Merge remote-tracking branch 'origin/mark' into yonghui

This commit is contained in:
苏尹岚
2019-12-04 17:56:08 +08:00
22 changed files with 740 additions and 847 deletions

View File

@@ -255,79 +255,3 @@ func (c *OrderManager) UpdataOrderFinancialInfo(orderFinancial *model.OrderFinan
// orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新 // orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
return err return err
} }
// 正向订单设置小费后更新信息需要再去订单查询列表接口查询小费金额然后传递过来感觉这样一个个写非常麻烦以下demo是以京东为例
// 为什么不直接用OrderDetail2Financial再处理一遍通过传递一个type=新建/更新在SaveOrderFinancialInfo进行相应的数据库操作
// func UpdataOrderFinancialInfoByTips(orderFinancial *model.OrderFinancial, orderData map[string]interface{}) (err error) {
// db := dao.GetDB()
// dao.Begin(db)
// defer dao.Rollback(db)
// order1, err2 := api.JdAPI.OrderShoudSettlementService(orderFinancial.VendorOrderID) // 考虑放到上层实现然后传递过来
// orderFinancial.FreightTipsMoney = utils.MustInterface2Int64(orderData["tips"])
// pmMoney := orderFinancial.PmMoney
// JxPmMoney := orderFinancial.JxPmMoney
// orderFinancial.PmMoney = 0
// // 京东/京西平台费可能会变化
// if err = err2; err == nil {
// orderFinancial.ShopMoney = utils.Interface2Int64WithDefault(order1["settlementAmount"], 0)
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["goodsCommission"], 0)
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["freightCommission"], 0)
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["packageCommission"], 0)
// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["guaranteedCommission"], 0)
// orderFinancial.JxPmMoney = (orderFinancial.ShopMoney+orderFinancial.PmMoney)*TotalRate/1000 - orderFinancial.PmMoney // 京西平台费 = 总金额*20%-第三方平台费
// if orderFinancial.JxPmMoney < 0 { // 如果算出京西平台费为负数则置0
// orderFinancial.JxPmMoney = 0
// }
// // 计算在此次变动中,第三方平台结算费用的变化值
// decMoney := orderFinancial.FreightTipsMoney + orderFinancial.PmMoney - pmMoney
// orderFinancial.ShopMoneyByCal -= decMoney
// decMoney2 := decMoney
// // 计算在此次变动中,京西结算费用的变化值
// jxDecMoney := decMoney + orderFinancial.JxPmMoney - JxPmMoney
// orderFinancial.JxShopMoney -= jxDecMoney
// jxDecMoney2 := jxDecMoney
// for _, sku := range orderFinancial.Skus[1:] {
// // 重新计算单条sku平台应该结算的金额
// skuDecMoney := utils.Float64TwoInt64(float64(decMoney*sku.SalePrice*int64(sku.Count)+sku.MealBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.MealBoxMoney))
// sku.PmDeductionsMoney += skuDecMoney
// sku.ShopMoneyByCal -= skuDecMoney
// decMoney2 -= skuDecMoney
// // 重新计算单条sku京西应该结算的金额
// skuJxDecMoney := utils.Float64TwoInt64(float64(jxDecMoney*sku.SalePrice*int64(sku.Count)+sku.MealBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.MealBoxMoney))
// sku.JxDeductionsMoney += skuJxDecMoney
// sku.JxShopMoney -= skuJxDecMoney
// jxDecMoney2 -= skuJxDecMoney
// if err = dao.UpdateEntity(db, sku); err != nil {
// return err
// }
// }
// if len(orderFinancial.Skus) > 0 {
// sku := orderFinancial.Skus[0]
// sku.PmDeductionsMoney += decMoney2
// sku.ShopMoneyByCal -= decMoney2
// sku.JxDeductionsMoney += jxDecMoney2
// sku.JxShopMoney -= jxDecMoney2
// if err = dao.UpdateEntity(db, sku); err != nil {
// return err
// }
// }
// // orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
// // 更新
// // 更新
// } else {
// globals.SugarLogger.Warnf("jd OrderDetail2Financial, orderID:%s is not found from api.JdAPI.OrderShoudSettlementService", orderFinancial.VendorOrderID)
// }
// return err
// }
// 正向订单转自配送后更新信息
// func SaveOrderFinancialInfoBySelf(orderFinancial *model.OrderFinancial) (err error) {
// // 此时考虑之前有没有设置小费,如果设置了小费,要扣掉
// return err
// }

View File

