门店商品分类

This commit is contained in:
苏尹岚
2020-07-23 15:15:47 +08:00
parent 24e9b4f571
commit 29673dd992
12 changed files with 521 additions and 40 deletions

View File

@@ -1278,6 +1278,10 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor
if valid["status"] != nil {
syncStatus |= model.SyncFlagStoreStatus
}
//修改分类开关需要打同步标志
if valid["isSysCat"] != nil {
SetStoreCategorySyncStatus2(db, []int{storeID}, nil, model.SyncFlagModifiedMask)
}
if vendorStoreName, ok := valid["vendorStoreName"].(string); ok {
if utf8.RuneCountInString(vendorStoreName) > jdapi.MaxStoreNameLen && vendorID == model.VendorIDJD {
return 0, fmt.Errorf("门店名称不允许超过13位")
@@ -3016,6 +3020,282 @@ func ChangeYbCookie() (err error) {
return err
}
func GetStoreCategoryMap(ctx *jxcontext.Context, parentID, level int, storeID int) (storeCatMaps []*model.StoreCategoryMap, err error) {
db := dao.GetDB()
storeCatMaps, err = dao.GetStoreCategoryMap(db, parentID, level, storeID, 0)
if err != nil {
return nil, err
}
return storeCatMaps, err
}
func AddStoreCategoryMap(ctx *jxcontext.Context, storeCategoryMap *model.StoreCategoryMap) (result *model.StoreCategoryMap, err error) {
var (
db = dao.GetDB()
)
if storeCategoryMap.Level != 1 {
storeCatMaps, _ := dao.GetStoreCategoryMap(db, -1, 0, storeCategoryMap.StoreID, storeCategoryMap.CategoryID)
if len(storeCatMaps) > 0 {
return nil, fmt.Errorf("已存在绑定的京西分类,分类名:[%v]", storeCatMaps[0].StoreCategoryName)
}
}
storeCategoryMap.StoreCategoryName = strings.Trim(storeCategoryMap.StoreCategoryName, " ")
dao.WrapAddIDCULDEntity(storeCategoryMap, ctx.GetUserName())
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if err = dao.CreateEntity(db, storeCategoryMap); err != nil {
dao.Rollback(db)
return nil, err
}
dao.Commit(db)
result = storeCategoryMap
if storeCategoryMap.CategoryID != 0 {
SetStoreCategorySyncStatus2(db, []int{storeCategoryMap.StoreID}, []int{storeCategoryMap.CategoryID}, model.SyncFlagModifiedMask)
}
// _, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName)
return result, err
}
func UpdateStoreCategoryMap(ctx *jxcontext.Context, ID int, storeCategoryMap *model.StoreCategoryMap, isDelete bool) (num int64, err error) {
var (
db = dao.GetDB()
valid = make(map[string]interface{})
storeCategoryMap2 = &model.StoreCategoryMap{}
)
storeCategoryMap2.ID = ID
if err = dao.GetEntity(db, storeCategoryMap2); err != nil {
return 0, err
}
if storeCategoryMap.StoreCategoryName != "" {
valid["storeCategoryName"] = storeCategoryMap.StoreCategoryName
}
if storeCategoryMap.CategoryID != 0 {
valid["categoryID"] = storeCategoryMap.CategoryID
if !isDelete {
storeCatMaps, _ := dao.GetStoreCategoryMap(db, -1, 0, storeCategoryMap2.StoreID, storeCategoryMap.CategoryID)
if len(storeCatMaps) > 0 {
for _, v := range storeCatMaps {
if v.ID != ID {
return 0, fmt.Errorf("已存在绑定的京西分类,分类名:[%v]", storeCatMaps[0].StoreCategoryName)
}
}
}
}
}
if storeCategoryMap.Level != 0 {
valid["level"] = storeCategoryMap.Level
if storeCategoryMap.Level == 2 {
cat2, _ := dao.GetCategories(db, -1, 0, []int{storeCategoryMap.CategoryID}, false)
if len(cat2) > 0 {
if cat2[0].ParentID != storeCategoryMap.ParentID {
return 0, fmt.Errorf("此二级分类只能绑定到对应一级分类下!")
}
}
}
}
if isDelete {
valid["deletedAt"] = time.Now()
valid["updatedAt"] = time.Now()
valid["lastOperator"] = ctx.GetUserName()
//如果是1级分类则删除下面的子分类
var catIDs []int
if storeCategoryMap2.Level == 1 {
storeCatMaps, _ := dao.GetStoreCategoryMap(db, storeCategoryMap2.CategoryID, 2, storeCategoryMap2.StoreID, 0)
if len(storeCatMaps) > 0 {
for _, v := range storeCatMaps {
catIDs = append(catIDs, v.CategoryID)
v.DeletedAt = time.Now()
v.LastOperator = ctx.GetUserName()
dao.UpdateEntity(db, v, "DeletedAt", "LastOperator")
}
}
}
// var storeSkus []*model.StoreSkuBind
// sql := `
// SELECT a.*
// FROM store_sku_bind a
// JOIN sku b ON a.sku_id = b.id
// JOIN sku_name c ON c.id = b.name_id
// WHERE a.deleted_at = ? AND b.deleted_at = ? AND c.deleted_at = ?
// AND c.category_id = ? AND a.store_id = ?
// UNION ALL
// SELECT a.*
// FROM store_sku_bind a
// JOIN sku b ON a.sku_id = b.id
// JOIN sku_name c ON c.id = b.name_id
// JOIN sku_category d ON d.id = c.category_id
// JOIN sku_category e ON e.id = d.parent_id
// WHERE a.deleted_at = ? AND b.deleted_at = ? AND c.deleted_at = ?
// AND e.id = ? AND a.store_id = ?
// `
// sqlParams := []interface{}{
// utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue,
// storeCategoryMap2.CategoryID, storeCategoryMap2.StoreID,
// utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue,
// storeCategoryMap2.CategoryID, storeCategoryMap2.StoreID,
// }
// if err = dao.GetRows(db, &storeSkus, sql, sqlParams); err != nil {
// return 0, err
// }
// if len(storeSkus) > 0 {
// return 0, fmt.Errorf("该分类下或该分类的子分类下有关注的商品,不可删除!分类名:[%v]", storeCategoryMap2.StoreCategoryName)
// }
catIDs = append(catIDs, storeCategoryMap.CategoryID)
SetStoreCategorySyncStatus2(db, []int{storeCategoryMap2.StoreID}, catIDs, model.SyncFlagModifiedMask)
} else {
SetStoreCategorySyncStatus2(db, []int{storeCategoryMap2.StoreID}, []int{storeCategoryMap.CategoryID, storeCategoryMap2.CategoryID}, model.SyncFlagModifiedMask)
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
if num, err = dao.UpdateEntityLogically(db, storeCategoryMap2, valid, ctx.GetUserName(), nil); err != nil {
dao.Rollback(db)
return 0, err
}
dao.Commit(db)
return num, err
}
func ReorderStoreCategories(ctx *jxcontext.Context, parentID, storeID int, categoryIDs []int) (err error) {
var (
storeCatsMap []*model.StoreCategoryMap
)
db := dao.GetDB()
storeCatsMap, err = dao.GetStoreCategoryMap(db, parentID, 0, storeID, 0)
catsLen := len(storeCatsMap)
if catsLen != len(categoryIDs) {
return ErrInputCatsDoesntMatch
}
catsMap := make(map[int]*model.StoreCategoryMap, catsLen)
for _, cat := range storeCatsMap {
catsMap[cat.CategoryID] = cat
}
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
for k, v := range categoryIDs {
if catsMap[v] == nil {
dao.Rollback(db)
return fmt.Errorf("分类:%d不在%d分类下", v, parentID)
}
catsMap[v].StoreCategorySeq = k
catsMap[v].LastOperator = ctx.GetUserName()
if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil {
dao.Rollback(db)
return err
}
}
dao.Commit(db)
SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask)
if err == nil {
CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true)
}
return err
}
func CopyStoreCategories(ctx *jxcontext.Context, fromStoreID int, toStoreIDs, categoryIDs []int, isContinueWhenError, isAsync bool) (hint string, err error) {
var (
db = dao.GetDB()
)
storeCatList, err := dao.GetStoreCategoryMap(db, -1, 0, fromStoreID, 0)
if err != nil {
return "", err
}
if len(storeCatList) == 0 {
return "", fmt.Errorf("原门店无分类信息storeID: %v", fromStoreID)
}
task := tasksch.NewParallelTask("CopyStoreCategories", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeID := batchItemList[0].(int)
//证明是要全复制
if len(categoryIDs) == 0 {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
sql := `
DELETE FROM store_category_map WHERE store_id = ?
`
sqlParams := []interface{}{storeID}
if _, err = dao.ExecuteSQL(db, sql, sqlParams); err != nil {
return retVal, err
}
sql2 := `
INSERT INTO store_category_map(created_at,updated_at,last_operator,deleted_at,store_id,category_id,store_category_name,store_category_seq,level,parent_id)
SELECT ?, ?, ?, ?, ?, category_id, store_category_name, store_category_seq, level, parent_id
FROM store_category_map
WHERE store_id = ? AND deleted_at = ?
`
sqlParams2 := []interface{}{
time.Now(), time.Now(), ctx.GetUserName(), utils.DefaultTimeValue, storeID,
fromStoreID, utils.DefaultTimeValue,
}
if _, err = dao.ExecuteSQL(db, sql2, sqlParams2); err != nil {
return retVal, err
}
dao.Commit(db)
} else {
for _, v := range categoryIDs {
list, err := dao.GetStoreCategoryMap(db, -1, 0, storeID, v)
if err != nil {
return retVal, err
}
if len(list) > 0 {
return retVal, fmt.Errorf("该门店已有重复绑定的京西分类storeID: %v,categroyID: %v", storeID, v)
} else {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
sql2 := `
INSERT INTO store_category_map(created_at,updated_at,last_operator,deleted_at,store_id,category_id,store_category_name,store_category_seq,level,parent_id)
SELECT ?, ?, ?, ?, ?, category_id, store_category_name, store_category_seq, level, parent_id
FROM store_category_map
WHERE store_id = ? AND deleted_at = ? AND category_id = ?
`
sqlParams2 := []interface{}{
time.Now(), time.Now(), ctx.GetUserName(), utils.DefaultTimeValue, storeID,
fromStoreID, utils.DefaultTimeValue, v,
}
if _, err = dao.ExecuteSQL(db, sql2, sqlParams2); err != nil {
return retVal, err
}
dao.Commit(db)
}
}
}
return retVal, err
}, toStoreIDs)
tasksch.HandleTask(task, nil, true).Run()
if isAsync {
hint = task.GetID()
} else {
_, err = task.GetResult(0)
hint = "1"
}
return hint, err
}
func DisabledStoreWithoutVendor(ctx *jxcontext.Context, isContinueWhenError, isAsync bool) (hint string, err error) {
var (
db = dao.GetDB()

View File

@@ -78,7 +78,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
if len(catList) > 0 {
num += len(catList)
task := tasksch.NewParallelTask(fmt.Sprintf("%s SyncStoreCategory step2, level=%d", model.VendorChineseNames[vendorID], level),
tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[vendorID])}
idFieldName := dao.GetVendorThingIDStructField(model.VendorNames[vendorID])
@@ -91,6 +91,13 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
return nil, err
}
}
if vendorID != model.VendorIDJD && vendorID != model.VendorIDJDShop {
if catInfo.IsSysCat == model.YES && catInfo.StoreCatID != 0 {
catInfo.Name = catInfo.StoreCatName
catInfo.Seq = catInfo.StoreCatSeq
}
}
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) {
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level)