Merge remote-tracking branch 'origin/mark' into su
This commit is contained in:
@@ -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])
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -27,7 +27,8 @@ var (
|
||||
VendorIDMTWM: "美好菜市",
|
||||
VendorIDELM: "好菜鲜生",
|
||||
VendorIDEBAI: "好菜鲜生",
|
||||
VendorIDWSC: "京西菜市",
|
||||
VendorIDJX: "京西商城",
|
||||
VendorIDWSC: "微盟微商城",
|
||||
}
|
||||
|
||||
OrderStatusName = map[int]string{
|
||||
@@ -269,6 +270,7 @@ const (
|
||||
OrderFlagMaskSetDelivered = 128 // 设置送达
|
||||
|
||||
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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
// 确认收到退货
|
||||
|
||||
@@ -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,
|
||||
@@ -1,4 +1,4 @@
|
||||
package jx
|
||||
package phpjx
|
||||
|
||||
import (
|
||||
"testing"
|
||||
@@ -1,4 +1,4 @@
|
||||
package jx
|
||||
package phpjx
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package jx
|
||||
package phpjx
|
||||
|
||||
import (
|
||||
"testing"
|
||||
82
business/partner/purchase/jx/phpjx/order.go
Normal file
82
business/partner/purchase/jx/phpjx/order.go
Normal file
@@ -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
|
||||
}
|
||||
130
business/partner/purchase/jx/phpjx/order_afs.go
Normal file
130
business/partner/purchase/jx/phpjx/order_afs.go
Normal file
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user