@@ -8,6 +8,7 @@ import (
"time" "time"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/baseapi/utils/errlist"
"git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/datares" "git.rosy.net.cn/jx-callback/business/jxutils/datares"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
@@ -97,10 +98,25 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string
} }
cat.Seq = maxSeq.MaxSeq + 1 cat.Seq = maxSeq.MaxSeq + 1
} }
if err = dao.CreateEntity(nil, cat); err == nil { dao.Begin(db)
outCat = cat defer func() {
_, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName) if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if err = dao.CreateEntity(db, cat); err != nil {
dao.Rollback(db)
return nil, err
} }
if err = OnCreateThing(db, int64(cat.ID), model.ThingTypeCategory); err != nil {
dao.Rollback(db)
return nil, err
}
dao.Commit(db)
outCat = cat
_, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName)
return outCat, err return outCat, err
} }
@@ -119,64 +135,71 @@ func UpdateCategory(ctx *jxcontext.Context, categoryID int, payload map[string]i
syncStatus = model.SyncFlagModifiedMask syncStatus = model.SyncFlagModifiedMask
valid[model.FieldJdSyncStatus] = int8(syncStatus) | cat.JdSyncStatus valid[model.FieldJdSyncStatus] = int8(syncStatus) | cat.JdSyncStatus
} }
if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err == nil {
SetStoreCategorySyncStatus2(db, nil, []int{categoryID}, model.SyncFlagModifiedMask)
var skuIDs []int
if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil ||
valid["jdPricePercentage"] != nil || valid["ebaiPricePercentage"] != nil || valid["mtwmPricePercentage"] != nil {
if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 {
for _, sku := range skuList {
skuIDs = append(skuIDs, sku.ID)
}
if valid["jdCategoryID"] != nil {
dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask)
}
// todo 如下逻辑在不同平台同时改pricePercentage与平台分类映射时会不必要的打上多余的标记 dao.Begin(db)
var vendorIDs []int defer func() {
syncStatus := model.SyncFlagModifiedMask if r := recover(); r != nil {
if valid["jdPricePercentage"] != nil { dao.Rollback(db)
vendorIDs = append(vendorIDs, model.VendorIDJD) panic(r)
syncStatus |= model.SyncFlagPriceMask }
} }()
if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err != nil {
dao.Rollback(db)
return 0, err
}
if err = OnUpdateThing(db, int64(categoryID), model.ThingTypeCategory); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
if valid["ebaiPricePercentage"] != nil { SetStoreCategorySyncStatus2(db, nil, []int{categoryID}, model.SyncFlagModifiedMask)
vendorIDs = append(vendorIDs, model.VendorIDEBAI) var skuIDs []int
syncStatus |= model.SyncFlagPriceMask if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil ||
} else if valid["ebaiCategoryID"] != nil { valid["jdPricePercentage"] != nil || valid["ebaiPricePercentage"] != nil || valid["mtwmPricePercentage"] != nil {
vendorIDs = append(vendorIDs, model.VendorIDEBAI) if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 {
} for _, sku := range skuList {
skuIDs = append(skuIDs, sku.ID)
}
if valid["jdCategoryID"] != nil {
dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask)
}
if valid["mtwmPricePercentage"] != nil { // todo 如下逻辑在不同平台同时改pricePercentage与平台分类映射时会不必要的打上多余的标记
vendorIDs = append(vendorIDs, model.VendorIDMTWM) var vendorIDs []int
syncStatus |= model.SyncFlagPriceMask syncStatus := model.SyncFlagModifiedMask
} else if valid["mtwmCategoryID"] != nil { if valid["jdPricePercentage"] != nil {
vendorIDs = append(vendorIDs, model.VendorIDMTWM) vendorIDs = append(vendorIDs, model.VendorIDJD)
} syncStatus |= model.SyncFlagPriceMask
if len(vendorIDs) > 0 { }
SetStoreSkuSyncStatus2(db, nil, vendorIDs, skuIDs, syncStatus)
} if valid["ebaiPricePercentage"] != nil {
vendorIDs = append(vendorIDs, model.VendorIDEBAI)
syncStatus |= model.SyncFlagPriceMask
} else if valid["ebaiCategoryID"] != nil {
vendorIDs = append(vendorIDs, model.VendorIDEBAI)
}
if valid["mtwmPricePercentage"] != nil {
vendorIDs = append(vendorIDs, model.VendorIDMTWM)
syncStatus |= model.SyncFlagPriceMask
} else if valid["mtwmCategoryID"] != nil {
vendorIDs = append(vendorIDs, model.VendorIDMTWM)
}
if len(vendorIDs) > 0 {
SetStoreSkuSyncStatus2(db, nil, vendorIDs, skuIDs, syncStatus)
} }
} }
_, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName) }
if len(skuIDs) > 0 { _, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName)
CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, userName) if len(skuIDs) > 0 {
} CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, userName)
} }
} }
return num, err return num, err
} }
func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, syncStatus int) (num int64, err error) { func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, syncStatus int) (num int64, err error) {
// dao.Begin(db)
// defer func() {
// if r := recover(); r != nil || err != nil {
// dao.Rollback(db)
// if r != nil {
// panic(r)
// }
// }
// }()
for _, vendorID := range partner.GetSingleStoreVendorIDs() { for _, vendorID := range partner.GetSingleStoreVendorIDs() {
num2, err2 := dao.SetStoreCategorySyncStatus(db, vendorID, storeIDs, catIDs, syncStatus) num2, err2 := dao.SetStoreCategorySyncStatus(db, vendorID, storeIDs, catIDs, syncStatus)
if err = err2; err != nil { if err = err2; err != nil {
@@ -184,43 +207,52 @@ func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, sy
} }
num += num2 num += num2
} }
// dao.Commit(db)
return num, nil return num, nil
} }
func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int, userName string) (err error) { func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int, userName string) (err error) {
var cats []*model.SkuCategory var cats []*model.SkuCategory
parentCat := &model.SkuCategory{}
parentCat.ID = parentID
db := dao.GetDB() db := dao.GetDB()
if parentID != 0 { if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil {
err = dao.GetEntity(db, parentCat) catsLen := len(cats)
} else { if catsLen != len(categoryIDs) {
parentCat = nil return ErrInputCatsDoesntMatch
} }
if err == nil { catsMap := make(map[int]*model.SkuCategory, catsLen)
if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil { for _, cat := range cats {
catsLen := len(cats) catsMap[cat.ID] = cat
if catsLen != len(categoryIDs) { }
return ErrInputCatsDoesntMatch
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
} }
catsMap := make(map[int]*model.SkuCategory, catsLen) }()
for _, cat := range cats { for k, v := range categoryIDs {
catsMap[cat.ID] = cat if catsMap[v] == nil {
dao.Rollback(db)
return fmt.Errorf("分类:%d不在%d分类下", v, parentID)
} }
for k, v := range categoryIDs { catsMap[v].Seq = k
catsMap[v].Seq = k catsMap[v].LastOperator = ctx.GetUserName()
catsMap[v].LastOperator = ctx.GetUserName() if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil {
if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil { dao.Rollback(db)
break return err
}
} }
SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask) if err = OnUpdateThing(db, int64(catsMap[v].ID), model.ThingTypeCategory); err != nil {
if err == nil { dao.Rollback(db)
_, err = CurVendorSync.SyncReorderCategories(ctx, db, parentID, false, userName) return err
CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true)
} }
} }
dao.Commit(db)
SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask)
if err == nil {
_, err = CurVendorSync.SyncReorderCategories(ctx, db, parentID, false, userName)
CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true)
}
} }
return err return err
} }
@@ -252,14 +284,25 @@ func DeleteCategory(ctx *jxcontext.Context, categoryID int, userName string) (nu
} }
dao.Begin(db) dao.Begin(db)
defer func() { defer func() {
dao.Rollback(db) if r := recover(); r != nil {
}() dao.Rollback(db)
if _, err = DeleteCategoryMap(ctx, db, categoryID); err == nil { panic(r)
if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err == nil && num == 1 {
dao.Commit(db)
_, err = CurVendorSync.SyncCategory(ctx, db, cat.ID, false, userName)
} }
}()
if _, err = DeleteCategoryMap(ctx, db, categoryID); err != nil {
dao.Rollback(db)
return 0, err
} }
if err = OnDeleteThing(db, int64(categoryID), model.ThingTypeCategory); err != nil {
dao.Rollback(db)
return 0, err
}
if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
_, err = CurVendorSync.SyncCategory(ctx, db, cat.ID, false, userName)
} }
return num, err return num, err
} }
@@ -620,11 +663,15 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
} }
if err = OnCreateThing(db, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db)
return nil, err
}
for _, sku := range skuNameExt.Skus { for _, sku := range skuNameExt.Skus {
dao.WrapAddIDCULDEntity(sku, userName) dao.WrapAddIDCULDEntity(sku, userName)
sku.NameID = skuNameExt.ID sku.NameID = skuNameExt.ID
sku.JdSyncStatus = model.SyncFlagNewMask sku.JdSyncStatus = model.SyncFlagNewMask
sku.JdID = 0 //beginJDID sku.JdID = 0
if err = dao.CreateEntity(db, sku); err != nil { if err = dao.CreateEntity(db, sku); err != nil {
dao.Rollback(db) dao.Rollback(db)
return nil, err return nil, err
@@ -728,66 +775,77 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
} }
}() }()
valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus
if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err == nil { if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err != nil {
if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil {
if places, ok := payload["places"].([]interface{}); ok {
if _, err = dao.DeleteSkuNamePlace(db, nameID, nil); err == nil {
for _, placeCode := range places {
placeBind := &model.SkuNamePlaceBind{}
placeBind.PlaceCode = int(utils.Interface2Int64WithDefault(placeCode, 0))
if placeBind.PlaceCode > 0 {
dao.WrapAddIDCULEntity(placeBind, userName)
placeBind.NameID = nameID
err = dao.CreateEntity(db, placeBind)
} else {
dao.Rollback(db)
return 0, errors.New("地点代码非法")
}
}
}
}
}
if err == nil {
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil)
if err = err2; err == nil {
for _, v := range skuList {
sku := &v.Sku
sku.JdSyncStatus |= model.SyncFlagModifiedMask
sku.LastOperator = userName
sku.UpdatedAt = time.Now()
dao.UpdateEntity(db, sku)
}
}
if err == nil {
skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID})
if err = err2; err == nil && len(skuIDs) > 0 {
_, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), skuIDs, model.SyncFlagModifiedMask)
}
}
}
if err == nil {
dao.Commit(db)
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
} else {
dao.Rollback(db)
}
} else {
dao.Rollback(db) dao.Rollback(db)
return 0, err
} }
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db)
return 0, err
}
if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil {
if places, ok := payload["places"].([]interface{}); ok {
if _, err = dao.DeleteSkuNamePlace(db, nameID, nil); err != nil {
dao.Rollback(db)
return 0, err
}
for _, placeCode := range places {
placeBind := &model.SkuNamePlaceBind{}
placeBind.PlaceCode = int(utils.Interface2Int64WithDefault(placeCode, 0))
if placeBind.PlaceCode > 0 {
dao.WrapAddIDCULEntity(placeBind, userName)
placeBind.NameID = nameID
err = dao.CreateEntity(db, placeBind)
} else {
dao.Rollback(db)
return 0, errors.New("地点代码非法")
}
}
}
}
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil)
if err = err2; err == nil {
for _, v := range skuList {
sku := &v.Sku
sku.JdSyncStatus |= model.SyncFlagModifiedMask
sku.LastOperator = userName
sku.UpdatedAt = time.Now()
if _, err = dao.UpdateEntity(db, sku); err != nil {
dao.Rollback(db)
return 0, err
}
if err = OnUpdateThing(db, int64(v.ID), model.ThingTypeSku); err != nil {
dao.Rollback(db)
return 0, err
}
}
}
skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID})
if err = err2; err != nil {
dao.Rollback(db)
return 0, err
}
if len(skuIDs) > 0 {
if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), skuIDs, model.SyncFlagModifiedMask); err != nil {
dao.Rollback(db)
return 0, err
}
}
dao.Commit(db)
errList := errlist.New()
errList.AddErr(err)
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
errList.AddErr(err)
err = errList.GetErrListAsOne()
} }
return num, err return num, err
} }
func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []int, syncStatus int) (num int64, err error) { func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []int, syncStatus int) (num int64, err error) {
// dao.Begin(db)
// defer func() {
// if r := recover(); r != nil || err != nil {
// dao.Rollback(db)
// if r != nil {
// panic(r)
// }
// }
// }()
for _, vendorID := range vendorIDs { for _, vendorID := range vendorIDs {
num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeIDs, skuIDs, syncStatus) num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeIDs, skuIDs, syncStatus)
if err = err2; err != nil { if err = err2; err != nil {
@@ -795,7 +853,6 @@ func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []i
} }
num += num2 num += num2
} }
// dao.Commit(db)
return num, nil return num, nil
} }
@@ -803,33 +860,57 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int
db := dao.GetDB() db := dao.GetDB()
dao.Begin(db) dao.Begin(db)
defer func() { defer func() {
dao.Rollback(db) if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}() }()
if _, err := dao.DeleteSkuNamePlace(db, nameID, nil); err != nil { if _, err := dao.DeleteSkuNamePlace(db, nameID, nil); err != nil {
dao.Rollback(db)
return 0, err return 0, err
} }
if _, err = DeleteStoreSku(ctx, db, nameID, 0); err != nil { if _, err = DeleteStoreSku(ctx, db, nameID, 0); err != nil {
dao.Rollback(db)
return 0, err return 0, err
} }
numSku, err := dao.DeleteEntityLogically(db, &model.Sku{}, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagDeletedMask, skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil)
model.FieldStatus: model.SkuStatusDeleted, if err = err2; err == nil {
}, userName, map[string]interface{}{ for _, v := range skuList {
model.FieldNameID: nameID, sku := &v.Sku
}) if _, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{
if err != nil { model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldStatus: model.SkuStatusDeleted,
}, userName, nil); err != nil {
dao.Rollback(db)
return 0, err
}
if err = OnDeleteThing(db, int64(v.ID), model.ThingTypeSku); err != nil {
dao.Rollback(db)
return 0, err
}
}
}
if err = OnDeleteThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db)
return 0, err return 0, err
} }
skuName := &model.SkuName{} skuName := &model.SkuName{}
skuName.ID = nameID skuName.ID = nameID
if num, err = dao.DeleteEntityLogically(db, skuName, map[string]interface{}{ if num, err = dao.DeleteEntityLogically(db, skuName, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldStatus: model.SkuStatusDeleted, model.FieldStatus: model.SkuStatusDeleted,
}, userName, nil); err != nil { }, userName, nil); err != nil {
dao.Rollback(db)
return 0, err return 0, err
} }
dao.Commit(db) dao.Commit(db)
if numSku > 0 {
if len(skuList) > 0 {
_, err = CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, false, userName) _, err = CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, false, userName)
} }
return num, err return num, err
@@ -848,17 +929,33 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
dao.WrapAddIDCULDEntity(sku, userName) dao.WrapAddIDCULDEntity(sku, userName)
sku.JdSyncStatus = model.SyncFlagNewMask sku.JdSyncStatus = model.SyncFlagNewMask
sku.NameID = nameID
sku.JdID = 0 sku.JdID = 0
if err = dao.CreateEntity(db, sku); err == nil { sku.NameID = nameID
result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0)
if err = err2; err == nil { dao.Begin(db)
if result.TotalCount == 1 { defer func() {
outSkuNameExt = result.SkuNames[0] if r := recover(); r != nil {
_, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, sku.ID, false, false, userName) dao.Rollback(db)
} else { panic(r)
err = ErrEntityNotExist }
} }()
if err = dao.CreateEntity(db, sku); err != nil {
dao.Rollback(db)
return nil, err
}
if err = OnCreateThing(db, int64(sku.ID), model.ThingTypeSku); err != nil {
dao.Rollback(db)
return nil, err
}
dao.Commit(db)
result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0)
if err = err2; err == nil {
if result.TotalCount == 1 {
outSkuNameExt = result.SkuNames[0]
_, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, sku.ID, false, false, userName)
} else {
err = ErrEntityNotExist
} }
} }
return outSkuNameExt, err return outSkuNameExt, err
@@ -887,31 +984,43 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{}
maskValue |= model.SyncFlagSpecMask maskValue |= model.SyncFlagSpecMask
} }
valid[model.FieldJdSyncStatus] = maskValue | sku.JdSyncStatus valid[model.FieldJdSyncStatus] = maskValue | sku.JdSyncStatus
if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err == nil { if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err != nil || num == 0 {
if num == 1 { dao.Rollback(db)
if num, err = dao.ExecuteSQL(db, ` if err == nil {
UPDATE sku_name t1
JOIN sku t2 ON t1.id = t2.name_id
SET t1.spec_quality = t2.spec_quality,
t1.spec_unit = t2.spec_unit
WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ?
`, utils.DefaultTimeValue, skuID, model.SpecialUnit); err == nil {
if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagModifiedMask); err == nil {
if maskValue&model.SyncFlagSpecMask != 0 {
err = refreshStoreSkuPrice(ctx, db, skuID)
}
}
}
} else {
err = ErrEntityNotExist err = ErrEntityNotExist
} }
return 0, err
} }
if err == nil { if num, err = dao.ExecuteSQL(db, `
dao.Commit(db) UPDATE sku_name t1
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) JOIN sku t2 ON t1.id = t2.name_id
} else { SET t1.spec_quality = t2.spec_quality,
t1.spec_unit = t2.spec_unit
WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ?
`, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil || num == 0 {
dao.Rollback(db) dao.Rollback(db)
if err == nil {
err = ErrEntityNotExist
}
return 0, err
} }
if err = OnUpdateThing(db, int64(skuID), model.ThingTypeSku); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagModifiedMask); err == nil {
if maskValue&model.SyncFlagSpecMask != 0 {
err = refreshStoreSkuPrice(ctx, db, skuID)
}
}
errList := errlist.New()
errList.AddErr(err)
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName)
errList.AddErr(err)
err = errList.GetErrListAsOne()
} }
return num, err return num, err
} }
@@ -950,23 +1059,33 @@ func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, e
db := dao.GetDB() db := dao.GetDB()
dao.Begin(db) dao.Begin(db)
defer func() { defer func() {
dao.Rollback(db) if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}() }()
if _, err = DeleteStoreSku(ctx, db, 0, skuID); err == nil { if _, err = DeleteStoreSku(ctx, db, 0, skuID); err != nil {
sku := &model.Sku{} dao.Rollback(db)
sku.ID = skuID return 0, err
if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ }
model.FieldStatus: model.SkuStatusDeleted, if err = OnDeleteThing(db, int64(skuID), model.ThingTypeSku); err != nil {
model.FieldJdSyncStatus: model.SyncFlagDeletedMask, dao.Rollback(db)
}, userName, nil); err == nil { return 0, err
dao.Commit(db) }
if num == 1 { sku := &model.Sku{}
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) sku.ID = skuID
} else { if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{
err = ErrEntityNotExist model.FieldStatus: model.SkuStatusDeleted,
} model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
} }, userName, nil); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
if num == 1 {
_, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName)
} }
return num, err return num, err
} }
@@ -997,6 +1116,7 @@ func DeleteStoreSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int) (n
storeSkuBind := &model.StoreSkuBind{} storeSkuBind := &model.StoreSkuBind{}
_, err = dao.DeleteEntityLogically(db, storeSkuBind, map[string]interface{}{ _, err = dao.DeleteEntityLogically(db, storeSkuBind, map[string]interface{}{
model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldJdSyncStatus: model.SyncFlagDeletedMask,
model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask,
model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask,
}, ctx.GetUserName(), map[string]interface{}{ }, ctx.GetUserName(), map[string]interface{}{
model.FieldSkuID: v.ID, model.FieldSkuID: v.ID,
@@ -1017,9 +1137,25 @@ func AddSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName str
PlaceCode: placeCode, PlaceCode: placeCode,
} }
dao.WrapAddIDCULEntity(placeBind, userName) dao.WrapAddIDCULEntity(placeBind, userName)
if err = dao.CreateEntity(db, placeBind); err == nil {
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if err = dao.CreateEntity(db, placeBind); err != nil {
dao.Rollback(db)
return nil, err
} }
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db)
return nil, err
}
dao.Commit(db)
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
return placeBind, err return placeBind, err
} }
@@ -1028,13 +1164,28 @@ func DeleteSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName
placeBind := &model.SkuNamePlaceBind{} placeBind := &model.SkuNamePlaceBind{}
placeBind.NameID = nameID placeBind.NameID = nameID
placeBind.PlaceCode = placeCode placeBind.PlaceCode = placeCode
if num, err = dao.DeleteEntity(db, placeBind, model.FieldNameID, model.FieldPlaceCode); err == nil {
if num == 1 { dao.Begin(db)
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) defer func() {
} else { if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if num, err = dao.DeleteEntity(db, placeBind, model.FieldNameID, model.FieldPlaceCode); err != nil || num == 0 {
dao.Rollback(db)
if err == nil {
err = ErrEntityNotExist err = ErrEntityNotExist
} }
return 0, err
} }
if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
_, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName)
return num, err return num, err
} }
@@ -1067,9 +1218,7 @@ func SortCategorySkus(ctx *jxcontext.Context, catID int, skuIDList []int) (err e
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
dao.Rollback(db) dao.Rollback(db)
if r != nil { panic(r)
panic(r)
}
} }
}() }()
nameIDList := []int{} nameIDList := []int{}
@@ -1096,6 +1245,5 @@ func SortCategorySkus(ctx *jxcontext.Context, catID int, skuIDList []int) (err e
dao.Rollback(db) dao.Rollback(db)
} }
} }
return err return err
} }

