diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 3df1b5b37..2bbb05eb8 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -1397,6 +1397,17 @@ func GetWaybills(db *DaoDB, vendorOrderID string) (waybills []*model.Waybill, er return waybills, err } +// GetWayBillsByWayBillId 根据运单id获取运单id +func GetWayBillsByWayBillId(db *DaoDB, vendorWayBillId string) (waybills []*model.Waybill, err error) { + sql := `SELECT * + FROM waybill + WHERE vendor_waybill_id = ? + ` + sqlParams := []interface{}{vendorWayBillId} + err = GetRows(db, &waybills, sql, sqlParams) + return waybills, err +} + func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) { sql := `SELECT * FROM goods_order diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 867b692ba..26bfd1651 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -83,12 +83,16 @@ func GetOrderRiderInfoToPlatform(orderId string) { switch riderInfo.LogisticsStatus { case 20: //配送中 riderInfo.LogisticsStatus = 20 + riderInfo.LogisticsContext = `正在配送中` case 110: // 完成 riderInfo.LogisticsStatus = 40 + riderInfo.LogisticsContext = `配送完成` case 105: // 完成 riderInfo.LogisticsStatus = 40 + riderInfo.LogisticsContext = `被取消` case 115: // 取消 riderInfo.LogisticsStatus = 100 + riderInfo.LogisticsContext = `被取消` default: continue } diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index f5772f4c8..8b648a016 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -3,6 +3,7 @@ package tiktok_store import ( "errors" "fmt" + order_logisticsAdd_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_logisticsAdd/request" order_orderDetail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_orderDetail/response" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" "regexp" @@ -213,7 +214,9 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s // GetOrderRider 商家自配送同步配送信息 func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfo(param) + appKey := `7153997323561879075` // 暂时定死 + appSecret := `3517d3ea-b96b-4379-a7a4-2d9389e8ffeb` //暂时定死 + return tiktokShop.NewExpress(appKey, appSecret, "").OrderStatusAndPsInfo(param) } func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) { @@ -588,12 +591,19 @@ func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName return err } -// SelfDeliverDelivering 暂无自配送中 +// SelfDeliverDelivering 订单在自配送中,表示三方品牌接单,通知抖音已经发货了 func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { - //if globals.EnableMtwmStoreWrite { - // err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderDelivering(utils.Str2Int64(order.VendorOrderID)) - //} - return err + return getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderDelivering(&order_logisticsAdd_request.OrderLogisticsAddParam{ + OrderId: order.VendorOrderID, + Company: "", + CompanyCode: "chengdouruoxi", + LogisticsCode: order.VendorWaybillID, + IsRefundReject: false, + IsRejectRefund: false, + SerialNumberList: nil, + AddressId: 0, + StoreId: utils.Str2Int64(order.VendorStoreID), + }) } // SelfDeliverDelivered 自配搜完成(暂无) diff --git a/business/partner/purchase/tiktok_store/order_afs_utils.go b/business/partner/purchase/tiktok_store/order_afs_utils.go index d91d2baf5..aae864bea 100644 --- a/business/partner/purchase/tiktok_store/order_afs_utils.go +++ b/business/partner/purchase/tiktok_store/order_afs_utils.go @@ -129,7 +129,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) (orderStatus *model.OrderStatus, vendorOrgCode int) { switch msgId { case tiktokShop.CallbackRefundOrderMsgTagId: // 买家发起售后申请消息 - refundOrder := msg.(*tiktokShop.BuyerRefundCreatedData) + refundOrder := msg.(tiktokShop.BuyerRefundCreatedData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, @@ -153,7 +153,7 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( vendorOrgCode = refundOrder.ShopId orderStatus = orderMsg case tiktokShop.CallbackUpdateRefundOrderMsgTagId: // 买家修改售后申请消息 - refundOrder := msg.(*tiktokShop.BuyerRefundModifiedData) + refundOrder := msg.(tiktokShop.BuyerRefundModifiedData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, @@ -177,7 +177,7 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( vendorOrgCode = refundOrder.ShopId orderStatus = orderMsg case tiktokShop.CallbackRefundOrderSuccessMsgTagId: // 退款成功消息 - refundOrder := msg.(*tiktokShop.BusinessRefundSuccessData) + refundOrder := msg.(tiktokShop.BusinessRefundSuccessData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, @@ -200,7 +200,7 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( vendorOrgCode = refundOrder.ShopId orderStatus = orderMsg case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息 - refundOrder := msg.(*tiktokShop.BusinessNotRefundRefusedData) + refundOrder := msg.(tiktokShop.BusinessNotRefundRefusedData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, @@ -223,7 +223,7 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( vendorOrgCode = refundOrder.ShopId orderStatus = orderMsg case tiktokShop.CallbackRefundShopMsgTagId: // 拒绝退货申请消息 - refundOrder := msg.(*tiktokShop.BusinessNotReturnApplyRefusedData) + refundOrder := msg.(tiktokShop.BusinessNotReturnApplyRefusedData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, @@ -246,7 +246,7 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( vendorOrgCode = refundOrder.ShopId orderStatus = orderMsg case tiktokShop.CallbackReturnApplyAgreedMsgTagId: // 同意退货申请消息 - refundOrder := msg.(*tiktokShop.BusinessReturnApplyAgreedData) + refundOrder := msg.(tiktokShop.BusinessReturnApplyAgreedData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, @@ -269,7 +269,7 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) ( vendorOrgCode = refundOrder.ShopId orderStatus = orderMsg case tiktokShop.CallbackReturnRefundAgreedMsgTagId: // 同意退款消息 - refundOrder := msg.(*tiktokShop.BusinessRefundAgreedData) + refundOrder := msg.(tiktokShop.BusinessRefundAgreedData) orderMsg := &model.OrderStatus{ VendorID: model.VendorIDDD, OrderType: model.OrderTypeAfsOrder, diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index e77d86151..b14aeb1ce 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -282,6 +282,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI StartSaleType: 0, PickupMethod: "0", OuterProductId: utils.Int2Str(storeSku.SkuID), // 本地skuId为外部商品id + //AfterSaleService: map[string]string{"supply_day_return_selector": "7"}, } globals.SugarLogger.Debugf("====OuterProductId====%d", storeSku.SkuID) globals.SugarLogger.Debugf("====OuterProductId====%d", storeSku.ID) diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index bbf971cf2..079bc4fa5 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -61,14 +61,24 @@ func GetProductFormatNew(categoryLeftId int64, vendorOrgCode string) (string, er } format := make(map[string][]*tiktokShop.ProductFormatNewList, 0) for _, v := range category.Data.Data { - for _, d := range v.Options { + if len(v.Options) == 0 { formateNew := &tiktokShop.ProductFormatNewList{ - Value: utils.Str2Int64(d.Value), - Name: d.Name, - DiyType: v.DiyType, + Value: 0, + Name: "暂不支持", + DiyType: 1, } format[utils.Int64ToStr(v.PropertyId)] = append(format[utils.Int64ToStr(v.CategoryId)], formateNew) + } else { + for _, d := range v.Options { + formateNew := &tiktokShop.ProductFormatNewList{ + Value: utils.Str2Int64(d.Value), + Name: d.Name, + DiyType: v.DiyType, + } + format[utils.Int64ToStr(v.PropertyId)] = append(format[utils.Int64ToStr(v.CategoryId)], formateNew) + } } + } productFormatNew, err := json.Marshal(format) if err != nil { diff --git a/controllers/tiktok_delivery.go b/controllers/tiktok_delivery.go new file mode 100644 index 000000000..519dceb3b --- /dev/null +++ b/controllers/tiktok_delivery.go @@ -0,0 +1,196 @@ +package controllers + +import ( + "encoding/json" + "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" + "github.com/astaxie/beego/server/web" + "io/ioutil" + "time" +) + +type LogisticsController struct { + web.Controller +} + +//#region 美团物流注册(发货完成时注册) + +// LogisticsRegisterReq 注册接口请求参数 +type LogisticsRegisterReq struct { + TrackNo string `json:"track_no"` // 运单号 + CallbackUrl string `json:"callback_url"` // 回调地址 + Company string `json:"company"` //物流公司编码 +} + +// LogisticsRegisterResp 响应接口 +type LogisticsRegisterResp struct { + Result bool `json:"result"` + ReturnCode string `json:"return_code"` + Message string `json:"message"` +} + +// LogisticsRegister 即时配轨迹订阅接口 +func (c *LogisticsController) LogisticsRegister() { + body, _ := ioutil.ReadAll(c.Ctx.Request.Body) + + register := &LogisticsRegisterReq{} + if err := json.Unmarshal(body, register); err != nil { + globals.SugarLogger.Debugf("小时达订阅接口类型转换异常:%s", err) + c.Data["json"] = LogisticsRegisterResp{ + Result: false, + ReturnCode: "1007", + Message: err.Error(), + } + c.ServeJSON() + return + } + if register.TrackNo == "" { + c.Data["json"] = LogisticsRegisterResp{ + Result: false, + ReturnCode: "1002", + Message: "单号不存在", + } + c.ServeJSON() + return + } + // 查询订单的运单是否存在 + data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), register.TrackNo) + if err != nil { + globals.SugarLogger.Debugf("根据单号查询运单数据错误:%s", err) + } + if len(data) <= 0 { + globals.SugarLogger.Debugf("单号存在但是本地数据不存,推送平台运单号错误,或者运单错误:%s", err) + c.Data["json"] = LogisticsRegisterResp{ + Result: false, + ReturnCode: "1002", + Message: "单号不存在", + } + c.ServeJSON() + return + } + + c.Data["json"] = LogisticsRegisterResp{ + Result: true, + ReturnCode: "200", + Message: "", + } + c.ServeJSON() + return +} + +//#endregion + +//#region 保底物流信息更新 + +// LogisticsQueryReq 请求参数 +type LogisticsQueryReq struct { + TrackNo string `json:"track_no"` // 运单号 + Company string `json:"company"` // 物流商编码 + PhoneLastFour string `json:"phone_last_four"` // 手机号后4位 +} + +// LogisticsQueryRest 响应参数 +type LogisticsQueryRest struct { + Result bool `json:"result"` // 结果 + ReturnCode string `json:"return_code"` // 错误码 + Message string `json:"message"` // 错误消息 + Data LogisticsQueryData `json:"data"` // 轨迹数据 +} + +type LogisticsQueryData struct { + Timestamp string `json:"timestamp"` // 当前系统时间 + TrackNo string `json:"track_no"` // 运单号 + Traces []TracesList `json:"traces"` // 轨迹列表 +} + +type TracesList struct { + Timestamp string `json:"timestamp"` // 当前系统时间 + // 事件编码 + Opcode string `json:"opcode"` + // 文案 + Content string `json:"content"` + // 骑手信息 + Rider RiderInfo `json:"rider"` + // 三方运力公司,顺丰同城 sftc 闪送 shansong 达达 dada UU uupt 美团 meituan 蜂鸟 fengniao + ThirdPartyCompany string `json:"third_party_company"` + // 异常编码 + ExceptionCode string `json:"exception_code"` + // 异常原因 + ExceptionDesc string `json:"exception_desc"` + // 取消编码 + CancelCode string `json:"cancel_code"` + // 取消原因 + CancelDesc string `json:"cancel_desc"` +} +type RiderInfo struct { + Name string `json:"name"` // 骑手姓名 + Mobile string `json:"mobile"` // 骑手电话号码 +} + +// LogisticsQuery 即时配保底查询接口 +func (c *LogisticsController) LogisticsQuery() { + body, _ := ioutil.ReadAll(c.Ctx.Request.Body) + param := &LogisticsQueryReq{} + if err := json.Unmarshal(body, param); err != nil { + c.Data["json"] = LogisticsQueryRest{ + Result: false, + ReturnCode: "1005", + Message: "数据解析错误", + } + c.ServeJSON() + return + } + + if param.TrackNo == "" { + c.Data["json"] = LogisticsQueryRest{ + Result: false, + ReturnCode: "1002", + Message: "运单账号不存在", + } + c.ServeJSON() + } + + // 查询订单的运单是否存在 + data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), param.TrackNo) + if err != nil { + globals.SugarLogger.Debugf("根据单号查询运单数据错误:%s", err) + } + if len(data) <= 0 { + globals.SugarLogger.Debugf("单号存在但是本地数据不存,推送平台运单号错误,或者运单错误:%s", err) + c.Data["json"] = LogisticsRegisterResp{ + Result: false, + ReturnCode: "1002", + Message: "单号不存在", + } + c.ServeJSON() + return + } + + returnParam := &LogisticsQueryRest{ + Result: true, + ReturnCode: "200", + Message: "正常", + Data: LogisticsQueryData{ + Timestamp: utils.Time2Str(time.Now()), + TrackNo: param.TrackNo, + Traces: []TracesList{{ + Opcode: "ORDER_RECEIVED", + Timestamp: utils.Time2Str(time.Now()), + Content: "抖音定时保底更新", + ThirdPartyCompany: tiktok_api.TiktokExpressCode, + ExceptionCode: "", + ExceptionDesc: "", + CancelCode: "", + CancelDesc: "", + Rider: RiderInfo{Name: data[0].CourierName, Mobile: data[0].CourierMobile}, + }}, + }, + } + + c.Data["json"] = returnParam + c.ServeJSON() +} + +//#endregion diff --git a/controllers/tiktok_order.go b/controllers/tiktok_order.go index 45a926c25..2a602be99 100644 --- a/controllers/tiktok_order.go +++ b/controllers/tiktok_order.go @@ -6,6 +6,8 @@ import ( "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" + beego "github.com/astaxie/beego/server/web" + "strings" ) type TiktokController struct { @@ -26,6 +28,10 @@ func (t *TiktokController) CallbackTiktokOrderMsg() { t.ServeJSON() return } + if beego.BConfig.RunMode == "beta" && !strings.Contains(string(byteList), "53802960") { + t.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackSuccessCode, Msg: tiktok_api.CallbackSuccess} + t.ServeJSON() + } // 2.参数解析 globals.SugarLogger.Debug("抖音订单回调数据参数打印===========", string(byteList)) diff --git a/routers/router.go b/routers/router.go index 56c3830ba..634015cfe 100644 --- a/routers/router.go +++ b/routers/router.go @@ -186,6 +186,7 @@ func init() { web.AutoRouter(&controllers.TiktokController{}) // 订单 web.AutoRouter(&controllers.TiktokShopController{}) // 门店授权 + web.AutoRouter(&controllers.LogisticsController{}) // 抖音快递信息同步 // 如下都是用于检测存活的空接口 web.Any("/", func(ctx *beecontext.Context) { ctx.WriteString("pong\n")