281 lines
10 KiB
Go
281 lines
10 KiB
Go
package jd
|
|
|
|
import (
|
|
"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/dao"
|
|
"git.rosy.net.cn/jx-callback/business/partner"
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
"git.rosy.net.cn/jx-callback/business/model"
|
|
"git.rosy.net.cn/jx-callback/globals/api"
|
|
)
|
|
|
|
const (
|
|
VendorStorePrefix = "京西菜市"
|
|
)
|
|
|
|
type tJdStoreInfo struct {
|
|
model.Store
|
|
JdCityCode int
|
|
JdDistrictCode int
|
|
JdStoreStatus int
|
|
VendorStoreID string `orm:"column(vendor_store_id)"`
|
|
RealLastOperator string
|
|
SyncStatus int
|
|
}
|
|
|
|
func (p *PurchaseHandler) GetFieldIDName() string {
|
|
return model.FieldJdID
|
|
}
|
|
|
|
func (p *PurchaseHandler) GetFieldSyncStatusName() string {
|
|
return model.FieldJdSyncStatus
|
|
}
|
|
|
|
func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) {
|
|
result, err := api.JdAPI.GetStoreInfoByStationNo(vendorStoreID)
|
|
if err == nil {
|
|
retVal := &model.Store{
|
|
Address: utils.Interface2String(result["stationAddress"]),
|
|
OpenTime1: JdOperationTime2JxOperationTime(result["serviceTimeStart1"]),
|
|
CloseTime1: JdOperationTime2JxOperationTime(result["serviceTimeEnd1"]),
|
|
OpenTime2: JdOperationTime2JxOperationTime(result["serviceTimeStart2"]),
|
|
CloseTime2: JdOperationTime2JxOperationTime(result["serviceTimeEnd2"]),
|
|
Status: JdStoreStatus2JxStatus(result["yn"], result["closeStatus"]),
|
|
Tel1: utils.Interface2String(result["phone"]),
|
|
}
|
|
_, retVal.Name = jxutils.SplitStoreName(utils.Interface2String(result["stationName"]), partner.StoreNameSeparator, VendorStorePrefix)
|
|
retVal.DeliveryType = JdDeliveryType2Jx(int(utils.MustInterface2Int64(result["carrierNo"])))
|
|
|
|
tel2 := utils.Interface2String(result["mobile"])
|
|
if tel2 != "" && tel2 != retVal.Tel1 {
|
|
retVal.Tel2 = tel2
|
|
}
|
|
cityCode := int(utils.MustInterface2Int64(result["city"]))
|
|
if cityCode != 0 {
|
|
db := dao.GetDB()
|
|
if city, err2 := dao.GetPlaceByJdCode(db, cityCode); err2 == nil {
|
|
retVal.CityCode = city.Code
|
|
districtName := utils.Interface2String(result["countyName"]) // 京东的市区号码与通用数据完全无法关联,只有通过名字来关联
|
|
if district, err2 := dao.GetPlaceByName(db, districtName, 3, city.Code); err2 == nil {
|
|
retVal.DistrictCode = district.Code
|
|
}
|
|
}
|
|
}
|
|
retVal.Lng = jxutils.StandardCoordinate2Int(utils.MustInterface2Float64(result["lng"]))
|
|
retVal.Lat = jxutils.StandardCoordinate2Int(utils.MustInterface2Float64(result["lat"]))
|
|
|
|
retVal.ID = int(utils.Str2Int64WithDefault(utils.Interface2String(result["outSystemId"]), 0))
|
|
result, err2 := api.JdAPI.GetDeliveryRangeByStationNo(vendorStoreID)
|
|
if err = err2; err == nil {
|
|
retVal.DeliveryRangeType = int8(utils.MustInterface2Int64(result["deliveryRangeType"]))
|
|
if retVal.DeliveryRangeType == model.DeliveryRangeTypePolygon {
|
|
retVal.DeliveryRange = utils.Interface2String(result["deliveryRange"])
|
|
} else {
|
|
retVal.DeliveryRange = utils.Int64ToStr(utils.MustInterface2Int64(result["deliveryRangeRadius"]))
|
|
}
|
|
return retVal, nil
|
|
}
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
// stoerIDs为nil表示所有
|
|
func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
|
var store tJdStoreInfo
|
|
sql := `
|
|
SELECT t1.*, city.jd_code jd_city_code, district.jd_code jd_district_code, t2.status jd_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
|
|
FROM store t1
|
|
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ?
|
|
LEFT JOIN place city ON t1.city_code = city.code
|
|
LEFT JOIN place district ON t1.district_code = district.code
|
|
WHERE t1.id = ?
|
|
ORDER BY t2.updated_at DESC
|
|
LIMIT 1;
|
|
`
|
|
if err = dao.GetRow(db, &store, sql, model.VendorIDJD, storeID); err == nil {
|
|
outSystemID := ""
|
|
if store.SyncStatus&model.SyncFlagDeletedMask == 0 {
|
|
outSystemID = utils.Int2Str(int(store.ID))
|
|
}
|
|
params := map[string]interface{}{
|
|
"outSystemId": outSystemID, // todo 直接修改这个字段可能会有问题
|
|
"stationName": jxutils.ComposeStoreName(store.Name, partner.StoreNameSeparator, VendorStorePrefix),
|
|
"stationAddress": store.Address,
|
|
"serviceTimeStart1": JxOperationTime2JdOperationTime(store.OpenTime1),
|
|
"serviceTimeEnd1": JxOperationTime2JdOperationTime(store.CloseTime1),
|
|
"deliveryRangeType": store.DeliveryRangeType,
|
|
"coordinateType": 3, // 一直用高德
|
|
"lng": jxutils.IntCoordinate2Standard(store.Lng),
|
|
"lat": jxutils.IntCoordinate2Standard(store.Lat),
|
|
"city": store.JdCityCode,
|
|
"county": store.JdDistrictCode,
|
|
"phone": store.Tel1,
|
|
"mobile": store.Tel2,
|
|
}
|
|
if store.DeliveryRangeType == model.DeliveryRangeTypePolygon {
|
|
params["coordinatePoints"] = store.DeliveryRange
|
|
} else {
|
|
params["deliveryRangeRadius"] = utils.Str2Int64(store.DeliveryRange)
|
|
}
|
|
|
|
openTime2 := JxOperationTime2JdOperationTime(store.OpenTime2)
|
|
if openTime2 != 0 {
|
|
params["serviceTimeStart2"] = openTime2
|
|
params["serviceTimeEnd2"] = JxOperationTime2JdOperationTime(store.CloseTime2)
|
|
}
|
|
_, params["closeStatus"] = JxStoreStatus2JdStatus(jxutils.MergeStoreStatus(store.Status, store.JdStoreStatus))
|
|
// globals.SugarLogger.Debug(utils.Format4Output(params, false))
|
|
if globals.EnableStoreWrite {
|
|
err = api.JdAPI.UpdateStoreInfo4Open(store.VendorStoreID, store.RealLastOperator, params)
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
// 没用
|
|
// func (p *PurchaseHandler) DeleteStore(vendorStoreID, userName string) error {
|
|
// params := map[string]interface{}{
|
|
// "yn": 1,
|
|
// }
|
|
// return api.JdAPI.UpdateStoreInfo4Open(vendorStoreID, userName, params)
|
|
// }
|
|
|
|
// func (p *PurchaseHandler) EnableAutoAcceptOrder(vendorStoreID string, isEnabled bool) error {
|
|
// _, err := api.JdAPI.UpdateStoreConfig4Open(vendorStoreID, isEnabled)
|
|
// return err
|
|
// }
|
|
|
|
// func (p *PurchaseHandler) OpenStore(vendorStoreID string, userName string) error {
|
|
// params := map[string]interface{}{
|
|
// "closeStatus": 0,
|
|
// "storeNotice": "",
|
|
// }
|
|
// return api.JdAPI.UpdateStoreInfo4Open(vendorStoreID, userName, params)
|
|
// }
|
|
|
|
// func (p *PurchaseHandler) CloseStore(vendorStoreID, closeNotice, userName string) error {
|
|
// params := map[string]interface{}{
|
|
// "closeStatus": 1,
|
|
// "storeNotice": closeNotice,
|
|
// }
|
|
// return api.JdAPI.UpdateStoreInfo4Open(vendorStoreID, userName, params)
|
|
// }
|
|
|
|
///////////////////////
|
|
func (p *PurchaseHandler) GetAllStoreIDsFromRemote() ([]string, error) {
|
|
result, err := api.JdAPI.GetStationsByVenderId()
|
|
return result, err
|
|
}
|
|
|
|
func (p *PurchaseHandler) GetAllStoresFromRemote() ([]*model.Store, error) {
|
|
ids, err := p.GetAllStoreIDsFromRemote()
|
|
if err == nil {
|
|
retVal := make([]*model.Store, len(ids))
|
|
for index, id := range ids {
|
|
store, err2 := p.ReadStore(id)
|
|
if err2 == nil {
|
|
retVal[index] = store
|
|
} else {
|
|
return nil, err2
|
|
}
|
|
}
|
|
return retVal, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, isAsync bool) (hint string, err error) {
|
|
globals.SugarLogger.Debugf("jd RefreshAllStoresID")
|
|
|
|
var stores []*tJdStoreInfo
|
|
db := dao.GetDB()
|
|
rootTask := tasksch.NewSeqTask("jd RefreshAllStoresID", ctx.GetUserName(), 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 = ?
|
|
WHERE t1.deleted_at = ?
|
|
`, utils.DefaultTimeValue, utils.DefaultTimeValue)
|
|
case 1:
|
|
task1 := tasksch.NewParallelTask("jd RefreshAllStoresID update to uuid", nil, ctx.GetUserName(), func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
store := batchItemList[0].(*tJdStoreInfo)
|
|
storeParams := map[string]interface{}{
|
|
"outSystemId": utils.GetUUID(),
|
|
}
|
|
if globals.EnableStoreWrite {
|
|
err = api.JdAPI.UpdateStoreInfo4Open(store.VendorStoreID, ctx.GetUserName(), storeParams)
|
|
}
|
|
return nil, err
|
|
}, stores)
|
|
task.AddChild(task1).Run()
|
|
_, err = task1.GetResult(0)
|
|
case 2:
|
|
task2 := tasksch.NewParallelTask("jd RefreshAllStoresID update outSystemId", nil, ctx.GetUserName(), func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
store := batchItemList[0].(*tJdStoreInfo)
|
|
storeParams := map[string]interface{}{
|
|
"outSystemId": store.ID,
|
|
}
|
|
if globals.EnableStoreWrite {
|
|
err = api.JdAPI.UpdateStoreInfo4Open(store.VendorStoreID, ctx.GetUserName(), storeParams)
|
|
}
|
|
return nil, err
|
|
}, stores)
|
|
task.AddChild(task2).Run()
|
|
_, err = task2.GetResult(0)
|
|
}
|
|
return nil, err
|
|
}, 3)
|
|
|
|
ctx.SetTaskOrAddChild(rootTask)
|
|
rootTask.Run()
|
|
if !isAsync {
|
|
_, err = rootTask.GetResult(0)
|
|
}
|
|
return rootTask.ID, err
|
|
}
|
|
|
|
// func JdRange2JxRange(jdRanges string) (jxRanges string) {
|
|
// coords := strings.Split(jdRanges, ";")
|
|
// intCoords := []string{}
|
|
// for _, coord := range coords {
|
|
// items := strings.Split(coord, ",")
|
|
// if len(items) == 2 {
|
|
// lng := jxutils.StandardCoordinate2Int(utils.Str2Float64(items[0]))
|
|
// lat := jxutils.StandardCoordinate2Int(utils.Str2Float64(items[1]))
|
|
// intCoords = append(intCoords, fmt.Sprintf("%d,%d", lng, lat))
|
|
// }
|
|
// }
|
|
// return strings.Join(intCoords, ";")
|
|
// }
|
|
|
|
// func JxRange2JdRange(jxRanges string) (jdRanges string) {
|
|
// coords := strings.Split(jxRanges, ";")
|
|
// intCoords := []string{}
|
|
// for _, coord := range coords {
|
|
// items := strings.Split(coord, ",")
|
|
// if len(items) == 2 {
|
|
// lng := jxutils.IntCoordinate2Standard(int(utils.Str2Int64(items[0])))
|
|
// lat := jxutils.IntCoordinate2Standard(int(utils.Str2Int64(items[1])))
|
|
// intCoords = append(intCoords, fmt.Sprintf("%f,%f", lng, lat))
|
|
// }
|
|
// }
|
|
// return strings.Join(intCoords, ";")
|
|
// }
|
|
|
|
func JdDeliveryType2Jx(deliveryType int) int8 {
|
|
if deliveryType == 2938 {
|
|
return scheduler.StoreDeliveryTypeByStore
|
|
} else if deliveryType == 9966 {
|
|
return scheduler.StoreDeliveryTypeCrowdSourcing
|
|
}
|
|
return scheduler.StoreDeliveryTypeByPlatform
|
|
}
|