View File

@@ -38,6 +38,11 @@ type SingleStoreHandlerWrapper struct {
partner.ISingleStoreHandler partner.ISingleStoreHandler
} }
type tMultiStoreVendorInfo struct {
VendorID int
OrgCode string
}
var ( var (
CurVendorSync VendorSync CurVendorSync VendorSync
) )
@@ -96,6 +101,20 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan
return nil return nil
} }
func getMultiStoreVendorInfoList() (list []*tMultiStoreVendorInfo) {
vendorIDs := partner.GetMultiStoreVendorIDs()
for _, vendorID := range vendorIDs {
orgCodeList := partner.CurAPIManager.GetAppOrgCodeList(vendorID)
for _, v := range orgCodeList {
list = append(list, &tMultiStoreVendorInfo{
VendorID: vendorID,
OrgCode: v,
})
}
}
return list
}
func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) { func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) {
multiStoresHandler := v.GetMultiStoreHandler(vendorID) multiStoresHandler := v.GetMultiStoreHandler(vendorID)
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
@@ -132,7 +151,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
globals.SugarLogger.Debug("SyncCategory") globals.SugarLogger.Debug("SyncCategory")
hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步分类信息:%d", categoryID), isAsync, false, hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步分类信息:%d", categoryID), isAsync, false,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
vendorID := batchItemList[0].(int) vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo)
var cats []*model.SkuCategory var cats []*model.SkuCategory
cond := make(map[string]interface{}) cond := make(map[string]interface{})
if categoryID > 0 { if categoryID > 0 {
@@ -142,7 +161,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
} }
err := dao.GetEntitiesByKV(db, &cats, cond, true) err := dao.GetEntitiesByKV(db, &cats, cond, true)
if err == nil { if err == nil {
err = v.syncCategories(ctx, t, vendorID, db, cats, userName) err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName)
} }
if err != nil || categoryID > 0 { if err != nil || categoryID > 0 {
return nil, err return nil, err
@@ -150,7 +169,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
cond[model.FieldLevel] = 2 cond[model.FieldLevel] = 2
err = dao.GetEntitiesByKV(db, &cats, cond, true) err = dao.GetEntitiesByKV(db, &cats, cond, true)
if err == nil { if err == nil {
err = v.syncCategories(ctx, t, vendorID, db, cats, userName) err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName)
} }
return nil, err return nil, err
}) })
@@ -159,7 +178,8 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor
func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) {
hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("分类重排序:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("分类重排序:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
multiStoresHandler := v.GetMultiStoreHandler(batchItemList[0].(int)) vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo)
multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID)
err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName)
if err2 == nil { if err2 == nil {
cat := &model.SkuCategory{} cat := &model.SkuCategory{}
@@ -236,8 +256,8 @@ func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []i
return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt, return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
var resultList []interface{} var resultList []interface{}
vendorID := batchItemList[0].(int) vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo)
multiStoresHandler := v.GetMultiStoreHandler(vendorID) multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID)
syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()])
dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()]) dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()])
skuMap := make(map[int]bool) skuMap := make(map[int]bool)
@@ -266,7 +286,7 @@ func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []i
err := dao.GetRows(db, &skuNameList, sql, sqlParams...) err := dao.GetRows(db, &skuNameList, sql, sqlParams...)
if err == nil && len(skuNameList) > 0 { if err == nil && len(skuNameList) > 0 {
// todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 // todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题
task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx, task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorInfo.VendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
var resultList []interface{} var resultList []interface{}
skuName := batchItemList[0].(*model.SkuName) skuName := batchItemList[0].(*model.SkuName)
@@ -562,7 +582,7 @@ func (v *VendorSync) LoopStoresMap(ctx *jxcontext.Context, db *dao.DaoDB, taskNa
} }
func (v *VendorSync) LoopMultiStoresVendors(ctx *jxcontext.Context, db *dao.DaoDB, taskName string, isAsync bool, isManageIt bool, handler tasksch.WorkFunc) (hint string, err error) { func (v *VendorSync) LoopMultiStoresVendors(ctx *jxcontext.Context, db *dao.DaoDB, taskName string, isAsync bool, isManageIt bool, handler tasksch.WorkFunc) (hint string, err error) {
task := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, partner.GetMultiStoreVendorIDs()) task := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, getMultiStoreVendorInfoList())
tasksch.HandleTask(task, nil, isManageIt).Run() tasksch.HandleTask(task, nil, isManageIt).Run()
if !isAsync { if !isAsync {
result, err2 := task.GetResult(0) result, err2 := task.GetResult(0)
@@ -695,3 +715,15 @@ func GetTimeMixByInt(begin1, end1, begin2, end2 int16) (beginAt, endAt int16) {
} }
return beginAt, endAt return beginAt, endAt
} }
func OnCreateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) {
return err
}
func OnUpdateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) {
return err
}
func OnDeleteThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) {
return err
}

