diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 6a775d24a..3ceada398 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -10,7 +10,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" - "git.rosy.net.cn/jx-callback/business/partner/purchase/jx" "git.rosy.net.cn/jx-callback/globals" ) @@ -233,8 +232,6 @@ func (c *BaseScheduler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID st } } err = jd.CurPurchaseHandler.ConfirmSelfTake(ctx, vendorOrderID, selfTakeCode) - } else if vendorID == model.VendorIDJX { - err = jx.CurPurchaseHandler.ConfirmSelfTake(ctx, vendorOrderID, selfTakeCode) } else { err = fmt.Errorf("自提核销不支持%s平台订单", model.VendorChineseNames[vendorID]) } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index a6f2e19b4..5712d2eeb 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -490,9 +490,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if isBillAlreadyCandidate && !s.isWaybillCourierSame(savedOrderInfo, bill) && !model.IsWaybillPlatformOwn(bill) { s.notify3rdPartyWaybill(order, bill, isBillAlreadyCandidate) } - flag2Clear := model.WaybillVendorID2Mask(bill.WaybillVendorID) order.Flag &= ^model.OrderFlagMaskFailedGetGoods - order.DeliveryFlag &= ^flag2Clear err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order) } case model.WaybillStatusAcceptCanceled: diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 5d4928dd2..6da6f124c 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -252,7 +252,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte if params["storeID"] != nil || params["storeIDs"] != nil { var storeIDs []int if params["storeIDs"] != nil { - if err = jxutils.Strings2Objs(utils.Interface2String("storeIDs"), &storeIDs); err != nil { + if err = jxutils.Strings2Objs(utils.Interface2String(params["storeIDs"]), &storeIDs); err != nil { return "", nil, "", nil, err } } @@ -311,7 +311,7 @@ func getStoresSql(ctx *jxcontext.Context, keyword string, params map[string]inte return sql, sqlParams, sqlFrom, sqlFromParams, nil } -func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresInfo, storeIDs []int) (err error) { +func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresInfo, storeIDs []int, briefLevel int) (err error) { storeMapList, err := dao.GetStoresMapList(db, nil, storeIDs, model.StoreStatusAll, model.StoreIsSyncAll, "") if err != nil { return err @@ -331,6 +331,9 @@ func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresIn } for _, v := range storesInfo.Stores { + if briefLevel > 0 { + v.DeliveryRange = "" + } for _, v2 := range storeMapMap[v.ID] { v.StoreMaps = append(v.StoreMaps, utils.Struct2FlatMap(v2)) } @@ -343,6 +346,7 @@ func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresIn // todo 门店绑定信息可以考虑以数组形式返回,而不是现在这样 func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interface{}, offset, pageSize int, orderTimeFrom, orderTimeTo time.Time, orderCountFrom, orderCountTo int) (retVal *StoresInfo, err error) { + briefLevel := int(utils.ForceInterface2Int64(params["briefLevel"])) sql, sqlParams, _, _, err := getStoresSql(ctx, keyword, params, orderTimeFrom, orderTimeTo) if err != nil { @@ -448,7 +452,7 @@ func GetStores(ctx *jxcontext.Context, keyword string, params map[string]interfa } if len(retVal.Stores) > 0 { - setStoreMapInfo(ctx, db, retVal, storeIDs) + setStoreMapInfo(ctx, db, retVal, storeIDs, briefLevel) retVal.MapCenterLng, retVal.MapCenterLat = getMapCenter(retVal.Stores) } return retVal, err @@ -1511,7 +1515,7 @@ func GetStoresVendorSnapshot(ctx *jxcontext.Context, parentTask tasksch.ITask, v task := tasksch.NewParallelTask("GetStoresVendorSnapshot", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeMap := batchItemList[0].(*model.StoreMap) - if storeMap.VendorID != model.VendorIDWSC { + if model.IsVendorRemote(storeMap.VendorID) { if handler := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID); handler != nil { store, err2 := handler.ReadStore(ctx, storeMap.VendorStoreID) if err = err2; err == nil { diff --git a/business/model/const.go b/business/model/const.go index 4256a46a0..d055752f7 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -27,7 +27,8 @@ var ( VendorIDMTWM: "美好菜市", VendorIDELM: "好菜鲜生", VendorIDEBAI: "好菜鲜生", - VendorIDWSC: "京西菜市", + VendorIDJX: "京西商城", + VendorIDWSC: "微盟微商城", } OrderStatusName = map[int]string{ @@ -268,7 +269,8 @@ const ( OrderFlagMaskCallPMCourier = 64 // 取货失败后召唤平台配送 OrderFlagMaskSetDelivered = 128 // 设置送达 - OrderFlagMaskFake = 256 // 假订单,即刷单用的 + OrderFlagMaskFake = 256 // 假订单,即刷单用的 + OrderFlagMaskTempJX = 512 // 临时京西订单 ) const ( @@ -340,8 +342,8 @@ func IsOrderImportantStatus(status int) bool { return IsOrderMainStatus(status) || IsOrderLockStatus(status) || IsOrderUnlockStatus(status) } -func IsSpecialVendorID(vendorID int) bool { - return vendorID == VendorIDWSC || vendorID == VendorIDJX +func IsVendorRemote(vendorID int) bool { + return vendorID >= VendorIDJD && vendorID <= VendorIDEBAI } func WaybillVendorID2Mask(vendorID int) (mask int8) { diff --git a/business/model/dao/food_recipe.go b/business/model/dao/food_recipe.go index 8f6b27e65..5228c87c3 100644 --- a/business/model/dao/food_recipe.go +++ b/business/model/dao/food_recipe.go @@ -25,7 +25,7 @@ type FoodRecipeItemChoiceExt struct { Comment string `json:"-"` } -func QueryFoodRecipes(db *DaoDB, keyword string, recipeID int, authorID, userID string, offset, pageSize int) (recipeList []*FoodRecipeWithAction, totalCount int, err error) { +func QueryFoodRecipes(db *DaoDB, keyword string, recipeID int, authorID, userID string, skuIDs []int, offset, pageSize int) (recipeList []*FoodRecipeWithAction, totalCount int, err error) { var sql string var sqlParams []interface{} if userID != "" { @@ -64,6 +64,14 @@ func QueryFoodRecipes(db *DaoDB, keyword string, recipeID int, authorID, userID sql += " AND t1.author_id = ?" sqlParams = append(sqlParams, authorID) } + if len(skuIDs) > 0 { + sql += ` AND ( + SELECT COUNT(*) + FROM food_recipe_item_choice t11 + WHERE t11.recipe_id = t1.id AND t11.sku_id IN (` + GenQuestionMarks(len(skuIDs)) + `) + ) > 0` + sqlParams = append(sqlParams, skuIDs) + } offset = FormalizePageOffset(offset) pageSize = FormalizePageSize(pageSize) sql += ` @@ -80,7 +88,7 @@ func QueryFoodRecipes(db *DaoDB, keyword string, recipeID int, authorID, userID } func GetRecommendFoodRecipes(db *DaoDB, keyword, userID string, offset, pageSize int) (recipeList []*model.FoodRecipe, totalCount int, err error) { - list, totalCount, err := QueryFoodRecipes(db, keyword, 0, userID, "", offset, pageSize) + list, totalCount, err := QueryFoodRecipes(db, keyword, 0, userID, "", nil, offset, pageSize) if err == nil { recipeList = FoodRecipeWithActionList2Recipe(list) } diff --git a/business/model/order.go b/business/model/order.go index fe19ca271..600446e87 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -285,3 +285,13 @@ func IsOrderDeliveryByStore(order *GoodsOrder) bool { func IsOrderDeliveryByPlatform(order *GoodsOrder) bool { return order.DeliveryType == OrderDeliveryTypePlatform } + +func IsOrderJXTemp(order *GoodsOrder) bool { + // return order.Flag&OrderFlagMaskTempJX != 0 + return true +} + +func IsAfsOrderJXTemp(order *AfsOrder) bool { + // return order.Flag&OrderFlagMaskTempJX != 0 + return true +} diff --git a/business/partner/purchase/jx/order.go b/business/partner/purchase/jx/order.go index df4c06acd..51df85de2 100644 --- a/business/partner/purchase/jx/order.go +++ b/business/partner/purchase/jx/order.go @@ -3,78 +3,13 @@ package jx import ( "time" - "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" - "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx" ) -type Data4Neworder struct { - model.GoodsOrder - Skus []*model.OrderSku `json:"skus"` -} - -func (c *PurchaseHandler) OnOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) { - jxutils.CallMsgHandler(func() { - retVal, errCode, err = c.onOrderMsg(msg) - }, jxutils.ComposeUniversalOrderID(msg.ThingID, c.GetVendorID())) - return retVal, errCode, err -} - -func (c *PurchaseHandler) onOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) { - subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)) - if subMsgType == model.OrderStatusNew || subMsgType == model.OrderStatusAdjust { - var order *Data4Neworder - if err = utils.UnmarshalUseNumber([]byte(msg.Data), &order); err == nil { - if order.VendorStatus == "" { - order.VendorStatus = utils.Int2Str(order.Status) - } - retVal, errCode, err = c.onOrderNew(msg, subMsgType, order) - } - } else { - status := c.callbackMsg2Status(msg) - err = partner.CurOrderManager.OnOrderStatusChanged(status) - } - return retVal, errCode, err -} - -func (c *PurchaseHandler) callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus { - orderStatus := &model.OrderStatus{ - VendorOrderID: msg.ThingID, - VendorID: model.VendorIDJX, - OrderType: model.OrderTypeOrder, - RefVendorOrderID: msg.ThingID, - RefVendorID: model.VendorIDJX, - VendorStatus: msg.SubMsgType, - Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)), - StatusTime: utils.Timestamp2Time(msg.Timestamp), - Remark: "", - } - return orderStatus -} - -func (c *PurchaseHandler) onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) { - globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID) - order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0)) - order.DeliveryType = model.OrderDeliveryTypeStoreSelf - order.GoodsOrder.Skus = order.Skus - order.VendorID = model.VendorIDJX - for _, v := range order.GoodsOrder.Skus { - v.SkuID = int(utils.Str2Int64WithDefault(v.VendorSkuID, 0)) - } - jxutils.RefreshOrderSkuRelated(&order.GoodsOrder) - orderStatus := model.Order2Status(&order.GoodsOrder) - if subMsgType == model.OrderStatusNew { - err = partner.CurOrderManager.OnOrderNew(&order.GoodsOrder, orderStatus) - } else if subMsgType == model.OrderStatusAdjust { - err = partner.CurOrderManager.OnOrderAdjust(&order.GoodsOrder, orderStatus) - } - return retVal, errCode, err -} - func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) { return order } @@ -90,12 +25,16 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI } else { status = model.OrderStatusCanceled } - err = c.notifyOrderStatusChanged(order, status) + if model.IsOrderJXTemp(order) { + err = phpjx.NotifyOrderStatusChanged(order, status) + } return err } func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { - err = c.notifyOrderStatusChanged(order, model.OrderStatusFinishedPickup) + if model.IsOrderJXTemp(order) { + err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinishedPickup) + } return err } @@ -120,13 +59,16 @@ func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName } func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { - err = c.notifyOrderStatusChanged(order, model.OrderStatusDelivering) + if model.IsOrderJXTemp(order) { + err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusDelivering) + } return err } -// 京东送达接口都是一样的 func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { - err = c.notifyOrderStatusChanged(order, model.OrderStatusFinished) + if model.IsOrderJXTemp(order) { + err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinished) + } return err } @@ -139,7 +81,9 @@ func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod } func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { - err = c.notifyOrderStatusChanged(order, model.OrderStatusCanceled) + if model.IsOrderJXTemp(order) { + err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusCanceled) + } return err } @@ -162,16 +106,9 @@ func (c *PurchaseHandler) AddWaybillTip(ctx *jxcontext.Context, order *model.Goo func (c *PurchaseHandler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID, selfTakeCode string) (err error) { order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX) if err == nil { - err = c.notifyOrderStatusChanged(order, model.OrderStatusFinished) - } - return err -} - -func (c *PurchaseHandler) notifyOrderStatusChanged(order *model.GoodsOrder, status int) (err error) { - orderMsg := *order - orderMsg.Status = status - if err = jxAPI.NotifyOrderStatusChanged(&orderMsg); err == nil { - c.postFakeMsg(orderMsg.VendorOrderID, orderMsg.Status) + if model.IsOrderJXTemp(order) { + err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinished) + } } return err } diff --git a/business/partner/purchase/jx/order_afs.go b/business/partner/purchase/jx/order_afs.go index 51af9b84a..53319ea39 100644 --- a/business/partner/purchase/jx/order_afs.go +++ b/business/partner/purchase/jx/order_afs.go @@ -2,134 +2,13 @@ package jx import ( "fmt" - "time" - "git.rosy.net.cn/baseapi/platformapi/jdapi" - "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx" ) -type Data4AfsOrderSku struct { - VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"` // 平台skuid - PromotionType int `json:"promotionType"` // 商品级别促销类型 (1、无优惠;2、秒杀(已经下线);3、单品直降;4、限时抢购;1202、加价购;1203、满赠(标识商品);6、买赠(买A送B,标识B);9999、表示一个普通商品参与捆绑促销,设置的捆绑类型;9998、表示一个商品参与了捆绑促销,并且还参与了其他促销类型;9997、表示一个商品参与了捆绑促销,但是金额拆分不尽,9996:组合购,8001:轻松购会员价,8:第二件N折,9:拼团促销) - Name string `orm:"size(255)" json:"name"` // 商品名 - SalePrice int64 `json:"salePrice"` // 售卖价 - Count int `json:"count"` // 订单下单数量 -} - -type Data4AfsOrder struct { - VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` // 关联原始订单ID - AfsOrderID string `orm:"column(afs_order_id);size(48)" json:"afsOrderID"` // 售后订单ID - AfsCreatedAt time.Time `orm:"type(datetime);null;index" json:"afsCreatedAt"` // 售后单生成时间 - VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` // 外部系统里记录的storeid - - VendorStatus string `orm:"size(255)" json:"vendorStatus"` - VendorReasonType string `orm:"size(255)" json:"vendorReasonType"` // 原始售后原因 - ReasonDesc string `orm:"size(1024)" json:"reasonDesc"` // 售后原因描述 - ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片 - VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式 - Skus []*Data4AfsOrderSku -} - -func (c *PurchaseHandler) OnAfsOrderMsg(msg *CallbackMsg) (err error) { - jxutils.CallMsgHandlerAsync(func() { - err = c.onAfsOrderMsg(msg) - }, jxutils.ComposeUniversalOrderID(msg.ThingID, c.GetVendorID())) - return err -} - -func (c *PurchaseHandler) buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) { - var afsOrder *Data4AfsOrder - if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil { - outAfsOrder = &model.AfsOrder{ - VendorID: model.VendorIDJX, - AfsOrderID: afsOrder.AfsOrderID, - VendorOrderID: afsOrder.VendorOrderID, - VendorStoreID: afsOrder.VendorStoreID, - StoreID: int(utils.Str2Int64WithDefault(afsOrder.VendorStoreID, 0)), - AfsCreatedAt: afsOrder.AfsCreatedAt, - - VendorStatus: afsOrder.VendorStatus, - VendorReasonType: afsOrder.VendorReasonType, - ReasonType: int8(utils.Str2Int64WithDefault(afsOrder.VendorReasonType, 0)), - ReasonDesc: utils.LimitUTF8StringLen(afsOrder.ReasonDesc, 1024), - ReasonImgList: afsOrder.ReasonImgList, - VendorAppealType: afsOrder.VendorAppealType, - AppealType: int8(utils.Str2Int64WithDefault(afsOrder.VendorAppealType, 0)), - } - outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0)) - - for _, x := range afsOrder.Skus { - orderSku := &model.OrderSkuFinancial{ - Count: x.Count, - VendorSkuID: x.VendorSkuID, - SkuID: int(utils.Str2Int64WithDefault(x.VendorSkuID, 0)), - Name: x.Name, - } - if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal { - orderSku.StoreSubName = utils.Int2Str(x.PromotionType) - } - outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku) - } - } - return outAfsOrder, err -} - -func (c *PurchaseHandler) callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus { - orderStatus := &model.OrderStatus{ - VendorOrderID: msg.ThingID2, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 - VendorID: model.VendorIDJX, - OrderType: model.OrderTypeAfsOrder, - RefVendorOrderID: msg.ThingID, - RefVendorID: model.VendorIDJX, - VendorStatus: msg.SubMsgType, - Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)), - StatusTime: utils.Timestamp2Time(msg.Timestamp), - Remark: "", - } - return orderStatus -} - -func (c *PurchaseHandler) onAfsOrderMsg(msg *CallbackMsg) (err error) { - subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)) - status := c.callbackAfsMsg2Status(msg) - if subMsgType == model.AfsOrderStatusWait4Approve || subMsgType == model.AfsOrderStatusNew { - afsOrder, err2 := c.buildAfsOrder(msg) - if err = err2; err == nil { - err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, status) - } - } else { - err = partner.CurOrderManager.OnOrderStatusChanged(status) - } - return err -} - -func (p *PurchaseHandler) postFakeAfsMsg(orderNo, afsOrderID string, status int) { - msg := &CallbackMsg{ - AppKey: appKey, - MsgType: MsgTypeAfsOrder, - SubMsgType: utils.Int2Str(status), - ThingID: orderNo, - ThingID2: afsOrderID, - Timestamp: time.Now().Unix(), - } - utils.CallFuncAsync(func() { - OnCallbackMsg(msg) - }) -} - -func (c *PurchaseHandler) notifyAfsOrderStatusChanged(order *model.AfsOrder, status int) (err error) { - orderMsg := *order - orderMsg.Status = status - if err = jxAPI.NotifyAfsOrderStatusChanged(&orderMsg); err == nil { - c.postFakeAfsMsg(orderMsg.VendorOrderID, orderMsg.AfsOrderID, orderMsg.Status) - } - return err -} - // 审核售后单申请 func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) { var status int @@ -138,7 +17,10 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod } else { status = model.AfsOrderStatusFinished } - return c.notifyAfsOrderStatusChanged(order, status) + if model.IsAfsOrderJXTemp(order) { + err = phpjx.NotifyAfsOrderStatusChanged(order, status) + } + return err } // 确认收到退货 diff --git a/business/partner/purchase/jx/callback.go b/business/partner/purchase/jx/phpjx/callback.go similarity index 85% rename from business/partner/purchase/jx/callback.go rename to business/partner/purchase/jx/phpjx/callback.go index 27e8cce7d..49dc06968 100644 --- a/business/partner/purchase/jx/callback.go +++ b/business/partner/purchase/jx/phpjx/callback.go @@ -1,4 +1,4 @@ -package jx +package phpjx import ( "fmt" @@ -34,14 +34,14 @@ func OnCallbackMsg(msg *CallbackMsg) (retVal, errCode string, err error) { return retVal, errCode, fmt.Errorf("无效的AppKey:%s", msg.AppKey) } if msg.MsgType == MsgTypeOrder { - retVal, errCode, err = CurPurchaseHandler.OnOrderMsg(msg) + retVal, errCode, err = OnOrderMsg(msg) } else if msg.MsgType == MsgTypeAfsOrder { - err = CurPurchaseHandler.OnAfsOrderMsg(msg) + err = OnAfsOrderMsg(msg) } return retVal, errCode, err } -func (p *PurchaseHandler) postFakeMsg(orderNo string, status int) { +func postFakeMsg(orderNo string, status int) { msg := &CallbackMsg{ AppKey: appKey, MsgType: MsgTypeOrder, diff --git a/business/partner/purchase/jx/jx_test.go b/business/partner/purchase/jx/phpjx/callback_test.go similarity index 98% rename from business/partner/purchase/jx/jx_test.go rename to business/partner/purchase/jx/phpjx/callback_test.go index 8ba8e260f..361777628 100644 --- a/business/partner/purchase/jx/jx_test.go +++ b/business/partner/purchase/jx/phpjx/callback_test.go @@ -1,4 +1,4 @@ -package jx +package phpjx import ( "testing" diff --git a/business/partner/purchase/jx/jxapi.go b/business/partner/purchase/jx/phpjx/jxapi.go similarity index 99% rename from business/partner/purchase/jx/jxapi.go rename to business/partner/purchase/jx/phpjx/jxapi.go index 89f30856f..1c6cd25a4 100644 --- a/business/partner/purchase/jx/jxapi.go +++ b/business/partner/purchase/jx/phpjx/jxapi.go @@ -1,4 +1,4 @@ -package jx +package phpjx import ( "fmt" diff --git a/business/partner/purchase/jx/jxapi_order.go b/business/partner/purchase/jx/phpjx/jxapi_order.go similarity index 98% rename from business/partner/purchase/jx/jxapi_order.go rename to business/partner/purchase/jx/phpjx/jxapi_order.go index e451dab83..ef2befb2f 100644 --- a/business/partner/purchase/jx/jxapi_order.go +++ b/business/partner/purchase/jx/phpjx/jxapi_order.go @@ -1,4 +1,4 @@ -package jx +package phpjx import ( "git.rosy.net.cn/jx-callback/business/model" @@ -42,3 +42,4 @@ func (a *API) NotifyAfsOrderStatusChanged(afsOrder *model.AfsOrder) (err error) } return err } + diff --git a/business/partner/purchase/jx/jxapi_order_test.go b/business/partner/purchase/jx/phpjx/jxapi_order_test.go similarity index 96% rename from business/partner/purchase/jx/jxapi_order_test.go rename to business/partner/purchase/jx/phpjx/jxapi_order_test.go index be0939963..d74be9133 100644 --- a/business/partner/purchase/jx/jxapi_order_test.go +++ b/business/partner/purchase/jx/phpjx/jxapi_order_test.go @@ -1,4 +1,4 @@ -package jx +package phpjx import ( "testing" diff --git a/business/partner/purchase/jx/phpjx/order.go b/business/partner/purchase/jx/phpjx/order.go new file mode 100644 index 000000000..0b513e4b4 --- /dev/null +++ b/business/partner/purchase/jx/phpjx/order.go @@ -0,0 +1,82 @@ +package phpjx + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" +) + +func NotifyOrderStatusChanged(order *model.GoodsOrder, status int) (err error) { + orderMsg := *order + orderMsg.Status = status + if err = jxAPI.NotifyOrderStatusChanged(&orderMsg); err == nil { + postFakeMsg(orderMsg.VendorOrderID, orderMsg.Status) + } + return err +} + +type Data4Neworder struct { + model.GoodsOrder + Skus []*model.OrderSku `json:"skus"` +} + +func OnOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) { + jxutils.CallMsgHandler(func() { + retVal, errCode, err = onOrderMsg(msg) + }, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX)) + return retVal, errCode, err +} + +func onOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) { + subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)) + if subMsgType == model.OrderStatusNew || subMsgType == model.OrderStatusAdjust { + var order *Data4Neworder + if err = utils.UnmarshalUseNumber([]byte(msg.Data), &order); err == nil { + if order.VendorStatus == "" { + order.VendorStatus = utils.Int2Str(order.Status) + } + retVal, errCode, err = onOrderNew(msg, subMsgType, order) + } + } else { + status := callbackMsg2Status(msg) + err = partner.CurOrderManager.OnOrderStatusChanged(status) + } + return retVal, errCode, err +} + +func callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus { + orderStatus := &model.OrderStatus{ + VendorOrderID: msg.ThingID, + VendorID: model.VendorIDJX, + OrderType: model.OrderTypeOrder, + RefVendorOrderID: msg.ThingID, + RefVendorID: model.VendorIDJX, + VendorStatus: msg.SubMsgType, + Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)), + StatusTime: utils.Timestamp2Time(msg.Timestamp), + Remark: "", + } + return orderStatus +} + +func onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) { + globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID) + order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0)) + order.DeliveryType = model.OrderDeliveryTypeStoreSelf + order.GoodsOrder.Skus = order.Skus + order.VendorID = model.VendorIDJX + order.Flag = model.OrderFlagMaskTempJX + for _, v := range order.GoodsOrder.Skus { + v.SkuID = int(utils.Str2Int64WithDefault(v.VendorSkuID, 0)) + } + jxutils.RefreshOrderSkuRelated(&order.GoodsOrder) + orderStatus := model.Order2Status(&order.GoodsOrder) + if subMsgType == model.OrderStatusNew { + err = partner.CurOrderManager.OnOrderNew(&order.GoodsOrder, orderStatus) + } else if subMsgType == model.OrderStatusAdjust { + err = partner.CurOrderManager.OnOrderAdjust(&order.GoodsOrder, orderStatus) + } + return retVal, errCode, err +} diff --git a/business/partner/purchase/jx/phpjx/order_afs.go b/business/partner/purchase/jx/phpjx/order_afs.go new file mode 100644 index 000000000..bb604c9aa --- /dev/null +++ b/business/partner/purchase/jx/phpjx/order_afs.go @@ -0,0 +1,130 @@ +package phpjx + +import ( + "time" + + "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" +) + +type Data4AfsOrderSku struct { + VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"` // 平台skuid + PromotionType int `json:"promotionType"` // 商品级别促销类型 (1、无优惠;2、秒杀(已经下线);3、单品直降;4、限时抢购;1202、加价购;1203、满赠(标识商品);6、买赠(买A送B,标识B);9999、表示一个普通商品参与捆绑促销,设置的捆绑类型;9998、表示一个商品参与了捆绑促销,并且还参与了其他促销类型;9997、表示一个商品参与了捆绑促销,但是金额拆分不尽,9996:组合购,8001:轻松购会员价,8:第二件N折,9:拼团促销) + Name string `orm:"size(255)" json:"name"` // 商品名 + SalePrice int64 `json:"salePrice"` // 售卖价 + Count int `json:"count"` // 订单下单数量 +} + +type Data4AfsOrder struct { + VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` // 关联原始订单ID + AfsOrderID string `orm:"column(afs_order_id);size(48)" json:"afsOrderID"` // 售后订单ID + AfsCreatedAt time.Time `orm:"type(datetime);null;index" json:"afsCreatedAt"` // 售后单生成时间 + VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` // 外部系统里记录的storeid + + VendorStatus string `orm:"size(255)" json:"vendorStatus"` + VendorReasonType string `orm:"size(255)" json:"vendorReasonType"` // 原始售后原因 + ReasonDesc string `orm:"size(1024)" json:"reasonDesc"` // 售后原因描述 + ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片 + VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式 + Skus []*Data4AfsOrderSku +} + +func OnAfsOrderMsg(msg *CallbackMsg) (err error) { + jxutils.CallMsgHandlerAsync(func() { + err = onAfsOrderMsg(msg) + }, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX)) + return err +} + +func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) { + var afsOrder *Data4AfsOrder + if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil { + outAfsOrder = &model.AfsOrder{ + VendorID: model.VendorIDJX, + AfsOrderID: afsOrder.AfsOrderID, + VendorOrderID: afsOrder.VendorOrderID, + VendorStoreID: afsOrder.VendorStoreID, + StoreID: int(utils.Str2Int64WithDefault(afsOrder.VendorStoreID, 0)), + AfsCreatedAt: afsOrder.AfsCreatedAt, + + VendorStatus: afsOrder.VendorStatus, + VendorReasonType: afsOrder.VendorReasonType, + ReasonType: int8(utils.Str2Int64WithDefault(afsOrder.VendorReasonType, 0)), + ReasonDesc: utils.LimitUTF8StringLen(afsOrder.ReasonDesc, 1024), + ReasonImgList: afsOrder.ReasonImgList, + VendorAppealType: afsOrder.VendorAppealType, + AppealType: int8(utils.Str2Int64WithDefault(afsOrder.VendorAppealType, 0)), + Flag: model.OrderFlagMaskTempJX, + } + outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0)) + + for _, x := range afsOrder.Skus { + orderSku := &model.OrderSkuFinancial{ + Count: x.Count, + VendorSkuID: x.VendorSkuID, + SkuID: int(utils.Str2Int64WithDefault(x.VendorSkuID, 0)), + Name: x.Name, + } + if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal { + orderSku.StoreSubName = utils.Int2Str(x.PromotionType) + } + outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku) + } + } + return outAfsOrder, err +} + +func callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus { + orderStatus := &model.OrderStatus{ + VendorOrderID: msg.ThingID2, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 + VendorID: model.VendorIDJX, + OrderType: model.OrderTypeAfsOrder, + RefVendorOrderID: msg.ThingID, + RefVendorID: model.VendorIDJX, + VendorStatus: msg.SubMsgType, + Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)), + StatusTime: utils.Timestamp2Time(msg.Timestamp), + Remark: "", + } + return orderStatus +} + +func onAfsOrderMsg(msg *CallbackMsg) (err error) { + subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)) + status := callbackAfsMsg2Status(msg) + if subMsgType == model.AfsOrderStatusWait4Approve || subMsgType == model.AfsOrderStatusNew { + afsOrder, err2 := buildAfsOrder(msg) + if err = err2; err == nil { + err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, status) + } + } else { + err = partner.CurOrderManager.OnOrderStatusChanged(status) + } + return err +} + +func postFakeAfsMsg(orderNo, afsOrderID string, status int) { + msg := &CallbackMsg{ + AppKey: appKey, + MsgType: MsgTypeAfsOrder, + SubMsgType: utils.Int2Str(status), + ThingID: orderNo, + ThingID2: afsOrderID, + Timestamp: time.Now().Unix(), + } + utils.CallFuncAsync(func() { + OnCallbackMsg(msg) + }) +} + +func NotifyAfsOrderStatusChanged(order *model.AfsOrder, status int) (err error) { + orderMsg := *order + orderMsg.Status = status + if err = jxAPI.NotifyAfsOrderStatusChanged(&orderMsg); err == nil { + postFakeAfsMsg(orderMsg.VendorOrderID, orderMsg.AfsOrderID, orderMsg.Status) + } + return err +} diff --git a/business/userstore/food_recipe.go b/business/userstore/food_recipe.go index 541921db3..af0254ad8 100644 --- a/business/userstore/food_recipe.go +++ b/business/userstore/food_recipe.go @@ -200,9 +200,9 @@ func tryRegisterDataRes4Recipe(ctx *jxcontext.Context, name, mainImg string, ste return errList.GetErrListAsOne() } -func QueryFoodRecipes(ctx *jxcontext.Context, keyword, authorID string, offset, pageSize int) (recipeInfo *model.PagedInfo, err error) { +func QueryFoodRecipes(ctx *jxcontext.Context, keyword, authorID string, skuIDs []int, offset, pageSize int) (recipeInfo *model.PagedInfo, err error) { _, userID := ctx.GetMobileAndUserID() - recipeList, totalCount, err := dao.QueryFoodRecipes(dao.GetDB(), keyword, 0, authorID, userID, offset, pageSize) + recipeList, totalCount, err := dao.QueryFoodRecipes(dao.GetDB(), keyword, 0, authorID, userID, skuIDs, offset, pageSize) if err == nil { recipeInfo = &model.PagedInfo{ TotalCount: totalCount, @@ -227,7 +227,7 @@ func GetRecommendFoodRecipes(ctx *jxcontext.Context, keyword string, offset, pag func GetRecipeDetail(ctx *jxcontext.Context, recipeID int) (recipeDetail *FoodRecipeDetail, err error) { _, userID := ctx.GetMobileAndUserID() db := dao.GetDB() - recipeList, _, err := dao.QueryFoodRecipes(db, "", recipeID, "", userID, 0, 0) + recipeList, _, err := dao.QueryFoodRecipes(db, "", recipeID, "", userID, nil, 0, 0) if err != nil { return nil, err } @@ -275,7 +275,7 @@ func VoteFoodRecipe(ctx *jxcontext.Context, recipeID, voteType int) (err error) } db := dao.GetDB() - recipeList, _, err := dao.QueryFoodRecipes(db, "", recipeID, "", userID, 0, 0) + recipeList, _, err := dao.QueryFoodRecipes(db, "", recipeID, "", userID, nil, 0, 0) if err != nil { return err } diff --git a/controllers/cms_food_recipe.go b/controllers/cms_food_recipe.go index d94e23de8..ca78723ca 100644 --- a/controllers/cms_food_recipe.go +++ b/controllers/cms_food_recipe.go @@ -75,6 +75,7 @@ func (c *FoodRecipeController) UpdateFoodRecipe() { // @Param token header string true "认证token" // @Param keyword query string false "关键字" // @Param authorID query string false "创建者ID" +// @Param skuIDs query string false "skuID列表" // @Param offset query int false "菜谱列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "菜谱列表页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult @@ -82,7 +83,10 @@ func (c *FoodRecipeController) UpdateFoodRecipe() { // @router /QueryFoodRecipes [get] func (c *FoodRecipeController) QueryFoodRecipes() { c.callQueryFoodRecipes(func(params *tFoodrecipeQueryFoodRecipesParams) (retVal interface{}, errCode string, err error) { - retVal, err = userstore.QueryFoodRecipes(params.Ctx, params.Keyword, params.AuthorID, params.Offset, params.PageSize) + var skuIDs []int + if err = jxutils.Strings2Objs(params.SkuIDs, &skuIDs); err == nil { + retVal, err = userstore.QueryFoodRecipes(params.Ctx, params.Keyword, params.AuthorID, skuIDs, params.Offset, params.PageSize) + } return retVal, "", err }) } diff --git a/controllers/cms_store.go b/controllers/cms_store.go index b6b27bde7..64196873d 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -39,6 +39,7 @@ type StoreController struct { // @Param orderTimeTo query string false "订单创建结束时间" // @Param orderCountFrom query int false "订单量起始" // @Param orderCountTo query int false "订单量结束" +// @Param briefLevel query int false "返回信息精简模式" // @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult diff --git a/controllers/jxshop_callback.go b/controllers/jxshop_callback.go index 89ad0d73a..911f9a365 100644 --- a/controllers/jxshop_callback.go +++ b/controllers/jxshop_callback.go @@ -1,7 +1,7 @@ package controllers import ( - "git.rosy.net.cn/jx-callback/business/partner/purchase/jx" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx" "github.com/astaxie/beego" ) @@ -21,7 +21,7 @@ type JxShopController struct { // @router /JxMsg [post] func (c *JxShopController) JxMsg(msgType string) { c.callJxMsg(func(params *tJxshopJxMsgParams) (retVal interface{}, errCode string, err error) { - retVal, errCode, err = jx.OnCallbackMsg(&jx.CallbackMsg{ + retVal, errCode, err = phpjx.OnCallbackMsg(&phpjx.CallbackMsg{ AppKey: params.AppKey, MsgType: params.MsgType, SubMsgType: params.SubMsgType,