门店商品分类
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user