View File

@@ -1,13 +1,9 @@
package initdata package initdata
import ( import (
"bytes"
"context"
"fmt" "fmt"
"strings"
"git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/autonavi"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/datares" "git.rosy.net.cn/jx-callback/business/jxutils/datares"
@@ -16,10 +12,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/api"
"github.com/qiniu/api.v7/storage"
) )
func TruncateTable(db *dao.DaoDB, tableName string) (err error) { func TruncateTable(db *dao.DaoDB, tableName string) (err error) {
@@ -142,107 +135,6 @@ func InitPlace(ctx *jxcontext.Context) (err error) {
return err return err
} }
func RefreshSkuNameImg(ctx *jxcontext.Context, parentTask tasksch.ITask, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
db := dao.GetDB()
var skuNameList []*model.SkuName
if err = dao.GetRows(db, &skuNameList, `
SELECT t1.id, t1.img, MAX(t2.jd_id) jd_id
FROM sku_name t1
JOIN sku t2 ON t2.name_id = t1.id AND t2.deleted_at = ?
WHERE t1.deleted_at = ?
GROUP BY 1,2
ORDER BY t1.id
`, utils.DefaultTimeValue, utils.DefaultTimeValue); err != nil {
return "", err
}
task := tasksch.NewParallelTask("RefreshSkuNameImg", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
skuName := batchItemList[0].(*model.SkuName)
if !jxutils.IsEmptyID(skuName.JdID) {
if skuName.Img == "" || isForce {
var imgList []*jdapi.SkuPageImg
if imgList, err = api.JdAPI.GetSkuPageImageInfo(skuName.JdID); err == nil {
if len(imgList) > 0 {
skuName.Img = imgList[0].Big
_, err = dao.UpdateEntity(db, skuName, "Img")
}
}
}
}
return nil, err
}, skuNameList)
tasksch.HandleTask(task, parentTask, true).Run()
if !isAsync {
_, err = task.GetResult(0)
} else {
hint = task.ID
}
return hint, err
}
// func RefreshImgMd5(ctx *jxcontext.Context, parentTask tasksch.ITask, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
// db := dao.GetDB()
// var skuNameList []*model.SkuName
// if err = dao.GetRows(db, &skuNameList, `
// SELECT *
// FROM sku_name
// WHERE deleted_at = ? AND img <> ''
// ORDER BY id
// `, utils.DefaultTimeValue); err != nil {
// return "", err
// }
// task := tasksch.NewParallelTask("InitSkuName calculate md5", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// skuName := batchItemList[0].(*model.SkuName)
// if skuName.ImgHashCode == "" || isForce {
// response, err := http.Get(skuName.Img)
// if err == nil {
// defer response.Body.Close()
// if response.StatusCode == http.StatusOK {
// data, err2 := ioutil.ReadAll(response.Body)
// if err = err2; err == nil {
// skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data))
// db := dao.GetDB()
// _, err = dao.UpdateEntity(db, skuName, "ImgHashCode")
// }
// } else {
// err = platformapi.ErrHTTPCodeIsNot200
// }
// }
// }
// return nil, err
// }, skuNameList)
// tasksch.HandleTask(task, parentTask, true).Run()
// if !isAsync {
// _, err = task.GetResult(0)
// } else {
// hint = task.ID
// }
// return hint, err
// }
func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError bool) (hint string, err error) {
rootTask := tasksch.NewSeqTask("InitSkuName", ctx,
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step {
case 0:
_, err = RefreshSkuNameImg(ctx, task, isForce, false, isContinueWhenError)
case 1:
// _, err = RefreshImgMd5(ctx, task, isForce, false, isContinueWhenError)
}
return nil, err
}, 2)
tasksch.ManageTask(rootTask).Run()
if !isAsync {
_, err = rootTask.GetResult(0)
} else {
hint = rootTask.ID
}
return hint, err
}
func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hint string, err error) { func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hint string, err error) {
if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil { if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil {
var cats []*model.SkuVendorCategory var cats []*model.SkuVendorCategory
@@ -386,213 +278,3 @@ func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool
func getSkuNameKey(prefix, name, comment, specUnit, unit string, specQuality float32) string { func getSkuNameKey(prefix, name, comment, specUnit, unit string, specQuality float32) string {
return fmt.Sprintf("%s-%s-%f-%s-%s", prefix, name, specQuality, specUnit, unit) return fmt.Sprintf("%s-%s-%f-%s-%s", prefix, name, specQuality, specUnit, unit)
} }
func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) {
ebaiCatIDKey := "ebaiCatID"
catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID)
if err != nil {
return hint, err
}
catMap := make(map[string]map[string]interface{})
allSkuInfo := make(map[string]map[string]map[string]map[string]interface{})
for _, cat := range catList {
catName := utils.Interface2String(cat["cat_name"])
if catName == "限时特惠" || catName == "应季热销" {
catName = "应季水果"
}
skuNameMap := allSkuInfo[catName]
if skuNameMap == nil {
skuNameMap = make(map[string]map[string]map[string]interface{})
allSkuInfo[catName] = skuNameMap
}
if catMap[catName] == nil {
catMap[catName] = cat
}
skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"])))
if err = err2; err != nil {
return hint, err
}
for _, sku := range skuList {
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
if specQuality > 0 {
if catMap[catName][ebaiCatIDKey] == nil {
catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"])
}
skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string)
if skuNameMap[skuNameKey] == nil {
skuNameMap[skuNameKey] = make(map[string]map[string]interface{})
}
skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku
}
}
}
allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt)
catSeq := 0
for catName, catSkuNameMap := range allSkuInfo {
if len(catSkuNameMap) > 0 {
skuCat := &model.SkuCategory{
Name: catName,
ParentID: 0,
Level: 1,
Type: model.SkuCategoryNormal,
Seq: catSeq,
EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])),
}
catSeq++
for _, skuList := range catSkuNameMap {
var skuNameExt *model.SkuNameExt
for _, sku := range skuList {
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
if skuNameExt == nil {
skuNameExt = &model.SkuNameExt{
SkuName: model.SkuName{
Prefix: prefix,
Name: name,
// CategoryID:
IsGlobal: 1,
Unit: unit,
SpecQuality: specQuality,
SpecUnit: specUnit,
Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))),
Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string),
Status: model.SkuStatusNormal,
IsSpu: 0,
},
}
if len(skuList) > 1 {
skuNameExt.Unit = "份"
skuNameExt.SpecQuality = 500
skuNameExt.SpecUnit = "g"
}
if skuNameExt.Unit == "份" {
tmpSpecQuality := specQuality
if specUnit == "kg" || specUnit == "l" {
tmpSpecQuality *= 1000
}
skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality)
}
}
mySku := &model.Sku{
// CategoryID:
// NameID:
Comment: comment,
SpecQuality: specQuality,
SpecUnit: specUnit,
Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))),
Status: model.SkuStatusNormal,
LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用
}
if sku["enabled"].(string) == "0" {
mySku.Status = model.SkuStatusDontSale
}
skuNameExt.Skus = append(skuNameExt.Skus, mySku)
}
allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt)
}
}
}
startOutSkuID := 1000
var skuCatList []*model.SkuCategory
for cat := range allSkuInfo2 {
skuCatList = append(skuCatList, cat)
}
putPolicy := storage.PutPolicy{
Scope: globals.QiniuBucket,
// Expires: 10 * 60,
}
cfg := &storage.Config{}
upToken := putPolicy.UploadToken(api.QiniuAPI)
rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx,
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
var catID string
cat := skuCatList[step]
skuNameExtList := allSkuInfo2[cat]
catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName())
if err == nil {
shopCategories := []int64{utils.Str2Int64(catID)}
for _, skuNameExt := range skuNameExtList {
var imgContent []byte
skuNameExt.CategoryID = cat.ID
skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1)
if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil {
globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err)
if !isContinueWhenError {
return nil, err
}
err = nil
continue
}
formUploader := storage.NewFormUploader(cfg)
ret := storage.PutRet{}
key := jxutils.GenPicFileName(".jpeg")
for i := 0; i < 3; i++ {
if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil {
break
}
}
if err != nil {
globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err)
if !isContinueWhenError {
return nil, err
}
err = nil
continue
}
qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800"
for _, sku := range skuNameExt.Skus {
jdCatID := 22410 // 其他国产水果
if cat.Name == "进口水果" {
jdCatID = 20342 // 其他进口水果
}
price := sku.LinkID
sku.LinkID = 0
skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
fixedStatus := 1
if sku.Status != model.SkuStatusNormal {
fixedStatus = 2
}
var vendorSkuID string
vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil)
if err == nil {
globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID)
} else {
globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err)
if !isContinueWhenError {
return nil, err
}
err = nil
}
// fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName)
startOutSkuID++
// rootTask.Cancel()
// return nil, nil
}
}
} else {
return nil, err
}
return nil, err
}, len(skuCatList))
tasksch.ManageTask(rootTask).Run()
if !isAsync {
_, err = rootTask.GetResult(0)
} else {
hint = rootTask.ID
}
return hint, err
}
func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) {
// globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName)
// return "123", err
return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName)
}
func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) {
// globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
// return "456", err
return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
}

