package orderman import ( "strconv" "time" "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)"` } func (c *OrderManager) GetStoreOrderInfo(ctx *jxcontext.Context, storeID string, lastHours int, fromStatus, toStatus, offset, pageSize int) (orders []*model.GoodsOrderExt, err error) { globals.SugarLogger.Debugf("GetStoreOrderInfo storeID:%s", storeID) if lastHours > maxLastHours { lastHours = maxLastHours } else if lastHours == 0 { lastHours = defLastHours } if toStatus == 0 { toStatus = fromStatus } if offset < 0 { offset = 0 } pageSize = jxutils.FormalizePageSize(pageSize) db := orm.NewOrm() _, err = db.Raw(` SELECT t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at 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 IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.Status >= ? AND t1.Status <= ? ORDER BY t1.status, t1.order_created_at LIMIT ? OFFSET ? `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus, pageSize, offset).QueryRows(&orders) if err == nil { return orders, nil } globals.SugarLogger.Infof("GetStoreOrderInfo storeID:%s failed with error:%v", storeID, err) return nil, err } func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID string, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) { globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%s", storeID) if lastHours > maxLastHours { lastHours = maxLastHours } else if lastHours == 0 { lastHours = defLastHours } db := orm.NewOrm() _, err = db.Raw(` SELECT t1.status, COUNT(*) count FROM goods_order t1 WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? GROUP BY 1 ORDER BY 1 `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour)).QueryRows(&countInfo) if err == nil { return countInfo, nil } globals.SugarLogger.Infof("GetStoreOrderCountInfo storeID:%s 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) if globals.OrderUseNewTable { db := dao.GetDB() if vendorID == model.VendorIDELM { err = dao.GetRows(db, &skus, ` SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.col_imageUrl, t3.img) image FROM order_sku t1 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 vendor_order_id = ? AND vendor_id = ? ORDER BY t1.sku_name `, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorOrderID, vendorID) } else if vendorID == model.VendorIDJD { err = dao.GetRows(db, &skus, ` SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.image, t3.img) image FROM order_sku t1 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 vendor_order_id = ? AND vendor_id = ? ORDER BY t1.sku_name `, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorOrderID, vendorID) } if err != nil || len(skus) == 0 { err = dao.GetRows(db, &skus, ` SELECT t1.*, t3.img image FROM order_sku t1 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 } db := orm.NewOrm() var num int64 // 为了显示图片,非正规的使用导出表 if vendorID == model.VendorIDELM { num, err = db.Raw(` SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.col_imageUrl, t3.img) image FROM order_sku t1 LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id LEFT JOIN ede_skus t4 ON t1.vendor_sku_id = t4.col_id WHERE vendor_order_id = ? AND vendor_id = ? ORDER BY t1.sku_name `, vendorOrderID, vendorID).QueryRows(&skus) } else if vendorID == model.VendorIDJD { num, err = db.Raw(` SELECT t1.*, IF(t3.img IS NULL OR t3.img = '', t4.image, t3.img) image FROM order_sku t1 LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id LEFT JOIN jde_sku_infos t4 ON t1.vendor_sku_id = t4.skuId WHERE vendor_order_id = ? AND vendor_id = ? ORDER BY t1.sku_name `, vendorOrderID, vendorID).QueryRows(&skus) } if err != nil || num == 0 { num, err = db.Raw(` SELECT t1.*, t3.img image FROM order_sku t1 LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id WHERE vendor_order_id = ? AND vendor_id = ? ORDER BY t1.sku_name `, vendorOrderID, vendorID).QueryRows(&skus) } if err == nil && num > 0 { return skus, nil } if err == nil { err = ErrCanNotFindOrder } globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) return nil, err } 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) (bills []*model.Waybill, err error) { globals.SugarLogger.Debugf("GetOrderWaybillInfo orderID:%s", vendorOrderID) db := orm.NewOrm() _, err = db.Raw(` SELECT t1.* FROM waybill t1 WHERE t1.vendor_order_id = ? AND order_vendor_id = ? `, vendorOrderID, vendorID).QueryRows(&bills) if err == nil { return bills, nil } globals.SugarLogger.Infof("GetOrderWaybillInfo orderID:%s failed with error:%v", vendorOrderID, err) return nil, 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(t2.store_id <> 0, t2.store_id, t2.jx_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, 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, 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) 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 } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at 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 ` 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_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) 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["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["waybillVendorIDs"] != nil { var waybillVendorIDs []int if err = utils.UnmarshalUseNumber([]byte(params["waybillVendorIDs"].(string)), &waybillVendorIDs); err != nil { return nil, err } if len(waybillVendorIDs) > 0 { sqlWhere += " AND t2.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, err } if len(storeIDs) > 0 { sqlWhere += " AND IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, 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 t1.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 t1.store_id = st.id" sqlWhere += " AND st.city_code IN (" + dao.GenQuestionMarks(len(cities)) + ")" sqlParams = append(sqlParams, cities) } } sql += sqlWhere sql += ` ORDER BY t1.order_created_at DESC LIMIT ? OFFSET ? ` sqlParams = append(sqlParams, pageSize, offset) var orders []*model.GoodsOrderExt pagedInfo = &model.PagedInfo{} 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 { countInfo := &struct{ Ct int }{} if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil { pagedInfo.TotalCount = countInfo.Ct pagedInfo.Data = orders } } dao.Commit(db) return pagedInfo, 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{}{ fromDate, toDate, } sql := ` SELECT SQL_CALC_FOUND_ROWS t1.*, t2.store_name, IF(t2.store_id <> 0, t2.store_id, t2.jx_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 pagedInfo = &model.PagedInfo{} 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 { countInfo := &struct{ Ct int }{} if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil { pagedInfo.TotalCount = countInfo.Ct pagedInfo.Data = waybills } } dao.Commit(db) return pagedInfo, err }