From 70bf5a522a5864ccdd3c5a820b17d16c096714ca Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 11 Sep 2018 11:38:31 +0800 Subject: [PATCH] - move some funcs from jxtools to dao. --- business/jxstore/cms/cms.go | 1 + business/jxstore/cms/sku.go | 34 +++++++-- business/jxstore/cms/store.go | 21 ++---- business/jxutils/dtask/dtask.go | 2 +- business/jxutils/jxutils.go | 12 ---- business/model/dao/dao.go | 14 +++- business/model/dao/dao_utils.go | 80 ++++++++++++++++++++++ business/partner/purchase/jd/store_test.go | 14 ---- 8 files changed, 130 insertions(+), 48 deletions(-) create mode 100644 business/model/dao/dao_utils.go diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 3f5c263c0..c4794c535 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -19,6 +19,7 @@ var ( var ( ErrHaveNotImplementedYet = errors.New("还没有实现") + ErrEntityNotExist = errors.New("找不到相应实体") ) func GetPurchaseHandler(vendorID int) partner.IPurchasePlatformHandler { diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 4241eaf1e..de395080d 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -5,7 +5,6 @@ import ( "strconv" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" ) @@ -52,9 +51,8 @@ func GetCategories(parentID int) (cats []*model.SkuCategory, err error) { } func AddCategory(cat *model.SkuCategory, userName string) (outCat *model.SkuCategory, err error) { - cat.ID = 0 + dao.WrapAddIDCULDEntity(cat, userName) cat.JdSyncStatus = model.SyncFlagNewMask - cat.DeletedAt = utils.DefaultTimeValue if err = dao.CreateEntity(nil, cat); err == nil { outCat = cat err = CurVendorSync.SyncCategory(cat.ID, false, userName) @@ -65,7 +63,7 @@ func AddCategory(cat *model.SkuCategory, userName string) (outCat *model.SkuCate func UpdateCategory(categoryID int, payload map[string]interface{}, userName string) (num int64, err error) { cat := &model.SkuCategory{} cat.ID = categoryID - valid := jxutils.NormalMakeMapByStructObject(payload, cat, userName) + valid := dao.NormalMakeMapByStructObject(payload, cat, userName) valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask db := dao.GetDB() if num, err = dao.UpdateEntityByKV(db, cat, valid, nil); err == nil { @@ -96,6 +94,7 @@ func ReorderCategories(parentID int, categoryIDs []int, userName string) (err er break } } + // todo 这里应该也需要先置标记 if err == nil { err = GetPurchaseHandler(model.VendorIDJD).ReorderCategories(parentCat, userName) } @@ -262,8 +261,31 @@ func GetSkuNames(keyword string, params map[string]interface{}, offset, pageSize return skuNamesInfo, err } -func AddSkuName(skuNameID int, payload map[string]interface{}) (num int64, err error) { - return num, err +func AddSkuName(skuNameExt *SkuNameExt, userName string) (outSkuNameExt *SkuNameExt, err error) { + db := dao.GetDB() + dao.Begin(db) + dao.WrapAddIDCULDEntity(&skuNameExt.SkuName, userName) + if err = dao.CreateEntity(db, &skuNameExt.SkuName); err != nil { + dao.Rollback(db) + return nil, err + } + for _, sku := range skuNameExt.Skus { + dao.WrapAddIDCULDEntity(sku, userName) + if err = dao.CreateEntity(db, sku); err != nil { + dao.Rollback(db) + return nil, err + } + } + dao.Commit(db) + tmpInfo, err := GetSkuNames("", utils.Params2Map("id", skuNameExt.SkuName.ID), 0, 1) + if err != nil { + return nil, err + } + if tmpInfo.TotalCount != 1 { + return nil, ErrEntityNotExist + } + outSkuNameExt = tmpInfo.SkuNames[0] + return outSkuNameExt, err } func UpdateSkuName(skuNameID int, payload map[string]interface{}) (num int64, err error) { diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 4dda2a13f..84f6b3e7c 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -4,10 +4,8 @@ import ( "errors" "strconv" "strings" - "time" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" @@ -57,11 +55,7 @@ func UpdatePlaces(places []map[string]interface{}, userName string) (num int64, return 0, ErrMissingInput } placeid := &model.Place{} - globals.SugarLogger.Debug(utils.Format4Output(place, false)) - valid, _ := jxutils.FilterMapByFieldList(place, []string{"jdCode", "enabled", "mtpsPrice"}) - valid["updatedAt"] = time.Now() - valid["lastOperator"] = userName - globals.SugarLogger.Debug(valid) + valid := dao.NormalMakeMapByFieldList(place, []string{"jdCode", "enabled", "mtpsPrice"}, userName) if num, err = dao.UpdateEntityByKV(nil, placeid, valid, utils.Params2Map("Code", place["code"])); err != nil { return num, err } @@ -74,6 +68,7 @@ func UpdatePlace(placeCode int, payload map[string]interface{}, userName string) return UpdatePlaces([]map[string]interface{}{payload}, userName) } +// todo 门店绑定信息可以考虑以数组形式返回,而不是现在这样 func GetStores(keyword string, params map[string]interface{}, offset, pageSize int) (retVal *StoresInfo, err error) { sql := ` FROM store t1 @@ -205,7 +200,7 @@ func GetVendorStore(vendorStoreID string, vendorID int) (retVal *StoreExt, err e func UpdateStore(storeID int, payload map[string]interface{}, userName string) (num int64, err error) { store := &model.Store{} store.ID = storeID - valid := jxutils.NormalMakeMapByStructObject(payload, store, userName) + valid := dao.NormalMakeMapByStructObject(payload, store, userName) db := dao.GetDB() if num, err = dao.UpdateEntityByKV(db, store, valid, nil); err == nil { dummy := &model.StoreMap{} @@ -220,10 +215,7 @@ func UpdateStore(storeID int, payload map[string]interface{}, userName string) ( } func CreateStore(store *model.Store, userName string) (id int, err error) { - store.ID = 0 - store.LastOperator = userName - store.CreatedAt = time.Now() - store.UpdatedAt = store.CreatedAt + dao.WrapAddIDCULEntity(store, userName) if err = dao.CreateEntity(nil, store); err == nil { return store.ID, nil } @@ -243,6 +235,7 @@ func GetStoreVendorMaps(db *dao.DaoDB, storeID int, vendorID int) (storeMaps []* func AddStoreVendorMap(db *dao.DaoDB, storeMap *model.StoreMap, userName string) (outStoreMap *model.StoreMap, err error) { store, err := GetPurchaseHandler(storeMap.VendorID).ReadStore(storeMap.VendorStoreID) if err == nil { + dao.WrapAddIDCULEntity(storeMap, userName) storeMap.DeliveryType = store.DeliveryType storeMap.Status = store.Status storeMap.SyncStatus = model.SyncFlagModifiedMask @@ -271,8 +264,8 @@ func UpdateStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, payload map[stri } if err == nil { dummyStoreMap := &model.StoreMap{} - valid := jxutils.NormalMakeMapByStructObject(payload, dummyStoreMap, userName) - if valid["status"] != nil { + valid := dao.NormalMakeMapByStructObject(payload, dummyStoreMap, userName) + if valid["status"] != nil { // 对于store vendor map,只有Status改变才需要同步到厂商 valid[model.FieldSyncStatus] = model.SyncFlagModifiedMask } globals.SugarLogger.Debug(utils.Format4Output(valid, false)) diff --git a/business/jxutils/dtask/dtask.go b/business/jxutils/dtask/dtask.go index 65ff6ef5f..d2d0d663d 100644 --- a/business/jxutils/dtask/dtask.go +++ b/business/jxutils/dtask/dtask.go @@ -96,7 +96,7 @@ func (m *DurableTaskMan) AddItem(taskID, objHint string, funcName string, params if item.Params, err = SerializeData(params); err == nil { db := dao.GetDB() if err = dao.CreateEntity(db, item); err == nil { - err = dao.UpdateEntity(db, d.data, "TotalItem") + _, err = dao.UpdateEntity(db, d.data, "TotalItem") d.items = append(d.items, item) } } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 87d34617c..06ed3e52d 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -302,7 +302,6 @@ func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, ex for _, v := range excludedFields { excludedMap[v] = 1 } - m := Struct2FlatMap(obj) valid = make(map[string]interface{}) invalid = make(map[string]interface{}) @@ -316,10 +315,6 @@ func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, ex return valid, invalid } -func NormalFilterMapByStructObject(mapData map[string]interface{}, obj interface{}) (valid map[string]interface{}, invalid map[string]interface{}) { - return FilterMapByStructObject(mapData, obj, []string{"id", "createdAt", "syncStatus", "lastOperator", "updatedAt", "finishedAt"}) -} - func FilterMapByFieldList(mapData map[string]interface{}, fields []string) (valid map[string]interface{}, invalid map[string]interface{}) { valid = make(map[string]interface{}) invalid = make(map[string]interface{}) @@ -336,10 +331,3 @@ func FilterMapByFieldList(mapData map[string]interface{}, fields []string) (vali func GetObjFieldByName(obj interface{}, fieldName string) interface{} { return reflect.Indirect(reflect.ValueOf(obj)).FieldByName(fieldName).Interface() } - -func NormalMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) { - retVal, _ = NormalFilterMapByStructObject(mapData, obj) - retVal["lastOperator"] = userName - retVal["updatedAt"] = time.Now() - return retVal -} diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go index 4a68630b4..347017a87 100644 --- a/business/model/dao/dao.go +++ b/business/model/dao/dao.go @@ -56,6 +56,18 @@ func GetDB() *DaoDB { return &DaoDB{db: orm.NewOrm()} } +func Begin(db *DaoDB) error { + return db.db.Begin() +} + +func Commit(db *DaoDB) error { + return db.db.Commit() +} + +func Rollback(db *DaoDB) error { + return db.db.Rollback() +} + func GetRow(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) { if db == nil { db = GetDB() @@ -154,7 +166,7 @@ func DeleteEntity(db *DaoDB, item interface{}, conditions map[string]interface{} err = utils.CallFuncLogError(func() error { qs := db.db.QueryTable(item) if len(conditions) == 0 { - qs = qs.Filter("ID", jxutils.GetObjFieldByName(item, model.FieldID)) + qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID)) } else { for k, v := range conditions { qs = qs.Filter(k, v) diff --git a/business/model/dao/dao_utils.go b/business/model/dao/dao_utils.go new file mode 100644 index 000000000..c50ac16f0 --- /dev/null +++ b/business/model/dao/dao_utils.go @@ -0,0 +1,80 @@ +package dao + +import ( + "reflect" + "time" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" +) + +func NormalFilterMapByStructObject(mapData map[string]interface{}, obj interface{}) (valid map[string]interface{}, invalid map[string]interface{}) { + return jxutils.FilterMapByStructObject(mapData, obj, []string{"id", "createdAt", "syncStatus", "lastOperator", "updatedAt", "finishedAt"}) +} + +func NormalMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) { + retVal, _ = NormalFilterMapByStructObject(mapData, obj) + retVal["lastOperator"] = userName + retVal["updatedAt"] = time.Now() + return retVal +} + +func NormalMakeMapByFieldList(mapData map[string]interface{}, fields []string, userName string) (retVal map[string]interface{}) { + retVal, _ = jxutils.FilterMapByFieldList(mapData, fields) + retVal["lastOperator"] = userName + retVal["updatedAt"] = time.Now() + return retVal +} + +func checkAndGetStructValue(item interface{}) *reflect.Value { + value := reflect.ValueOf(item) + if value.Kind() == reflect.Ptr { + value = value.Elem() + } else { + panic("item ust be ptr type") + } + return &value +} + +func WrapAddIDCULEntity(item interface{}, lastOperator string) interface{} { + now := time.Now() + if mapData, ok := item.(map[string]interface{}); ok { + mapData[model.FieldID] = 0 + mapData[model.FieldCreatedAt] = now + mapData[model.FieldUpdatedAt] = now + mapData[model.FieldLastOperator] = lastOperator + } else { + value := checkAndGetStructValue(item) + nowValue := reflect.ValueOf(now) + value.FieldByName(model.FieldID).SetInt(0) + value.FieldByName(model.FieldCreatedAt).Set(nowValue) + value.FieldByName(model.FieldUpdatedAt).Set(nowValue) + value.FieldByName(model.FieldLastOperator).SetString(lastOperator) + } + return item +} + +func WrapAddIDCULDEntity(item interface{}, lastOperator string) interface{} { + if mapData, ok := item.(map[string]interface{}); ok { + mapData[model.FieldDeletedAt] = utils.DefaultTimeValue + } else { + value := checkAndGetStructValue(item) + value.FieldByName(model.FieldDeletedAt).Set(reflect.ValueOf(utils.DefaultTimeValue)) + } + return WrapAddIDCULEntity(item, lastOperator) +} + +func WrapUpdateULEntity(item interface{}, lastOperator string) interface{} { + now := time.Now() + if mapData, ok := item.(map[string]interface{}); ok { + mapData[model.FieldUpdatedAt] = now + mapData[model.FieldLastOperator] = lastOperator + } else { + value := checkAndGetStructValue(item) + nowValue := reflect.ValueOf(now) + value.FieldByName(model.FieldUpdatedAt).Set(nowValue) + value.FieldByName(model.FieldLastOperator).SetString(lastOperator) + } + return item +} diff --git a/business/partner/purchase/jd/store_test.go b/business/partner/purchase/jd/store_test.go index dc57ff6b7..8ecf61d4c 100644 --- a/business/partner/purchase/jd/store_test.go +++ b/business/partner/purchase/jd/store_test.go @@ -17,20 +17,6 @@ func TestReadStore(t *testing.T) { t.Log(result) } -func TestCloseStore(t *testing.T) { - err := new(PurchaseHandler).CloseStore(TestStoreNo, "我就是想休息一下", "test") - if err != nil { - t.Fatal(err.Error()) - } -} - -func TestOpenStore(t *testing.T) { - err := new(PurchaseHandler).OpenStore(TestStoreNo, "test") - if err != nil { - t.Fatal(err.Error()) - } -} - func TestUpdateStore(t *testing.T) { handler := new(PurchaseHandler) result, err := handler.ReadStore(TestStoreNo)