diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 001564ecf..8b6676bc3 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -93,19 +93,65 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string func UpdateCategory(ctx *jxcontext.Context, categoryID int, payload map[string]interface{}, userName string) (num int64, err error) { cat := &model.SkuCategory{} cat.ID = categoryID - valid := dao.NormalMakeMapByStructObject(payload, cat, userName) + db := dao.GetDB() + if err = dao.GetEntity(db, cat); err != nil { + return 0, err + } + valid := dao.StrictMakeMapByStructObject(payload, cat, userName) if len(valid) > 0 { + syncStatus := 0 if valid["name"] != nil { valid["name"] = strings.Trim(valid["name"].(string), " ") + syncStatus = model.SyncFlagModifiedMask } - db := dao.GetDB() - if num, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, cat, valid, userName, nil, model.FieldJdSyncStatus, model.SyncFlagModifiedMask); err == nil { + if num, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, cat, valid, userName, nil, model.FieldJdSyncStatus, syncStatus); err == nil { + SetStoreCategorySyncStatus2(db, -1, []int{categoryID}, model.SyncFlagModifiedMask) + if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil { + if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 { + var skuIDs []int + for _, sku := range skuList { + skuIDs = append(skuIDs, sku.ID) + } + if valid["jdCategoryID"] != nil { + dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask) + } + var vendorIDs []int + if valid["ebaiCategoryID"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDEBAI) + } + if valid["mtwmCategoryID"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDMTWM) + } + SetStoreSkuSyncStatus2(db, -1, vendorIDs, skuIDs, model.SyncFlagModifiedMask) + } + } _, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName) } } return num, err } +func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeID 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 CurVendorSync.SingleStoreVendorIDs { + num2, err2 := dao.SetStoreCategorySyncStatus(db, vendorID, storeID, catIDs, syncStatus) + if err = err2; err != nil { + return 0, err + } + num += num2 + } + dao.Commit(db) + return num, nil +} + func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int, userName string) (err error) { var cats []*model.SkuCategory parentCat := &model.SkuCategory{} @@ -588,8 +634,14 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf model.FieldNameID: nameID, }, model.FieldJdSyncStatus, model.SyncFlagModifiedMask) if err == nil { - dao.Commit(db) - _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) + skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID}) + if err = err2; err == nil && len(skuIDs) > 0 { + _, err = SetStoreSkuSyncStatus2(db, -1, CurVendorSync.SingleStoreVendorIDs, skuIDs, model.SyncFlagModifiedMask) + } + if err == nil { + dao.Commit(db) + _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) + } } } } @@ -597,6 +649,27 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf return num, err } +func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeID 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 { + num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeID, skuIDs, syncStatus) + if err = err2; err != nil { + return 0, err + } + num += num2 + } + dao.Commit(db) + return num, nil +} + func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int64, err error) { db := dao.GetDB() dao.Begin(db) @@ -691,8 +764,10 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} `, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil { return 0, err } - dao.Commit(db) - _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) + if _, err = SetStoreSkuSyncStatus2(db, -1, CurVendorSync.SingleStoreVendorIDs, []int{skuID}, model.SyncFlagModifiedMask); err == nil { + dao.Commit(db) + _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) + } } else { err = ErrEntityNotExist } diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 599a6f134..cb1aa7d08 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -1,8 +1,11 @@ package dao import ( + "fmt" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals" ) func GetSellCities(db *DaoDB, nameID int, vendorID int) (cities []*model.Place, err error) { @@ -70,3 +73,76 @@ func GetSkuNames(db *DaoDB, nameIDs []int) (skuNameList []*model.SkuName, err er } return nil, err } + +func GetSkuByNames(db *DaoDB, nameIDs []int) (skuList []*model.Sku, err error) { + sql := ` + SELECT * + FROM sku t1 + WHERE t1.deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if len(nameIDs) > 0 { + sql += " AND t1.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + if err = GetRows(db, &skuList, sql, sqlParams...); err == nil { + return skuList, nil + } + return nil, err +} + +func GetSkuIDByNames(db *DaoDB, nameIDs []int) (skuIDs []int, err error) { + skuList, err := GetSkuByNames(db, nameIDs) + if err == nil { + for _, sku := range skuList { + skuIDs = append(skuIDs, sku.ID) + } + } + return skuIDs, err +} + +func GetSkuByCats(db *DaoDB, catIDs []int) (skuList []*model.Sku, err error) { + sql := ` + SELECT t1.* + FROM sku t1 + JOIN sku_name t2 ON t2.id = t1.name_id + WHERE t1.deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if len(catIDs) > 0 { + sql += " AND t2.category_id IN (" + GenQuestionMarks(len(catIDs)) + ")" + sqlParams = append(sqlParams, catIDs) + } + err = GetRows(db, &skuList, sql, sqlParams...) + globals.SugarLogger.Debugf("GetSkuByCats err:%v", err) + return skuList, err +} + +func SetSkuSyncStatus(db *DaoDB, vendorID int, skuIDs []int, syncStatus int) (num int64, err error) { + globals.SugarLogger.Debugf("SetSkuSyncStatus, vendorID:%d", vendorID) + + fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) + sql := fmt.Sprintf(` + UPDATE sku t1 + SET t1.%s_sync_status = IF(t1.deleted_at = ?, t1.%s_sync_status | ?, 0) + `, fieldPrefix, fieldPrefix) + sqlParams := []interface{}{ + utils.DefaultTimeValue, + syncStatus, + } + if (syncStatus & model.SyncFlagNewMask) != 0 { + sql += fmt.Sprintf(`, + t1.%s_id = 0 + `, fieldPrefix) + } + sql += " WHERE 1 = 1" + if len(skuIDs) > 0 { + sql += " AND t1.id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + return ExecuteSQL(db, sql, sqlParams...) +} diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 334c5ffce..6b99f51ff 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -224,8 +224,8 @@ func SetStoreSkuSyncStatus(db *DaoDB, vendorID, storeID int, skuIDs []int, syncS fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := fmt.Sprintf(` - UPDATE store_sku_bind - SET %s_sync_status = IF(deleted_at = ?, %s_sync_status | ?, 0) + UPDATE store_sku_bind t1 + SET t1.%s_sync_status = IF(t1.deleted_at = ?, t1.%s_sync_status | ?, 0) `, fieldPrefix, fieldPrefix) sqlParams := []interface{}{ utils.DefaultTimeValue, @@ -233,16 +233,16 @@ func SetStoreSkuSyncStatus(db *DaoDB, vendorID, storeID int, skuIDs []int, syncS } if (syncStatus & model.SyncFlagNewMask) != 0 { sql += fmt.Sprintf(`, - %s_id = 0 + t1.%s_id = 0 `, fieldPrefix) } sql += " WHERE 1 = 1" if storeID > 0 { - sql += " AND store_id = ?" + sql += " AND t1.store_id = ?" sqlParams = append(sqlParams, storeID) } if len(skuIDs) > 0 { - sql += " AND sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } return ExecuteSQL(db, sql, sqlParams...) @@ -254,13 +254,16 @@ func SetStoreCategorySyncStatus(db *DaoDB, vendorID, storeID int, catIDs []int, fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := fmt.Sprintf(` UPDATE store_sku_category_map - SET %s_sync_status = %s_sync_status | ? - WHERE deleted_at = ? AND store_id = ? + SET %s_sync_status = IF(deleted_at = ?, %s_sync_status | ?, 0) `, fieldPrefix, fieldPrefix) sqlParams := []interface{}{ - syncStatus, utils.DefaultTimeValue, - storeID, + syncStatus, + } + sql += " WHERE 1 = 1" + if storeID > 0 { + sql += " AND store_id = ?" + sqlParams = append(sqlParams, storeID) } if len(catIDs) > 0 { sql += " AND category_id IN (" + GenQuestionMarks(len(catIDs)) + ")" diff --git a/business/model/store_sku.go b/business/model/store_sku.go index f803b6a9c..09fbacec7 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -58,6 +58,12 @@ func (*StoreSkuCategoryMap) TableUnique() [][]string { } } +func (*StoreSkuCategoryMap) TableIndex() [][]string { + return [][]string{ + []string{"CategoryID", "StoreID", "DeletedAt"}, + } +} + type StoreSkuBind struct { ModelIDCULD @@ -88,6 +94,12 @@ func (*StoreSkuBind) TableUnique() [][]string { } } +func (*StoreSkuBind) TableIndex() [][]string { + return [][]string{ + []string{"SkuID", "StoreID", "DeletedAt"}, + } +} + type StoreOpRequest struct { ModelIDCULD // DeletedAt用于表示请求操作结束,而并不一定是删除