View File

@@ -2,6 +2,7 @@ package tempop
import ( import (
"bytes" "bytes"
"context"
"fmt" "fmt"
"image" "image"
"image/jpeg" "image/jpeg"
@@ -15,6 +16,7 @@ import (
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
"git.rosy.net.cn/jx-callback/business/partner/delivery" "git.rosy.net.cn/jx-callback/business/partner/delivery"
"github.com/360EntSecGroup-Skylar/excelize" "github.com/360EntSecGroup-Skylar/excelize"
"github.com/qiniu/api.v7/storage"
"git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi"
@@ -29,6 +31,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model/legacymodel" "git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
"git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/api"
@@ -600,78 +603,6 @@ type GoodsOrderOriginalEx struct {
OrderStatus int OrderStatus int
} }
// func CreateOrderFromOriginal(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) {
// sqlBatchCount := 5000
// rootTask := tasksch.NewSeqTask("CreateOrderFromOriginal", ctx,
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
// sql := `
// SELECT t1.*, t3.order_status
// FROM goods_order_original t1
// LEFT JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id
// LEFT JOIN jxorder t3 ON t3.order_id = t1.vendor_order_id
// WHERE t2.id IS NULL
// LIMIT ?;
// `
// db := dao.GetDB()
// var orderList []*GoodsOrderOriginalEx
// if err = dao.GetRows(db, &orderList, sql, sqlBatchCount); err != nil {
// return nil, err
// }
// if len(orderList) > 0 {
// task := tasksch.NewParallelTask("CreateOrderFromOriginal", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(1), ctx,
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
// orderOriginal := batchItemList[0].(*GoodsOrderOriginalEx)
// globals.SugarLogger.Debugf("CreateOrderFromOriginal processing orderID:%s", orderOriginal.VendorOrderID)
// if handler := partner.GetPurchasePlatformFromVendorID(orderOriginal.VendorID); handler != nil {
// var detail map[string]interface{}
// if err = utils.UnmarshalUseNumber([]byte(strings.Replace(strings.Replace(orderOriginal.OriginalData, "\n", "", -1), "\r", "", -1)), &detail); err != nil {
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err)
// return nil, err
// }
// order := handler.Map2Order(detail)
// if order.Status < model.OrderStatusEndBegin {
// if orderOriginal.OrderStatus == 3 {
// order.Status = model.OrderStatusFinished
// } else if orderOriginal.OrderStatus == 7 {
// order.Status = model.OrderStatusCanceled
// } else {
// order2, err2 := handler.GetOrder(order.VendorOrderID)
// if err = err2; err == nil {
// order.Status = order2.Status
// } else {
// err = nil // ignore get status error
// }
// }
// }
// if err == nil {
// if _, err = orderman.FixedOrderManager.SaveOrder(order, false, dao.GetDB()); err != nil {
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err)
// }
// } else {
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err)
// }
// } else {
// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s", orderOriginal.VendorOrderID)
// }
// return nil, err
// }, orderList)
// // rootTask.AddChild(task).Run()
// task.Run()
// _, err = task.GetResult(0)
// } else {
// rootTask.Cancel()
// }
// return nil, err
// }, math.MaxInt32)
// tasksch.ManageTask(rootTask).Run()
// if !isAsync {
// _, err = rootTask.GetResult(0)
// } else {
// hint = rootTask.ID
// }
// return hint, err
// }
func TransformJdSpu2Sku(ctx *jxcontext.Context, skuNameIDs []int, count int, isAsync, isContinueWhenError bool) (hint string, err error) { func TransformJdSpu2Sku(ctx *jxcontext.Context, skuNameIDs []int, count int, isAsync, isContinueWhenError bool) (hint string, err error) {
sql := ` sql := `
SELECT t1.* SELECT t1.*
@@ -1359,3 +1290,213 @@ func JdStoreInfo1125() (hint string, err error) {
} }
return hint, err return hint, err
} }
func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) {
ebaiCatIDKey := "ebaiCatID"
catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID)
if err != nil {
return hint, err
}
catMap := make(map[string]map[string]interface{})
allSkuInfo := make(map[string]map[string]map[string]map[string]interface{})
for _, cat := range catList {
catName := utils.Interface2String(cat["cat_name"])
if catName == "限时特惠" || catName == "应季热销" {
catName = "应季水果"
}
skuNameMap := allSkuInfo[catName]
if skuNameMap == nil {
skuNameMap = make(map[string]map[string]map[string]interface{})
allSkuInfo[catName] = skuNameMap
}
if catMap[catName] == nil {
catMap[catName] = cat
}
skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"])))
if err = err2; err != nil {
return hint, err
}
for _, sku := range skuList {
_, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
if specQuality > 0 {
if catMap[catName][ebaiCatIDKey] == nil {
catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"])
}
skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string)
if skuNameMap[skuNameKey] == nil {
skuNameMap[skuNameKey] = make(map[string]map[string]interface{})
}
skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku
}
}
}
allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt)
catSeq := 0
for catName, catSkuNameMap := range allSkuInfo {
if len(catSkuNameMap) > 0 {
skuCat := &model.SkuCategory{
Name: catName,
ParentID: 0,
Level: 1,
Type: model.SkuCategoryNormal,
Seq: catSeq,
EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])),
}
catSeq++
for _, skuList := range catSkuNameMap {
var skuNameExt *model.SkuNameExt
for _, sku := range skuList {
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string))
if skuNameExt == nil {
skuNameExt = &model.SkuNameExt{
SkuName: model.SkuName{
Prefix: prefix,
Name: name,
// CategoryID:
IsGlobal: 1,
Unit: unit,
SpecQuality: specQuality,
SpecUnit: specUnit,
Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))),
Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string),
Status: model.SkuStatusNormal,
IsSpu: 0,
},
}
if len(skuList) > 1 {
skuNameExt.Unit = "份"
skuNameExt.SpecQuality = 500
skuNameExt.SpecUnit = "g"
}
if skuNameExt.Unit == "份" {
tmpSpecQuality := specQuality
if specUnit == "kg" || specUnit == "l" {
tmpSpecQuality *= 1000
}
skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality)
}
}
mySku := &model.Sku{
// CategoryID:
// NameID:
Comment: comment,
SpecQuality: specQuality,
SpecUnit: specUnit,
Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))),
Status: model.SkuStatusNormal,
LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用
}
if sku["enabled"].(string) == "0" {
mySku.Status = model.SkuStatusDontSale
}
skuNameExt.Skus = append(skuNameExt.Skus, mySku)
}
allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt)
}
}
}
startOutSkuID := 1000
var skuCatList []*model.SkuCategory
for cat := range allSkuInfo2 {
skuCatList = append(skuCatList, cat)
}
putPolicy := storage.PutPolicy{
Scope: globals.QiniuBucket,
// Expires: 10 * 60,
}
cfg := &storage.Config{}
upToken := putPolicy.UploadToken(api.QiniuAPI)
rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx,
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
var catID string
cat := skuCatList[step]
skuNameExtList := allSkuInfo2[cat]
catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName())
if err == nil {
shopCategories := []int64{utils.Str2Int64(catID)}
for _, skuNameExt := range skuNameExtList {
var imgContent []byte
skuNameExt.CategoryID = cat.ID
skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1)
if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil {
globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err)
if !isContinueWhenError {
return nil, err
}
err = nil
continue
}
formUploader := storage.NewFormUploader(cfg)
ret := storage.PutRet{}
key := jxutils.GenPicFileName(".jpeg")
for i := 0; i < 3; i++ {
if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil {
break
}
}
if err != nil {
globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err)
if !isContinueWhenError {
return nil, err
}
err = nil
continue
}
qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800"
for _, sku := range skuNameExt.Skus {
jdCatID := 22410 // 其他国产水果
if cat.Name == "进口水果" {
jdCatID = 20342 // 其他进口水果
}
price := sku.LinkID
sku.LinkID = 0
skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
fixedStatus := 1
if sku.Status != model.SkuStatusNormal {
fixedStatus = 2
}
var vendorSkuID string
vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil)
if err == nil {
globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID)
} else {
globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err)
if !isContinueWhenError {
return nil, err
}
err = nil
}
// fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName)
startOutSkuID++
// rootTask.Cancel()
// return nil, nil
}
}
} else {
return nil, err
}
return nil, err
}, len(skuCatList))
tasksch.ManageTask(rootTask).Run()
if !isAsync {
_, err = rootTask.GetResult(0)
} else {
hint = rootTask.ID
}
return hint, err
}
func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) {
// globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName)
// return "123", err
return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName)
}
func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) {
// globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
// return "456", err
return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams)
}

