186 lines
7.8 KiB
Go
186 lines
7.8 KiB
Go
package tiktok_store
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
instantShopping_getDeliveryListByOrderId_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/instantShopping_getDeliveryListByOrderId/response"
|
||
"time"
|
||
|
||
superm_getStoreAutoCallRiderInfo_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/superm_getStoreAutoCallRiderInfo/response"
|
||
superm_setStoreAutoCallRider_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/superm_setStoreAutoCallRider/request"
|
||
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/baseapi/utils/errlist"
|
||
"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"
|
||
)
|
||
|
||
var (
|
||
VendorWaybillStatus2StatusMap = map[int]int{
|
||
tiktok_api.ShipmentStatusCalling: model.WaybillStatusNew,
|
||
tiktok_api.ShipmentStatusReceived: model.WaybillStatusAccepted,
|
||
tiktok_api.ShipmentStatusArrived: model.WaybillStatusCourierArrived,
|
||
tiktok_api.ShipmentStatusDelivering: model.WaybillStatusDelivering,
|
||
tiktok_api.ShipmentStatusRejected: model.WaybillStatusRejected,
|
||
tiktok_api.ShipmentStatusReturning: model.WaybillStatusReturning,
|
||
tiktok_api.ShipmentStatusReturned: model.WaybillStatusReturned,
|
||
tiktok_api.ShipmentStatusDelivered: model.WaybillStatusDelivered,
|
||
tiktok_api.ShipmentStatusCanceled: model.WaybillStatusCanceled,
|
||
}
|
||
)
|
||
|
||
func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) int {
|
||
if status, ok := VendorWaybillStatus2StatusMap[utils.Str2Int(vendorStatus)]; ok {
|
||
return status
|
||
}
|
||
return model.WaybillStatusUnknown
|
||
}
|
||
|
||
func (c *PurchaseHandler) onWaybillMsg(tag, orderId string, data interface{}) *tiktok_api.CallbackResponse {
|
||
waybill := c.callbackMsg2Waybill(tag, orderId, data)
|
||
localOrder, _ := partner.CurOrderManager.LoadOrder(waybill.VendorOrderID, model.VendorIDDD)
|
||
// 当前订单的运力状态发生变化时,抖店侧会对open侧推送消息。当前运力状态变化的原因有两个来源:1:呼叫平台运力,平台运力有变化,此时会推送消息;2:商家自配,erp通过回传配送状态触发运力状态变化,此时也会推送消息
|
||
// 问题:当前两种消息来源是没有区分的,都是统一发送消息,但erp侧针对不同的情况有特殊处理,因此需要区分这两种消息
|
||
// 当本地记录骑手数据(非抖音平台运单)与当前运单匹配上是,就直接返回
|
||
if waybill.CourierName != "" && waybill.CourierMobile != "" {
|
||
localWaybill, _ := dao.GetWaybills(dao.GetDB(), localOrder.VendorOrderID, nil)
|
||
for _, v := range localWaybill {
|
||
if v.CourierName != "" && v.CourierMobile != "" && v.WaybillVendorID != model.VendorIDDD && v.CourierName == waybill.CourierName && v.CourierMobile == waybill.CourierMobile {
|
||
return tiktok_api.Err2CallbackResponse(nil, "")
|
||
}
|
||
}
|
||
}
|
||
err := partner.CurOrderManager.OnWaybillStatusChanged(waybill)
|
||
if err == nil {
|
||
status := &model.OrderStatus{
|
||
VendorOrderID: waybill.VendorOrderID,
|
||
VendorID: model.VendorIDDD,
|
||
OrderType: model.OrderTypeWaybill,
|
||
RefVendorOrderID: waybill.VendorOrderID,
|
||
RefVendorID: model.VendorIDDD,
|
||
Status: waybill.Status,
|
||
VendorStatus: waybill.VendorStatus,
|
||
StatusTime: time.Now(),
|
||
DuplicatedCount: 0,
|
||
Remark: "",
|
||
ModelTimeInfo: model.ModelTimeInfo{
|
||
CreatedAt: time.Now(),
|
||
UpdatedAt: time.Now(),
|
||
},
|
||
}
|
||
err = partner.CurOrderManager.OnOrderStatusChanged(localOrder.VendorOrgCode, status)
|
||
if err != nil {
|
||
partner.CurOrderManager.OnOrderMsg(localOrder, "", "抖店运单骑手状态修改异常:"+err.Error())
|
||
}
|
||
if status.VendorStatus == utils.Int2Str(tiktok_api.ShipmentStatusCanceled) {
|
||
localOrder.Status = model.WaybillStatusCourierArrived
|
||
dao.UpdateEntity(dao.GetDB(), localOrder, "Status")
|
||
}
|
||
}
|
||
return tiktok_api.Err2CallbackResponse(err, "")
|
||
}
|
||
|
||
func (c *PurchaseHandler) callbackMsg2Waybill(tag, orderId string, data interface{}) (retVal *model.Waybill) {
|
||
req := data.(tiktok_api.ShipmentInfoData)
|
||
tempRemark := ""
|
||
if req.Status == tiktok_api.ShipmentStatusReceived {
|
||
tempRemark = req.RiderName + "," + req.RiderPhone
|
||
}
|
||
way := &model.Waybill{
|
||
VendorOrderID: utils.Int64ToStr(req.ShopOrderID),
|
||
OrderVendorID: model.VendorIDDD,
|
||
VendorWaybillID: utils.Int64ToStr(req.ShopOrderID),
|
||
WaybillVendorID: model.VendorIDDD,
|
||
CourierName: req.RiderName,
|
||
CourierMobile: req.RiderPhone,
|
||
VendorStatus: utils.Int64ToStr(req.Status),
|
||
Status: c.GetWaybillStatusFromVendorStatus(utils.Int64ToStr(req.Status)),
|
||
StatusTime: utils.Str2Time(req.OperateTime),
|
||
Remark: tempRemark,
|
||
VendorOrgCode: utils.Int64ToStr(req.ShopID), //为抖音账号ID
|
||
}
|
||
return way
|
||
}
|
||
|
||
//设置自动呼叫运力
|
||
func SetStoreAutoCallRider(vendorOrgCode, opType string, storeID int64) error {
|
||
if opType == tiktok_api.AutoCallRiderOpen {
|
||
if err := getAPI(vendorOrgCode, 0, "").SetStoreAutoCallRider(&superm_setStoreAutoCallRider_request.SupermSetStoreAutoCallRiderParam{
|
||
StoreID: storeID,
|
||
OpType: opType,
|
||
ServiceType: tiktok_api.ServiceTypeDelayCall,
|
||
DelayTime: tiktok_api.AutoCallDelayTime15,
|
||
}); err != nil {
|
||
return err
|
||
}
|
||
} else {
|
||
if err := getAPI(vendorOrgCode, 0, "").SetStoreAutoCallRider(&superm_setStoreAutoCallRider_request.SupermSetStoreAutoCallRiderParam{
|
||
StoreID: storeID,
|
||
OpType: opType,
|
||
}); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
//批量查询自动呼叫运力配置
|
||
func GetStoreAutoCallRiderInfo(vendorOrgCode string, storeIDs []int64) (map[int64]*superm_getStoreAutoCallRiderInfo_response.AutoCallInfo, error) {
|
||
if len(storeIDs) == 0 {
|
||
return nil, errors.New("门店ID为空,请检查")
|
||
}
|
||
errList := errlist.ErrList{}
|
||
tAutoCallInfos := make(map[int64]*superm_getStoreAutoCallRiderInfo_response.AutoCallInfo, 0)
|
||
for _, i := range storeIDs {
|
||
if autoCallInfo, err := getAPI(vendorOrgCode, 0, "").GetStoreAutoCallRiderInfo(i); err != nil {
|
||
errList.AddErr(err)
|
||
} else {
|
||
tAutoCallInfos[i] = &superm_getStoreAutoCallRiderInfo_response.AutoCallInfo{
|
||
ServiceStatus: autoCallInfo.ServiceStatus,
|
||
ServiceType: autoCallInfo.ServiceType,
|
||
DelayTime: autoCallInfo.DelayTime,
|
||
}
|
||
}
|
||
}
|
||
if errList.GetErrListAsOne() != nil {
|
||
return nil, errList.GetErrListAsOne()
|
||
}
|
||
return tAutoCallInfos, nil
|
||
}
|
||
|
||
//取消自动运力
|
||
func (c *PurchaseHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||
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, 0, "").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 *PurchaseHandler) GetDYPSRiderInfo(orderId string) (*instantShopping_getDeliveryListByOrderId_response.InstantShoppingGetDeliveryListByOrderIdData, error) {
|
||
params := map[string]interface{}{
|
||
"vendorOrderID": orderId,
|
||
}
|
||
orderInfo, _, err := dao.GetOrders(dao.GetDB(), nil, false, false, "", "", false, nil, false, "", params, 0, 0)
|
||
if err != nil {
|
||
return nil, errors.New("获取本地门店账号信息失败,请重试")
|
||
}
|
||
|
||
waybill, err := getAPI(orderInfo[0].VendorOrgCode, 0, "").GetShipmentInfo(utils.Str2Int64(orderId), 0, tiktok_api.ShipmentTypeInvoice)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return waybill, nil
|
||
}
|