893 lines
31 KiB
Go
893 lines
31 KiB
Go
package ebai
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
||
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||
"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"
|
||
)
|
||
|
||
type tEbaiSupplierInfo struct {
|
||
SupplierID string `json:"supplierID"`
|
||
Logo string `json:"logo"`
|
||
Categorys []map[string]interface{}
|
||
BusinessFormID int //门店业态
|
||
BrandName string
|
||
}
|
||
|
||
var (
|
||
EbaiSupplierInfo = map[string]*tEbaiSupplierInfo{
|
||
EbaiSupplierIDsc: &tEbaiSupplierInfo{
|
||
SupplierID: EbaiSupplierIDsc,
|
||
Logo: "https://image-star.elemecdn.com/pb/dab294b0d3e9fa4b5fa63007ff02d06e98",
|
||
Categorys: []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"category1": 166,
|
||
"category2": 222,
|
||
},
|
||
},
|
||
BusinessFormID: 1672214913,
|
||
BrandName: "京西到家",
|
||
},
|
||
EbaiSupplierIDhc: &tEbaiSupplierInfo{
|
||
SupplierID: EbaiSupplierIDhc,
|
||
Logo: "https://image-star.elemecdn.com/pb/b79d499b9b0be5deb3ee3ce71bf29ad0a8",
|
||
Categorys: []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 180,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 184,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 183,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 181,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 182,
|
||
},
|
||
},
|
||
BusinessFormID: 1917869373,
|
||
BrandName: "好菜鲜生",
|
||
},
|
||
EbaiSupplierIDc4: &tEbaiSupplierInfo{
|
||
SupplierID: EbaiSupplierIDc4,
|
||
Logo: "https://fuss10.elemecdn.com/1/34/c6d76d8e3aa86cf214e6bff5514c1jpeg.jpeg",
|
||
Categorys: []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 180,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 184,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 183,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 181,
|
||
},
|
||
map[string]interface{}{
|
||
"category1": 277,
|
||
"category2": 182,
|
||
},
|
||
},
|
||
BusinessFormID: 1917869373,
|
||
BrandName: "京西菜市",
|
||
},
|
||
EbaiSupplierIDgy: &tEbaiSupplierInfo{
|
||
SupplierID: EbaiSupplierIDgy,
|
||
Logo: "https://fuss10.elemecdn.com/7/21/a4b2877a916e1af6c5bdbf5945d51jpeg.jpeg",
|
||
Categorys: []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"category1": 274,
|
||
"category2": 190,
|
||
},
|
||
},
|
||
BusinessFormID: 1917867465,
|
||
BrandName: "京西果园",
|
||
},
|
||
}
|
||
)
|
||
|
||
type tEbaiStoreInfo struct {
|
||
model.Store
|
||
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||
VendorStoreID string `orm:"column(vendor_store_id)"`
|
||
RealLastOperator string
|
||
EbaiStoreStatus int
|
||
SyncStatus int
|
||
|
||
ProvinceID int `orm:"column(province_id)"`
|
||
CityID int `orm:"column(city_id)"`
|
||
DistrictID int `orm:"column(district_id)"`
|
||
VendorStoreName string
|
||
BrandName string
|
||
}
|
||
|
||
func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) {
|
||
var store tEbaiStoreInfo
|
||
sql := `
|
||
SELECT t1.*, t2.status ebai_store_status, t2.vendor_store_id,
|
||
IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator, t2.sync_status,
|
||
province.ebai_code province_id, city.ebai_code city_id, district.ebai_code district_id
|
||
FROM store t1
|
||
LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
|
||
JOIN place district ON t1.district_code = district.code
|
||
JOIN place city ON t1.city_code = city.code
|
||
JOIN place province ON city.parent_code = province.code
|
||
WHERE t1.id = ? AND t2.id IS NULL;
|
||
`
|
||
if err = dao.GetRow(db, &store, sql, model.VendorIDEBAI, utils.DefaultTimeValue, storeID); err == nil {
|
||
params := genStoreMapFromStore(&store)
|
||
params["shop_id"] = store.ID
|
||
params["business_form_id"] = "179"
|
||
params["service_phone"] = store.Tel1
|
||
params["invoice_support"] = 2
|
||
params["package_box_price"] = 0
|
||
params["encrypt"] = ""
|
||
|
||
params["category1"] = ""
|
||
params["category2"] = ""
|
||
params["category3"] = ""
|
||
if globals.EnableEbaiStoreWrite {
|
||
intVendorStoreID, err2 := api.EbaiAPI.ShopCreate(params)
|
||
if err = err2; err == nil {
|
||
return utils.Int64ToStr(intVendorStoreID), err
|
||
}
|
||
} else {
|
||
return utils.Int64ToStr(jxutils.GenFakeID()), nil
|
||
}
|
||
}
|
||
return "", err
|
||
}
|
||
|
||
// 2019-07-26 疑似饿百将门店返回的坐标类型从float64改为string了
|
||
func getCoordintate(data interface{}) float64 {
|
||
if str, ok := data.(string); ok {
|
||
return utils.Str2Float64WithDefault(str, 0)
|
||
}
|
||
return utils.MustInterface2Float64(data)
|
||
}
|
||
|
||
func (p *PurchaseHandler) ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (*dao.StoreDetail, error) {
|
||
baiduShopID := utils.Str2Int64WithDefault(vendorStoreID, 0)
|
||
if baiduShopID == 0 {
|
||
return nil, fmt.Errorf("饿百门店ID:%s非法,应该是一个整数", vendorStoreID)
|
||
}
|
||
result, err := api.EbaiAPI.ShopGet("", baiduShopID)
|
||
if err == nil {
|
||
// globals.SugarLogger.Debug(utils.Format4Output(result, false))
|
||
retVal := &dao.StoreDetail{
|
||
Store: model.Store{
|
||
Address: utils.Interface2String(result["address"]),
|
||
Tel1: utils.Interface2String(result["phone"]),
|
||
},
|
||
}
|
||
retVal.OriginalName = utils.Interface2String(result["name"])
|
||
_, retVal.Name = jxutils.SplitStoreName(retVal.OriginalName, partner.StoreNameSeparator, globals.StoreNameEbai)
|
||
retVal.DeliveryType = EbaiDeliveryType2Jx(utils.Interface2String(result["delivery_type"]))
|
||
|
||
retVal.SetOpTime(ebaiOpTime2Jx(result["business_time"]))
|
||
retVal.Status, _ = p.GetStoreStatus(ctx, vendorOrgCode, 0, vendorStoreID)
|
||
|
||
tel2 := utils.Interface2String(result["ivr_phone"])
|
||
if tel2 != "" && tel2 != retVal.Tel1 {
|
||
retVal.Tel2 = tel2
|
||
}
|
||
|
||
lng := getCoordintate(result["longitude"])
|
||
lat := getCoordintate(result["latitude"])
|
||
if utils.Interface2String(result["coord_type"]) == ebaiapi.CoordTypeBaidu {
|
||
var err2 error
|
||
if lng, lat, err2 = api.AutonaviAPI.CoordinateConvert(lng, lat, autonavi.CoordSysBaidu); err2 != nil {
|
||
return nil, err2
|
||
}
|
||
}
|
||
retVal.Lng = jxutils.StandardCoordinate2Int(lng)
|
||
retVal.Lat = jxutils.StandardCoordinate2Int(lat)
|
||
|
||
db := dao.GetDB()
|
||
if city, err2 := dao.GetPlaceByName(db, utils.Interface2String(result["city"]), model.PlaceLevelCity, 0); err2 == nil {
|
||
retVal.CityCode = city.Code
|
||
retVal.CityName = utils.Interface2String(result["city"])
|
||
districtName := utils.Interface2String(result["county"])
|
||
if retVal.CityCode != 0 && districtName != "" {
|
||
if district, err2 := dao.GetPlaceByName(db, utils.Interface2String(result["county"]), model.PlaceLevelDistrict, city.Code); err2 == nil {
|
||
retVal.DistrictCode = district.Code
|
||
}
|
||
}
|
||
}
|
||
if retVal.DistrictCode == 0 {
|
||
retVal.DistrictCode = api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat)
|
||
if retVal.CityCode == 0 {
|
||
if district, err := dao.GetPlaceByCode(db, retVal.DistrictCode); err == nil {
|
||
retVal.CityCode = district.ParentCode
|
||
}
|
||
}
|
||
}
|
||
retVal.VendorStoreID = vendorStoreID
|
||
retVal.ID = int(utils.Str2Int64WithDefault(utils.Interface2String(result["shop_id"]), 0))
|
||
retVal.DeliveryRangeType = model.DeliveryRangeTypePolygon
|
||
retVal.DeliveryRange = EbaiDeliveryRegion2Jx(result["delivery_region"])
|
||
if retVal.DeliveryRange == "" {
|
||
if list, err := api.EbaiAPI.ShopDeliveryinfoGet("", utils.Str2Int64(vendorStoreID)); err == nil && len(list) > 0 {
|
||
retVal.DeliveryRange = EbaiDeliveryRegion2Jx2(list[0])
|
||
}
|
||
}
|
||
return retVal, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
|
||
func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||
globals.SugarLogger.Debugf("ebai UpdateStore storeID:%d, userName:%s", storeID, userName)
|
||
|
||
var stores []*tEbaiStoreInfo
|
||
sql := `
|
||
SELECT
|
||
t1.*,
|
||
t2.status ebai_store_status, t2.vendor_store_id, t2.vendor_org_code,
|
||
IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator, t2.sync_status, t2.vendor_store_name,
|
||
t3.name brand_name
|
||
FROM store t1
|
||
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND (t2.deleted_at = ?)
|
||
LEFT JOIN brand t3 ON t3.id = t1.brand_id
|
||
WHERE t1.id = ?
|
||
ORDER BY t2.updated_at
|
||
`
|
||
if err = dao.GetRows(db, &stores, sql, model.VendorIDEBAI, utils.DefaultTimeValue, storeID); err == nil {
|
||
for _, store := range stores {
|
||
if globals.EnableEbaiStoreWrite {
|
||
shopID := 0
|
||
if store.SyncStatus&model.SyncFlagDeletedMask == 0 {
|
||
shopID = store.ID
|
||
}
|
||
store2, err2 := p.ReadStore(jxcontext.AdminCtx, store.VendorOrgCode, store.VendorStoreID)
|
||
// globals.SugarLogger.Debugf("ebai UpdateStore2 store2:%s, err2:%v", utils.Format4Output(store2, true), err2)
|
||
if err = err2; err == nil {
|
||
if store2.ID == store.ID {
|
||
shopID = -1
|
||
}
|
||
}
|
||
if err == nil {
|
||
if shopID > 0 {
|
||
err = p.UpdateStoreCustomID(jxcontext.AdminCtx, "", store.VendorStoreID, int64(shopID))
|
||
} else if shopID == 0 {
|
||
// todo remove out shop id
|
||
}
|
||
}
|
||
if err == nil {
|
||
if store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreStatus) != 0 {
|
||
mergeStatus := jxutils.MergeStoreStatus(store.Status, store.EbaiStoreStatus)
|
||
if err = p.UpdateStoreStatus(jxcontext.AdminCtx, store.VendorOrgCode, storeID, store.VendorStoreID, mergeStatus); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
params := genStoreMapFromStore(store)
|
||
if err = api.EbaiAPI.ShopUpdate(params); err == nil {
|
||
if store.PromoteInfo != "" {
|
||
err = api.EbaiAPI.ShopAnnouncementSet("", utils.Str2Int64(store.VendorStoreID), store.PromoteInfo)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
func isStoreStatusSame(status1, status2 int) bool {
|
||
if status1 == model.StoreStatusHaveRest {
|
||
status1 = model.StoreStatusClosed
|
||
}
|
||
if status2 == model.StoreStatusHaveRest {
|
||
status2 = model.StoreStatusClosed
|
||
}
|
||
return status1 == status2
|
||
}
|
||
|
||
func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
|
||
globals.SugarLogger.Debugf("ebai RefreshAllStoresID")
|
||
const batchSize = 50
|
||
const stepCount = 3
|
||
var stores []*tEbaiStoreInfo
|
||
db := dao.GetDB()
|
||
rootTask := tasksch.NewSeqTask("ebai RefreshAllStoresID", ctx,
|
||
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||
switch step {
|
||
case 0:
|
||
err = dao.GetRows(db, &stores, `
|
||
SELECT t1.*, t2.vendor_store_id
|
||
FROM store t1
|
||
JOIN store_map t2 ON t1.id = t2.store_id AND t2.deleted_at = ? AND t2.vendor_id = ?
|
||
WHERE t1.deleted_at = ?
|
||
`, utils.DefaultTimeValue, model.VendorIDEBAI, utils.DefaultTimeValue)
|
||
default:
|
||
taskName := "ebai RefreshAllStoresID update to custom id"
|
||
if step != stepCount-1 {
|
||
taskName = "ebai RefreshAllStoresID update to uuid"
|
||
}
|
||
task1 := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetBatchSize(batchSize), ctx,
|
||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||
baiduShopIDs := make([]string, len(batchItemList))
|
||
shopIDs := make([]string, len(batchItemList))
|
||
for k, v := range batchItemList {
|
||
store := v.(*tEbaiStoreInfo)
|
||
baiduShopIDs[k] = store.VendorStoreID
|
||
shopIDs[k] = utils.Int2Str(store.ID)
|
||
if step != stepCount-1 {
|
||
shopIDs[k] = utils.GetUUID()
|
||
}
|
||
}
|
||
if globals.EnableEbaiStoreWrite {
|
||
err = api.EbaiAPI.ShopIDBatchUpdate(baiduShopIDs, shopIDs)
|
||
}
|
||
return nil, err
|
||
}, stores)
|
||
task.AddChild(task1).Run()
|
||
_, err = task1.GetResult(0)
|
||
}
|
||
return nil, err
|
||
}, stepCount)
|
||
|
||
tasksch.HandleTask(rootTask, parentTask, false).Run()
|
||
if !isAsync {
|
||
_, err = rootTask.GetResult(0)
|
||
}
|
||
return rootTask.ID, err
|
||
}
|
||
|
||
// todo 此函数只考虑了在饿了么侧开店的情况
|
||
func EbaiDeliveryType2Jx(deliveryType string) int8 {
|
||
spIndex := strings.Index(deliveryType, "|")
|
||
if deliveryType != "" {
|
||
elmDeliveryType := utils.Str2Int64(deliveryType[:spIndex])
|
||
switch elmDeliveryType {
|
||
case ebaiapi.DeliveryTypeElmFengNiaoZS,
|
||
ebaiapi.DeliveryTypeElmFengNiaoZSKA,
|
||
ebaiapi.DeliveryTypeElmFengNiaoKS,
|
||
ebaiapi.DeliveryTypeElmNewRetail,
|
||
ebaiapi.DeliveryTypeElmEPeiSong,
|
||
ebaiapi.DeliveryTypeElmFengNiaoHybrid,
|
||
ebaiapi.DeliveryTypeElmFengNiaoNiubee:
|
||
return scheduler.StoreDeliveryTypeByPlatform
|
||
case ebaiapi.DeliveryTypeElmXingHuoZBTrial,
|
||
ebaiapi.DeliveryTypeElmXingHuoZB,
|
||
ebaiapi.DeliveryTypeElmXingHuoZBKA:
|
||
return scheduler.StoreDeliveryTypeCrowdSourcing
|
||
case ebaiapi.DeliveryTypeElmNone,
|
||
ebaiapi.DeliveryTypeElmXingHuoTrial,
|
||
ebaiapi.DeliveryTypeElmXingHuo,
|
||
ebaiapi.DeliveryTypeElmEBase,
|
||
ebaiapi.DeliveryTypeElmXingHuoKA:
|
||
return scheduler.StoreDeliveryTypeByStore
|
||
default:
|
||
return scheduler.StoreDeliveryTypeCrowdSourcing
|
||
}
|
||
}
|
||
return scheduler.StoreDeliveryTypeCrowdSourcing
|
||
}
|
||
|
||
func EbaiDeliveryRegion2Jx(deliveryRegion interface{}) string {
|
||
if deliveryRegion == nil {
|
||
return ""
|
||
}
|
||
realDeliveryRegion := deliveryRegion.([]interface{})
|
||
if len(realDeliveryRegion) > 0 {
|
||
region := deliveryRegion.([]interface{})[0].(map[string]interface{})["region"].([]interface{})[0].([]interface{})
|
||
coords := make([]string, len(region))
|
||
for k, v := range region {
|
||
mapV := v.(map[string]interface{})
|
||
coords[k] = fmt.Sprintf("%.6f,%.6f", utils.MustInterface2Float64(mapV["longitude"]), utils.MustInterface2Float64(mapV["latitude"]))
|
||
}
|
||
return strings.Join(coords, ";")
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func EbaiDeliveryRegion2Jx2(deliveryRegion map[string]interface{}) string {
|
||
if len(deliveryRegion) > 0 {
|
||
if deliveryRegion["delivery_areas"] == nil {
|
||
return ""
|
||
}
|
||
region := deliveryRegion["delivery_areas"].([]interface{})[0].(map[string]interface{})["coordinates"].([]interface{})
|
||
coords := make([]string, len(region))
|
||
for k, v := range region {
|
||
mapV := v.(map[string]interface{})
|
||
coords[k] = fmt.Sprintf("%.6f,%.6f", utils.MustInterface2Float64(mapV["longitude"]), utils.MustInterface2Float64(mapV["latitude"]))
|
||
}
|
||
return strings.Join(coords, ";")
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func JxDeliveryRegion2Ebai(store *model.Store) (deliveryRegion interface{}) {
|
||
rangeStr := strings.Trim(store.DeliveryRange, ";")
|
||
if store.DeliveryRangeType == model.DeliveryRangeTypeRadius {
|
||
if utils.Str2Int64WithDefault(store.DeliveryRange, 0) > 100 { // todo 如果小于100米,表示禁用,不更新
|
||
rangeStr = jxutils.GetPolygonFromCircleStr(jxutils.IntCoordinate2Standard(store.Lng), jxutils.IntCoordinate2Standard(store.Lat), utils.Str2Float64(store.DeliveryRange), 8)
|
||
} else {
|
||
rangeStr = ""
|
||
}
|
||
}
|
||
rangeStr = "" // todo 暂时禁止同步配送区域
|
||
if rangeStr != "" {
|
||
pointPairs := strings.Split(rangeStr, ";")
|
||
region := make([]map[string]interface{}, 0)
|
||
for _, v := range pointPairs {
|
||
pointPair := strings.Split(v, ",")
|
||
if len(pointPair) == 2 {
|
||
region = append(region, map[string]interface{}{
|
||
"longitude": utils.Str2Float64(pointPair[0]),
|
||
"latitude": utils.Str2Float64(pointPair[1]),
|
||
})
|
||
}
|
||
}
|
||
deliveryRegion = []interface{}{
|
||
map[string]interface{}{
|
||
"name": "主要配送区",
|
||
"delivery_fee": 600,
|
||
"delivery_time": "60",
|
||
"min_buy_free": "0",
|
||
"min_order_price": "0",
|
||
"region": []interface{}{
|
||
region,
|
||
},
|
||
},
|
||
}
|
||
}
|
||
return deliveryRegion
|
||
}
|
||
|
||
func fillOpTimeParams(params map[string]interface{}, opTimeList []int16) map[string]interface{} {
|
||
if params == nil {
|
||
params = make(map[string]interface{})
|
||
}
|
||
var pairList []map[string]string
|
||
opTimeListLen := len(opTimeList)
|
||
if opTimeListLen > 4 {
|
||
opTimeListLen = 4
|
||
}
|
||
opTimeListLen = opTimeListLen / 2 * 2
|
||
for k := 0; k < len(opTimeList); k += 2 {
|
||
if opTimeList[k] != 0 {
|
||
pairList = append(pairList, map[string]string{
|
||
"start": jxutils.JxOperationTime2StrTime(opTimeList[k]),
|
||
"end": jxutils.JxOperationTime2StrTime(opTimeList[k+1]),
|
||
})
|
||
} else {
|
||
break
|
||
}
|
||
}
|
||
params["business_time"] = pairList
|
||
return params
|
||
}
|
||
|
||
func ebaiOpTime2Jx(businessTime interface{}) (opTimeList []int16) {
|
||
businessTimeList, _ := businessTime.([]interface{})
|
||
for _, v := range businessTimeList {
|
||
vMap := v.(map[string]interface{})
|
||
opTimeList = append(opTimeList, jxutils.StrTime2JxOperationTime(utils.Interface2String(vMap["start"])+":00", 700),
|
||
jxutils.StrTime2JxOperationTime(utils.Interface2String(vMap["end"])+":00", 2000))
|
||
}
|
||
return opTimeList
|
||
}
|
||
|
||
func genStoreMapFromStore(store *tEbaiStoreInfo) map[string]interface{} {
|
||
params := fillOpTimeParams(nil, store.GetOpTimeList())
|
||
// tel := store.Tel1
|
||
// if tel == "" {
|
||
// tel = store.Tel2
|
||
// }
|
||
// if tel != "" {
|
||
// // params["phone"] = tel // 外卖客服联系电话,这个有时能修改,有时不能修改,暂时统一不改
|
||
// params["ivr_phone"] = tel // 订单提醒电话
|
||
// }
|
||
phone := ""
|
||
if store.MarketManPhone != "" {
|
||
phone = store.MarketManPhone
|
||
} else {
|
||
phone = model.VendorStoreTel
|
||
}
|
||
params["ivr_phone"] = phone //统一改为这个电话
|
||
|
||
if store.VendorStoreID != "" {
|
||
params["baidu_shop_id"] = store.VendorStoreID
|
||
}
|
||
if false { //store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
|
||
if store.VendorStoreName != "" {
|
||
params["name"] = store.VendorStoreName
|
||
} else {
|
||
if store.BrandID != 1 {
|
||
params["name"] = store.Name
|
||
} else {
|
||
params["name"] = jxutils.ComposeStoreName(store.Name, model.VendorIDEBAI)
|
||
}
|
||
}
|
||
}
|
||
boxFee, _ := dao.GetSysConfigAsInt64(dao.GetDB(), model.ConfigSysEbaiBoxFee)
|
||
params["package_box_price"] = boxFee
|
||
params["service_phone"] = store.Tel1
|
||
params["address"] = store.Address
|
||
// todo 饿百 开店审核通过后不允许修改商户信息
|
||
if store.SyncStatus&(model.SyncFlagNewMask /*|model.SyncFlagStoreAddress*/) != 0 {
|
||
// todo 这里应该要做坐标转换吧
|
||
params["longitude"] = jxutils.IntCoordinate2Standard(store.Lng)
|
||
params["latitude"] = jxutils.IntCoordinate2Standard(store.Lat)
|
||
params["coord_type"] = ebaiapi.CoordTypeAutonavi
|
||
// if deliveryRegion := JxDeliveryRegion2Ebai(&store.Store); deliveryRegion != nil {
|
||
// params["delivery_region"] = deliveryRegion
|
||
// }
|
||
if store.ProvinceID != 0 {
|
||
params["province"] = store.ProvinceID
|
||
}
|
||
if store.CityID != 0 {
|
||
params["city"] = store.CityID
|
||
}
|
||
if store.DistrictID != 0 {
|
||
params["county"] = store.DistrictID
|
||
}
|
||
}
|
||
return params
|
||
}
|
||
|
||
func (p *PurchaseHandler) GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error) {
|
||
ebaiStatus, err := api.EbaiAPI.ShopBusStatusGet("", utils.Str2Int64(vendorStoreID), ebaiapi.PlatformFlagElm)
|
||
if err == nil {
|
||
storeStatus = EbaiBusStatus2JxStatus(ebaiStatus)
|
||
}
|
||
return storeStatus, err
|
||
}
|
||
|
||
func (c *PurchaseHandler) onShopMsgPush(msg *ebaiapi.CallbackMsg) (response *ebaiapi.CallbackResponse) {
|
||
var err error
|
||
vendorStoreID := utils.Interface2String(msg.Body["baidu_shop_id"])
|
||
storeID := int(utils.Interface2Int64WithDefault(msg.Body["shop_id"], 0))
|
||
storeStatus := model.StoreStatusOpened
|
||
switch utils.Interface2String(msg.Body["msg_type"]) {
|
||
case "online", "offline":
|
||
storeStatus, err = c.GetStoreStatus(jxcontext.AdminCtx, "", storeID, vendorStoreID)
|
||
case "shop_open", "shop_pause", "shop_close":
|
||
if int(utils.ForceInterface2Int64(msg.Body["business_ele"])) == 1 {
|
||
storeStatus = model.StoreStatusOpened
|
||
} else {
|
||
storeStatus = model.StoreStatusClosed
|
||
}
|
||
}
|
||
if err == nil {
|
||
err = partner.CurStoreManager.OnStoreStatusChanged(vendorStoreID, model.VendorIDEBAI, storeStatus)
|
||
}
|
||
return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil)
|
||
}
|
||
|
||
func (c *PurchaseHandler) GetShopHealthInfo(vendorShopID string) (shopHealthInfo map[string]interface{}, err error) {
|
||
result, err := api.EbaiAPI.GetShopHealthByDetail(utils.Str2Int64(vendorShopID))
|
||
if err == nil {
|
||
shopHealthInfo = utils.Struct2FlatMap(result)
|
||
}
|
||
return shopHealthInfo, err
|
||
}
|
||
|
||
func (p *PurchaseHandler) EnableAutoAcceptOrder(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, isSetEnable bool) (err error) {
|
||
return err
|
||
}
|
||
|
||
func (c *PurchaseHandler) UpdateStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, status int) (err error) {
|
||
if globals.EnableEbaiStoreWrite {
|
||
if status == model.StoreStatusOpened {
|
||
err = api.EbaiAPI.ShopOpen("", utils.Str2Int64(vendorStoreID))
|
||
} else if status == model.StoreStatusHaveRest || status == model.StoreStatusClosed {
|
||
err = api.EbaiAPI.ShopClose("", utils.Str2Int64(vendorStoreID))
|
||
} else if status == model.StoreStatusDisabled {
|
||
err = api.EbaiAPI.ShopClose("", utils.Str2Int64(vendorStoreID))
|
||
// err = api.EbaiAPI.ShopOffline("", utils.Str2Int64(vendorStoreID))
|
||
}
|
||
if err != nil {
|
||
if remoteStatus, err2 := c.GetStoreStatus(ctx, vendorOrgCode, storeID, vendorStoreID); err2 == nil && remoteStatus == status {
|
||
err = nil
|
||
} else if intErr, ok := err.(*utils.ErrorWithCode); ok && intErr.IntCode() == 201100 || intErr.IntCode() == 201101 { // 兼容假错误:商户开业饿了么侧成功
|
||
err = nil
|
||
}
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
func (c *PurchaseHandler) UpdateStoreOpTime(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, opTimeList []int16) (err error) {
|
||
params := map[string]interface{}{
|
||
ebaiapi.KeyBaiduShopID: vendorStoreID,
|
||
}
|
||
fillOpTimeParams(params, opTimeList)
|
||
if globals.EnableEbaiStoreWrite {
|
||
api.EbaiAPI.ShopUpdate(params)
|
||
}
|
||
return err
|
||
}
|
||
|
||
func (c *PurchaseHandler) GetAllStoresVendorID(ctx *jxcontext.Context, vendorOrgCode string) (vendorStoreIDs []string, err error) {
|
||
shopList, err := api.EbaiAPI.ShopList(ebaiapi.SysStatusAll)
|
||
if err == nil && len(shopList) > 0 {
|
||
vendorStoreIDs = make([]string, len(shopList))
|
||
for k, v := range shopList {
|
||
vendorStoreIDs[k] = utils.Int64ToStr(v.BaiduShopID)
|
||
}
|
||
}
|
||
return vendorStoreIDs, err
|
||
}
|
||
|
||
func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode string, vendorStoreID string, storeID int64) (err error) {
|
||
if globals.EnableJdStoreWrite {
|
||
err = api.EbaiAPI.ShopIDBatchUpdate([]string{vendorStoreID}, []string{utils.Int64ToStr(storeID)})
|
||
}
|
||
return err
|
||
}
|
||
|
||
func (c *PurchaseHandler) GetShopListByPage(status, proxy_business_state int) (shopList []*ebaiapi.ShopList, err error) {
|
||
var (
|
||
pageCount = 500
|
||
pageNum = 1
|
||
)
|
||
for {
|
||
shopListPage, _, err2 := api.EbaiAPI.GetShopListByPage(status, proxy_business_state, pageCount, pageNum)
|
||
err = err2
|
||
shopList = append(shopList, shopListPage...)
|
||
if len(shopList) < pageCount {
|
||
break
|
||
}
|
||
pageNum++
|
||
}
|
||
return shopList, err
|
||
}
|
||
|
||
func (c *PurchaseHandler) GetShopIDsByPage() (vendorStoreIDs []string, err error) {
|
||
shopList, err := c.GetShopListByPage(ebaiapi.ShopStatusOnLine, ebaiapi.ProxyBusinessState)
|
||
for _, v := range shopList {
|
||
vendorStoreIDs = append(vendorStoreIDs, v.Wid)
|
||
}
|
||
return vendorStoreIDs, err
|
||
}
|
||
|
||
func (p *PurchaseHandler) CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error) {
|
||
param := make(map[string]interface{})
|
||
param["shop_id"] = utils.Int2Str(storeID)
|
||
// param["supplier_id"] = params["supplierID"]
|
||
param["supplier_id"] = params["supplierID"].(string)
|
||
|
||
//省市区
|
||
placeCity, err := dao.GetPlaceByCode(db, storeDetail.CityCode)
|
||
param["city"] = placeCity.EbaiCode
|
||
placeProvince, err := dao.GetPlaceByCode(db, placeCity.ParentCode)
|
||
param["province"] = placeProvince.EbaiCode
|
||
placeCounty, err := dao.GetPlaceByCode(db, storeDetail.DistrictCode)
|
||
param["county"] = placeCounty.EbaiCode
|
||
|
||
phone := ""
|
||
if storeDetail.MarketManPhone != "" {
|
||
phone = storeDetail.MarketManPhone
|
||
} else {
|
||
phone = model.VendorStoreTel
|
||
}
|
||
ebaiInfo := EbaiSupplierInfo[params["supplierID"].(string)]
|
||
param["name"] = params["vendorStoreName"]
|
||
param["phone"] = phone
|
||
param["ivr_phone"] = phone
|
||
param["service_phone"] = storeDetail.Tel1
|
||
// param["phone"] = "18160030913"
|
||
// param["ivr_phone"] = "18160030913"
|
||
// param["service_phone"] = "18160030913"
|
||
param["address"] = storeDetail.Address
|
||
param["longitude"] = jxutils.IntCoordinate2Standard(storeDetail.Lng)
|
||
param["latitude"] = jxutils.IntCoordinate2Standard(storeDetail.Lat)
|
||
param["coord_type"] = "amap" //高德坐标系
|
||
param["shop_logo"] = ebaiInfo.Logo
|
||
param["categorys"] = ebaiInfo.Categorys
|
||
time1map := map[string]string{
|
||
"start": jxutils.JxOperationTime2StrTime(storeDetail.OpenTime1),
|
||
"end": jxutils.JxOperationTime2StrTime(storeDetail.CloseTime1),
|
||
}
|
||
var time2map = make(map[string]string)
|
||
if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
|
||
time2map["start"] = jxutils.JxOperationTime2StrTime(storeDetail.OpenTime2)
|
||
time2map["end"] = jxutils.JxOperationTime2StrTime(storeDetail.CloseTime2)
|
||
}
|
||
var timeLis []map[string]string
|
||
timeLis = append(timeLis, time1map)
|
||
if len(time2map) > 0 {
|
||
timeLis = append(timeLis, time2map)
|
||
}
|
||
param["business_time"] = timeLis
|
||
param["business_form_id"] = ebaiInfo.BusinessFormID
|
||
if baiduShopID, err2 := api.EbaiAPI.ShopCreate(param); err2 == nil {
|
||
//上传资质
|
||
|
||
return utils.Int64ToStr(baiduShopID), nil
|
||
} else {
|
||
err = err2
|
||
}
|
||
return vendorStoreID, err
|
||
}
|
||
|
||
func (p *PurchaseHandler) DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||
return err
|
||
}
|
||
|
||
func (c *PurchaseHandler) SyncQualify(ctx *jxcontext.Context, storeDetail *dao.StoreDetail) (err error) {
|
||
if storeDetail.LicenceCode == "" || storeDetail.Licence == "" {
|
||
return fmt.Errorf("营业执照信息不全, [%v]", storeDetail.ID)
|
||
}
|
||
if storeDetail.IDCode == "" || storeDetail.IDCardFront == "" || storeDetail.IDCardBack == "" || storeDetail.IDValid == "" {
|
||
return fmt.Errorf("个人信息不全, [%v]", storeDetail.ID)
|
||
}
|
||
if storeDetail.StoreFrontPic == "" || storeDetail.StoreInPic == "" {
|
||
return fmt.Errorf("门面门店照不全!, [%v]", storeDetail.ID)
|
||
}
|
||
if storeDetail.EbaiSupplierID == EbaiSupplierIDsc {
|
||
if storeDetail.Licence2Code == "" || storeDetail.Licence2Image == "" {
|
||
return fmt.Errorf("食品经营许可证不全, [%v]", storeDetail.ID)
|
||
}
|
||
}
|
||
|
||
//营业执照
|
||
licenceMap := make(map[string]interface{})
|
||
licenceMap["type_1"] = 1
|
||
licenceMap["type_2"] = 101
|
||
licenceMap["license_number"] = storeDetail.LicenceCode
|
||
licenceMap["license_address"] = storeDetail.LicenceAddress
|
||
licenceMap["legal_representative_name"] = storeDetail.LicenceOwnerName
|
||
licenceMap["license_name"] = storeDetail.LicenceCorpName
|
||
licence, _ := api.EbaiAPI.PictureUpload(storeDetail.Licence, nil)
|
||
licenceMap["photos"] = []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"photo_url": licence,
|
||
"waterprinter_url": licence,
|
||
},
|
||
}
|
||
if storeDetail.LicenceExpire == "" {
|
||
licenceMap["long_term_valid"] = 1
|
||
} else {
|
||
if storeDetail.LicenceValid != "" {
|
||
if utils.Str2Time(storeDetail.LicenceExpire).Sub(utils.Str2Time(storeDetail.LicenceValid)) > 0 {
|
||
licenceMap["license_validdate"] = storeDetail.LicenceExpire
|
||
} else {
|
||
licenceMap["license_validdate"] = storeDetail.LicenceValid
|
||
}
|
||
} else {
|
||
licenceMap["license_validdate"] = storeDetail.LicenceExpire
|
||
}
|
||
}
|
||
|
||
licence2Map := make(map[string]interface{})
|
||
if storeDetail.EbaiSupplierID == EbaiSupplierIDsc {
|
||
//食品经营许可证
|
||
licence2Map["type_1"] = 2
|
||
licence2Map["type_2"] = 202
|
||
licence2Map["license_number"] = storeDetail.Licence2Code
|
||
licence2Map["license_address"] = storeDetail.LicenceAddress
|
||
licence2Map["legal_representative_name"] = storeDetail.LicenceOwnerName
|
||
licence2Map["license_name"] = storeDetail.LicenceCorpName
|
||
licence2, _ := api.EbaiAPI.PictureUpload(storeDetail.Licence2Image, nil)
|
||
licence2Map["photos"] = []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"photo_url": licence2,
|
||
"waterprinter_url": licence2,
|
||
},
|
||
}
|
||
if storeDetail.Licence2Expire == "" {
|
||
licence2Map["long_term_valid"] = 1
|
||
} else {
|
||
if storeDetail.Licence2Valid != "" {
|
||
if utils.Str2Time(storeDetail.Licence2Expire).Sub(utils.Str2Time(storeDetail.Licence2Valid)) > 0 {
|
||
licence2Map["license_validdate"] = storeDetail.Licence2Expire
|
||
} else {
|
||
licence2Map["license_validdate"] = storeDetail.Licence2Valid
|
||
}
|
||
} else {
|
||
licence2Map["license_validdate"] = storeDetail.Licence2Expire
|
||
}
|
||
}
|
||
}
|
||
|
||
//身份证
|
||
idMap := make(map[string]interface{})
|
||
idMap["type_1"] = 3
|
||
idMap["type_2"] = 301
|
||
idMap["license_number"] = storeDetail.IDCode
|
||
idMap["legal_representative_name"] = storeDetail.IDName
|
||
idMap["license_name"] = storeDetail.IDName
|
||
idCardFront, _ := api.EbaiAPI.PictureUpload(storeDetail.IDCardFront, nil)
|
||
idCardBack, _ := api.EbaiAPI.PictureUpload(storeDetail.IDCardBack, nil)
|
||
idCardHand, _ := api.EbaiAPI.PictureUpload(storeDetail.IDCardHand, nil)
|
||
|
||
// idCardFront, _ := api.EbaiAPI.PictureUpload("http://image.jxc4.com/image/db790784e3a06202d00706c3141035dd.jpg", nil)
|
||
// idCardBack, _ := api.EbaiAPI.PictureUpload("http://image.jxc4.com/image/45a7aae6758edb33f5dc2656358b1afb.jpg", nil)
|
||
// idCardHand, _ := api.EbaiAPI.PictureUpload("http://image.jxc4.com/image/2d47385bbcb211bb08c8c0b76f5b7a21.jpg", nil)
|
||
idMap["photos"] = []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"photo_url": idCardFront,
|
||
"waterprinter_url": idCardFront,
|
||
},
|
||
map[string]interface{}{
|
||
"photo_url": idCardBack,
|
||
"waterprinter_url": idCardBack,
|
||
},
|
||
map[string]interface{}{
|
||
"photo_url": idCardHand,
|
||
"waterprinter_url": idCardHand,
|
||
},
|
||
}
|
||
if storeDetail.IDExpire == "" {
|
||
idMap["long_term_valid"] = 1
|
||
} else {
|
||
if storeDetail.Licence2Valid != "" {
|
||
if utils.Str2Time(storeDetail.IDExpire).Sub(utils.Str2Time(storeDetail.IDValid)) > 0 {
|
||
idMap["license_validdate"] = storeDetail.IDExpire
|
||
} else {
|
||
idMap["license_validdate"] = storeDetail.IDValid
|
||
}
|
||
} else {
|
||
idMap["license_validdate"] = storeDetail.IDExpire
|
||
}
|
||
}
|
||
params := make(map[string]interface{})
|
||
storeFrontPic, _ := api.EbaiAPI.PictureUpload(storeDetail.StoreFrontPic, nil)
|
||
storeInPic, _ := api.EbaiAPI.PictureUpload(storeDetail.StoreInPic, nil)
|
||
maps := []map[string]interface{}{
|
||
licenceMap, idMap, map[string]interface{}{
|
||
"type_1": 5,
|
||
"type_2": 501,
|
||
"photos": []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"photo_url": storeFrontPic,
|
||
"waterprinter_url": storeFrontPic,
|
||
},
|
||
},
|
||
}, map[string]interface{}{
|
||
"type_1": 5,
|
||
"type_2": 502,
|
||
"photos": []map[string]interface{}{
|
||
map[string]interface{}{
|
||
"photo_url": storeInPic,
|
||
"waterprinter_url": storeInPic,
|
||
},
|
||
},
|
||
},
|
||
}
|
||
if storeDetail.EbaiSupplierID == EbaiSupplierIDsc {
|
||
maps = append(maps, licence2Map)
|
||
}
|
||
params["aptitude"] = maps
|
||
err = api.EbaiAPI.ShopAptitudeUpload("", utils.Str2Int64(storeDetail.VendorStoreID), params)
|
||
return err
|
||
}
|
||
|
||
func (c *PurchaseHandler) UpdateStoreLineStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, lineStatus int) (err error) {
|
||
if lineStatus == model.StoreStatusOpened {
|
||
err = api.EbaiAPI.ShopOpen("", utils.Str2Int64(vendorStoreID))
|
||
} else {
|
||
err = api.EbaiAPI.ShopOffline("", utils.Str2Int64(vendorStoreID))
|
||
}
|
||
return err
|
||
}
|