View File

@@ -179,6 +179,7 @@ func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrd
FROM goods_order t1 FROM goods_order t1
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
WHERE IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.id > ? AND t1.status < ? WHERE IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.id > ? AND t1.status < ?
AND (t1.flag & ?) = 0
ORDER BY t1.order_created_at DESC, t1.id DESC; ORDER BY t1.order_created_at DESC, t1.id DESC;
` `
sqlParams := []interface{}{ sqlParams := []interface{}{
@@ -186,6 +187,7 @@ func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrd
orderTime, orderTime,
lastOrderSeqID, lastOrderSeqID,
model.OrderStatusEndBegin, model.OrderStatusEndBegin,
model.OrderFlagMaskFake,
} }
return orderList, GetRows(db, &orderList, sql, sqlParams...) return orderList, GetRows(db, &orderList, sql, sqlParams...)
} }
@@ -899,7 +901,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC` ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC`
sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX) sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX)
} else { } else {
if isIncludeSku { if isIncludeSku && userID == "" {
sql += ` sql += `
ORDER BY t1.id` ORDER BY t1.id`
} else { } else {

View File

@@ -206,7 +206,6 @@ func GetDirtyStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats
} }
// 以store_sku_bind为基础来做同步正常情况下使用 // 以store_sku_bind为基础来做同步正常情况下使用
// !!! 此函数不要将store_sku_bind中的vendor_price取出来放到StoreSkuSyncInfo.VendorPrice中因为之后会依赖这个VendorPrice进行重算
// 单多门店模式厂商通用 // 单多门店模式厂商通用
func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) { func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) {
if vendorID < 0 { if vendorID < 0 {

View File

@@ -157,24 +157,6 @@ func (*SkuCategory) TableIndex() [][]string {
} }
} }
type SkuCategoryMap struct {
ModelIDCULD
CatID int `orm:"column(cat_id)" json:"catID"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
VendorCatID string `orm:"size(32);column(vendor_cat_id)" json:"vendorCatID"`
SyncStatus int8 `orm:"default(2)"`
}
func (*SkuCategoryMap) TableUnique() [][]string {
return [][]string{
[]string{"CatID", "VendorID", "VendorOrgCode", "DeletedAt"},
[]string{"VendorCatID", "VendorID", "VendorOrgCode", "DeletedAt"},
}
}
type SkuName struct { type SkuName struct {
ModelIDCULD ModelIDCULD

View File

@@ -0,0 +1,26 @@
package model
const (
ThingTypeCategory = 1
ThingTypeSkuName = 2
ThingTypeSku = 3
)
type ThingMap struct {
ModelIDCULD
ThingID int64 `orm:"column(thing_id)" json:"thingID"`
ThingType int8 `json:"thingType"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
VendorThingID string `orm:"size(32);column(vendor_thing_id)" json:"vendorThingID"`
SyncStatus int8 `orm:"default(2)"`
}
func (*ThingMap) TableUnique() [][]string {
return [][]string{
[]string{"ThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"},
[]string{"VendorThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"},
}
}

View File

@@ -107,23 +107,26 @@ func unregisterChan(storeID int, chan2Listen chan<- *ServerMsg) {
<-chan2Close <-chan2Close
} }
func getPendingOrderList(storeID int, lastOrderTime time.Time, lastOrderSeqID int64) (orderList []*model.GoodsOrderExt, err error) { func getPendingOrderList(storeID int, lastOrderTime time.Time, lastOrderSeqID int64) (vendorOrderIDs []string, err error) {
if utils.IsTimeZero(lastOrderTime) || time.Now().Sub(lastOrderTime) > maxGetOrderTimeDuration { if utils.IsTimeZero(lastOrderTime) || time.Now().Sub(lastOrderTime) > maxGetOrderTimeDuration {
lastOrderTime = time.Now().Add(-maxGetOrderTimeDuration) lastOrderTime = time.Now().Add(-maxGetOrderTimeDuration)
} }
orderList, err = dao.GetStoreOrderAfterTime(dao.GetDB(), storeID, lastOrderTime, lastOrderSeqID) orderList, err := dao.GetStoreOrderAfterTime(dao.GetDB(), storeID, lastOrderTime, lastOrderSeqID)
return orderList, err for _, v := range orderList {
vendorOrderIDs = append(vendorOrderIDs, v.VendorOrderID)
}
return vendorOrderIDs, err
} }
func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOrderSeqID int64, msgTypeList []string, waitingSecond int) (msg *ServerMsg, err error) { func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOrderSeqID int64, msgTypeList []string, waitingSecond int) (msg *ServerMsg, err error) {
orderList, err := getPendingOrderList(storeID, lastOrderTime, lastOrderSeqID) vendorOrderIDs, err := getPendingOrderList(storeID, lastOrderTime, lastOrderSeqID)
if err == nil { if err == nil {
msg = &ServerMsg{ msg = &ServerMsg{
Type: ServerMsgNewOrder, Type: ServerMsgNewOrder,
StoreID: storeID, StoreID: storeID,
MsgData: 0, MsgData: 0,
} }
if len(orderList) == 0 { if len(vendorOrderIDs) == 0 {
chan2Listen := make(chan *ServerMsg, 1) chan2Listen := make(chan *ServerMsg, 1)
registerChan(storeID, chan2Listen) registerChan(storeID, chan2Listen)
pollingDuration := defPollingDuration pollingDuration := defPollingDuration
@@ -149,7 +152,8 @@ func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOr
} }
close(chan2Listen) close(chan2Listen)
} else { } else {
msg.MsgData = len(orderList) globals.SugarLogger.Debugf("GetMsg vendorOrderIDs:%s", utils.Format4Output(vendorOrderIDs, true))
msg.MsgData = len(vendorOrderIDs)
} }
} }
return msg, err return msg, err

