From 9f3624c7775f97b3c098272c7412b0be3f5e783c Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 17 Oct 2018 14:28:49 +0800 Subject: [PATCH] - orderUseNewTable except store feature related. --- business/jxcallback/orderman/order.go | 118 +++++++++++++++--- business/jxcallback/orderman/orderman_ext.go | 19 +++ business/model/dao/dao.go | 4 + business/model/dao/dao_bz.go | 3 +- .../jxstorefeature.go | 0 business/partner/delivery/dada/waybill.go | 22 ++++ business/partner/delivery/mtps/waybill.go | 51 +++++--- conf/app.conf | 1 + controllers/promotion.go | 4 +- globals/globals.go | 2 + 10 files changed, 190 insertions(+), 34 deletions(-) rename business/model/{legacymodel => legacymodel2}/jxstorefeature.go (100%) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 9c7b9adfc..88148166c 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -9,10 +9,18 @@ import ( "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) +type tStoreSkuBindAndVendorSkuID struct { + VendorSkuID int64 `orm:"column(vendor_sku_id)"` + SkuID int `orm:"column(sku_id)"` + Weight int + UnitPrice int +} + var ( needAlarmStores map[int]int ) @@ -172,13 +180,77 @@ func (c *OrderManager) saveOrder(order *model.GoodsOrder, isAdjust bool, db orm. } func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) { + globals.SugarLogger.Debugf("updateOrderSkuOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) jxStoreID := jxutils.GetJxStoreIDFromOrder(order) if jxStoreID == 0 { globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营]订单在京西与平台都找不到京西门店信息orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) return nil } orderSkus := order.Skus + opNum := "2" + if needAlarmStores[jxStoreID] != 0 { + opNum = "" + } + var sql string + if globals.OrderUseNewTable { + skuIDs := make([]int64, len(orderSkus)) + for k, v := range orderSkus { + skuIDs[k] = utils.Str2Int64(v.VendorSkuID) + } + if order.VendorID == model.VendorIDELM { // todo 临时用 + sql = ` + SELECT t1.sku_id vendor_sku_id, IF(t1.custom_sku_id = -1, 0, t1.custom_sku_id) sku_id, t2.unit_price, t3.weight + FROM eb_sku_id_map t1 + LEFT JOIN store_sku_bind t2 ON t1.custom_sku_id = t2.sku_id AND t2.deleted_at = ? AND t2.store_id = ? + LEFT JOIN sku t3 ON t1.custom_sku_id = t3.id AND t3.deleted_at = ? + WHERE t1.sku_id IN (-1,` + dao.GenQuestionMarks(len(skuIDs)) + ")" + } else { + vendorSkuIDField := "" + if order.VendorID == model.VendorIDJD { + vendorSkuIDField = " t1.jd_id " + } else if order.VendorID == model.VendorIDELM { + vendorSkuIDField = " t2.elm_id " + } else if order.VendorID == model.VendorIDEBAI { + vendorSkuIDField = " t2.ebai_id " + } else { + panic(fmt.Sprintf("unknown vendorID:%d", order.VendorID)) + } + sql = "SELECT " + vendorSkuIDField + ` vendor_sku_id, t1.id sku_id, t2.unit_price, t1.weight + FROM sku t1 + LEFT JOIN store_sku_bind t2 ON t1.id = t2.sku_id AND t2.deleted_at = ? AND t2.store_id = ? + WHERE t1.deleted_at = ? AND ` + vendorSkuIDField + " IN (-1, " + dao.GenQuestionMarks(len(skuIDs)) + ")" + } + var skuInfos []*tStoreSkuBindAndVendorSkuID + db2 := dao.WrapDB(db) + if err = dao.GetRows(db2, &skuInfos, sql, utils.DefaultTimeValue, jxStoreID, utils.DefaultTimeValue, skuIDs); err != nil { + globals.SugarLogger.Errorf("updateOrderSkuOtherInfo can not get sku info for orderID:%s, error:%v", order.VendorOrderID, err) + return err + } + skumapper := make(map[int64]*tStoreSkuBindAndVendorSkuID) + for _, v := range skuInfos { + skumapper[v.VendorSkuID] = v + } + globals.SugarLogger.Debug(sql) + globals.SugarLogger.Debug(utils.Format4Output(skumapper, false)) + + for _, v := range orderSkus { + if v.VendorSkuID != "-70000" { // todo hard code + skuBindInfo := skumapper[utils.Str2Int64(v.VendorSkuID)] + if skuBindInfo == nil { + globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNum, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v) + } else { + v.JxSkuID = skuBindInfo.SkuID + v.ShopPrice = int64(skuBindInfo.UnitPrice) + order.ShopPrice += v.ShopPrice * int64(v.Count) + if skuBindInfo.UnitPrice == 0 { + globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营%s]%s订单sku门店价格为零(一般原因为没有门店价格信息),orderID:%s, StoreID:%d, SkuID:%d, sku:%v", opNum, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.JxSkuID, v) + } + } + } + } + return nil + } if order.VendorID == model.VendorIDJD { // todo 为什么要区分京东与其它? sql = ` SELECT t1.jdskuid, t1.skuid, t2.price, t3.weight @@ -211,10 +283,6 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db orm.O sqlParams = append(sqlParams, v.SkuID) } } - opNum := "2" - if needAlarmStores[jxStoreID] != 0 { - opNum = "" - } sql = sql[:len(sql)-1] + ")" var lists []orm.ParamsList @@ -264,31 +332,47 @@ func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db orm.O } func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) { + globals.SugarLogger.Debugf("updateOrderOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) + var sql string - if order.VendorID == model.VendorIDJD { - sql = ` + if globals.OrderUseNewTable { + storeMap := &model.StoreMap{ + VendorID: order.VendorID, + VendorStoreID: order.VendorStoreID, + } + storeMap.DeletedAt = utils.DefaultTimeValue + db2 := dao.WrapDB(db) + if err = dao.GetEntity(db2, storeMap, model.FieldVendorID, model.FieldVendorStoreID, model.FieldDeletedAt); err != nil && err != orm.ErrNoRows { + globals.SugarLogger.Warnf("updateOrderOtherInfo GetEntity orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) + return err + } + order.JxStoreID = storeMap.StoreID + } else { + if order.VendorID == model.VendorIDJD { + sql = ` SELECT t1.jxstoreid FROM jxstoremap t1 /* JOIN jxstore t2 ON t1.jxstoreid = t2.storeid */ WHERE t1.jdstoreid = ? ` - } else if order.VendorID == model.VendorIDELM { - sql = ` + } else if order.VendorID == model.VendorIDELM { + sql = ` SELECT t1.jx_store_id FROM jx_to_elm_store_map t1 /* JOIN jxstore t2 ON t1.jx_store_id = t2.storeid */ WHERE t1.elm_store_id = ? ` - } else if order.VendorID == model.VendorIDEBAI { // todo - } else { - panic(fmt.Sprintf("wrong vendorid:%d", order.VendorID)) - } - if sql != "" { - var lists []orm.ParamsList - if num, err := db.Raw(sql, utils.Str2Int64(order.VendorStoreID)).ValuesList(&lists); err == nil && num == 1 { - order.JxStoreID = int(utils.Str2Int64(lists[0][0].(string))) + } else if order.VendorID == model.VendorIDEBAI { // todo } else { - globals.SugarLogger.Infof("updateOrderOtherInfo [运营]订单orderID:%s在京西找不到相应的京西门店信息,请处理, VendorStoreID:%s, num:%d, error:%v", order.VendorOrderID, order.VendorStoreID, num, err) + panic(fmt.Sprintf("wrong vendorid:%d", order.VendorID)) + } + if sql != "" { + var lists []orm.ParamsList + if num, err := db.Raw(sql, utils.Str2Int64(order.VendorStoreID)).ValuesList(&lists); err == nil && num == 1 { + order.JxStoreID = int(utils.Str2Int64(lists[0][0].(string))) + } else { + globals.SugarLogger.Infof("updateOrderOtherInfo [运营]订单orderID:%s在京西找不到相应的京西门店信息,请处理, VendorStoreID:%s, num:%d, error:%v", order.VendorOrderID, order.VendorStoreID, num, err) + } } } if err = c.updateOrderSkuOtherInfo(order, db); err == nil { diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 0a4dc7def..0d91a388a 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -84,6 +84,25 @@ func (c *OrderManager) GetStoreOrderCountInfo(storeID string, lastHours int) (co func (c *OrderManager) GetOrderSkuInfo(vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) { globals.SugarLogger.Debugf("GetOrderSkuInfo orderID:%s", vendorOrderID) + if globals.OrderUseNewTable { + db := dao.GetDB() + 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 // 为了显示图片,非正规的使用导出表 diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go index 92909fb99..ea816df83 100644 --- a/business/model/dao/dao.go +++ b/business/model/dao/dao.go @@ -57,6 +57,10 @@ func GetDB() *DaoDB { return &DaoDB{db: orm.NewOrm()} } +func WrapDB(ormDb orm.Ormer) *DaoDB { + return &DaoDB{db: ormDb} +} + func Begin(db *DaoDB) error { return db.db.Begin() } diff --git a/business/model/dao/dao_bz.go b/business/model/dao/dao_bz.go index 16be9be46..12c151b4f 100644 --- a/business/model/dao/dao_bz.go +++ b/business/model/dao/dao_bz.go @@ -116,7 +116,8 @@ func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendo StoreID: storeID, CategoryID: categoryID, } - if err = GetEntity(db, storeCat, model.FieldStoreID, model.FieldCategoryID); err != nil && err != orm.ErrNoRows { + storeCat.DeletedAt = utils.DefaultTimeValue + if err = GetEntity(db, storeCat, model.FieldStoreID, model.FieldCategoryID, model.FieldDeletedAt); err != nil && err != orm.ErrNoRows { return err } if vendorID == model.VendorIDEBAI { diff --git a/business/model/legacymodel/jxstorefeature.go b/business/model/legacymodel2/jxstorefeature.go similarity index 100% rename from business/model/legacymodel/jxstorefeature.go rename to business/model/legacymodel2/jxstorefeature.go diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 3be2e09e3..145435f02 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -9,6 +9,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "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" "git.rosy.net.cn/jx-callback/globals/api" @@ -167,6 +168,27 @@ func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, func (c *DeliveryHandler) getDataCityCodeFromOrder(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { var sql string + if globals.OrderUseNewTable { + jxStoreID := jxutils.GetJxStoreIDFromOrder(order) + sql = ` + SELECT t2.tel_code + FROM store t1 + JOIN place t2 on t1.city_code = t2.code + WHERE t1.id = ? + ` + db2 := dao.WrapDB(db) + codeInfo := &struct { + TelCode string + }{} + if err = dao.GetRow(db2, codeInfo, sql, jxStoreID); err != nil { + globals.SugarLogger.Errorf("GetDataCityCodeFromOrder can not find store info for vendorID:%d, store:%s, error:%v", order.VendorID, order.VendorStoreID, err) + if err == nil { + err = ErrCanNotFindDadaCityCode + } + return "", err + } + return codeInfo.TelCode, nil + } storeID := utils.Str2Int64(order.VendorStoreID) if order.VendorID == model.VendorIDJD { sql = ` diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 8d145ba2b..739cae8ca 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -11,6 +11,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/legacymodel" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" @@ -111,27 +112,49 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re } func (c *DeliveryHandler) calculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) { - var lists []orm.ParamsList if db == nil { db = orm.NewOrm() } JxStoreID := jxutils.GetJxStoreIDFromOrder(order) - num, err := db.Raw(` - SELECT t2.price, t1.lng, t1.lat - FROM jxstore t1 - JOIN mtpsdeliveryprice t2 ON t2.citycode = t1.area - WHERE t1.storeid = ? - `, JxStoreID).ValuesList(&lists) - - if err == nil && num == 1 { - deliveryFee = utils.Str2Int64(lists[0][0].(string)) + var lng, lat float64 + if globals.OrderUseNewTable { + priceInfo := &struct { + Price int + Lng int + Lat int + }{} + db2 := dao.WrapDB(db) + if err = dao.GetRow(db2, priceInfo, ` + SELECT t2.mtps_price price, t1.lng, t1.lat + FROM store t1 + JOIN place t2 ON t1.city_code = t2.code + WHERE t1.id = ? AND t1.deleted_at = ? + `, JxStoreID, utils.DefaultTimeValue); err != nil { + return 0, 0, err + } + lng = jxutils.IntCoordinate2Standard(priceInfo.Lng) + lat = jxutils.IntCoordinate2Standard(priceInfo.Lat) + deliveryFee = int64(priceInfo.Price) } else { - globals.SugarLogger.Warnf("calculateDeliveryFee can not calculate delivery fee for orderID:%s, num:%d, error:%v", order.VendorOrderID, num, err) - return 0, 0, ErrStoreNoPriceInfo + var lists []orm.ParamsList + num, err := db.Raw(` + SELECT t2.price, t1.lng, t1.lat + FROM jxstore t1 + JOIN mtpsdeliveryprice t2 ON t2.citycode = t1.area + WHERE t1.storeid = ? + `, JxStoreID).ValuesList(&lists) + if err != nil || num == 0 { + globals.SugarLogger.Warnf("calculateDeliveryFee can not calculate delivery fee for orderID:%s, num:%d, error:%v", order.VendorOrderID, num, err) + if err != nil { + return 0, 0, err + } + return 0, 0, ErrStoreNoPriceInfo + } + lng = utils.Str2Float64(utils.Interface2String(lists[0][1])) + lat = utils.Str2Float64(utils.Interface2String(lists[0][2])) + deliveryFee = utils.Str2Int64(lists[0][0].(string)) } - lng := utils.Str2Float64(utils.Interface2String(lists[0][1])) - lat := utils.Str2Float64(utils.Interface2String(lists[0][2])) if lng == 0 || lat == 0 { globals.SugarLogger.Warnf("calculateDeliveryFee can not calculate delivery fee for orderID:%s, because no coordinate info", order.VendorOrderID) return 0, 0, ErrStoreNoCoordinate diff --git a/conf/app.conf b/conf/app.conf index 09714236f..1bf4354a2 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -16,6 +16,7 @@ autonaviKey = "4427170f870af2110becb8852d36ab08" enableStore = true enableStoreWrite = false +orderUseNewTable = false aliKey = "LTAI6xJUGaP6WdMQ" aliSecret = "CLmx5T93Bgi89EGAxWM4RTAXUsiHbM" diff --git a/controllers/promotion.go b/controllers/promotion.go index 64491b7f8..6425af262 100644 --- a/controllers/promotion.go +++ b/controllers/promotion.go @@ -25,7 +25,7 @@ type PromotionController struct { // @Param type formData int true "促销类型,3:直降,4:限时抢购" // @Param storeIDs formData string true "json数据,storeID列表[1,2,3]" // @Param skuPrices formData string true "json数据,价格信息列表" -// @Param isAsync formData bool false "是否异常,缺省否(暂时只支持同步)" +// @Param isAsync formData bool false "是否异步,缺省否(暂时只支持同步)" // @Param advertising formData string false "广告语" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult @@ -55,7 +55,7 @@ func (c *PromotionController) CreatePromotion() { // @Title 发送文件给门店 // @Description 发送文件给门店,调用GET方法得到浏览器端参考的上传HTML实现,userfiles -// @Param type formData int true "是否异步,缺省是同步" +// @Param type formData int true "促销类型,3:直降,4:限时抢购" // @Param isAsync formData bool false "是否异常,缺省否(暂时只支持同步)" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult diff --git a/globals/globals.go b/globals/globals.go index f74838a29..351e87321 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -27,6 +27,7 @@ var ( EnableStore bool EnableStoreWrite bool + OrderUseNewTable bool QiniuBucket string ) @@ -55,6 +56,7 @@ func Init() { EnableStore = beego.AppConfig.DefaultBool("enableStore", false) EnableStoreWrite = beego.AppConfig.DefaultBool("enableStoreWrite", false) + OrderUseNewTable = beego.AppConfig.DefaultBool("orderUseNewTable", false) QiniuBucket = beego.AppConfig.String("qiniuBucket") }