package orderman import ( "fmt" "strconv" "strings" "time" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/excel" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) const ( maxLastHours = 7 * 24 // 最多只能查询7天内的订单数据 defLastHours = 2 * 24 // 缺省是两天内的订单 ) type tWaybillExt struct { model.Waybill StoreName string `json:"storeName"` StoreID int `json:"storeID" orm:"column(store_id)"` } type StoresOrderSaleInfo struct { StoreID int `orm:"column(store_id)" json:"storeID"` VendorID int `orm:"column(vendor_id)" json:"vendorID"` Status int `json:"status"` Count int `json:"count"` ShopPrice int64 `json:"shopPrice"` VendorPrice int64 `json:"vendorPrice"` SalePrice int64 `json:"salePrice"` ActualPayPrice int64 `json:"actualPayPrice"` EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱 } func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) { globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%d", storeID) if lastHours > maxLastHours { lastHours = maxLastHours } else if lastHours == 0 { lastHours = defLastHours } db := dao.GetDB() err = dao.GetRows(db, &countInfo, ` SELECT t1.lock_status, t1.status, COUNT(*) count FROM goods_order t1 WHERE t1.vendor_id <> 2 AND IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) = ? AND t1.order_created_at >= ? GROUP BY 1,2 ORDER BY 1,2 `, model.VendorIDWSC, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour)) if err == nil { return countInfo, nil } globals.SugarLogger.Infof("GetStoreOrderCountInfo storeID:%d failed with error:%v", storeID, err) return nil, err } func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) { globals.SugarLogger.Debugf("GetOrderSkuInfo orderID:%s", vendorOrderID) fullSkuNameSQL := "t1.sku_name" if vendorID == model.VendorIDJD { fullSkuNameSQL = "CONCAT(t1.sku_name, IF(t3.is_spu = 1 AND LOCATE(';', t1.sku_name) = 0, CONCAT('[约', t2.spec_quality, t2.spec_unit, '/', t3.unit, ']'), ''))" } sql := fmt.Sprintf(` SELECT t1.id, t1.vendor_order_id, t1.vendor_id, t1.count, t1.vendor_sku_id, t1.sku_id, t1.jx_sku_id, t1.sku_name, IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price, t1.sale_price, t1.earning_price, CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) real_earning_price, t1.weight, t1.sku_type, t1.promotion_type, t1.order_created_at, t1.store_sub_id, t1.store_sub_name, t1.vendor_price, %s full_sku_name, `, model.DefaultEarningPricePercentage, fullSkuNameSQL) db := dao.GetDB() if vendorID == model.VendorIDELM { err = dao.GetRows(db, &skus, sql+` IF(t3.img <> '', t3.img, t4.col_imageUrl) image FROM order_sku t1 LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ LEFT JOIN ede_skus t4 ON t1.vendor_sku_id = t4.col_id WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? ORDER BY t1.sku_name `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) } else if vendorID == model.VendorIDJD { err = dao.GetRows(db, &skus, sql+` IF(t3.img <> '', t3.img, t4.image) image FROM order_sku t1 LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ LEFT JOIN jde_sku_infos t4 ON t1.vendor_sku_id = t4.skuId WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? ORDER BY t1.sku_name `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) } if err != nil || len(skus) == 0 { err = dao.GetRows(db, &skus, sql+` t3.img image FROM order_sku t1 LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? ORDER BY t1.sku_name `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) if err != nil { globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) return nil, err } } if len(skus) == 0 { return nil, ErrCanNotFindOrder } return skus, nil } func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isRefresh bool) (order *model.GoodsOrderExt, err error) { globals.SugarLogger.Debugf("GetOrderInfo orderID:%s", vendorOrderID) db := orm.NewOrm() orders := []*model.GoodsOrderExt{} // 这里用QueryRows而不用QueryRow的原因是用QueryRow在这种情况下不能将数据读出,很奇怪。大概的原因是QueryRow对于GoodsOrderExt这种有嵌入的struct处理有问题 num, err := db.Raw(` SELECT t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile FROM goods_order t1 LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id WHERE t1.vendor_order_id = ? AND vendor_id = ? `, vendorOrderID, vendorID).QueryRows(&orders) if err == nil && num > 0 { order = orders[0] if isRefresh && vendorID == model.VendorIDJD { tmpOrder, err2 := partner.GetPurchasePlatformFromVendorID(vendorID).GetOrder(vendorOrderID) if err = err2; err == nil { order.CurrentConsigneeMobile = tmpOrder.ConsigneeMobile } else { order.CurrentConsigneeMobile = "Error" globals.SugarLogger.Infof("GetOrderInfo GetOrder failed with error:%v", err2) } } return order, nil } if err == nil { err = ErrCanNotFindOrder } globals.SugarLogger.Infof("GetOrderInfo orderID:%s failed with error:%v", vendorOrderID, err) return nil, err } func (c *OrderManager) GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded bool) (bills []*model.Waybill, err error) { globals.SugarLogger.Debugf("GetOrderWaybillInfo orderID:%s", vendorOrderID) db := dao.GetDB() sql := ` SELECT t1.* FROM waybill t1 WHERE t1.vendor_order_id = ? AND order_vendor_id = ? ` sqlParams := []interface{}{ vendorOrderID, vendorID, } if isNotEnded { sql += " AND t1.status < ?" sqlParams = append(sqlParams, model.OrderStatusEndBegin) } err = dao.GetRows(db, &bills, sql, sqlParams...) globals.SugarLogger.Infof("GetOrderWaybillInfo orderID:%s failed with error:%v", vendorOrderID, err) return bills, err } func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toDateStr string) (excelContent []byte, err error) { globals.SugarLogger.Debugf("ExportMTWaybills from:%s to:%s", fromDateStr, toDateStr) fromDate, err := utils.TryStr2Time(fromDateStr) if err != nil { return nil, err } if toDateStr == "" { toDateStr = fromDateStr } toDate, err := utils.TryStr2Time(toDateStr) if err != nil { return nil, err } toDate = toDate.Add(24 * time.Hour) var waybills []*tWaybillExt sql := ` SELECT t1.*, t2.store_name, IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) store_id FROM waybill t1 JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id WHERE t1.waybill_vendor_id = 102 AND t1.status = 105 AND t1.waybill_created_at >= ? AND t1.waybill_created_at <= ? ORDER BY t1.id ` db := dao.GetDB() if err = dao.GetRows(db, &waybills, sql, model.VendorIDWSC, fromDate, toDate); err == nil { config := []*excel.Obj2ExcelSheetConfig{ &excel.Obj2ExcelSheetConfig{ Title: "Sheet1", Data: waybills, CaptionList: []string{ "vendorWaybillID", "waybillVendorID", "vendorOrderID", "orderVendorID", "storeName", "storeID", "courierName", "status", "desiredFee", "waybillCreatedAt", }, }, } return excel.Obj2Excel(config), nil } return nil, err } func (c *OrderManager) getOrders(ctx *jxcontext.Context, isIncludeSku bool, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (orders []*model.GoodsOrderExt, totalCount int, err error) { globals.SugarLogger.Debugf("getOrders from:%s to:%s", fromDateStr, toDateStr) pageSize = jxutils.FormalizePageSize(pageSize) if offset < 0 { offset = 0 } sql := fmt.Sprintf(` SELECT SQL_CALC_FOUND_ROWS t1.*, CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at`, model.DefaultEarningPricePercentage) if isIncludeSku { sql += `, 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, t3.sale_price sku_sale_price` } sql += ` FROM goods_order t1 LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)` if isIncludeSku { sql += ` JOIN order_sku t3 ON t3.vendor_order_id = t1.vendor_order_id AND t3.vendor_id = t1.vendor_id` } var ( sqlWhere string sqlParams []interface{} ) // 如果搜索关键字可能为订单号,则当成订单号查询 if params["keyword"] != nil { if jxutils.GetPossibleVendorIDFromVendorOrderID(params["keyword"].(string)) > model.VendorIDUnknown { params["vendorOrderID"] = params["keyword"] } } if params["orderID"] != nil || params["vendorOrderID"] != nil { sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)" vendorOrderID := params["vendorOrderID"] if vendorOrderID == nil { vendorOrderID = params["orderID"] } sqlParams = []interface{}{ vendorOrderID, vendorOrderID, } } else { fromDate, err2 := utils.TryStr2Time(fromDateStr) if err = err2; err != nil { return nil, 0, err } if utils.IsTimeZero(fromDate) { return nil, 0, fmt.Errorf("在没有指定订单号时,必须指定查询日期范围") } if toDateStr == "" { toDateStr = fromDateStr } toDate, err2 := utils.TryStr2Time(toDateStr) if err = err2; err != nil { return nil, 0, err } toDate = toDate.Add(24 * time.Hour) sqlWhere = ` WHERE t1.order_created_at >= ? AND t1.order_created_at < ? ` sqlParams = []interface{}{ fromDate, toDate, } if params["keyword"] != nil { keyword := params["keyword"].(string) keywordLike := "%" + keyword + "%" sqlWhere += ` AND (t1.store_name LIKE ? OR t1.vendor_order_id LIKE ? OR t1.vendor_store_id LIKE ? OR t1.consignee_name LIKE ? OR t1.consignee_mobile LIKE ? OR t1.consignee_mobile2 LIKE ? OR t1.consignee_address LIKE ? OR t2.vendor_waybill_id LIKE ? OR t2.courier_name LIKE ? OR t2.courier_mobile LIKE ? ` sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { sqlWhere += " OR t1.store_id = ? OR t1.jx_store_id = ?" sqlParams = append(sqlParams, keywordInt64, keywordInt64) } sqlWhere += ")" } if params["waybillVendorIDs"] != nil { var waybillVendorIDs []int if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil { return nil, 0, err } if len(waybillVendorIDs) > 0 { sqlWhere += " AND t1.waybill_vendor_id IN (" + dao.GenQuestionMarks(len(waybillVendorIDs)) + ")" sqlParams = append(sqlParams, waybillVendorIDs) } } if params["storeIDs"] != nil { var storeIDs []int if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err != nil { return nil, 0, err } if len(storeIDs) > 0 { sqlWhere += " AND IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, model.VendorIDWSC, storeIDs) } } if params["statuss"] != nil { var statuss []int if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil { return nil, 0, err } if len(statuss) > 0 { sqlWhere += " AND t1.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")" sqlParams = append(sqlParams, statuss) } } if params["lockStatuss"] != nil { var lockStatuss []int if err = utils.UnmarshalUseNumber([]byte(params["lockStatuss"].(string)), &lockStatuss); err != nil { return nil, 0, err } if len(lockStatuss) > 0 { sqlWhere += " AND t1.lock_status IN (" + dao.GenQuestionMarks(len(lockStatuss)) + ")" sqlParams = append(sqlParams, lockStatuss) } } if params["cities"] != nil { var cities []int if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil { return nil, 0, err } if len(cities) > 0 { sql += " JOIN store st ON t1.store_id = st.id" sqlWhere += " AND st.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ")" sqlParams = append(sqlParams, cities) } } } if params["vendorIDs"] != nil { var vendorIDs []int if err = utils.UnmarshalUseNumber([]byte(params["vendorIDs"].(string)), &vendorIDs); err != nil { return nil, 0, err } if len(vendorIDs) > 0 { sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } } db := dao.GetDB() sql += sqlWhere if isIncludeSku { sql += ` ORDER BY t1.id` } else { sql += ` ORDER BY t1.order_created_at DESC LIMIT ? OFFSET ?` sqlParams = append(sqlParams, pageSize, offset) dao.Begin(db) defer func() { if r := recover(); r != nil { dao.Rollback(db) panic(r) } }() } if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil { totalCount = dao.GetLastTotalRowCount(db) } if !isIncludeSku { dao.Commit(db) } return orders, totalCount, err } func (c *OrderManager) GetOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr) orders, totalCount, err := c.getOrders(ctx, false, fromDateStr, toDateStr, params, offset, pageSize) if err == nil { pagedInfo = &model.PagedInfo{ TotalCount: totalCount, Data: orders, } } return pagedInfo, err } func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string, mapParams map[string]interface{}) (hint string, err error) { globals.SugarLogger.Debugf("ExportOrders from:%s to:%s", fromDateStr, toDateStr) var ( orders, orders2 []*model.GoodsOrderExt order *model.GoodsOrderExt afsSkuMap map[string]map[int]*model.OrderSkuFinancial excelBin []byte ) task := tasksch.NewSeqTask("导出订单SKU信息", ctx, func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { 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 { 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 3: excelConf := &excel.Obj2ExcelSheetConfig{ Title: "订单导出", Data: orders2, CaptionList: []string{ "vendorOrderID", "vendorOrderID2", "vendorID", "vendorStoreID", "jxStoreID", "storeName", "salePrice", "shopPrice", "weight", "consigneeName", "consigneeMobile", "consigneeMobile2", "consigneeAddress", "skuCount", "status", "orderSeq", "buyerComment", "businessType", "expectedDeliveredTime", "vendorWaybillID", "waybillVendorID", "orderCreatedAt", "orderFinishedAt", "courierVendorName", "courierName", "courierMobile", "courierMobile", "desiredFee", "waybillCreatedAt", "waybillFinishedAt", "status2", "skuInfo", }, } excelBin = excel.Obj2Excel([]*excel.Obj2ExcelSheetConfig{excelConf}) case 4: keyPart := []string{ ctx.GetUserName(), } if fromDateStr != "" { keyPart = append(keyPart, fromDateStr) } if toDateStr != "" { keyPart = append(keyPart, toDateStr) } keyPart = append(keyPart, time.Now().Format("20060102T150405")+".xlsx") key := "export/" + strings.Join(keyPart, "_") excelURL, err2 := jxutils.UploadExportContent(excelBin, key) if err = err2; err == nil { task.SetNoticeMsg(excelURL) } globals.SugarLogger.Debugf("导出订单SKU信息excelURL:%s, err:%v", excelURL, err) } return nil, err }, 5) tasksch.ManageTask(task).Run() hint = task.GetID() return hint, err } func (c *OrderManager) GetWaybills(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { globals.SugarLogger.Debugf("GetWaybills from:%s to:%s", fromDateStr, toDateStr) fromDate, err := utils.TryStr2Time(fromDateStr) if err != nil { return nil, err } if toDateStr == "" { toDateStr = fromDateStr } toDate, err := utils.TryStr2Time(toDateStr) if err != nil { return nil, err } toDate = toDate.Add(24 * time.Hour) pageSize = jxutils.FormalizePageSize(pageSize) if offset < 0 { offset = 0 } sqlParams := []interface{}{ model.VendorIDWSC, fromDate, toDate, } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name, IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) store_id FROM waybill t1 JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id WHERE t1.status = 105 AND t1.waybill_created_at >= ? AND t1.waybill_created_at < ? ` if params["keyword"] != nil { keyword := params["keyword"].(string) keywordLike := "%" + keyword + "%" sql += ` AND (t2.store_name LIKE ? OR t1.vendor_order_id LIKE ? OR t2.vendor_waybill_id LIKE ? OR t2.courier_name LIKE ? OR t2.courier_mobile LIKE ? ` sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) if keywordInt64, err2 := strconv.ParseInt(keyword, 10, 64); err2 == nil { sql += " OR t2.store_id = ? OR t2.jx_store_id = ?" sqlParams = append(sqlParams, keywordInt64, keywordInt64) } sql += ")" } if params["waybillVendorIDs"] != nil { var waybillVendorIDs []int if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil { return nil, err } if len(waybillVendorIDs) > 0 { sql += " AND t2.waybill_vendor_id IN (" + dao.GenQuestionMarks(len(waybillVendorIDs)) + ")" sqlParams = append(sqlParams, waybillVendorIDs) } } if params["statuss"] != nil { var statuss []int if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil { return nil, err } if len(statuss) > 0 { sql += " AND t1.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")" sqlParams = append(sqlParams, statuss) } } sql += ` ORDER BY t1.id LIMIT ? OFFSET ? ` sqlParams = append(sqlParams, pageSize, offset) var waybills []*tWaybillExt db := dao.GetDB() dao.Begin(db) defer func() { if r := recover(); r != nil { dao.Rollback(db) panic(r) } }() if err = dao.GetRows(db, &waybills, sql, sqlParams...); err == nil { pagedInfo = &model.PagedInfo{ TotalCount: dao.GetLastTotalRowCount(db), Data: waybills, } } dao.Commit(db) return pagedInfo, err } func (c *OrderManager) GetOrderStatusList(ctx *jxcontext.Context, vendorOrderID string, vendorID int, orderType int) (statusList []*model.OrderStatus, err error) { sql := ` SELECT * FROM order_status t1 WHERE t1.ref_vendor_order_id = ? AND t1.ref_vendor_id = ? ` sqlParams := []interface{}{ vendorOrderID, vendorID, } if orderType > 0 { sql += " AND t1.order_type = ?" sqlParams = append(sqlParams, orderType) } sql += " ORDER BY t1.status_time, t1.order_type DESC" db := dao.GetDB() if err = dao.GetRows(db, &statusList, sql, sqlParams...); err != nil { return nil, err } return statusList, nil } func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, toDateStr string, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { globals.SugarLogger.Debugf("GetOrdersFinancial from:%s to:%s", fromDateStr, toDateStr) pageSize = jxutils.FormalizePageSize(pageSize) if offset < 0 { offset = 0 } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name,t2.vendor_store_id,t2.store_id,t2.jx_store_id,t2.status,t2.order_finished_at FROM order_financial t1 LEFT JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id ` var ( sqlWhere string sqlParams []interface{} ) if params["orderID"] != nil { sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)" sqlParams = []interface{}{ params["orderID"], params["orderID"], } } else { fromDate, err2 := utils.TryStr2Time(fromDateStr) if err = err2; err != nil { return nil, err } if toDateStr == "" { toDateStr = fromDateStr } toDate, err2 := utils.TryStr2Time(toDateStr) if err = err2; err != nil { return nil, err } toDate = toDate.Add(24 * time.Hour) sqlWhere = ` WHERE t2.order_finished_at >= ? AND t2.order_finished_at < ? ` sqlParams = []interface{}{ fromDate, toDate, } if params["vendorIDs"] != nil { var vendorIDs []int if err = utils.UnmarshalUseNumber([]byte(params["vendorIDs"].(string)), &vendorIDs); err != nil { return nil, err } if len(vendorIDs) > 0 { sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } } if params["storeIDs"] != nil { var storeIDs []int if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err != nil { return nil, err } if len(storeIDs) > 0 { sqlWhere += " AND IF(t1.vendor_id = ?, t2.store_id, IF(t2.jx_store_id != 0, t2.jx_store_id, t2.store_id)) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, model.VendorIDWSC, storeIDs) } } if params["statuss"] != nil { var statuss []int if err = utils.UnmarshalUseNumber([]byte(params["statuss"].(string)), &statuss); err != nil { return nil, err } if len(statuss) > 0 { sqlWhere += " AND t2.status IN (" + dao.GenQuestionMarks(len(statuss)) + ")" sqlParams = append(sqlParams, statuss) } } if params["cities"] != nil { var cities []int if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil { return nil, err } if len(cities) > 0 { sql += "JOIN store st ON t2.store_id = st.id" sqlWhere += " AND st.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ")" sqlParams = append(sqlParams, cities) } } } sql += sqlWhere sql += ` ORDER BY t2.order_created_at DESC LIMIT ? OFFSET ? ` sqlParams = append(sqlParams, pageSize, offset) var orders []*model.OrderFinancialExt db := dao.GetDB() dao.Begin(db) defer func() { if r := recover(); r != nil { dao.Rollback(db) panic(r) } }() if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil { pagedInfo = &model.PagedInfo{ TotalCount: dao.GetLastTotalRowCount(db), Data: orders, } } dao.Commit(db) return pagedInfo, err } 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) } 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) { globals.SugarLogger.Debugf("GetAfsOrders") pageSize = jxutils.FormalizePageSize(pageSize) if offset < 0 { offset = 0 } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.* FROM afs_order t1 ` var ( sqlWhere string sqlParams []interface{} ) // 如果搜索关键字可能为订单或售后单号,则当成订单或售后单查询 if keyword != "" { if jxutils.GetPossibleVendorIDFromAfsOrderID(keyword) > model.VendorIDUnknown && afsOrderID == "" { afsOrderID = keyword keyword = "" } else if jxutils.GetPossibleVendorIDFromVendorOrderID(keyword) > model.VendorIDUnknown && vendorOrderID == "" { vendorOrderID = keyword keyword = "" } } if vendorOrderID != "" || afsOrderID != "" { if vendorOrderID != "" { sqlWhere = " WHERE (t1.vendor_order_id = ? OR t1.vendor_order_id2 = ?)" sqlParams = []interface{}{ vendorOrderID, vendorOrderID, } } else { sqlWhere = " WHERE (t1.afs_order_id = ?)" sqlParams = []interface{}{ afsOrderID, } } } else { if toTime.Sub(fromTime) > 24*time.Hour*60 { return nil, fmt.Errorf("售后单查询时间不能超过60天") } sqlWhere = ` WHERE t1.afs_created_at >= ? AND t1.afs_created_at <= ? ` sqlParams = []interface{}{ fromTime, toTime, } if keyword != "" { keywordLike := "%" + keyword + "%" sqlWhere += ` AND (t1.vendor_order_id2 LIKE ? OR t1.vendor_order_id LIKE ? OR t1.afs_order_id LIKE ? OR t1.vendor_store_id LIKE ? OR t1.reason_desc LIKE ? ` sqlParams = append(sqlParams, keywordLike, keywordLike, keywordLike, keywordLike, keywordLike) if keywordInt64 := utils.Str2Int64WithDefault(keyword, 0); keywordInt64 > 0 { sqlWhere += " OR t1.store_id = ? OR t1.jx_store_id = ?" sqlParams = append(sqlParams, keywordInt64, keywordInt64) } sqlWhere += ")" } if len(storeIDList) > 0 { sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + dao.GenQuestionMarks(len(storeIDList)) + ")" sqlParams = append(sqlParams, storeIDList) } if len(statusList) > 0 { sqlWhere += " AND t1.status IN (" + dao.GenQuestionMarks(len(statusList)) + ")" sqlParams = append(sqlParams, statusList) } if len(appealTypeList) > 0 { sqlWhere += " AND t1.appeal_type IN (" + dao.GenQuestionMarks(len(appealTypeList)) + ")" sqlParams = append(sqlParams, appealTypeList) } } if len(vendorIDList) > 0 { sqlWhere += " AND t1.vendor_id IN (" + dao.GenQuestionMarks(len(vendorIDList)) + ")" sqlParams = append(sqlParams, vendorIDList) } sql += sqlWhere sql += ` ORDER BY t1.afs_created_at DESC LIMIT ? OFFSET ? ` sqlParams = append(sqlParams, pageSize, offset) var orders []*model.AfsOrder db := dao.GetDB() dao.Begin(db) defer func() { if r := recover(); r != nil || err != nil { dao.Rollback(db) if r != nil { panic(r) } } }() if err = dao.GetRows(db, &orders, sql, sqlParams...); err == nil { pagedInfo = &model.PagedInfo{ TotalCount: dao.GetLastTotalRowCount(db), Data: orders, } dao.Commit(db) } return pagedInfo, err } func (c *OrderManager) GetAfsOrderSkuInfo(ctx *jxcontext.Context, afsOrderID string, vendorID int) (skus []*model.OrderFinancialSkuExt, err error) { sql := ` SELECT t1.*, t3.img image FROM order_sku_financial t1 JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id) JOIN sku_name t3 ON t3.id = t2.name_id WHERE t1.is_afs_order = 1 AND t1.afs_order_id = ? AND t1.vendor_id = ? ` sqlParams := []interface{}{ afsOrderID, vendorID, } err = dao.GetRows(dao.GetDB(), &skus, sql, sqlParams...) 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 { lastHours = maxLastHours } else if lastHours == 0 { lastHours = defLastHours } db := dao.GetDB() err = dao.GetRows(db, &countInfo, ` SELECT 0 lock_status, t1.status, COUNT(*) count FROM afs_order t1 WHERE t1.vendor_id <> 2 AND IF(t1.vendor_id = ?, t1.store_id, IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) ) = ? AND t1.afs_created_at >= ? GROUP BY 1,2 ORDER BY 1,2 `, model.VendorIDWSC, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour)) if err == nil { return countInfo, nil } globals.SugarLogger.Infof("GetStoreAfsOrderCountInfo storeID:%d failed with error:%v", storeID, err) return nil, err }