View File

@@ -146,10 +146,6 @@ type IPurchasePlatformHandler interface {
GetStoreStatus(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeStatus int, err error) GetStoreStatus(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeStatus int, err error)
UpdateStoreCustomID(ctx *jxcontext.Context, vendorStoreID string, storeID int64) (err error) UpdateStoreCustomID(ctx *jxcontext.Context, vendorStoreID string, storeID int64) (err error)
// SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error)
// // !!!注意,此操作会先清除门店已有的商品,一般用于初始化,小心使用
// FullSyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync, isContinueWhenError bool) (hint string, err error)
RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error)
UploadImg(ctx *jxcontext.Context, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error) UploadImg(ctx *jxcontext.Context, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error)

View File

@@ -26,6 +26,22 @@ func getAPI(appOrgCode string) (apiObj *jdapi.API) {
return partner.CurAPIManager.GetAPI(model.VendorIDJD, appOrgCode).(*jdapi.API) return partner.CurAPIManager.GetAPI(model.VendorIDJD, appOrgCode).(*jdapi.API)
} }
func GetAPIByToken(token string) (apiObj *jdapi.API) {
if token == "" {
apiObj = getAPI("")
} else {
apiList := partner.CurAPIManager.GetAppOrgCodeList(model.VendorIDJD)
for _, v := range apiList {
jdAPI := partner.CurAPIManager.GetAPI(model.VendorIDJD, v).(*jdapi.API)
if jdAPI.GetToken() == token {
apiObj = jdAPI
break
}
}
}
return apiObj
}
func (c *PurchaseHandler) GetVendorID() int { func (c *PurchaseHandler) GetVendorID() int {
return model.VendorIDJD return model.VendorIDJD
} }

View File

@@ -207,24 +207,6 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
return err return err
} }
///////////////////////
func (p *PurchaseHandler) GetAllStoresFromRemote() ([]*model.Store, error) {
ids, err := p.GetAllStoresVendorID(jxcontext.AdminCtx)
if err == nil {
retVal := make([]*model.Store, len(ids))
for index, id := range ids {
store, err2 := p.ReadStore(jxcontext.AdminCtx, id)
if err2 == nil {
retVal[index] = &store.Store
} else {
return nil, err2
}
}
return retVal, nil
}
return nil, err
}
func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
globals.SugarLogger.Debugf("jd RefreshAllStoresID") globals.SugarLogger.Debugf("jd RefreshAllStoresID")
const stepCount = 3 const stepCount = 3
@@ -274,34 +256,6 @@ func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask
return rootTask.ID, err 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 { func JdDeliveryType2Jx(deliveryType int) int8 {
if deliveryType == jdapi.CarrierNoSelfDelivery { if deliveryType == jdapi.CarrierNoSelfDelivery {
return scheduler.StoreDeliveryTypeByStore return scheduler.StoreDeliveryTypeByStore

View File

@@ -211,17 +211,3 @@ func (p *PurchaseHandler) SyncStoreProducts(ctx *jxcontext.Context, parentTask t
} }
return hint, err return hint, err
} }
// func (p *PurchaseHandler) ReorderStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, vendorCatID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
// storeSkuCount := len(storeSkuList)
// if storeSkuCount > 0 {
// if storeSkuCount > jdapi.MaxAddByStoreAndSkusCount {
// storeSkuList = storeSkuList[:jdapi.MaxAddByStoreAndSkusCount]
// }
// vendorSkuIDs := partner.BareStoreSkuInfoList(storeSkuList).GetVendorSkuIDIntList()
// if globals.EnableJdStoreWrite {
// err = getAPI("").AddByStoreAndSkus(utils.Str2Int64(vendorStoreID), vendorSkuIDs)
// }
// }
// return err
// }

View File

@@ -57,6 +57,7 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp
} }
func OnWxPayCallback(msg *wxpay.CallbackMsg) (err error) { func OnWxPayCallback(msg *wxpay.CallbackMsg) (err error) {
globals.SugarLogger.Debugf("OnWxPayCallback msg:%s", utils.Format4Output(msg, true))
switch msg.MsgType { switch msg.MsgType {
case wxpay.MsgTypePay: case wxpay.MsgTypePay:
err = onWxpayFinished(msg.Data.(*wxpay.PayResultMsg)) err = onWxpayFinished(msg.Data.(*wxpay.PayResultMsg))
@@ -88,6 +89,8 @@ func onWxpayFinished(msg *wxpay.PayResultMsg) (err error) {
if msg.ResultCode == wxpay.ResponseCodeSuccess { if msg.ResultCode == wxpay.ResponseCodeSuccess {
err = OnPayFinished(orderPay) err = OnPayFinished(orderPay)
} }
} else {
globals.SugarLogger.Debugf("onWxpayFinished msg:%s, err:%v", utils.Format4Output(msg, true), err)
} }
return err return err
} }

View File

@@ -64,7 +64,9 @@ func callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus {
func onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) { func onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) {
globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID) globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID)
order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0)) order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0))
order.DeliveryType = model.OrderDeliveryTypeStoreSelf if order.DeliveryType == "" {
order.DeliveryType = model.OrderDeliveryTypeStoreSelf
}
order.GoodsOrder.Skus = order.Skus order.GoodsOrder.Skus = order.Skus
order.VendorID = model.VendorIDJX order.VendorID = model.VendorIDJX
order.Flag = model.OrderFlagMaskTempJX order.Flag = model.OrderFlagMaskTempJX

View File

@@ -22,22 +22,6 @@ func (c *InitDataController) InitPlace() {
}) })
} }
// @Title 初始化skuname当前主要是计算md5)
// @Description 初始化skuname当前主要是计算md5)
// @Param token header string true "认证token"
// @Param isForce formData bool false "是否强刷即即使本地已经有了hashCode也重新计算缺省为false"
// @Param isAsync formData bool false "是否异步操作"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /InitSkuName [post]
func (c *InitDataController) InitSkuName() {
c.callInitSkuName(func(params *tInitdataInitSkuNameParams) (retVal interface{}, errCode string, err error) {
retVal, err = initdata.InitSkuName(params.Ctx, params.IsForce, params.IsAsync, params.IsContinueWhenError)
return retVal, "", err
})
}
// @Title 初始化vendor category // @Title 初始化vendor category
// @Description 初始化vendor category // @Description 初始化vendor category
// @Param token header string true "认证token" // @Param token header string true "认证token"
@@ -67,19 +51,3 @@ func (c *InitDataController) UploadImage4Vendors() {
return retVal, "", err return retVal, "", err
}) })
} }
// @Title 从饿百店建商品
// @Description 从饿百店建商品
// @Param token header string true "认证token"
// @Param baiduShopID formData int true "skuNameID"
// @Param isAsync formData bool false "是否异步操作"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /BuildSkuFromEbaiStore [post]
func (c *InitDataController) BuildSkuFromEbaiStore() {
c.callBuildSkuFromEbaiStore(func(params *tInitdataBuildSkuFromEbaiStoreParams) (retVal interface{}, errCode string, err error) {
retVal, err = initdata.BuildSkuFromEbaiStore(params.Ctx, int64(params.BaiduShopID), params.IsAsync, params.IsContinueWhenError)
return retVal, "", err
})
}

View File

