diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index e8d5d9ce4..3b0e5dc1f 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -950,7 +950,6 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s } func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interface{}, isExd bool) (num int64, err error) { - globals.SugarLogger.Debugf("==========payload %s", utils.Format4Output(payload, false)) userName := ctx.GetUserName() skuName := &model.SkuName{} skuName.ID = nameID @@ -1026,10 +1025,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf panic(r) } }() - globals.SugarLogger.Debugf("UpdateEntityLogically 1 := %s", utils.Format4Output(skuName, false)) - globals.SugarLogger.Debugf("UpdateEntityLogically 2 := %s", utils.Format4Output(valid, false)) - globals.SugarLogger.Debugf("UpdateEntityLogically 3 := %s", userName) - // valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err != nil { dao.Rollback(db, txDB) return 0, err @@ -1087,23 +1082,25 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } if len(skuIDs) > 0 { // 判断是否改价 - nowPrice, _ := payload["price"].(json.Number).Int64() - if skuName.Price != int(nowPrice) && nowPrice != 0 { + if payload["price"] != nil { + nowPrice, _ := payload["price"].(json.Number).Int64() + if skuName.Price != int(nowPrice) && nowPrice != 0 { - for _, v1 := range payload["skus"].([]interface{}) { - v := v1.(map[string]interface{}) - skuInfo := &aa{} - if err := utils.Map2StructByJson(v, skuInfo, false); err != nil { - globals.SugarLogger.Debugf("errr %v", err) - continue + for _, v1 := range payload["skus"].([]interface{}) { + v := v1.(map[string]interface{}) + skuInfo := &aa{} + if err := utils.Map2StructByJson(v, skuInfo, false); err != nil { + globals.SugarLogger.Debugf("errr %v", err) + continue + } + var skuPrice int64 = 0 + if payload["unit"] == "份" { // 商品规格等于份的时候,标准重量保持为500g + skuPrice = int64(float64(skuInfo.SpecQuality) / float64(500) * float64(nowPrice)) + } else { + skuPrice = nowPrice + } + SetUpdateSkuPriceIfChange(db, skuPrice, nowPrice, skuInfo.Id) } - var skuPrice int64 = 0 - if payload["unit"] == "份" { // 商品规格等于份的时候,标准重量保持为500g - skuPrice = int64(float64(skuInfo.SpecQuality) / float64(500) * float64(nowPrice)) - } else { - skuPrice = nowPrice - } - SetUpdateSkuPriceIfChange(db, skuPrice, nowPrice, skuInfo.Id) } } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index c9ece74c9..a90fff742 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -523,6 +523,7 @@ func setStoreMapInfo(ctx *jxcontext.Context, db *dao.DaoDB, storesInfo *StoresIn v.IDCardFront = "" v.IDCardBack = "" v.IDCardHand = "" + v.IDCardHandBack = "" v.Licence = "" v.Licence2Image = "" } @@ -3526,7 +3527,7 @@ func GetStoreCategoryMap(ctx *jxcontext.Context, parentID, level int, storeID in if err != nil { return nil, err } - if ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile { + if ctx.GetLoginType() != auth2.AuthTypePassword && ctx.GetLoginType() != weixin.AuthTypeMP && ctx.GetLoginType() != weixin.AuthTypeMini && ctx.GetLoginType() != weixin.AuthTypeWxApp && ctx.GetLoginType() != weixin.AuthTypeWxAppCaishi && ctx.GetLoginType() != auth2.AuthTypeMobile { return storeCatMaps, err } //表示没有门店分类 @@ -4455,7 +4456,7 @@ func RefreshTiktokShopToken(ctx *jxcontext.Context) (err error) { v.UpdatedAt = time.Now() v.StoreBrandName = "定时任务更新" dao.UpdateEntity(db, v, "Token", "UpdatedAt", "StoreBrandName") - tiktok_store.HttpToGuoYuan(utils.Struct2MapByJson(v), "token") + tiktok_store.HttpToGuoYuan(utils.Struct2MapByJson(v), tiktok_store.CaiShiPushGyTagToken) } } } diff --git a/business/model/store.go b/business/model/store.go index 763dcdb04..f0b292cff 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -340,10 +340,10 @@ type Store struct { PrinterSound string `json:"printerSound"` //打印机语音,京西打印机 PrinterTemplate string `json:"printerTemplate"` //打印模板。京西打印机 - IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` - IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` - IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"` - Licence string `orm:"size(255)" json:"licence"` // 营业执照图片 + IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"` // 身份证正面 + IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"` // 身份证背面 + IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"` // 手持身份证正面 + Licence string `orm:"size(255)" json:"licence"` // 营业执照图片 LicenceCode string `orm:"size(32)" json:"licenceCode"` LicenceType int8 `json:"licenceType"` // 营业执照类型,0:个人,1:公司 @@ -390,13 +390,14 @@ type Store struct { OperatorPhone3 string `orm:"size(16)" json:"operatorPhone3"` // 饿百运营人电话 OperatorRole3 string `orm:"size(32)" json:"operatorRole3"` // 饿百运营人组(角色) - PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告) - IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料 - SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例 - Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图 - BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID - IsPrintCancelOrder int `orm:"column(is_print_cancel_order)" json:"isPrintCancelOrder"` //是否打印取消订单1是/-1否 - IsPrintRefundOrder int `orm:"column(is_print_refund_order)" json:"isPrintRefundOrder"` //是否打印退款订单1是/-1否 + PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告) + IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料 + SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例 + Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图 + BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID + IsPrintCancelOrder int `orm:"column(is_print_cancel_order)" json:"isPrintCancelOrder"` //是否打印取消订单1是/-1否 + IsPrintRefundOrder int `orm:"column(is_print_refund_order)" json:"isPrintRefundOrder"` //是否打印退款订单1是/-1否 + IDCardHandBack string `orm:"size(255);column(id_card_hand_back)" json:"idCardHandBack"` // 手持身份证背面 } func (*Store) TableUnique() [][]string { diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index f4d92ddb1..5eea2f695 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -1,6 +1,7 @@ package ebai import ( + "errors" "fmt" "math" "strings" @@ -387,23 +388,36 @@ func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *mod // 将订单从购物平台配送转为自送 func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { if globals.EnableEbaiStoreWrite { - if order.DeliveryType == model.OrderDeliveryTypePlatform { - if err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID); err != nil { - if strings.Contains(err.Error(), "301251") { - api.EbaiAPI.OrderCancelDelivery(order.VendorOrderID) // 取消呼叫众包骑手 - } - if utils.IsErrMatch(err, "301251", nil) { - if deliveryStatus, err2 := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err2 == nil { - deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatus["status"])) - if deliveryStatus == ebaiapi.WaybillStatusSelfDelivery { - err = nil - } else if deliveryStatus == ebaiapi.WaybillStatusDeliveryCancled { - p.trySyncCancelStatus(order.VendorOrderID) - } - } - } - } + deliveryStatusObj, _ := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID) + deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatusObj["status"])) + switch deliveryStatus { + case ebaiapi.WaybillStatusSelfDelivery: + err = nil + case ebaiapi.WaybillStatusDeliveryCancled: + p.trySyncCancelStatus(order.VendorOrderID) + case ebaiapi.WaybillStatusNew, ebaiapi.WaybillStatusRequestDelivery, ebaiapi.WaybillStatusWait4Courier: + err = api.EbaiAPI.OrderCancelDelivery(order.VendorOrderID) // 取消呼叫众包骑手 + case ebaiapi.WaybillStatusCourierAccepted: + err = errors.New("骑手已接单,无法转自送") } + + //if order.DeliveryType == model.OrderDeliveryTypePlatform { + // if err = api.EbaiAPI.OrderSwitchselfdelivery(order.VendorOrderID); err != nil { + // if strings.Contains(err.Error(), "301251") { + // api.EbaiAPI.OrderCancelDelivery(order.VendorOrderID) // 取消呼叫众包骑手 + // } + // if utils.IsErrMatch(err, "301251", nil) { + // if deliveryStatus, err2 := api.EbaiAPI.OrderDeliveryGet(order.VendorOrderID); err2 == nil { + // deliveryStatus := utils.Int64ToStr(utils.MustInterface2Int64(deliveryStatus["status"])) + // if deliveryStatus == ebaiapi.WaybillStatusSelfDelivery { + // err = nil + // } else if deliveryStatus == ebaiapi.WaybillStatusDeliveryCancled { + // p.trySyncCancelStatus(order.VendorOrderID) + // } + // } + // } + // } + //} } if err == nil { // 饿百不会发送配送中,模拟发送 diff --git a/business/partner/purchase/tiktok_store/callback.go b/business/partner/purchase/tiktok_store/callback.go index 9211a667a..205742f57 100644 --- a/business/partner/purchase/tiktok_store/callback.go +++ b/business/partner/purchase/tiktok_store/callback.go @@ -6,69 +6,98 @@ 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/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" + "io/ioutil" "net/http" "strings" + "time" +) + +// 同一账号下,菜市消息推送到果园 +const ( + CaiShiPushGyTagOrder = "order" // 订单 + CaiShiPushGyTagToken = "token" // 授权 + CaiShiPushGyTagDeliveryRegister = "delivery" // 配送注册查询 + CaiShiPushGyTagDeliveryDetail = "deliveryDetail" // 配送详情 + CaiShiPushGyTagWayBill = "waybill" // 配送 ) // OnOrderMsg 抖音 func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) { + globals.SugarLogger.Debugf("guoyuan %s,%s", msgId, utils.Format4Output(msg, false)) if CurPurchaseHandler != nil { orderId, shopId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg) - globals.SugarLogger.Debugf("order_id %s,%s", orderId, shopId) - //orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId) - //if err != nil { - // return tiktokShop.Err2CallbackResponse(err, "") - //} - //vendorStoreID := orderDetail.ShopId - //if vendorStoreID != 0 { - // storeDetail, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), utils.Int64ToStr(vendorStoreID), model.VendorIDDD, "") - // if err != nil || storeDetail == nil || storeDetail.Store.ID == 0 { - // // 当前订单所属门店不属于菜市时,将消息推送到果园 - // gyMsg := map[string]interface{}{"tag": msgId, "msg_id": utils.Int64ToStr(time.Now().Unix()) + msgId, "data": msg} - // // 通知到果园 - // gyResult, err := HttpToGuoYuan(gyMsg, "order") - // if err != nil { - // return tiktokShop.Err2CallbackResponse(err, "") - // } - // result, _ := ioutil.ReadAll(gyResult.Body) - // var guoYuan *tiktokShop.CallbackResponse - // if err := json.Unmarshal(result, guoYuan); err != nil { - // return tiktokShop.Err2CallbackResponse(err, "") - // } - // return guoYuan - // } - //} + globals.SugarLogger.Debugf("order_id %s,%d", orderId, shopId) + orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId) + if err != nil { + return tiktokShop.Err2CallbackResponse(err, "") + } + vendorStoreID := orderDetail.SkuOrderList[0].StoreInfo.StoreId + + if vendorStoreID != "" { + storeDetail, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDDD, "") + if err != nil || storeDetail == nil || storeDetail.Store.ID == 0 { + // 当前订单所属门店不属于菜市时,将消息推送到果园 + gyMsg := map[string]interface{}{"tag": msgId, "msg_id": utils.Int64ToStr(time.Now().Unix()) + msgId, "data": msg} + // 通知到果园 + gyResult, err := HttpToGuoYuan(gyMsg, CaiShiPushGyTagOrder) + if err != nil { + return tiktokShop.Err2CallbackResponse(err, "") + } + result, _ := ioutil.ReadAll(gyResult.Body) + var guoYuan *tiktokShop.CallbackResponse + if err2 := json.Unmarshal(result, guoYuan); err2 != nil { + return tiktokShop.Err2CallbackResponse(err2, "") + } + return guoYuan + } + } jxutils.CallMsgHandler(func() { response = CurPurchaseHandler.onOrderMsg(msgId, orderId, msg) }, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDDD)) + } else { + globals.SugarLogger.Debugf("============2") } return response } func HttpToGuoYuan(param map[string]interface{}, requestType string) (*http.Response, error) { - globals.SugarLogger.Debugf("=========param %s", utils.Format4Output(param, false)) - paramData, err := json.Marshal(param) - if err != nil { - return nil, err + var paramData []byte + var err error + if requestType == "order" { + param["data"] = utils.Format4Output(param["data"], false) + paramData, err = json.Marshal([]interface{}{param}) + if err != nil { + return nil, err + } + } else { + paramData, err = json.Marshal(param) + if err != nil { + return nil, err + } } - body := strings.NewReader(string(paramData)) url := "" switch requestType { - case "order": // 订单相关 + case CaiShiPushGyTagOrder: // 订单相关 url = "http://callback-jxgy.jxc4.com/tiktok/callbackTiktokOrderMsg" - case "token": // 授权相关 + case CaiShiPushGyTagToken: // 授权相关 url = "http://callback-jxgy.jxc4.com/tiktokShop/jxcsToGyTiktokToken" - case "wayBill": // 运单消息 + case CaiShiPushGyTagDeliveryRegister: // 配送查询注册 + url = "http://callback-jxgy.jxc4.com/logistics/logisticsRegister" + case CaiShiPushGyTagDeliveryDetail: // 配送查询详情 + url = "http://callback-jxgy.jxc4.com/logistics/logisticsQuery" + case CaiShiPushGyTagWayBill: // 运单消息 } httpReq, err := http.NewRequest(http.MethodPost, url, body) if err != nil { return nil, err } + httpReq.Header.Set("Content-Type", "application/json") httpRes, err := http.DefaultClient.Do(httpReq) diff --git a/business/partner/purchase/tiktok_store/dy.go b/business/partner/purchase/tiktok_store/dy.go index 355e52627..f2772c3b4 100644 --- a/business/partner/purchase/tiktok_store/dy.go +++ b/business/partner/purchase/tiktok_store/dy.go @@ -47,7 +47,7 @@ func (c *PurchaseHandler) GetVendorID() int { } func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCats []*model.SkuVendorCategory, err error) { - cats, err := getAPI("57939570", 0, "").GetShopCategory(0) + cats, err := getAPI("68023619", 0, "").GetShopCategory(0) if err != nil { return nil, err } diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index b35fd7207..e023e0eff 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -722,6 +722,9 @@ func CreateSaleTemp(storeId int64, api *tiktokShop.API) (int64, error) { // GetDeliveryTemp 获取运费模板id,运费模板不存在则创建 func GetDeliveryTemp(api *tiktokShop.API, vendorStoreID string, storeDetail *dao.StoreDetail) (int64, error) { + if vendorStoreID == "" { + return 0, errors.New("平台门店id未绑定") + } // 没有模板是查询线上模板 freightId, _ := api.GetStoreBindTemp(utils.Str2Int64(vendorStoreID)) if freightId == 0 { diff --git a/controllers/tiktok_delivery.go b/controllers/tiktok_delivery.go index 0bd9daf92..377f98bb5 100644 --- a/controllers/tiktok_delivery.go +++ b/controllers/tiktok_delivery.go @@ -7,7 +7,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" - "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store" "github.com/astaxie/beego/server/web" "io/ioutil" "time" @@ -58,8 +58,32 @@ func (c *LogisticsController) LogisticsRegister() { } // 查询订单的运单是否存在 data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), register.TrackNo) - if err != nil { - globals.SugarLogger.Debugf("根据单号查询运单数据错误:%s", err) + + // 此订单可能是果园订单 + if web.BConfig.RunMode != "jxgy" && (len(data) == 0 || err != nil) { + resp, err := tiktok_store.HttpToGuoYuan(utils.Struct2Map(register, "", true), tiktok_store.CaiShiPushGyTagDeliveryRegister) + if err != nil { + c.Data["json"] = LogisticsRegisterResp{ + Result: false, + ReturnCode: "1002", + Message: "单号不存在", + } + c.ServeJSON() + return + } + gyData := &LogisticsRegisterResp{} + gyBody, _ := ioutil.ReadAll(resp.Body) + if err := json.Unmarshal(gyBody, gyData); err != nil { + c.Data["json"] = LogisticsRegisterResp{ + Result: false, + ReturnCode: "1002", + Message: "单号不存在", + } + c.ServeJSON() + return + } + c.Data["json"] = gyData + c.ServeJSON() } if len(data) == 0 || err != nil { @@ -156,14 +180,30 @@ func (c *LogisticsController) LogisticsQuery() { // 查询订单的运单是否存在 data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), param.TrackNo) - if err != nil || len(data) == 0 { - c.Data["json"] = LogisticsQueryRest{ - Result: false, - ReturnCode: "1002", - Message: "运单账号不存在", + if (err != nil || len(data) == 0) && web.BConfig.RunMode != "jxgy" { + resp, err := tiktok_store.HttpToGuoYuan(utils.Struct2Map(param, "", true), tiktok_store.CaiShiPushGyTagDeliveryDetail) + if err != nil { + c.Data["json"] = LogisticsQueryRest{ + Result: false, + ReturnCode: "1002", + Message: "运单账号不存在", + } + c.ServeJSON() + return } + wayBillDetail := &LogisticsQueryRest{} + gyBody, _ := ioutil.ReadAll(resp.Body) + if err := json.Unmarshal(gyBody, wayBillDetail); err != nil { + c.Data["json"] = LogisticsQueryRest{ + Result: false, + ReturnCode: "1002", + Message: "json unmarshal", + } + c.ServeJSON() + return + } + c.Data["json"] = wayBillDetail c.ServeJSON() - return } returnParam := &LogisticsQueryRest{ diff --git a/controllers/tiktok_order.go b/controllers/tiktok_order.go index 2a1eecdcb..358e1dbc8 100644 --- a/controllers/tiktok_order.go +++ b/controllers/tiktok_order.go @@ -2,7 +2,9 @@ package controllers import ( "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" "strings" @@ -21,6 +23,7 @@ func (t *TiktokController) CallbackTiktokOrderMsg() { t.ServeJSON() return } + if strings.Contains(string(byteList), "\"msg_id\":\"0\"") { t.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackSuccessCode, Msg: tiktok_api.CallbackSuccess} t.ServeJSON() @@ -29,6 +32,7 @@ func (t *TiktokController) CallbackTiktokOrderMsg() { // 2.参数解析 orderStatus, resp := api.TiktokStore.CreateOrderCallback(byteList) + globals.SugarLogger.Debugf("orderStatus %s,%s", utils.Format4Output(orderStatus, false), utils.Format4Output(resp, false)) if resp.Code != 0 { t.Data["json"] = resp t.ServeJSON() diff --git a/controllers/tiktok_store.go b/controllers/tiktok_store.go index 3ad78c873..f08a3aab4 100644 --- a/controllers/tiktok_store.go +++ b/controllers/tiktok_store.go @@ -154,6 +154,7 @@ func (c *TiktokShopController) TokenMsg() { c.ServeJSON() } +// JxcsToGyTiktokToken 果园京西速食接受token更新 func (c *TiktokShopController) JxcsToGyTiktokToken() { data, err := ioutil.ReadAll(c.Ctx.Request.Body) if err != nil {