- remove partner.GetFieldIDName and partner.GetFieldSyncStatusName (use dao.GetXXXField instead)
- mtwm.UpdateStore - mtwm.SyncStoreCategory
This commit is contained in:
@@ -443,7 +443,7 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor
|
||||
storeSkuBind := &model.StoreSkuBind{}
|
||||
if num, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, storeSkuBind, nil, userName, map[string]interface{}{
|
||||
model.FieldStoreID: storeID,
|
||||
}, storeHandler.GetFieldSyncStatusName()); err != nil {
|
||||
}, dao.GetSyncStatusStructField(model.VendorNames[vendorID])); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
dao.Commit(db)
|
||||
|
||||
@@ -127,7 +127,7 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan
|
||||
}
|
||||
|
||||
func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, multiStoresHandler partner.IMultipleStoresHandler, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) {
|
||||
syncStatusFieldName := multiStoresHandler.GetFieldSyncStatusName()
|
||||
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()])
|
||||
task := tasksch.NewParallelTask("syncCategories", nil, userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
cat := batchItemList[0].(*model.SkuCategory)
|
||||
updateFields := []string{syncStatusFieldName}
|
||||
@@ -136,7 +136,7 @@ func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.I
|
||||
err = multiStoresHandler.DeleteCategory(db, cat, userName)
|
||||
} else if (syncStatus & model.SyncFlagNewMask) != 0 { // 新增
|
||||
err = multiStoresHandler.CreateCategory(db, cat, userName)
|
||||
updateFields = append(updateFields, multiStoresHandler.GetFieldIDName())
|
||||
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()]))
|
||||
} else if (syncStatus & model.SyncFlagModifiedMask) != 0 { // 修改
|
||||
err = multiStoresHandler.UpdateCategory(db, cat, userName)
|
||||
}
|
||||
@@ -186,7 +186,7 @@ func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB
|
||||
err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName)
|
||||
if err2 == nil {
|
||||
cat := &model.SkuCategory{}
|
||||
_, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(multiStoresHandler.GetFieldSyncStatusName(), 0), utils.Params2Map(model.FieldParentID, categoryID))
|
||||
_, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]), 0), utils.Params2Map(model.FieldParentID, categoryID))
|
||||
return nil, err2
|
||||
}
|
||||
return nil, err2
|
||||
@@ -233,7 +233,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI
|
||||
globals.SugarLogger.Debugf("SyncSku, nameID:%d, skuID:%d, userName:%s", nameID, skuID, userName)
|
||||
return v.LoopMultiStoresVendors(ctx, db, "SyncSku", isAsync, userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||
multiStoresHandler := v.GetMultiStoreHandler(batchItemList[0].(int))
|
||||
syncStatusFieldName := multiStoresHandler.GetFieldSyncStatusName()
|
||||
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()])
|
||||
var skuList []*model.Sku
|
||||
cond := make(map[string]interface{})
|
||||
if nameID != -1 {
|
||||
@@ -254,7 +254,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI
|
||||
err = multiStoresHandler.DeleteSku(db, sku, userName)
|
||||
} else if syncStatus&model.SyncFlagNewMask != 0 { // 新增
|
||||
err = multiStoresHandler.CreateSku(db, sku, userName)
|
||||
updateFields = append(updateFields, multiStoresHandler.GetFieldIDName())
|
||||
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[multiStoresHandler.GetVendorID()]))
|
||||
} else if syncStatus&model.SyncFlagModifiedMask != 0 { // 修改
|
||||
err = multiStoresHandler.UpdateSku(db, sku, userName)
|
||||
}
|
||||
|
||||
@@ -19,12 +19,12 @@ const (
|
||||
|
||||
var (
|
||||
VendorNames = map[int]string{
|
||||
VendorIDJD: "JD",
|
||||
VendorIDMTWM: "MT",
|
||||
VendorIDELM: "ELEME",
|
||||
VendorIDEBAI: "EBAI",
|
||||
VendorIDJD: "Jd",
|
||||
VendorIDMTWM: "Mtwm",
|
||||
VendorIDELM: "Elm",
|
||||
VendorIDEBAI: "Ebai",
|
||||
VendorIDDada: "Dada",
|
||||
VendorIDMTPS: "MTPS",
|
||||
VendorIDMTPS: "Mtps",
|
||||
}
|
||||
VendorChineseNames = map[int]string{
|
||||
VendorIDJD: "京东到家",
|
||||
|
||||
@@ -2,6 +2,7 @@ package dao
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
@@ -81,3 +82,51 @@ func GenQuestionMarks(count int) string {
|
||||
}
|
||||
return marks
|
||||
}
|
||||
|
||||
func ConvertStructFieldPrefix(prefix string) string {
|
||||
return prefix
|
||||
}
|
||||
|
||||
func ConvertJsonFieldPrefix(prefix string) string {
|
||||
return strings.ToLower(prefix)
|
||||
}
|
||||
|
||||
func ConvertDBFieldPrefix(prefix string) string {
|
||||
return strings.ToLower(prefix)
|
||||
}
|
||||
|
||||
func GetVendorThingIDStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "ID"
|
||||
}
|
||||
|
||||
func GetVendorThingIDJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "ID"
|
||||
}
|
||||
|
||||
func GetVendorThingIDDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_id"
|
||||
}
|
||||
|
||||
func GetSyncStatusStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "SyncStatus"
|
||||
}
|
||||
|
||||
func GetSyncStatusJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "SyncStatus"
|
||||
}
|
||||
|
||||
func GetSyncStatusDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_sync_status"
|
||||
}
|
||||
|
||||
func GetCategoryIDStructField(prefix string) string {
|
||||
return ConvertStructFieldPrefix(prefix) + "CategoryID"
|
||||
}
|
||||
|
||||
func GetCategoryIDJsonField(prefix string) string {
|
||||
return ConvertJsonFieldPrefix(prefix) + "CategoryID"
|
||||
}
|
||||
|
||||
func GetCategoryIDDBField(prefix string) string {
|
||||
return ConvertDBFieldPrefix(prefix) + "_category_id"
|
||||
}
|
||||
|
||||
30
business/model/dao/store.go
Normal file
30
business/model/dao/store.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
type StoreDetail struct {
|
||||
model.Store
|
||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
||||
VendorStatus int `json:"vendor_status"` // 取值同Store.Status
|
||||
DeliveryFee int `json:"deliveryFee"`
|
||||
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
||||
model.Place // district info
|
||||
}
|
||||
|
||||
func GetStoreDetail(db *DaoDB, storeID, vendorID int) (storeDetail *StoreDetail, err error) {
|
||||
sql := `
|
||||
SELECT t2.status vendor_status, t2.vendor_store_id, t2.sync_status, district.*, t1.*
|
||||
FROM store t1
|
||||
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
|
||||
LEFT JOIN place district ON t1.district_code = district.code
|
||||
WHERE t1.id = ? AND t1.deleted_at = ?
|
||||
`
|
||||
storeDetail = &StoreDetail{}
|
||||
if err = GetRow(db, storeDetail, sql, vendorID, utils.DefaultTimeValue, storeID, utils.DefaultTimeValue); err == nil {
|
||||
return storeDetail, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
87
business/model/dao/store_sku.go
Normal file
87
business/model/dao/store_sku.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
|
||||
type SkuStoreCatInfo struct {
|
||||
model.SkuCategory
|
||||
CatID int `orm:"column(cat_id)"` // 这个主要用于判断是否有store_sku_category_map
|
||||
VendorCatID string `orm:"column(vendor_cat_id)"`
|
||||
CatSyncStatus int8
|
||||
|
||||
ParentCatName string
|
||||
ParentCatID int `orm:"column(parent_cat_id)"` // 这个主要用于判断是否有父store_sku_category_map
|
||||
ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"`
|
||||
ParentCatSyncStatus int8
|
||||
}
|
||||
|
||||
type StoreCatSyncInfo struct {
|
||||
CatName string
|
||||
Seq int `json:"seq"`
|
||||
model.StoreSkuCategoryMap
|
||||
|
||||
ParentCatName string
|
||||
ParentCatID int `orm:"column(parent_cat_id)"` // 这个主要用于判断是否有父store_sku_category_map
|
||||
ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"`
|
||||
ParentCatSyncStatus int8
|
||||
}
|
||||
|
||||
func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int) (cats []*SkuStoreCatInfo, err error) {
|
||||
sql := `
|
||||
SELECT DISTINCT t4.*, t5.category_id cat_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status, t4p.name parent_cat_name, t5p.category_id parent_cat_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status
|
||||
FROM store_sku_bind t1
|
||||
JOIN sku t2 ON t1.sku_id = t2.id
|
||||
JOIN sku_name t3 ON t2.name_id = t3.id
|
||||
`
|
||||
if level == 2 {
|
||||
sql += `
|
||||
JOIN sku_category t4 ON (t3.category_id = t4.id OR t2.category_id = t4.id)
|
||||
`
|
||||
} else {
|
||||
sql += `
|
||||
JOIN sku_category t4c ON (t3.category_id = t4c.id OR t2.category_id = t4c.id)
|
||||
JOIN sku_category t4 ON t4.id = t4c.parent_id
|
||||
`
|
||||
}
|
||||
sql += `
|
||||
LEFT JOIN store_sku_category_map t5 ON t4.id = t5.category_id AND t5.store_id = t1.store_id AND t5.deleted_at = ?
|
||||
LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id
|
||||
LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5p.store_id = t1.store_id AND t5p.deleted_at = ?
|
||||
WHERE t1.store_id = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
storeID,
|
||||
utils.DefaultTimeValue,
|
||||
utils.DefaultTimeValue,
|
||||
}
|
||||
if len(skuIDs) > 0 {
|
||||
sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||||
sqlParams = append(sqlParams, skuIDs)
|
||||
}
|
||||
filedPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||||
sql = fmt.Sprintf(sql, filedPrefix, filedPrefix, filedPrefix, filedPrefix)
|
||||
if err = GetRows(db, &cats, sql, sqlParams...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cats, err
|
||||
}
|
||||
|
||||
func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats []*StoreCatSyncInfo, err error) {
|
||||
filedPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||||
sql := fmt.Sprintf(`
|
||||
SELECT t5.*, t4.name cat_name, t4.seq, t4p.name parent_cat_name, t5p.category_id parent_cat_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status
|
||||
FROM store_sku_category_map t5
|
||||
JOIN sku_category t4 ON t5.category_id = t4.id
|
||||
JOIN sku_category t4p ON t4.parent_id = t4p.id
|
||||
JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5p.deleted_at = ?
|
||||
WHERE t5.store_id = ? AND t5.level = ? AND t5.%s_sync_status <> 0
|
||||
`, filedPrefix, filedPrefix, filedPrefix)
|
||||
if err = GetRows(db, &cats, sql, utils.DefaultTimeValue, storeID, level); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cats, err
|
||||
}
|
||||
@@ -134,6 +134,7 @@ type SkuCategory struct {
|
||||
JdCategoryID int `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别
|
||||
ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别
|
||||
EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别
|
||||
MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别
|
||||
|
||||
JdID int64 `orm:"column(jd_id);null" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID
|
||||
JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||||
|
||||
@@ -165,9 +165,10 @@ type StoreMap struct {
|
||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
||||
Status int `json:"status"` // 取值同Store.Status
|
||||
|
||||
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
|
||||
AutoPickup int8 `orm:"default(1)" json:"autoPickup"` // 是否自动拣货
|
||||
DeliveryType int8 `orm:"default(0)" json:"deliveryType"` // 配送类型
|
||||
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
|
||||
AutoPickup int8 `orm:"default(1)" json:"autoPickup"` // 是否自动拣货
|
||||
DeliveryType int8 `orm:"default(0)" json:"deliveryType"` // 配送类型
|
||||
DeliveryFee int `json:"deliveryFee"`
|
||||
DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争
|
||||
|
||||
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
||||
|
||||
@@ -16,11 +16,13 @@ type StoreSkuCategoryMap struct {
|
||||
StoreID int `orm:"column(store_id)"`
|
||||
CategoryID int `orm:"column(category_id)"`
|
||||
|
||||
ElmID int64 `orm:"column(elm_id);index"`
|
||||
EbaiID int64 `orm:"column(ebai_id);index"`
|
||||
ElmID int64 `orm:"column(elm_id);index"`
|
||||
EbaiID int64 `orm:"column(ebai_id);index"`
|
||||
MtwmID string `orm:"column(mtwm_id);size(16)"` // 美团外卖没有ID,保存名字
|
||||
|
||||
ElmSyncStatus int8
|
||||
EbaiSyncStatus int8
|
||||
MtwmSyncStatus int8
|
||||
}
|
||||
|
||||
func (*StoreSkuCategoryMap) TableUnique() [][]string {
|
||||
|
||||
@@ -113,7 +113,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del
|
||||
billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
||||
addParams := map[string]interface{}{
|
||||
"info": utils.FilterMb4(order.BuyerComment),
|
||||
// "origin_mark": model.VendorNames[order.VendorID],
|
||||
// "origin_mark": model.VendorChineseNames[order.VendorID],
|
||||
"origin_mark_no": fmt.Sprintf("%d", order.OrderSeq),
|
||||
"cargo_type": 13,
|
||||
"cargo_weight": jxutils.IntWeight2Float(order.Weight),
|
||||
|
||||
@@ -90,8 +90,6 @@ type IPurchasePlatformHandler interface {
|
||||
RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error)
|
||||
|
||||
GetVendorID() int
|
||||
GetFieldIDName() string
|
||||
GetFieldSyncStatusName() string
|
||||
}
|
||||
|
||||
// db *dao.DaoDB,
|
||||
|
||||
@@ -34,14 +34,6 @@ type tEbaiStoreInfo struct {
|
||||
DistrictID int `orm:"column(district_id)"`
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetFieldIDName() string {
|
||||
return model.FieldEbaiID
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetFieldSyncStatusName() string {
|
||||
return model.FieldEbaiSyncStatus
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) {
|
||||
var store tEbaiStoreInfo
|
||||
sql := `
|
||||
|
||||
@@ -9,14 +9,6 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) GetFieldIDName() string {
|
||||
return model.FieldElmID
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetFieldSyncStatusName() string {
|
||||
return model.FieldElmSyncStatus
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) {
|
||||
return nil, errors.New("饿了么还没实现")
|
||||
}
|
||||
|
||||
@@ -30,14 +30,6 @@ type tJdStoreInfo struct {
|
||||
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 {
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -28,6 +29,48 @@ func (c *PurchaseHandler) GetVendorID() int {
|
||||
return model.VendorIDMTWM
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetVendorCategories() (vendorCats []*model.SkuVendorCategory, err error) {
|
||||
cats, err := api.MtwmAPI.RetailGetSpTagIds()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
vendorCatMapList := make([]map[string]*model.SkuVendorCategory, 3)
|
||||
manID := 10000
|
||||
for i := 0; i < 3; i++ {
|
||||
vendorCatMapList[i] = make(map[string]*model.SkuVendorCategory)
|
||||
for _, v := range cats {
|
||||
if utils.MustInterface2Int64(v["level"]) == 3 {
|
||||
namePathList := strings.Split(strings.Trim(utils.Interface2String(v["namePath"]), ","), ",")
|
||||
if len(namePathList) != 3 {
|
||||
panic(fmt.Sprintf("%s没有三级结构", v["namePath"]))
|
||||
}
|
||||
name := namePathList[i]
|
||||
if _, ok := vendorCatMapList[i][name]; !ok {
|
||||
cat := &model.SkuVendorCategory{
|
||||
VendorID: model.VendorIDMTWM,
|
||||
Name: utils.Interface2String(v["name"]),
|
||||
Level: int(utils.MustInterface2Int64(v["level"])),
|
||||
}
|
||||
cat.LastOperator = "builder"
|
||||
vendorCats = append(vendorCats, cat)
|
||||
vendorCatMapList[i][name] = cat
|
||||
if i == 2 {
|
||||
cat.IsLeaf = int8(1)
|
||||
cat.VendorCategoryID = utils.Int64ToStr(utils.MustInterface2Int64(v["id"]))
|
||||
} else {
|
||||
cat.VendorCategoryID = utils.Int2Str(manID) // 非叶子结点编码没有实际使用
|
||||
manID++
|
||||
}
|
||||
if i > 0 {
|
||||
cat.ParentID = vendorCatMapList[i-1][namePathList[i-1]].VendorCategoryID
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return vendorCats, nil
|
||||
}
|
||||
|
||||
func rangeMtwm2JX(areaStr string) string {
|
||||
var area []interface{}
|
||||
if err := utils.UnmarshalUseNumber([]byte(areaStr), &area); err == nil {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package mtwm
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
_ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
@@ -16,3 +19,11 @@ func init() {
|
||||
beegodb.Init()
|
||||
api.Init()
|
||||
}
|
||||
|
||||
func TestGetVendorCategories(t *testing.T) {
|
||||
result, err := new(PurchaseHandler).GetVendorCategories()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
@@ -30,18 +30,6 @@ type tEbaiStoreInfo struct {
|
||||
DistrictID int `orm:"column(district_id)"`
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetFieldIDName() string {
|
||||
return model.FieldMtwmID
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetFieldSyncStatusName() string {
|
||||
return model.FieldMtwmSyncStatus
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) {
|
||||
return vendorStoreID, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) {
|
||||
result, err := api.MtwmAPI.PoiGet(vendorStoreID)
|
||||
if err == nil {
|
||||
@@ -93,28 +81,38 @@ func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error)
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||||
return p.UpdateStore(db, storeID, userName)
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||||
type StoreAndVendorInfo struct {
|
||||
model.Store
|
||||
model.StoreMap
|
||||
}
|
||||
var store StoreAndVendorInfo
|
||||
sql := `
|
||||
SELECT *
|
||||
FROM store t1
|
||||
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND (t2.deleted_at = ? OR t2.sync_status <> 0)
|
||||
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
|
||||
`
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
}
|
||||
if err = dao.GetRow(db, &store, sql, model.VendorIDJD, utils.DefaultTimeValue, storeID); err == nil {
|
||||
globals.SugarLogger.Debug(utils.Format4Output(store, false))
|
||||
storeDetail, err := dao.GetStoreDetail(db, storeID, model.VendorIDMTWM)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
openTime := [][2]int16{[2]int16{storeDetail.OpenTime1, storeDetail.CloseTime1}}
|
||||
if storeDetail.OpenTime2 > 0 {
|
||||
openTime = append(openTime, [2]int16{storeDetail.OpenTime2, storeDetail.CloseTime2})
|
||||
}
|
||||
params := map[string]interface{}{
|
||||
"name": storeDetail.Store.Name,
|
||||
"address": storeDetail.Address,
|
||||
"longitude": jxutils.IntCoordinate2Standard(storeDetail.Lng),
|
||||
"latitude": jxutils.IntCoordinate2Standard(storeDetail.Lat),
|
||||
"phone": storeDetail.Tel1,
|
||||
"shipping_fee": jxutils.IntPrice2Standard(int64(storeDetail.DeliveryFee)),
|
||||
"shipping_time": openTimeJX2Mtwm(openTime),
|
||||
"third_tag_name": "蔬菜",
|
||||
}
|
||||
params["open_level"], params["is_online"] = bizStatusJX2Mtwm(jxutils.MergeStoreStatus(storeDetail.Status, storeDetail.VendorStatus))
|
||||
globals.SugarLogger.Debug(utils.Format4Output(params, false))
|
||||
if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite {
|
||||
err = api.MtwmAPI.PoiSave(utils.Int2Str(storeDetail.Store.ID), params)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
|
||||
|
||||
87
business/partner/purchase/mtwm/store_sku.go
Normal file
87
business/partner/purchase/mtwm/store_sku.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package mtwm
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"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/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync bool) (hint string, err error) {
|
||||
userName := ctx.GetUserName()
|
||||
strStoreID := utils.Int2Str(storeID)
|
||||
db := dao.GetDB()
|
||||
rootTask := tasksch.NewSeqTask("mtwm SyncStoreCategory", userName, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
level := step + 1
|
||||
catList, err := dao.GetStoreCategories(db, model.VendorIDMTWM, storeID, level)
|
||||
task := tasksch.NewParallelTask("mtwm SyncStoreCategory2", nil, userName, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDMTWM])}
|
||||
catInfo := batchItemList[0].(*dao.StoreCatSyncInfo)
|
||||
if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite {
|
||||
if catInfo.MtwmSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除
|
||||
err = api.MtwmAPI.RetailCatDelete(strStoreID, catInfo.MtwmID)
|
||||
} else if catInfo.MtwmSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增
|
||||
catName := catInfo.CatName
|
||||
subCatName := ""
|
||||
originName := ""
|
||||
if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 {
|
||||
originName = catInfo.MtwmID
|
||||
}
|
||||
if level == 2 {
|
||||
originName = catInfo.ParentCatName
|
||||
catName = catInfo.ParentCatName
|
||||
subCatName = catInfo.CatName
|
||||
if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 {
|
||||
originName = catInfo.MtwmID
|
||||
catName = catInfo.CatName
|
||||
subCatName = ""
|
||||
}
|
||||
}
|
||||
if catName == "" {
|
||||
panic("catName is empty")
|
||||
}
|
||||
if err := api.MtwmAPI.RetailCatUpdate(strStoreID, originName, catName, subCatName, catInfo.Seq); err == nil {
|
||||
catInfo.MtwmID = catInfo.CatName
|
||||
updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDMTWM]))
|
||||
}
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
db2 := dao.GetDB()
|
||||
catInfo.MtwmSyncStatus = 0
|
||||
_, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...)
|
||||
}
|
||||
return nil, err
|
||||
}, catList)
|
||||
rootTask.AddChild(task).Run()
|
||||
_, err = task.GetResult(0)
|
||||
return nil, err
|
||||
}, 2)
|
||||
tasksch.AddChild(parentTask, rootTask).Run()
|
||||
if !isAsync {
|
||||
_, err = rootTask.GetResult(0)
|
||||
}
|
||||
return rootTask.ID, err
|
||||
}
|
||||
func (p *PurchaseHandler) ReadStoreCategories(storeID int) (cats []*model.SkuCategory, err error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) ReadStoreSku(storeID, skuID int) (skuNameExt *model.SkuNameExt, err error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error) {
|
||||
return hint, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) FullSyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||
return hint, err
|
||||
}
|
||||
17
business/partner/purchase/mtwm/store_sku_test.go
Normal file
17
business/partner/purchase/mtwm/store_sku_test.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package mtwm
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||||
)
|
||||
|
||||
func TestSyncStoreCategory(t *testing.T) {
|
||||
store, err := new(PurchaseHandler).SyncStoreCategory(jxcontext.AdminCtx, nil, 100077, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(store, false))
|
||||
}
|
||||
@@ -16,9 +16,8 @@ func TestReadStore(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUpdateStore(t *testing.T) {
|
||||
store, err := new(PurchaseHandler).UpdateStore("4351018")
|
||||
err := new(PurchaseHandler).UpdateStore(nil, 100002, "test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(store, false))
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ enableStore = true
|
||||
enableStoreWrite = false
|
||||
enableEbaiStoreWrite = false
|
||||
enableElmStoreWrite = true
|
||||
enableMtwmStoreWrite = false
|
||||
|
||||
orderUseNewTable = true
|
||||
|
||||
aliKey = "LTAI6xJUGaP6WdMQ"
|
||||
|
||||
10
controllers/mtwm_callback.go
Normal file
10
controllers/mtwm_callback.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
_ "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
|
||||
"github.com/astaxie/beego"
|
||||
)
|
||||
|
||||
type MtwmController struct {
|
||||
beego.Controller
|
||||
}
|
||||
@@ -27,7 +27,9 @@ var (
|
||||
EnableStoreWrite bool
|
||||
EnableEbaiStoreWrite bool
|
||||
EnableElmStoreWrite bool
|
||||
OrderUseNewTable bool
|
||||
EnableMtwmStoreWrite bool
|
||||
|
||||
OrderUseNewTable bool
|
||||
|
||||
QiniuBucket string
|
||||
)
|
||||
@@ -56,6 +58,7 @@ func Init() {
|
||||
EnableStoreWrite = beego.AppConfig.DefaultBool("enableStoreWrite", false)
|
||||
EnableEbaiStoreWrite = beego.AppConfig.DefaultBool("enableEbaiStoreWrite", false)
|
||||
EnableElmStoreWrite = beego.AppConfig.DefaultBool("enableElmStoreWrite", false)
|
||||
EnableMtwmStoreWrite = beego.AppConfig.DefaultBool("enableMtwmStoreWrite", false)
|
||||
|
||||
if EnableStore {
|
||||
OrderUseNewTable = beego.AppConfig.DefaultBool("orderUseNewTable", false)
|
||||
|
||||
Reference in New Issue
Block a user