@@ -2,14 +2,15 @@ package controllers
import ( import (
"bytes" "bytes"
"fmt"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/url"
"git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd" "git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego" "github.com/astaxie/beego"
"github.com/astaxie/beego/context" "github.com/astaxie/beego/context"
) )
@@ -19,20 +20,27 @@ type DjswController struct {
beego.Controller beego.Controller
} }
func (c *DjswController) handleMsg(isNeedDecode bool, handler func(*jdapi.API, url.Values, string) *jdapi.CallbackResponse) (callbackResponse *jdapi.CallbackResponse) {
values, token, msgURL, callbackResponse := jdapi.GetCallbackMsg(getUsefulRequest(c.Ctx), isNeedDecode)
if callbackResponse == nil {
if jdAPI := jd.GetAPIByToken(token); jdAPI != nil {
callbackResponse = handler(jdAPI, values, msgURL)
} else {
callbackResponse = jdapi.Err2CallbackResponse(fmt.Errorf("没有匹配的token,非法请求"), "")
}
}
return callbackResponse
}
func (c *DjswController) orderStatus(isCancelOrder bool) { func (c *DjswController) orderStatus(isCancelOrder bool) {
if c.Ctx.Input.Method() == http.MethodPost { if c.Ctx.Input.Method() == http.MethodPost {
var obj *jdapi.CallbackOrderMsg callbackResponse := c.handleMsg(isCancelOrder, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) {
var callbackResponse *jdapi.CallbackResponse obj, callbackResponse := a.GetOrderCallbackMsg(values, msgURL)
if callbackResponse == nil {
if isCancelOrder { callbackResponse = jd.OnOrderMsg(obj)
obj, callbackResponse = api.JdAPI.GetOrderApplyCancelCallbackMsg(getUsefulRequest(c.Ctx)) }
} else { return callbackResponse
obj, callbackResponse = api.JdAPI.GetOrderCallbackMsg(getUsefulRequest(c.Ctx)) })
}
globals.SugarLogger.Debug(utils.Format4Output(obj, true))
if callbackResponse == nil {
callbackResponse = jd.OnOrderMsg(obj)
}
c.Data["json"] = c.transferResponse("orderStatus", callbackResponse) c.Data["json"] = c.transferResponse("orderStatus", callbackResponse)
c.ServeJSON() c.ServeJSON()
} else { } else {
@@ -82,10 +90,13 @@ func (c *DjswController) ApplyCancelOrder() {
func (c *DjswController) PushDeliveryStatus() { func (c *DjswController) PushDeliveryStatus() {
if c.Ctx.Input.Method() == http.MethodPost { if c.Ctx.Input.Method() == http.MethodPost {
obj, callbackResponse := api.JdAPI.GetOrderDeliveryCallbackMsg(getUsefulRequest(c.Ctx)) callbackResponse := c.handleMsg(true, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) {
if callbackResponse == nil { obj, callbackResponse := a.GetOrderDeliveryCallbackMsg(values, msgURL)
callbackResponse = jd.OnWaybillMsg(obj) if callbackResponse == nil {
} callbackResponse = jd.OnWaybillMsg(obj)
}
return callbackResponse
})
c.Data["json"] = c.transferResponse("PushDeliveryStatus", callbackResponse) c.Data["json"] = c.transferResponse("PushDeliveryStatus", callbackResponse)
c.ServeJSON() c.ServeJSON()
} else { } else {
@@ -109,10 +120,13 @@ func (c *DjswController) Token() {
func (c *DjswController) StockIsHave() { func (c *DjswController) StockIsHave() {
// globals.SugarLogger.Info(string(c.Ctx.Input.RequestBody)) // globals.SugarLogger.Info(string(c.Ctx.Input.RequestBody))
if c.Ctx.Input.Method() == http.MethodPost { if c.Ctx.Input.Method() == http.MethodPost {
_, callbackResponse := api.JdAPI.GetStoreStockCallbackMsg(getUsefulRequest(c.Ctx)) callbackResponse := c.handleMsg(true, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) {
if callbackResponse == nil { _, callbackResponse = a.GetStoreStockCallbackMsg(values, msgURL)
// globals.SugarLogger.Debugf("StockIsHave, obj:%s", utils.Format4Output(obj, false)) if callbackResponse == nil {
} // globals.SugarLogger.Debugf("StockIsHave, obj:%s", utils.Format4Output(obj, false))
}
return callbackResponse
})
c.Data["json"] = c.transferResponse("StockIsHave", callbackResponse) c.Data["json"] = c.transferResponse("StockIsHave", callbackResponse)
c.ServeJSON() c.ServeJSON()
} else { } else {
@@ -122,10 +136,13 @@ func (c *DjswController) StockIsHave() {
func (c *DjswController) SinglePromoteCreate() { func (c *DjswController) SinglePromoteCreate() {
if c.Ctx.Input.Method() == http.MethodPost { if c.Ctx.Input.Method() == http.MethodPost {
obj, callbackResponse := api.JdAPI.GetOrderCallbackMsg(getUsefulRequest(c.Ctx)) callbackResponse := c.handleMsg(false, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) {
if callbackResponse == nil { obj, callbackResponse := a.GetOrderCallbackMsg(values, msgURL)
callbackResponse = jd.OnActMsg(obj) if callbackResponse == nil {
} callbackResponse = jd.OnActMsg(obj)
}
return callbackResponse
})
c.Data["json"] = c.transferResponse("SinglePromoteCreate", callbackResponse) c.Data["json"] = c.transferResponse("SinglePromoteCreate", callbackResponse)
c.ServeJSON() c.ServeJSON()
} else { } else {
@@ -135,10 +152,13 @@ func (c *DjswController) SinglePromoteCreate() {
func (c *DjswController) StoreCrud() { func (c *DjswController) StoreCrud() {
if c.Ctx.Input.Method() == http.MethodPost { if c.Ctx.Input.Method() == http.MethodPost {
obj, callbackResponse := api.JdAPI.GetOrderCallbackMsg(getUsefulRequest(c.Ctx)) callbackResponse := c.handleMsg(false, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) {
if callbackResponse == nil { obj, callbackResponse := a.GetOrderCallbackMsg(values, msgURL)
callbackResponse = jd.OnStoreMsg(obj) if callbackResponse == nil {
} callbackResponse = jd.OnStoreMsg(obj)
}
return callbackResponse
})
c.Data["json"] = c.transferResponse("StoreCrud", callbackResponse) c.Data["json"] = c.transferResponse("StoreCrud", callbackResponse)
c.ServeJSON() c.ServeJSON()
} else { } else {

View File

@@ -352,3 +352,19 @@ func (c *TempOpController) FixMtwmCategory() {
return retVal, "", err return retVal, "", err
}) })
} }
// @Title 从饿百店建商品
// @Description 从饿百店建商品
// @Param token header string true "认证token"
// @Param baiduShopID formData int true "skuNameID"
// @Param isAsync formData bool false "是否异步操作"
// @Param isContinueWhenError formData bool false "单个同步失败是否继续缺省false"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /BuildSkuFromEbaiStore [post]
func (c *TempOpController) BuildSkuFromEbaiStore() {
c.callBuildSkuFromEbaiStore(func(params *tTempopBuildSkuFromEbaiStoreParams) (retVal interface{}, errCode string, err error) {
retVal, err = tempop.BuildSkuFromEbaiStore(params.Ctx, int64(params.BaiduShopID), params.IsAsync, params.IsContinueWhenError)
return retVal, "", err
})
}

View File

@@ -17,9 +17,10 @@ type WXPayController struct {
func (c *WXPayController) Msg() { func (c *WXPayController) Msg() {
if c.Ctx.Input.Method() == http.MethodPost { if c.Ctx.Input.Method() == http.MethodPost {
msg, callbackResponse := api.WxpayAPI.GetCallbackMsg(c.Ctx.Request) msg, callbackResponse := api.WxpayAPI.GetCallbackMsg(c.Ctx.Request)
// globals.SugarLogger.Debugf("wxpay callback msg:%s, callbackResponse:%s, %t", utils.Format4Output(msg, true), utils.Format4Output(callbackResponse, true), callbackResponse == nil)
var err error var err error
if callbackResponse == nil { if callbackResponse == nil {
if msg.MsgType != wxpay.MsgTypeUnkown { if msg.MsgType == wxpay.MsgTypeUnkown {
err = fmt.Errorf("未知的微信支付回调类型:%d", msg.MsgType) err = fmt.Errorf("未知的微信支付回调类型:%d", msg.MsgType)
} else { } else {
err = localjx.OnWxPayCallback(msg) err = localjx.OnWxPayCallback(msg)

View File

@@ -32,7 +32,7 @@ func Init() {
orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{}) orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{})
orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{}) orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{})
orm.RegisterModel(&model.SkuCategory{}) orm.RegisterModel(&model.SkuCategory{})
// orm.RegisterModel(&model.SkuCategoryMap{}) // orm.RegisterModel(&model.ThingMap{})
orm.RegisterModel(&model.AuthBind{}, &model.User{}) orm.RegisterModel(&model.AuthBind{}, &model.User{})

View File

@@ -484,15 +484,6 @@ func init() {
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"],
beego.ControllerComments{
Method: "BuildSkuFromEbaiStore",
Router: `/BuildSkuFromEbaiStore`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "Change2JDSPU4Store", Method: "Change2JDSPU4Store",
@@ -529,15 +520,6 @@ func init() {
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"],
beego.ControllerComments{
Method: "InitSkuName",
Router: `/InitSkuName`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "InitVendorCategory", Method: "InitVendorCategory",
@@ -1827,6 +1809,15 @@ func init() {
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{
Method: "BuildSkuFromEbaiStore",
Router: `/BuildSkuFromEbaiStore`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"], beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "CheckSkuDiffBetweenJxAndVendor", Method: "CheckSkuDiffBetweenJxAndVendor",