Files
jx-callback/business/partner/delivery/tiktok_store/waybill.go
richboo111 68b6afe0df 1
2023-01-12 18:12:34 +08:00

242 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package tiktok_store
import (
"errors"
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
shop_getStoreDetail_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_getStoreDetail/request"
superm_createVirtualMobile_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/superm_createVirtualMobile/response"
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
"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/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"time"
)
var (
curDeliveryHandler *DeliveryHandler
)
type DeliveryHandler struct {
}
func init() {
if api.TiktokStore != nil {
curDeliveryHandler = new(DeliveryHandler)
partner.RegisterDeliveryPlatform(curDeliveryHandler, true)
}
}
func (c *DeliveryHandler) GetVendorID() int {
return model.VendorIDDYPS
}
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
return "", 0, errors.New("抖店暂不支持此操作")
}
func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeDetail *dao.StoreDetail2, err error) {
relInfo, err := dao.GetStoreDetailForDD(dao.GetDB(), storeID, model.VendorIDDD, vendorStoreID, "")
if err != nil {
return nil, errors.New("获取抖音平台账号信息失败,请重试")
}
apiObj := getAPI(relInfo.VendorOrgCode)
if storeInfo, err := apiObj.GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
StoreId: vendorStoreID,
}); err == nil {
storeDetail = &dao.StoreDetail2{
Store: model.Store{
Name: storeInfo.StoreDetail.Store.Name,
Tel1: storeInfo.StoreDetail.Store.Contact,
Address: storeInfo.StoreDetail.Store.Address,
Lng: jxutils.StandardCoordinate2Int(utils.Str2Float64(storeInfo.StoreDetail.Store.Longitude)),
Lat: jxutils.StandardCoordinate2Int(utils.Str2Float64(storeInfo.StoreDetail.Store.Latitude)),
},
VendorID: model.VendorIDDYPS,
VendorStoreID: utils.Int64ToStr(storeInfo.StoreDetail.Store.StoreId),
CourierStatus: int(storeInfo.StoreDetail.Store.State),
}
} else {
globals.SugarLogger.Debugf("GetStoreDetail err %s", err)
}
return storeDetail, err
}
func (c *DeliveryHandler) IsErrStoreNotExist(err error) bool {
return false
}
func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
return false
}
// 呼叫运力并发货
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
return nil, nil
//relInfo, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, model.VendorIDDD, "")
//if err != nil {
// return nil, errors.New("获取抖音平台账号信息失败,请重试")
//}
//apiObj := getAPI(relInfo.VendorOrgCode)
//if order.VendorID != model.VendorIDDD {
// return nil, errors.New("非抖音平台店铺不可发抖音配送")
//}
//bill = &model.Waybill{
// VendorOrderID: order.VendorOrderID,
// OrderVendorID: order.VendorID,
// VendorWaybillID: order.VendorOrderID, //抖音配送订单号即运单号
// WaybillVendorID: model.VendorIDDYPS,
//}
//if dispatcherFee, err := apiObj.GetDispatcherInfo(int64(order.StoreID), order.VendorOrderID, tiktok_api.DispatcherFeeTypeCall); err == nil {
// bill.DesiredFee = dispatcherFee
//}
//if err := apiObj.ShopOrderDispatcher(utils.Str2Int64(order.VendorStoreID), order.VendorOrderID, tiktok_api.DispatcherFeeTypeCall); err != nil {
// return nil, err
//}
//delivery.OnWaybillCreated(bill)
//return bill, nil
}
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
return nil
//params := make(map[string]interface{}, 0)
//params["vendorOrderID"] = bill.VendorOrderID
//if localOrder, _, err := dao.GetOrders(dao.GetDB(), nil, false, false, "", "", false, []int{0}, false, "", params, 0, 0); err != nil {
// return errors.New("取消运单时获取平台门店ID失败请重试")
//} else {
// if err = getAPI(bill.VendorOrgCode).ShopOrderDispatcher(utils.Str2Int64(localOrder[0].VendorStoreID), bill.VendorOrderID, tiktok_api.DispatcherFeeTypeCancel); err != nil {
// return fmt.Errorf("抖音配送取消运力失败:%v", err)
// }
// bill.Status = model.WaybillStatusCanceled
// bill.Remark = cancelReason
// partner.CurOrderManager.OnWaybillStatusChanged(bill)
//}
//return err
}
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
return nil, nil
//relInfo, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, model.VendorIDDD, "")
//if err != nil {
// return nil, errors.New("获取抖音平台账号信息失败,请重试")
//}
//if dispatcherFee, err := getAPI(relInfo.VendorOrgCode).GetDispatcherInfo(utils.Str2Int64(relInfo.VendorStoreID), order.VendorOrderID, tiktok_api.DispatcherFeeTypeCall); err == nil {
// deliveryFeeInfo = &partner.WaybillFeeInfo{}
// deliveryFeeInfo.DeliveryFee = dispatcherFee
//}
//return deliveryFeeInfo, err
}
func getDispatcherFee(storeID int64, vendorOrderID string, dispatcherType int32) int64 {
if relInfo, err := dao.GetStoreDetailForDD(dao.GetDB(), 0, model.VendorIDDD, utils.Int64ToStr(storeID), ""); err != nil {
return 0
} else {
if dispatcherFee, err := getAPI(relInfo.VendorOrgCode).GetDispatcherInfo(storeID, vendorOrderID, dispatcherType); err == nil {
return 0
} else {
return dispatcherFee
}
}
}
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
return errors.New("抖店配送暂不支持此操作")
}
func (c *DeliveryHandler) GetRiderInfo(orderId string, deliveryId int64, mtPeisongId string) (rider *mtpsapi.RiderInfo, err error) {
orderInfo, _, err := dao.GetOrders(dao.GetDB(), []int64{utils.Str2Int64(orderId)}, false, false, "", "", false, []int{0}, false, "", nil, 0, 0)
if err != nil {
return nil, errors.New("获取本地门店账号信息失败,请重试")
}
if waybill, err := getAPI(orderInfo[0].VendorOrgCode).GetShipmentInfo(utils.Str2Int64(orderId), deliveryId, tiktok_api.ShipmentTypeInvoice); err != nil {
return nil, err
} else {
rider = &mtpsapi.RiderInfo{
OrderId: orderId,
ThirdCarrierOrderId: mtPeisongId,
CourierName: waybill.RiderName,
CourierPhone: waybill.RiderPhone,
LogisticsProviderCode: mtpsapi.DYPsCode,
LogisticsStatus: int(waybill.ShipmentStatus),
LogisticsContext: tiktok_api.ShipmentStatus[waybill.ShipmentStatus],
Latitude: waybill.RiderLatitude,
Longitude: waybill.RiderLongitude,
}
}
globals.SugarLogger.Debugf("DYPS GetRiderInfo rider======%s", utils.Format4Output(rider, false))
return rider, nil
}
func CreateVirtualMobile(shopOrderID int64) (*superm_createVirtualMobile_response.SupermCreateVirtualMobileData, error) {
if orderInfo, _, err := dao.GetOrders(dao.GetDB(), []int64{shopOrderID}, false, false, "", "", false, []int{0}, false, "", nil, 0, 0); err != nil {
return nil, errors.New("获取本地门店账号信息失败,请重试")
} else {
if visMobile, err := getAPI(orderInfo[0].VendorOrgCode).CreateVirtualMobile(shopOrderID); err != nil {
return nil, err
} else {
return visMobile, nil
}
}
}
//订单状态回调
func OnWaybillMsg(tag, orderId string, data interface{}) (response *tiktok_api.CallbackResponse) {
req := data.(tiktok_api.ShipmentInfoData)
param := &model.Waybill{
VendorOrderID: utils.Int64ToStr(req.ShopOrderID),
VendorWaybillID: req.TrackNo,
VendorWaybillID2: utils.Int64ToStr(req.AfterSaleID),
WaybillVendorID: model.VendorIDDYPS,
OrderVendorID: model.VendorIDDD,
CourierName: req.RiderName,
CourierMobile: req.RiderPhone,
VendorStatus: utils.Int64ToStr(req.ShipmentStatus),
StatusTime: utils.Str2Time(req.OccurredTime),
Remark: "",
}
if req.OccurredTime == "" {
param.StatusTime = time.Now()
}
dispatcherFee := getDispatcherFee(req.ShopID, utils.Int64ToStr(req.ShopOrderID), tiktok_api.DispatcherFeeTypeCall)
switch req.ShipmentStatus {
case tiktok_api.ShipmentStatusCalling: //1 骑手呼叫中
param.DesiredFee = dispatcherFee
param.Status = model.WaybillStatusNew //5 待调度
case tiktok_api.ShipmentStatusReceived: //2 骑手已接单
param.DesiredFee = dispatcherFee
param.Status = model.WaybillStatusCourierAssigned
param.Remark = req.RiderName + "," + req.RiderPhone
case tiktok_api.ShipmentStatusArrived: //3 骑手已到达取货点
param.DesiredFee = dispatcherFee
param.Status = model.WaybillStatusCourierArrived //80 到店
param.Remark = tiktok_api.ShipmentStatus[req.ShipmentStatus]
case tiktok_api.ShipmentStatusDelivering: //4 配送中
param.Status = model.WaybillStatusDelivering
param.Remark = tiktok_api.ShipmentStatus[req.ShipmentStatus]
case tiktok_api.ShipmentStatusRejected, tiktok_api.ShipmentStatusReturning, tiktok_api.ShipmentStatusReturned: //5 收货人已拒收,6 返回中,7 返回完成
param.Status = model.WaybillStatusDeliverFailed
param.Remark = tiktok_api.ShipmentStatus[req.ShipmentStatus]
case tiktok_api.ShipmentStatusDelivered: // 8 订单妥投
param.Status = model.WaybillStatusDelivered
param.Remark = tiktok_api.ShipmentStatus[req.ShipmentStatus]
case tiktok_api.ShipmentStatusCanceled: //9 订单取消
param.Status = model.WaybillStatusCanceled
param.Remark = tiktok_api.ShipmentStatus[req.ShipmentStatus]
default:
globals.SugarLogger.Warnf("onWaybillMsg unknown shipmentStatus:%v", req.ShipmentStatus)
}
globals.SugarLogger.Debugf("DYPS onWaybillMsg param=====%s", utils.Format4Output(param, false))
if err := partner.CurOrderManager.OnWaybillStatusChanged(param); err != nil {
return tiktok_api.CallbackResponseErr(false)
}
return tiktok_api.CallbackResponseErr(true)
}
//以下为辅助函数
func getAPI(appOrgCode string) (apiObj *tiktok_api.API) {
apiObj = partner.CurAPIManager.GetAPI(model.VendorIDDD, appOrgCode).(*tiktok_api.API)
return apiObj
}