diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 64b2686ba..1570a08a1 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -260,7 +260,7 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at`, model.DefaultEarningPricePercentage) if isIncludeSku { sql += `, - t3.sku_id, + IF(t3.jx_sku_id > 0, t3.jx_sku_id, t3.sku_id) sku_id, t3.count sku_count2, t3.shop_price sku_shop_price, t3.earning_price sku_earning_price, @@ -299,6 +299,9 @@ func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, from if err = err2; err != nil { return nil, 0, err } + if utils.IsTimeZero(fromDate) { + return nil, 0, fmt.Errorf("在没有指定订单号时,必须指定查询日期范围") + } if toDateStr == "" { toDateStr = fromDateStr } @@ -437,6 +440,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS var ( orders, orders2 []*model.GoodsOrderExt order *model.GoodsOrderExt + afsSkuMap map[string]map[int]*model.OrderSkuFinancial excelBin []byte ) task := tasksch.NewSeqTask("导出订单SKU信息", ctx, @@ -445,25 +449,39 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS case 0: orders, _, err = c.getOrders(ctx, true, fromDateStr, toDateStr, mapParams, 0, -1) case 1: + afsSkuMap, err = c.getAfsOrderSkuInfo4ExportOrders(ctx, fromDateStr, toDateStr) + case 2: for _, v := range orders { - skuStr := strings.Join([]string{ - utils.Int2Str(v.SkuID), - utils.Int2Str(v.SkuCount2), - utils.Int2Str(v.SkuShopPrice), - utils.Int2Str(v.SkuSalePrice), - utils.Int2Str(v.SkuEarningPrice), - }, ",") - if order == nil || v.ID != order.ID { - order = v - v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID] - v.Status2 = model.OrderStatusName[v.Status] - v.SkuInfo = skuStr - orders2 = append(orders2, v) - } else { - order.SkuInfo += ";" + skuStr + if afsInfo := afsSkuMap[jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID)]; afsInfo != nil { + if afsInfo[v.SkuID] != nil && afsInfo[v.SkuID].Count > 0 { + minus := afsInfo[v.SkuID].Count + if minus > v.SkuCount2 { + minus = v.SkuCount2 + } + v.SkuCount2 -= minus + afsInfo[v.SkuID].Count -= minus + } + } + if v.SkuCount2 > 0 { + skuStr := strings.Join([]string{ + utils.Int2Str(v.SkuID), + utils.Int2Str(v.SkuCount2), + utils.Int2Str(v.SkuShopPrice), + utils.Int2Str(v.SkuSalePrice), + utils.Int2Str(v.SkuEarningPrice), + }, ",") + if order == nil || v.ID != order.ID { + order = v + v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID] + v.Status2 = model.OrderStatusName[v.Status] + v.SkuInfo = skuStr + orders2 = append(orders2, v) + } else { + order.SkuInfo += ";" + skuStr + } } } - case 2: + case 3: excelConf := &excel.Obj2ExcelSheetConfig{ Title: "订单导出", Data: orders2, @@ -503,7 +521,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS }, } excelBin = excel.Obj2Excel([]*excel.Obj2ExcelSheetConfig{excelConf}) - case 3: + case 4: keyPart := []string{ ctx.GetUserName(), } @@ -522,7 +540,7 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS globals.SugarLogger.Debugf("导出订单SKU信息excelURL:%s, err:%v", excelURL, err) } return nil, err - }, 4) + }, 5) tasksch.ManageTask(task).Run() hint = task.GetID() return hint, err @@ -881,6 +899,53 @@ func (c *OrderManager) GetAfsOrderSkuInfo(ctx *jxcontext.Context, afsOrderID str return skus, err } +func (c *OrderManager) getAfsOrderSkuInfo4ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string) (skuMap map[string]map[int]*model.OrderSkuFinancial, err error) { + fromDate, err2 := utils.TryStr2Time(fromDateStr) + if err = err2; err != nil { + return nil, err + } + if utils.IsTimeZero(fromDate) { + return nil, fmt.Errorf("在没有指定订单号时,必须指定查询日期范围") + } + if toDateStr == "" { + toDateStr = fromDateStr + } + toDate, err2 := utils.TryStr2Time(toDateStr) + if err = err2; err != nil { + return nil, err + } + toDate = toDate.Add(7 * 24 * time.Hour) // todo 售后单最多只可能延后7天吧 + sql := ` + SELECT t2.* + FROM afs_order t1 + JOIN order_sku_financial t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.is_afs_order = 1 + WHERE t1.afs_created_at >= ? AND t1.afs_created_at <= ? AND t1.status = ? + ` + sqlParams := []interface{}{ + fromDate, + toDate, + model.AfsOrderStatusFinished, + } + var skus []*model.OrderSkuFinancial + if err = dao.GetRows(dao.GetDB(), &skus, sql, sqlParams...); err == nil { + skuMap = make(map[string]map[int]*model.OrderSkuFinancial) + for _, v := range skus { + key := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID) + if skuMap[key] == nil { + skuMap[key] = make(map[int]*model.OrderSkuFinancial) + } + if skuID := jxutils.GetSkuIDFromOrderSkuFinancial(v); skuID > 0 { + if skuMap[key][skuID] == nil { + skuMap[key][skuID] = v + } else { + skuMap[key][skuID].Count += v.Count + } + } + } + } + return skuMap, err +} + func (c *OrderManager) GetStoreAfsOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) { globals.SugarLogger.Debugf("GetStoreAfsOrderCountInfo storeID:%d", storeID) if lastHours > maxLastHours { diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index c37d700a7..dbe6d3be6 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -113,6 +113,13 @@ func GetSaleStoreIDFromAfsOrder(order *model.AfsOrder) (retVal int) { return order.StoreID } +func GetSkuIDFromOrderSkuFinancial(sku *model.OrderSkuFinancial) (skuID int) { + if sku.JxSkuID > 0 { + return sku.JxSkuID + } + return sku.SkuID +} + func SplitUniversalOrderID(universalOrderID string) (orderID string, vendorID int) { index := strings.Index(universalOrderID, "|") if index != -1 {