1025 lines
42 KiB
Go
1025 lines
42 KiB
Go
package tiktok_store
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"reflect"
|
||
|
||
freightTemplate_create_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/freightTemplate_create/request"
|
||
freightTemplate_update_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/freightTemplate_update/request"
|
||
shop_batchCreateStore_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_batchCreateStore/request"
|
||
shop_bindStoreFreight_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreFreight/request"
|
||
shop_bindStoreSaleLimit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreSaleLimit/request"
|
||
shop_editStore_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_editStore/request"
|
||
shop_getStoreDetail_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_getStoreDetail/request"
|
||
shop_getStoreList_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_getStoreList/request"
|
||
shop_storeSuspend_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_storeSuspend/request"
|
||
shop_unsuspendStore_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_unsuspendStore/request"
|
||
trade_UpdateTradeLimitTemplate_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/trade_UpdateTradeLimitTemplate/request"
|
||
trade_createTradeLimitTemplate_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/trade_createTradeLimitTemplate/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/jxcallback/scheduler"
|
||
"git.rosy.net.cn/jx-callback/business/jxstore/event"
|
||
"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/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"
|
||
)
|
||
|
||
func SplicingTimeToDoudian(openTime1, closeTime1, openTime2, closeTime2 int16, flag bool) (timeList string) {
|
||
//700 1200 -> 07:00-12:00
|
||
var (
|
||
s1 = ""
|
||
ts1 = ""
|
||
s2 = ""
|
||
ts2 = ""
|
||
//ts3 = ""//暂不支持多时间段
|
||
s4 = ""
|
||
ts4 = ""
|
||
timeStr = ""
|
||
)
|
||
if openTime1 != 0 && closeTime1 != 0 {
|
||
tOpenTime1 := utils.Int64ToStr(int64(openTime1))
|
||
len1 := len(tOpenTime1) - 2
|
||
if utils.Str2Int(tOpenTime1[:len1]) <= 9 {
|
||
ts1 = "0"
|
||
}
|
||
s1 = ts1 + tOpenTime1[:len1] + ":" + tOpenTime1[len1:]
|
||
tCloseTime1 := utils.Int64ToStr(int64(closeTime1))
|
||
len2 := len(tCloseTime1) - 2
|
||
if utils.Str2Int(tCloseTime1[:len2]) <= 9 {
|
||
ts2 = "0"
|
||
}
|
||
s2 = ts2 + tCloseTime1[:len2] + ":" + tCloseTime1[len2:]
|
||
if openTime2 != 0 && closeTime2 != 0 {
|
||
//tOpenTime2 := utils.Int64ToStr(int64(openTime2))
|
||
//len3 := len(tOpenTime2) - 2
|
||
//if utils.Str2Int(tOpenTime2[:len3]) <= 9 {
|
||
// ts3 = "0"
|
||
//}
|
||
//s3 = ts3 + tOpenTime2[:len3] + ":" + tOpenTime2[len3:]
|
||
tCloseTime2 := utils.Int64ToStr(int64(closeTime2))
|
||
len4 := len(tCloseTime2) - 2
|
||
if utils.Str2Int(tCloseTime2[:len4]) <= 9 {
|
||
ts4 = "0"
|
||
}
|
||
s4 = ts4 + tCloseTime2[:len4] + ":" + tCloseTime2[len4:]
|
||
}
|
||
}
|
||
if flag {
|
||
timeStr += s1 + "-" + s4
|
||
} else {
|
||
timeStr += s1 + "-" + s2
|
||
}
|
||
return timeStr
|
||
}
|
||
|
||
// shop/batchCreateStore 批量创建门店
|
||
func (P *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error) {
|
||
var (
|
||
vendorStoreIDs string
|
||
ShopBatchCreateStoreParam *shop_batchCreateStore_request.ShopBatchCreateStoreParam
|
||
errList = errlist.New()
|
||
timeStr = ""
|
||
m = make(map[int64]string)
|
||
a = getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID)
|
||
)
|
||
if storeDetail.OpenTime1 == 0 || storeDetail.CloseTime1 == 0 {
|
||
return "", fmt.Errorf("营业时间必填")
|
||
} else {
|
||
if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
|
||
timeStr = SplicingTimeToDoudian(storeDetail.OpenTime1, storeDetail.CloseTime1, storeDetail.OpenTime2, storeDetail.CloseTime2, true)
|
||
} else {
|
||
timeStr = SplicingTimeToDoudian(storeDetail.OpenTime1, storeDetail.CloseTime1, 0, 0, false)
|
||
}
|
||
for j := 1; j <= 7; j++ {
|
||
m[int64(j)] = timeStr
|
||
}
|
||
}
|
||
ShopBatchCreateStoreParam = &shop_batchCreateStore_request.ShopBatchCreateStoreParam{
|
||
StoreList: []shop_batchCreateStore_request.StoreListItem{
|
||
{
|
||
RowId: 1,
|
||
Name: "京西菜市(" + storeDetail.Name + ")",
|
||
StoreCode: utils.Int2Str(storeDetail.Store.ID),
|
||
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
||
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
||
Province: storeDetail.ProvinceName,
|
||
City: storeDetail.CityName,
|
||
District: storeDetail.DistrictName,
|
||
Address: storeDetail.Address,
|
||
Contact: storeDetail.Tel1,
|
||
OpenTime: &shop_batchCreateStore_request.OpenTime{
|
||
DayMap: m,
|
||
},
|
||
},
|
||
},
|
||
}
|
||
if resp, err := a.BatchCreateStore(ShopBatchCreateStoreParam); err != nil {
|
||
return "", err
|
||
} else {
|
||
//必须先存进数据库
|
||
storeMap := &model.StoreMap{
|
||
VendorStoreID: vendorStoreID,
|
||
StoreID: storeID,
|
||
VendorID: model.VendorIDDD,
|
||
VendorOrgCode: storeDetail.VendorOrgCode,
|
||
Status: 0,
|
||
DeliveryType: model.StoreDeliveryTypeByStore,
|
||
PricePercentage: int16(utils.MustInterface2Int64(storeDetail.PricePercentage)),
|
||
AutoPickup: 1,
|
||
DeliveryCompetition: 1,
|
||
IsSync: 1,
|
||
PricePercentagePack: "",
|
||
}
|
||
dao.WrapAddIDCULDEntity(storeMap, userName)
|
||
if err := dao.CreateEntity(db, storeMap); err != nil {
|
||
errList.AddErr(dao.CreateEntity(db, storeMap))
|
||
}
|
||
vendorStoreIDs = utils.Int64ToStr(resp.ResultList[0].Store.StoreId)
|
||
if err := CreateOrUpdateAll(storeDetail.VendorOrgCode, int64(storeDetail.Store.ID), resp.ResultList[0].Store.StoreId, int64(storeDetail.DeliveryFeeDeductionFee), int64(storeMap.DeliveryFeeDeductionSill), utils.Str2Int64(storeDetail.YbStorePrefix), storeDetail.YbAppID); err != nil {
|
||
errList.AddErr(err)
|
||
}
|
||
}
|
||
endErr := errList.GetErrListAsOne()
|
||
return vendorStoreIDs, errors.New(fmt.Sprintf("创建抖店平台店铺相关错误信息:%v", endErr))
|
||
}
|
||
|
||
func CreateOrUpdateAll(vendorOrgCode string, storeID, vendorStoreID, deliveryFeeDeductionFee, deliveryFeeDeductionSill, minPrice int64, autoCall string) error {
|
||
var (
|
||
errList = errlist.New()
|
||
FreightTemplate = &model.FreightTemplate{
|
||
StoreID: int(storeID),
|
||
VendorStoreID: utils.Int64ToStr(vendorStoreID),
|
||
}
|
||
)
|
||
//检查门店是否审核通过
|
||
if IfAuditPass(vendorOrgCode, vendorStoreID) {
|
||
return fmt.Errorf("门店%d 未审核通过,请通过后再进行绑定", storeID)
|
||
}
|
||
//1.运费模板
|
||
if bindFreightIDs, err := GetStoreFreight(vendorOrgCode, vendorStoreID); err != nil || bindFreightIDs == 0 { //(1)未查询到绑定信息,不算错误
|
||
//创建
|
||
if freightTemplateID, err := CreateFreightTemplate(int(storeID), int(deliveryFeeDeductionSill)); err != nil || freightTemplateID == 0 {
|
||
errList.AddErr(fmt.Errorf("京西菜市门店:%d 平台门店:%d 创建运费模板:%d 失败:%v", storeID, vendorStoreID, freightTemplateID, err))
|
||
} else { //绑定
|
||
if err = ShopBindStoreFreight(vendorOrgCode, vendorStoreID, freightTemplateID); err != nil {
|
||
errList.AddErr(fmt.Errorf("京西菜市门店:%d 平台门店:%d 绑定运费模板:%d 失败:%v", storeID, vendorStoreID, freightTemplateID, err))
|
||
} else {
|
||
FreightTemplate.TemplateID = freightTemplateID
|
||
}
|
||
}
|
||
} else {
|
||
if err := UpdateFreightTemplate(int(storeID)); err != nil {
|
||
globals.SugarLogger.Debug("更新运费模板失败:", err)
|
||
errList.AddErr(fmt.Errorf("更新运费模板失败:%v", err))
|
||
}
|
||
FreightTemplate.TemplateID = bindFreightIDs
|
||
}
|
||
|
||
//2.平台获取仓库信息以及电子围栏id
|
||
if bind, err := GetWarehouseByStore(vendorOrgCode, vendorStoreID); err != nil {
|
||
errList.AddErr(fmt.Errorf("获取门店(%d) 绑定仓库信息以及电子围栏出错:%v", vendorStoreID, err))
|
||
} else {
|
||
//(1)仓库
|
||
if bind[utils.Int64ToStr(storeID)][0].WarehouseId > 0 {
|
||
FreightTemplate.WarehouseID = bind[utils.Int64ToStr(storeID)][0].WarehouseId
|
||
} else {
|
||
if warehouseID, err := CreateWarehouse(vendorOrgCode, storeID); err != nil || warehouseID == 0 {
|
||
errList.AddErr(fmt.Errorf("门店(%d) 创建仓库失败:%v", storeID, err))
|
||
} else {
|
||
if err = BindStoreWarehouse(vendorOrgCode, utils.Int64ToStr(storeID), vendorStoreID); err != nil { //仓库绑定通过自定义外部ID
|
||
errList.AddErr(fmt.Errorf("门店(%d) 绑定仓库%d 失败:%v", storeID, warehouseID, err))
|
||
} else {
|
||
FreightTemplate.WarehouseID = warehouseID
|
||
}
|
||
}
|
||
//(2)电子围栏
|
||
if len(bind[utils.Int64ToStr(storeID)][0].OutFenceIds) > 0 {
|
||
tempFenceID := bind[utils.Int64ToStr(storeID)][0].OutFenceIds[0]
|
||
if err1 := UpdateFenceByStore(vendorOrgCode, tempFenceID, int(vendorStoreID)); err1 != nil {
|
||
errList.AddErr(fmt.Errorf("平台门店(%d),门店(%d)更新电子围栏失败:%v", vendorStoreID, storeID, err1))
|
||
}
|
||
FreightTemplate.FenceID = bind[utils.Int64ToStr(storeID)][0].OutFenceIds[0] //保存一个就足够
|
||
} else {
|
||
if fenceID, err := CreateFenceByStore(vendorOrgCode, storeID); err != nil || len(fenceID) == 0 {
|
||
errList.AddErr(fmt.Errorf("门店(%d) 创建电子围栏失败:%v", storeID, err))
|
||
} else {
|
||
if err := BindFenceByStore(vendorOrgCode, vendorStoreID, []string{utils.Int64ToStr(storeID)}); err != nil {
|
||
errList.AddErr(fmt.Errorf("门店(%d) 绑定电子围栏:%s失败:%v", storeID, fenceID, err))
|
||
} else {
|
||
FreightTemplate.FenceID = utils.Int64ToStr(storeID)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//3.平台获取限售模板
|
||
if bindSaleLimitID, err := GetStoreSaleLimit(vendorOrgCode, vendorStoreID); err != nil || bindSaleLimitID == 0 { //未绑定限售模板,目前默认创建起送价限售模板
|
||
if createSaleLimitID, err := CreateAndBindMinPriceTemplate(vendorOrgCode, vendorStoreID, minPrice); err != nil {
|
||
errList.AddErr(fmt.Errorf("设置门店起送价限售模板失败:%v", err))
|
||
} else {
|
||
FreightTemplate.TradeLimitID = createSaleLimitID
|
||
}
|
||
} else {
|
||
if updateSaleLimitID, err := UpdateTradeLimitTemplate(vendorOrgCode, bindSaleLimitID, minPrice); err != nil {
|
||
errList.AddErr(fmt.Errorf("更新门店起送价限售模板失败:%v", err))
|
||
} else {
|
||
FreightTemplate.TradeLimitID = updateSaleLimitID
|
||
}
|
||
}
|
||
//4. 设置门店打包费 默认为0
|
||
if err := SetStorePackageFee(vendorOrgCode, vendorStoreID, deliveryFeeDeductionFee); err != nil {
|
||
errList.AddErr(fmt.Errorf("设置门店打包费失败:%v", err))
|
||
}
|
||
//5.设置自动运力
|
||
if autoCall == tiktok_api.AutoCallRiderOpen {
|
||
if err := SetStoreAutoCallRider(vendorOrgCode, tiktok_api.AutoCallRiderOpen, vendorStoreID); err != nil {
|
||
errList.AddErr(fmt.Errorf("开启门店自动运力失败:%v", err))
|
||
}
|
||
} else {
|
||
if err := SetStoreAutoCallRider(vendorOrgCode, tiktok_api.AutoCallRiderClose, vendorStoreID); err != nil {
|
||
errList.AddErr(fmt.Errorf("关闭门店自动运力失败:%v", err))
|
||
}
|
||
}
|
||
|
||
//6.同步进数据库
|
||
if err := dao.ReplaceInsertFreight(FreightTemplate); err != nil {
|
||
globals.SugarLogger.Debug("同步数据库错误信息:%v", err)
|
||
}
|
||
//if err := dao.CreateEntity(db, FreightTemplate); dao.IsDuplicateError(err) || err != nil {
|
||
// if _, err1 := dao.UpdateEntity(db, FreightTemplate, "TemplateID", "WarehouseID", "FenceID", "TradeLimitID", "StoreID", "VendorStoreID"); err1 != nil {
|
||
// globals.SugarLogger.Debug("更新操作,同步进数据库错误信息:%v", err1)
|
||
// //errList.AddErr(fmt.Errorf("更新操作,同步进数据库错误信息:%v", err1))
|
||
// } else {
|
||
// globals.SugarLogger.Debug("创建操作,同步进数据库错误信息:%v", err)
|
||
// //errList.AddErr(fmt.Errorf("创建操作,同步进数据库错误信息:%v", err))
|
||
// }
|
||
//}
|
||
endErr := errList.GetErrListAsOne()
|
||
if endErr != nil {
|
||
globals.SugarLogger.Debug("绑定抖音门店需进行的错误处理:%v", errors.New(fmt.Sprintf("%s", utils.Format4Output(errList, false))))
|
||
return endErr
|
||
} else {
|
||
return nil
|
||
}
|
||
}
|
||
|
||
// shop/editStore 编辑门店信息 正向推送平台
|
||
func (P *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||
var (
|
||
m = make(map[int64]string)
|
||
name string
|
||
storeInfo *dao.StoreDetail
|
||
errList = errlist.New()
|
||
timeStr = ""
|
||
tempFenceID string
|
||
FreightTemplate = &model.FreightTemplate{
|
||
StoreID: storeID,
|
||
VendorStoreID: storeInfo.VendorStoreID,
|
||
}
|
||
)
|
||
if db == nil {
|
||
db = dao.GetDB()
|
||
}
|
||
storeInfo, err = dao.GetStoreDetail(db, storeID, model.VendorIDDD, "")
|
||
apiObj := getAPI(storeInfo.VendorOrgCode, storeID, storeInfo.VendorStoreID)
|
||
//判断是否需要更新
|
||
if !IsNeedStoreUpdate(storeInfo, storeInfo.VendorStoreID) {
|
||
return nil
|
||
} else {
|
||
if storeInfo.OpenTime1 != 0 && storeInfo.CloseTime1 != 0 {
|
||
if storeInfo.OpenTime2 != 0 && storeInfo.CloseTime2 != 0 {
|
||
timeStr = SplicingTimeToDoudian(storeInfo.OpenTime1, storeInfo.CloseTime1, storeInfo.OpenTime2, storeInfo.CloseTime2, true)
|
||
} else {
|
||
timeStr = SplicingTimeToDoudian(storeInfo.OpenTime1, storeInfo.CloseTime1, 0, 0, false)
|
||
}
|
||
for j := 1; j <= 7; j++ {
|
||
m[int64(j)] = timeStr
|
||
}
|
||
} else {
|
||
return fmt.Errorf("营业时间必填")
|
||
}
|
||
if globals.EnableDdStoreWrite {
|
||
remoteStoreInfo, err2 := apiObj.GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||
StoreId: storeInfo.VendorStoreID,
|
||
})
|
||
if err2 != nil {
|
||
return err2
|
||
}
|
||
if remoteStoreInfo.StoreDetail.Store.StoreId == 0 {
|
||
return fmt.Errorf("ID(%d) 的门店不存在,请先创建", utils.Str2Int64(storeInfo.VendorStoreID))
|
||
}
|
||
mergedStoreStatus := jxutils.MergeStoreStatus(storeInfo.Status, storeInfo.VendorStatus)
|
||
name = remoteStoreInfo.StoreDetail.Store.Name
|
||
if storeInfo.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
|
||
if storeInfo.VendorStoreName != "" {
|
||
name = storeInfo.VendorStoreName
|
||
}
|
||
}
|
||
store := fmt.Sprintf("门店id:%d,门店名称:%s,第三方门店状态:%d,本地修改前门店状态%d,本地门店修改后状态:%d,第三方平台Id(抖店):%s", storeID, remoteStoreInfo.StoreDetail.Store.Name, remoteStoreInfo.StoreDetail.Store.State, storeInfo.Status, mergedStoreStatus, storeInfo.VendorOrgCode)
|
||
event.AddOperateEvent(jxcontext.AdminCtx, jxcontext.AdminCtx.GetTrackInfo(), store, "", "", 10, "UpdateStore")
|
||
params := &shop_editStore_request.ShopEditStoreParam{
|
||
StoreId: remoteStoreInfo.StoreDetail.Store.StoreId, //平台id不可修改
|
||
Name: name,
|
||
StoreCode: utils.Int2Str(storeInfo.ID), //自用编码即本地storeID
|
||
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeInfo.Lat)),
|
||
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeInfo.Lng)),
|
||
Province: storeInfo.ProvinceName,
|
||
City: storeInfo.CityName,
|
||
District: storeInfo.DistrictName,
|
||
Address: storeInfo.Address,
|
||
Contact: storeInfo.Tel1,
|
||
OpenTime: &shop_editStore_request.OpenTime{
|
||
DayMap: m,
|
||
},
|
||
}
|
||
//修改店铺状态
|
||
if storeInfo.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 {
|
||
errList.AddErr(UpdateStoreStatus(jxcontext.AdminCtx, storeInfo.VendorOrgCode, storeID, storeInfo.VendorStoreID, mergedStoreStatus))
|
||
}
|
||
if err3 := apiObj.EditStore(params); err3 != nil {
|
||
errList.AddErr(fmt.Errorf("修改门店(%d) 信息失败:%v", utils.Str2Int64(storeInfo.VendorStoreID), err3))
|
||
}
|
||
//电子围栏
|
||
bind, err := GetWarehouseByStore(storeInfo.VendorOrgCode, utils.Str2Int64(storeInfo.VendorStoreID))
|
||
if err != nil {
|
||
errList.AddErr(fmt.Errorf("获取门店(%d) 电子围栏失败:%v", utils.Str2Int64(storeInfo.VendorStoreID), err))
|
||
} else if len(bind[storeInfo.VendorStoreID][0].OutFenceIds) == 0 {
|
||
//检查是否以storeID创建过
|
||
if bindFence, err := GetFence(storeInfo.VendorOrgCode, []string{utils.Int2Str(storeID)}); err == nil {
|
||
tempFenceID = bindFence[0].OutFenceId
|
||
} else {
|
||
if fenceID, err := CreateFenceByStore(storeInfo.VendorOrgCode, int64(storeID)); err != nil || len(fenceID) == 0 { //创建
|
||
globals.SugarLogger.Debug("门店(%d) 创建电子围栏失败:%v", storeID, err)
|
||
errList.AddErr(fmt.Errorf("门店(%d) 创建电子围栏失败:%v", storeID, err))
|
||
} else {
|
||
tempFenceID = fenceID
|
||
}
|
||
}
|
||
if err := BindFenceByStore(storeInfo.VendorOrgCode, utils.Str2Int64(storeInfo.VendorStoreID), []string{tempFenceID}); err != nil {
|
||
globals.SugarLogger.Debug("门店(%d) 绑定电子围栏:%s失败:%v", storeID, tempFenceID, err)
|
||
errList.AddErr(fmt.Errorf("门店(%d) 绑定电子围栏:%s失败:%v", storeID, tempFenceID, err))
|
||
}
|
||
} else if len(bind[storeInfo.VendorStoreID][0].OutFenceIds) > 0 {
|
||
//默认更新第一个电子围栏
|
||
outFenceID := bind[storeInfo.VendorStoreID][0].OutFenceIds[0]
|
||
if err = UpdateFenceByStore(storeInfo.VendorOrgCode, outFenceID, storeID); err != nil {
|
||
errList.AddErr(errors.New(fmt.Sprintf("更新电子围栏失败,原因:%v", err)))
|
||
}
|
||
FreightTemplate.FenceID = outFenceID
|
||
}
|
||
}
|
||
//同步进数据库
|
||
FreightTemplate.FenceID = tempFenceID
|
||
if err := dao.ReplaceInsertFreight(FreightTemplate); err != nil {
|
||
globals.SugarLogger.Debug("同步数据库错误信息:%v", err)
|
||
}
|
||
//if err = dao.CreateEntity(db, FreightTemplate); dao.IsDuplicateError(err) || err != nil {
|
||
// if _, err1 := dao.UpdateEntity(db, FreightTemplate, "FenceID", "StoreID", "VendorStoreID"); err1 != nil {
|
||
// errList.AddErr(fmt.Errorf("更新操作,同步进数据库错误信息:%v", err1))
|
||
// } else {
|
||
// errList.AddErr(fmt.Errorf("创建操作,同步进数据库错误信息:%v", err))
|
||
// }
|
||
//}
|
||
if endErr := errList.GetErrListAsOne(); endErr != nil {
|
||
globals.SugarLogger.Debugf("DouDian UpdateStore wrong information:%v", endErr)
|
||
}
|
||
return nil
|
||
}
|
||
}
|
||
|
||
// UpdateStoreStatus shop/unsuspendStore 门店恢复营业
|
||
func UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, status int) (err error) {
|
||
isOnline := bizStatusJX2DouDian(status)
|
||
a := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||
if globals.EnableDdStoreWrite {
|
||
if isOnline != tiktok_api.StoreStatusOnline { //暂停营业状态
|
||
if _, err = a.StoreSuspend(&shop_storeSuspend_request.ShopStoreSuspendParam{
|
||
StoreId: utils.Str2Int64(vendorStoreID),
|
||
}); err != nil {
|
||
return err
|
||
}
|
||
} else { //恢复营业
|
||
//与平台上店铺状态对比
|
||
if remoteStoreInfo, err2 := a.GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||
StoreId: vendorStoreID,
|
||
}); err2 != nil {
|
||
return err2
|
||
} else {
|
||
if remoteStoreInfo.StoreDetail.Store.SuspendType == tiktok_api.SuspendTypePlatformPenalty {
|
||
err = errors.New("门店因平台处罚暂停营业,不可主动修改营业状态")
|
||
} else {
|
||
if _, err = a.UnsuspendStore(&shop_unsuspendStore_request.ShopUnsuspendStoreParam{
|
||
StoreId: utils.Str2Int64(vendorStoreID),
|
||
}); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
//默认 运费模板只创建 固定运费模板
|
||
func CreateFreightTemplate(storeCode, deliveryFeeDeductionSill int) (int64, error) {
|
||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeCode, model.VendorIDDD, "")
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
param := &freightTemplate_create_request.FreightTemplateCreateParam{
|
||
Template: &freightTemplate_create_request.Template{
|
||
TemplateName: utils.Int2Str(storeCode) + "的",
|
||
ProductProvince: utils.Str2Int64(utils.Int2Str(storeDetail.ProvinceCode)[:2]),
|
||
CalculateType: tiktok_api.CalculateTypeNum,
|
||
TransferType: tiktok_api.TransferTypeExpress,
|
||
RuleType: tiktok_api.RuleTypeFlatShipping,
|
||
FixedAmount: 500, //固定运费 单位:分
|
||
},
|
||
}
|
||
//直辖市特殊处理
|
||
if HandleMunicipality(storeDetail.CityName) {
|
||
param.Template.ProductCity = int64(storeDetail.ProvinceCode)
|
||
param.Columns = []freightTemplate_create_request.ColumnsItem{{
|
||
ProvinceInfos: []freightTemplate_create_request.ProvinceInfosItem{{
|
||
Id: utils.Str2Int64(utils.Int2Str(storeDetail.ProvinceCode)[:2]),
|
||
Children: []freightTemplate_create_request.ChildrenItem_4{
|
||
{
|
||
Id: int64(storeDetail.ProvinceCode),
|
||
Children: []freightTemplate_create_request.ChildrenItem_5{
|
||
{
|
||
Id: int64(storeDetail.DistrictCode),
|
||
//Children: []freightTemplate_create_request.ChildrenItem{
|
||
// {Id: 0},
|
||
//},
|
||
},
|
||
},
|
||
},
|
||
}},
|
||
}},
|
||
}
|
||
} else {
|
||
param.Template.ProductCity = int64(storeDetail.CityCode)
|
||
param.Columns = []freightTemplate_create_request.ColumnsItem{{
|
||
ProvinceInfos: []freightTemplate_create_request.ProvinceInfosItem{
|
||
{
|
||
Id: utils.Str2Int64(utils.Int2Str(storeDetail.ProvinceCode)[:2]),
|
||
Children: []freightTemplate_create_request.ChildrenItem_4{
|
||
{
|
||
Id: int64(storeDetail.CityCode),
|
||
Children: []freightTemplate_create_request.ChildrenItem_5{
|
||
{
|
||
Id: int64(storeDetail.DistrictCode),
|
||
//Children: []freightTemplate_create_request.ChildrenItem{
|
||
// {Id: 0},
|
||
//},
|
||
},
|
||
},
|
||
},
|
||
}},
|
||
},
|
||
},
|
||
}
|
||
}
|
||
if deliveryFeeDeductionSill != 0 {
|
||
param.Template.TemplateName += "满减包邮模板"
|
||
param.Columns = []freightTemplate_create_request.ColumnsItem{{
|
||
IsOverFree: true, //是否包邮
|
||
IsLimited: false,
|
||
OverAmount: int64(deliveryFeeDeductionSill), //此字段在vendor_id=14时 存储满x包邮金额
|
||
}}
|
||
} else {
|
||
//param.Columns = nil
|
||
param.Template.TemplateName += "固定运费模板"
|
||
}
|
||
globals.SugarLogger.Debugf("创建运费模板")
|
||
if resp, err := getAPI(storeDetail.VendorOrgCode, storeCode, storeDetail.VendorStoreID).FreightTemplateCreate(param); err != nil {
|
||
return 0, err
|
||
} else {
|
||
return resp.TemplateId, nil
|
||
}
|
||
}
|
||
|
||
// /freightTemplate/update 修改运费模板
|
||
func UpdateFreightTemplate(storeCode int) error {
|
||
//获取本地门店信息
|
||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeCode, model.VendorIDDD, "")
|
||
if err != nil {
|
||
return errors.New(fmt.Sprintf("获取本地门店信息失败:%v", err))
|
||
}
|
||
//获取绑定的运费模板信息
|
||
bindTemplate, err := GetStoreFreight(storeDetail.VendorOrgCode, utils.Str2Int64(storeDetail.VendorStoreID))
|
||
if err != nil || bindTemplate == 0 {
|
||
return errors.New(fmt.Sprintf("获取门店绑定运费模板失败:%v,请先创建运费模板", err))
|
||
} else {
|
||
param := &freightTemplate_update_request.FreightTemplateUpdateParam{
|
||
Template: &freightTemplate_update_request.Template{
|
||
Id: bindTemplate,
|
||
TemplateName: utils.Int2Str(storeCode) + "的",
|
||
ProductProvince: utils.Str2Int64(utils.Int2Str(storeDetail.ProvinceCode)[:2]),
|
||
CalculateType: tiktok_api.CalculateTypeNum,
|
||
TransferType: tiktok_api.TransferTypeExpress,
|
||
RuleType: tiktok_api.RuleTypeFlatShipping,
|
||
FixedAmount: 500, //固定运费 单位:分
|
||
},
|
||
}
|
||
if storeDetail.CityName == tiktok_api.MunicipalityBeiJin || storeDetail.CityName == tiktok_api.MunicipalityShangHai || storeDetail.CityName == tiktok_api.MunicipalityTianJin || storeDetail.CityName == tiktok_api.MunicipalityChongQing {
|
||
param.Template.ProductCity = int64(storeDetail.ProvinceCode)
|
||
} else {
|
||
param.Template.ProductCity = int64(storeDetail.CityCode)
|
||
}
|
||
if int64(storeDetail.DeliveryFeeDeductionSill) != 0 {
|
||
param.Template.TemplateName += "满减包邮模板"
|
||
columns := []freightTemplate_update_request.ColumnsItem{
|
||
{
|
||
IsOverFree: true, //是否包邮
|
||
IsDefault: 0,
|
||
IsLimited: false,
|
||
OverAmount: int64(storeDetail.DeliveryFeeDeductionSill), //此字段在vendor_id=14时 存储满x包邮金额
|
||
}}
|
||
param.Columns = columns
|
||
} else {
|
||
param.Columns = nil
|
||
param.Template.TemplateName += "固定运费模板"
|
||
}
|
||
_, err = getAPI(storeDetail.VendorOrgCode, storeCode, storeDetail.VendorStoreID).FreightTemplateUpdate(param)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// /freightTemplate/create 批量创建绑定 满x包邮 运费模板
|
||
func CreateBindFreeShipTemplate(storeID int, shipFee int64) error {
|
||
var (
|
||
db = dao.GetDB()
|
||
errList = errlist.New()
|
||
FreightTemplate = &model.FreightTemplate{}
|
||
)
|
||
if shipFee == 0 {
|
||
return errors.New("包邮金额必传,请检查")
|
||
}
|
||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, "")
|
||
if err != nil {
|
||
return errors.New("创建包邮运费模板,获取门店信息失败,请重试")
|
||
}
|
||
param := &freightTemplate_create_request.FreightTemplateCreateParam{
|
||
Template: &freightTemplate_create_request.Template{
|
||
TemplateName: utils.Int2Str(storeID) + "的满" + utils.Int64ToStr(shipFee) + "包邮模板",
|
||
ProductProvince: utils.Str2Int64(utils.Int2Str(storeDetail.ProvinceCode)[:2]),
|
||
CalculateType: tiktok_api.CalculateTypeNum,
|
||
TransferType: tiktok_api.TransferTypeExpress,
|
||
RuleType: tiktok_api.RuleTypeFlatShipping,
|
||
FixedAmount: 500, //固定运费 单位:分
|
||
},
|
||
Columns: []freightTemplate_create_request.ColumnsItem{
|
||
{
|
||
IsOverFree: true,
|
||
IsLimited: false,
|
||
OverAmount: shipFee,
|
||
}},
|
||
}
|
||
//直辖市特殊处理
|
||
if HandleMunicipality(storeDetail.CityName) {
|
||
param.Template.ProductCity = int64(storeDetail.ProvinceCode)
|
||
} else {
|
||
param.Template.ProductCity = int64(storeDetail.CityCode)
|
||
}
|
||
globals.SugarLogger.Debugf("CreateBindFreeShipTemplate param====%s", utils.Format4Output(param, false))
|
||
if resp, err := getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID).FreightTemplateCreate(param); err != nil {
|
||
return errors.New(fmt.Sprintf("平台门店(%s) 京西门店(%d) 创建包邮模板失败:%v,根据提示处理", storeDetail.VendorStoreID, storeID, err))
|
||
} else {
|
||
if err := ShopBindStoreFreight(storeDetail.VendorOrgCode, utils.Str2Int64(storeDetail.VendorStoreID), resp.TemplateId); err != nil {
|
||
return errors.New(fmt.Sprintf("平台门店(%s) 京西门店(%d) 绑定包邮模板失败:%v,根据提示处理", storeDetail.VendorStoreID, storeID, err))
|
||
} else {
|
||
if err := dao.CreateEntity(db, FreightTemplate); dao.IsDuplicateError(err) || err != nil {
|
||
if _, err1 := dao.UpdateEntity(db, FreightTemplate, "TemplateID"); err1 != nil {
|
||
errList.AddErr(fmt.Errorf("包邮模板:更新操作,同步进数据库错误信息:%v", err1))
|
||
} else {
|
||
errList.AddErr(fmt.Errorf("包邮模板:创建操作,同步进数据库错误信息:%v", err))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if errList.GetErrListAsOne() != nil {
|
||
return errList.GetErrListAsOne()
|
||
}
|
||
return nil
|
||
}
|
||
|
||
//更新 包邮运费模板
|
||
func UpdateFreeShipTemplate(storeID int, shipFee int64) error {
|
||
if shipFee == 0 {
|
||
return errors.New("包邮金额必传,请检查")
|
||
}
|
||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, "")
|
||
if err != nil {
|
||
return errors.New("更新包邮运费模板,获取门店信息失败,请重试")
|
||
}
|
||
a := getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID)
|
||
//获取远程运费模板详情
|
||
if bindFreightID, err := a.GetStoreFreight(utils.Str2Int64(storeDetail.VendorStoreID)); err != nil || len(bindFreightID) == 0 || utils.IsNil(bindFreightID) {
|
||
//return errors.New("门店未绑定运费模板,")
|
||
} else {
|
||
if freightDetail, err := a.GetStoreFreightDetail(bindFreightID[0]); err != nil {
|
||
param := &freightTemplate_update_request.FreightTemplateUpdateParam{
|
||
Template: &freightTemplate_update_request.Template{
|
||
Id: bindFreightID[0],
|
||
TemplateName: freightDetail.Template.TemplateName,
|
||
ProductProvince: utils.Str2Int64(freightDetail.Template.ProductProvince),
|
||
ProductCity: utils.Str2Int64(freightDetail.Template.ProductCity),
|
||
CalculateType: tiktok_api.CalculateTypeNum,
|
||
TransferType: tiktok_api.TransferTypeExpress,
|
||
RuleType: tiktok_api.RuleTypeFlatShipping,
|
||
FixedAmount: 500,
|
||
},
|
||
Columns: []freightTemplate_update_request.ColumnsItem{
|
||
{
|
||
IsOverFree: true,
|
||
IsLimited: false,
|
||
OverAmount: shipFee,
|
||
}},
|
||
}
|
||
if _, err := a.FreightTemplateUpdate(param); err != nil {
|
||
return errors.New("更新包邮运费模板失败")
|
||
}
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// /shop/bindStoreFreight 门店绑定运费模版
|
||
//门店绑定运费模版,运费模版必须属于门店关联的抖店,且门店与运费模版是一对一关系
|
||
func ShopBindStoreFreight(vendorOrgCode string, storeID, freightID int64) error {
|
||
if err := getAPI(vendorOrgCode, int(storeID), "").BindFreightTemplate(&shop_bindStoreFreight_request.ShopBindStoreFreightParam{
|
||
StoreId: storeID,
|
||
FreightId: freightID,
|
||
}); err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// /shop/getStoreFreight 获取门店绑定运费模板
|
||
func GetStoreFreight(vendorOrgCode string, storeID int64) (int64, error) {
|
||
if resp, err := getAPI(vendorOrgCode, int(storeID), "").GetStoreFreight(storeID); err != nil || len(resp) == 0 {
|
||
return 0, err
|
||
} else {
|
||
return resp[0], nil
|
||
}
|
||
}
|
||
|
||
// /trade/createTradeLimitTemplate 创建限售模板 默认模板 暂时不使用
|
||
func CreateTradeLimitTemplate(appOrgCode string, vendorStoreID int64) (tradeLimitID int64, err error) {
|
||
param := &trade_createTradeLimitTemplate_request.TradeCreateTradeLimitTemplateParam{
|
||
StoreId: vendorStoreID,
|
||
TradeLimitRuleRequestList: []trade_createTradeLimitTemplate_request.TradeLimitRuleRequestListItem{
|
||
{
|
||
TradeLimitModel: tiktok_api.TradeLimitModelQuantity,
|
||
TradeLimitResource: tiktok_api.TradeLimitResourceDouDian,
|
||
TradeLimitPattern: &trade_createTradeLimitTemplate_request.TradeLimitPattern{
|
||
Minimum: 1,
|
||
Maximum: 1000,
|
||
CumulativeMax: 10000,
|
||
},
|
||
TradeLimitSubjectList: []int32{tiktok_api.TradeLimitSubjectBuyMobile},
|
||
},
|
||
},
|
||
}
|
||
resp, err := getAPI(appOrgCode, 0, utils.Int64ToStr(vendorStoreID)).CreateTradeLimitTemplate(param)
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
return resp.TradeLimitId, nil
|
||
}
|
||
|
||
//创建起送价的 限售模板以及绑定
|
||
func CreateAndBindMinPriceTemplate(vendorOrgCode string, vendorStoreID, minimum int64) (int64, error) {
|
||
resp, err := getAPI(vendorOrgCode, 0, "").CreateTradeLimitTemplate(&trade_createTradeLimitTemplate_request.TradeCreateTradeLimitTemplateParam{
|
||
StoreId: vendorStoreID,
|
||
TradeLimitRuleRequestList: []trade_createTradeLimitTemplate_request.TradeLimitRuleRequestListItem{
|
||
{
|
||
TradeLimitModel: tiktok_api.TradeLimitModelMoney,
|
||
TradeLimitResource: tiktok_api.TradeLimitResourceDouDian,
|
||
TradeLimitPattern: &trade_createTradeLimitTemplate_request.TradeLimitPattern{
|
||
Minimum: minimum,
|
||
Maximum: minimum,
|
||
CumulativeMax: 100,
|
||
},
|
||
TradeLimitSubjectList: []int32{
|
||
tiktok_api.TradeLimitSubjectEndUser,
|
||
},
|
||
},
|
||
},
|
||
})
|
||
if err != nil || resp.TradeLimitId == 0 {
|
||
return 0, errors.New(fmt.Sprintf("创建门店(%d)的起送价失败:%v", vendorStoreID, err))
|
||
} else { //绑定
|
||
if err := BindStoreSaleLimit(vendorOrgCode, vendorStoreID, resp.TradeLimitId); err != nil {
|
||
return 0, errors.New(fmt.Sprintf("门店(%d)绑定 起送价限售模板失败:%v", vendorStoreID, err))
|
||
}
|
||
}
|
||
return resp.TradeLimitId, nil
|
||
}
|
||
|
||
// /trade/UpdateTradeLimitTemplate 更新限售模板 目前只做起送价
|
||
func UpdateTradeLimitTemplate(vendorOrgCode string, tradeLimitID, minPrice int64) (int64, error) {
|
||
if updateTradeLimit, err := getAPI(vendorOrgCode, 0, "").UpdateTradeLimitTemplate(&trade_UpdateTradeLimitTemplate_request.TradeUpdateTradeLimitTemplateParam{
|
||
TradeLimitTemplateId: tradeLimitID,
|
||
TradeLimitRuleRequestList: []trade_UpdateTradeLimitTemplate_request.TradeLimitRuleRequestListItem{
|
||
{
|
||
TradeLimitModel: tiktok_api.TradeLimitModelMoney,
|
||
TradeLimitResource: tiktok_api.TradeLimitResourceDouDian,
|
||
TradeLimitPattern: &trade_UpdateTradeLimitTemplate_request.TradeLimitPattern{
|
||
Minimum: minPrice,
|
||
Maximum: minPrice,
|
||
CumulativeMax: 100,
|
||
},
|
||
TradeLimitSubjectLisit: []int32{
|
||
tiktok_api.TradeLimitSubjectEndUser,
|
||
},
|
||
},
|
||
},
|
||
}); err != nil {
|
||
return 0, err
|
||
} else if updateTradeLimit.TradeLimitTemplateId == 0 {
|
||
return 0, errors.New(fmt.Sprintf("更新操作返回的TradeLimitTemplateId=0"))
|
||
} else {
|
||
return updateTradeLimit.TradeLimitTemplateId, nil
|
||
}
|
||
}
|
||
|
||
// /shop/bindStoreSaleLimit 门店绑定限售模板
|
||
func BindStoreSaleLimit(appOrgCode string, storeID, saleLimitTemplateID int64) error {
|
||
if err := getAPI(appOrgCode, 0, utils.Int64ToStr(storeID)).BindStoreSaleLimit(&shop_bindStoreSaleLimit_request.ShopBindStoreSaleLimitParam{
|
||
StoreId: storeID,
|
||
SaleLimitId: saleLimitTemplateID,
|
||
}); err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// 获取门店绑定限售模板
|
||
func GetStoreSaleLimit(appOrgCode string, storeID int64) (int64, error) {
|
||
if saleLimitTemplateID, err := getAPI(appOrgCode, 0, "").StoreQuerySaleLimitTemp(storeID); err != nil {
|
||
return 0, err
|
||
} else {
|
||
return saleLimitTemplateID, nil
|
||
}
|
||
}
|
||
|
||
func (P *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, opTimeList []int16) (err error) {
|
||
var (
|
||
timeStr = ""
|
||
t1 = opTimeList[0]
|
||
t2 = opTimeList[1]
|
||
t3 = opTimeList[2]
|
||
t4 = opTimeList[4]
|
||
m = make(map[int64]string)
|
||
)
|
||
if t1 != 0 && t2 != 0 {
|
||
if t3 != 0 && t4 != 0 {
|
||
timeStr = SplicingTimeToDoudian(t1, t2, t3, t4, true)
|
||
} else {
|
||
timeStr = SplicingTimeToDoudian(t1, t2, t3, t4, false)
|
||
}
|
||
} else {
|
||
return fmt.Errorf("营业时间必填")
|
||
}
|
||
for j := 1; j <= 7; j++ {
|
||
m[int64(j)] = timeStr
|
||
}
|
||
if globals.EnableDdStoreWrite {
|
||
err = getAPI(vendorOrgCode, storeID, vendorStoreID).EditStore(&shop_editStore_request.ShopEditStoreParam{
|
||
StoreId: utils.Str2Int64(vendorStoreID),
|
||
OpenTime: &shop_editStore_request.OpenTime{
|
||
DayMap: m,
|
||
},
|
||
})
|
||
}
|
||
return err
|
||
}
|
||
|
||
//获取门店状态
|
||
func (P *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) {
|
||
if result, err := getAPI(vendorOrgCode, storeID, vendorStoreID).GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||
StoreId: vendorStoreID,
|
||
IsNeedChargeInfo: false,
|
||
IsNeedPoiAuditInfo: false,
|
||
IsNeedRelShopUser: false,
|
||
}); err != nil {
|
||
return 0, err
|
||
} else {
|
||
poiStatus := int(result.StoreDetail.Store.PoiAuditState)
|
||
return poiStatus, nil
|
||
}
|
||
}
|
||
|
||
func (P *PurchaseHandler) EnableAutoAcceptOrder(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, isSetEnable bool) (err error) {
|
||
return err
|
||
}
|
||
|
||
// 获取店铺所有平台ID
|
||
func (P *PurchaseHandler) GetAllStoresVendorID(ctx *jxcontext.Context, vendorOrgCode string) (vendorStoreIDs []string, err error) {
|
||
//param := &shop_getStoreList_request.ShopGetStoreListParam{
|
||
// Page: "0",
|
||
// PageSize: "20",
|
||
//}
|
||
//if stores, err := getAPI(vendorOrgCode, 0, "").GetStoreList(param); err != nil || stores.Total == 0 {
|
||
// return nil, errors.New(fmt.Sprintf("暂时无门店数据返回,请重试:%v", err))
|
||
//}
|
||
//else if len(stores.StoreDetailList) > 0 {
|
||
// vendorStoreIDs = make([]string, len(stores.StoreDetailList))
|
||
// for k, v := range stores.StoreDetailList {
|
||
// vendorStoreIDs[k] = utils.Int64ToStr(v.Store.StoreId)
|
||
// }
|
||
//}
|
||
//return vendorStoreIDs, err
|
||
return nil, err
|
||
}
|
||
|
||
//获取京西 抖店门店映射关系
|
||
func GetAllVendorStoreMap(ctx *jxcontext.Context, vendorOrgCode string) (map[int64]string, error) {
|
||
param := &shop_getStoreList_request.ShopGetStoreListParam{
|
||
Page: "0",
|
||
PageSize: "20",
|
||
}
|
||
if stores, err := getAPI(vendorOrgCode, 0, "").GetStoreList(param); err != nil || len(stores) == 0 {
|
||
return nil, errors.New(fmt.Sprintf("暂时无门店数据返回,请重试:%v", err))
|
||
} else {
|
||
return stores, err
|
||
}
|
||
}
|
||
|
||
func (P *PurchaseHandler) UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, lineStatus int) (err error) {
|
||
a := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||
if lineStatus == model.StoreStatusOpened {
|
||
_, err = a.UnsuspendStore(&shop_unsuspendStore_request.ShopUnsuspendStoreParam{
|
||
StoreId: utils.Str2Int64(vendorStoreID),
|
||
})
|
||
} else {
|
||
_, err = a.StoreSuspend(&shop_storeSuspend_request.ShopStoreSuspendParam{
|
||
StoreId: utils.Str2Int64(vendorStoreID),
|
||
})
|
||
}
|
||
return err
|
||
}
|
||
func (P *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorStoreName string) (store *dao.StoreDetail, err error) {
|
||
vendorStore, err := getAPI(vendorOrgCode, 0, "").GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{StoreId: vendorStoreID})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
retVal := &dao.StoreDetail{
|
||
Store: model.Store{
|
||
Address: vendorStore.StoreDetail.Store.Address,
|
||
Tel1: vendorStore.StoreDetail.Store.Contact,
|
||
},
|
||
}
|
||
//获取自动运力设置
|
||
autoInfo, err := getAPI(vendorOrgCode, 0, "").GetStoreAutoCallRiderInfo(utils.Str2Int64(vendorStoreID))
|
||
if err == nil {
|
||
if autoInfo.ServiceStatus == tiktok_api.ServiceStatusOpen {
|
||
retVal.YbAppID = tiktok_api.AutoCallRiderOpen
|
||
} else {
|
||
retVal.YbAppID = tiktok_api.AutoCallRiderClose
|
||
}
|
||
}
|
||
retVal.OriginalName = vendorStore.StoreDetail.Store.Name
|
||
_, retVal.Name = jxutils.SplitStoreName(retVal.OriginalName, partner.StoreNameSeparator, globals.StoreNameTiktok)
|
||
retVal.SetTiktokOpenTime(vendorStore.StoreDetail.Store.OpenTime.DayMap[1])
|
||
retVal.Status = bizStatusTiktok2JX(vendorStore.StoreDetail.Store.State)
|
||
retVal.Lng = int(utils.Str2Float64(vendorStore.StoreDetail.Store.Longitude) * 1000000)
|
||
retVal.Lat = int(utils.Str2Float64(vendorStore.StoreDetail.Store.Latitude) * 1000000)
|
||
lng := jxutils.IntCoordinate2Standard(retVal.Lng)
|
||
lat := jxutils.IntCoordinate2Standard(retVal.Lat)
|
||
db := dao.GetDB()
|
||
retVal.DistrictCode = api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat)
|
||
city, err := dao.GetPlaceByCode(db, utils.Str2Int(vendorStore.StoreDetail.Store.CityCode))
|
||
retVal.CityName = city.Name
|
||
retVal.CityCode = utils.Str2Int(vendorStore.StoreDetail.Store.CityCode)
|
||
poiCode := vendorStore.StoreDetail.Store.StoreCode
|
||
retVal.VendorStoreID = vendorStoreID
|
||
retVal.ID = utils.Str2Int(poiCode)
|
||
retVal.DeliveryRangeType = model.DeliveryRangeTypeRadius
|
||
retVal.DeliveryRange = "3000"
|
||
retVal.DeliveryType = scheduler.StoreDeliveryTypeByStore
|
||
return retVal, nil
|
||
}
|
||
|
||
//设置门店打包费
|
||
func SetStorePackageFee(vendorOrgCode string, vendorStoreID, packageFee int64) error {
|
||
if err := getAPI(vendorOrgCode, 0, "").SetStorePackageFee(vendorStoreID, packageFee); err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (P *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
|
||
return "", errors.New("抖店暂不支持此操作")
|
||
}
|
||
|
||
func bizStatusJX2DouDian(status int) (onLine int) {
|
||
if status == model.StoreStatusDisabled || status == model.StoreStatusClosed || status == model.StoreStatusHaveRest {
|
||
return tiktok_api.StoreStatusOffline
|
||
}
|
||
return tiktok_api.StoreStatusOnline
|
||
}
|
||
|
||
func (P *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||
return errors.New("抖店暂不支持此操作")
|
||
}
|
||
|
||
func (P *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error) {
|
||
return err
|
||
}
|
||
|
||
func (P *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||
return 0, errors.New("抖店暂不支持此操作")
|
||
}
|
||
|
||
func (p *PurchaseHandler) GetSkus(ctx *jxcontext.Context, vendorOrgCode string, skuID int, vendorSkuID string) (skuNameList []*partner.SkuNameInfo, err error) {
|
||
return nil, err
|
||
}
|
||
|
||
//以下为辅助函数
|
||
|
||
type RelInfo struct {
|
||
StoreID string `json:"storeID"`
|
||
VendorStoreID string `json:"vendorStoreID"`
|
||
}
|
||
|
||
func ToStringSlice(actual interface{}) ([]string, error) {
|
||
var res []string
|
||
value := reflect.ValueOf(actual)
|
||
if value.Kind() != reflect.Slice || value.Kind() != reflect.Array {
|
||
return nil, errors.New("parse error")
|
||
}
|
||
for i := 0; i < value.Len(); i++ {
|
||
res = append(res, value.Index(i).Interface().(string))
|
||
}
|
||
return res, nil
|
||
}
|
||
|
||
//直辖市判断
|
||
func HandleMunicipality(cityName string) bool {
|
||
if cityName == tiktok_api.MunicipalityBeiJin || cityName == tiktok_api.MunicipalityShangHai || cityName == tiktok_api.MunicipalityTianJin || cityName == tiktok_api.MunicipalityChongQing {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
//判断门店是否审核通过
|
||
func IfAuditPass(vendorOrgCode string, vendorStoreID int64) bool {
|
||
if remoteStore, err := getAPI(vendorOrgCode, 0, " ").GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||
StoreId: utils.Int64ToStr(vendorStoreID),
|
||
}); err == nil {
|
||
if remoteStore.StoreDetail.Store.PoiAuditState != tiktok_api.PoiAuditStateSuccessBind || remoteStore.StoreDetail.Store.State != tiktok_api.StoreStateSuccessBind || remoteStore.StoreDetail.Store.QualState != tiktok_api.QualStateCheckingPassed || remoteStore.StoreDetail.Store.RemitState != tiktok_api.RemitStateCheckingPassed || remoteStore.StoreDetail.Store.OpenAccountState != tiktok_api.OpenAccountStateOpen {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
//判断门店信息是否需要修改
|
||
func IsNeedStoreUpdate(lStore *dao.StoreDetail, storeID string) bool {
|
||
if remoteStore, err := getAPI(lStore.VendorOrgCode, 0, "").GetStoreDetail(&shop_getStoreDetail_request.ShopGetStoreDetailParam{
|
||
StoreId: storeID,
|
||
IsNeedPoiAuditInfo: false,
|
||
IsNeedRelShopUser: false,
|
||
IsNeedChargeInfo: false,
|
||
}); err == nil {
|
||
rStore := remoteStore.StoreDetail.Store
|
||
if lStore.Tel1 != rStore.Contact || lStore.Name != rStore.Name || lStore.Address != rStore.Address {
|
||
return true
|
||
}
|
||
if lStore.ProvinceName != rStore.Province || lStore.CityName != rStore.City || lStore.DistrictName != rStore.District {
|
||
return true
|
||
}
|
||
if utils.Float64ToStr(jxutils.IntCoordinate2Standard(lStore.Lat)) != rStore.Latitude || utils.Float64ToStr(jxutils.IntCoordinate2Standard(lStore.Lng)) != rStore.Longitude {
|
||
return true
|
||
}
|
||
timeStr := ""
|
||
if lStore.OpenTime1 != 0 && lStore.CloseTime1 != 0 {
|
||
if lStore.OpenTime2 != 0 && lStore.CloseTime2 != 0 {
|
||
timeStr = SplicingTimeToDoudian(lStore.OpenTime1, lStore.CloseTime1, lStore.OpenTime2, lStore.CloseTime2, true)
|
||
} else {
|
||
timeStr = SplicingTimeToDoudian(lStore.OpenTime1, lStore.CloseTime1, 0, 0, false)
|
||
}
|
||
}
|
||
if timeStr != rStore.OpenTime.DayMap[1] {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|