From 9d88344ddb8e622937a2625c4333b76199773cab Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 20 Sep 2018 10:07:58 +0800 Subject: [PATCH] - Store and StoreMap add DeletedAt. --- business/jxstore/cms/cms.go | 2 +- business/jxstore/cms/sku.go | 42 ++++++------ business/jxstore/cms/store.go | 91 ++++++++++++++----------- business/jxstore/cms/store_sku.go | 4 +- business/jxstore/cms/sync.go | 14 ++-- business/jxutils/dtask/dtask.go | 4 +- business/model/dao/dao.go | 73 -------------------- business/model/dao/dao_bz.go | 71 +++++++++++++++++++ business/model/dao/dao_test.go | 19 ++++-- business/model/dao/dao_utils.go | 12 ++-- business/model/store.go | 26 ++++--- business/partner/purchase/ebai/store.go | 4 +- business/partner/purchase/jd/store.go | 14 +++- globals/beegodb/beegodb.go | 2 +- 14 files changed, 206 insertions(+), 172 deletions(-) create mode 100644 business/model/dao/dao_bz.go diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 8cb00f887..82b633361 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -111,7 +111,7 @@ func UpdatePlaces(places []map[string]interface{}, userName string) (num int64, } placeid := &model.Place{} valid := dao.NormalMakeMapByFieldList(place, []string{"jdCode", "enabled", "mtpsPrice"}, userName) - if num, err = dao.UpdateEntityByKV(nil, placeid, valid, utils.Params2Map("Code", place["code"])); err != nil { + if num, err = dao.UpdateEntityLogically(nil, placeid, valid, userName, utils.Params2Map("Code", place["code"])); err != nil { return num, err } } diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 6f172de83..e556f951a 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -4,7 +4,6 @@ import ( "errors" "strconv" "strings" - "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" @@ -29,7 +28,7 @@ func GetVendorCategories(vendorID int, parentID string) (vendorCats []*model.Sku if parentID != "-1" { cond[model.FieldParentID] = parentID } - return vendorCats, dao.GetEntities(nil, &vendorCats, cond, false) + return vendorCats, dao.GetEntitiesByKV(nil, &vendorCats, cond, false) } // parentID 为-1表示所有 @@ -62,7 +61,7 @@ func UpdateCategory(categoryID int, payload map[string]interface{}, userName str if len(valid) > 0 { valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask db := dao.GetDB() - if num, err = dao.UpdateEntityByKV(db, cat, valid, nil); err == nil { + if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err == nil { err = CurVendorSync.SyncCategory(db, categoryID, false, userName) } } @@ -80,7 +79,7 @@ func ReorderCategories(parentID int, categoryIDs []int, userName string) (err er parentCat = nil } if err == nil { - if err = dao.GetEntities(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil { + if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil { catsLen := len(cats) if catsLen != len(categoryIDs) { return ErrInputCatsDoesntMatch @@ -132,7 +131,7 @@ func DeleteCategory(categoryID int, isForce bool, userName string) (num int64, e } else if countInfos[2].Ct != 0 { return 0, errors.New("还有商品类别使用此类别,不能删除") } - if num, err = dao.DeleteEntityLogically(db, cat, nil, userName, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask)); err == nil && num == 1 { + if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err == nil && num == 1 { err = CurVendorSync.SyncCategory(db, cat.ID, false, userName) } } @@ -348,7 +347,7 @@ func AddSkuName(skuNameExt *model.SkuNameExt, userName string) (outSkuNameExt *m return nil, err } if tmpInfo.TotalCount != 1 { - // return nil, ErrEntityNotExist + return nil, ErrEntityNotExist } outSkuNameExt = tmpInfo.SkuNames[0] err = CurVendorSync.SyncSku(db, outSkuNameExt.SkuName.ID, -1, false, userName) @@ -369,7 +368,7 @@ func UpdateSkuName(nameID int, payload map[string]interface{}, userName string) panic(r) } }() - if num, err = dao.UpdateEntityByKV(db, skuName, valid, nil); err == nil && num == 1 { + if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err == nil && num == 1 { if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil { if places, ok := payload["places"].([]interface{}); ok { if _, err = dao.ExecuteSQL(db, "DELETE FROM sku_name_place_bind WHERE name_id = ?", nameID); err == nil { @@ -390,12 +389,14 @@ func UpdateSkuName(nameID int, payload map[string]interface{}, userName string) } if err == nil { sku := &model.Sku{} - _, err2 := dao.UpdateEntityByKV(db, sku, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagModifiedMask), utils.Params2Map(model.FieldNameID, skuName.ID)) + _, err2 := dao.UpdateEntityLogically(db, sku, map[string]interface{}{ + model.FieldJdSyncStatus: model.SyncFlagModifiedMask, + }, userName, map[string]interface{}{ + model.FieldNameID: nameID, + }) if err = err2; err == nil { - if err = dao.GetEntity(db, skuName); err == nil { - dao.Commit(db) - err2 = CurVendorSync.SyncSku(db, skuName.ID, -1, false, userName) - } + dao.Commit(db) + err2 = CurVendorSync.SyncSku(db, nameID, -1, false, userName) } } } @@ -421,12 +422,12 @@ func DeleteSkuName(nameID int, userName string) (num int64, err error) { skuName.ID = nameID if num, err = dao.DeleteEntityLogically(db, skuName, nil, userName, nil); err == nil && num == 1 { dummy := &model.Sku{} - num2, err2 := dao.UpdateEntityByKV(db, dummy, map[string]interface{}{ - model.FieldDeletedAt: time.Now(), - model.FieldLastOperator: userName, + num2, err2 := dao.DeleteEntityLogically(db, dummy, map[string]interface{}{ model.FieldJdSyncStatus: model.SyncFlagDeletedMask, - "Status": model.SkuStatusDeleted, - }, utils.Params2Map(model.FieldNameID, skuName.ID)) + model.FieldStatus: model.SkuStatusDeleted, + }, userName, map[string]interface{}{ + model.FieldNameID: nameID, + }) if err2 == nil { dao.Commit(db) if num2 > 0 { @@ -466,7 +467,7 @@ func UpdateSku(skuID int, payload map[string]interface{}, userName string) (num if len(valid) > 0 { valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask db := dao.GetDB() - if num, err = dao.UpdateEntityByKV(db, sku, valid, nil); err == nil { + if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err == nil { if num == 1 { err = CurVendorSync.SyncSku(db, -1, sku.ID, false, userName) } else { @@ -481,7 +482,10 @@ func DeleteSku(skuID int, userName string) (num int64, err error) { db := dao.GetDB() sku := &model.Sku{} sku.ID = skuID - if num, err = dao.DeleteEntityLogically(db, sku, nil, userName, nil); err == nil { + if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ + model.FieldStatus: model.SkuStatusDeleted, + model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + }, userName, nil); err == nil { if num == 1 { err = CurVendorSync.SyncSku(db, -1, sku.ID, false, userName) } else { diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 517373990..f52489a95 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -38,12 +38,12 @@ func GetStores(keyword string, params map[string]interface{}, offset, pageSize i FROM store t1 LEFT JOIN place city ON t1.city_code = city.code AND city.level = 2 LEFT JOIN place district ON t1.district_code = district.code AND district.level = 3 - LEFT JOIN store_map jdm ON t1.id = jdm.store_id AND jdm.vendor_id = 0 - LEFT JOIN store_map elmm ON t1.id = elmm.store_id AND elmm.vendor_id = 2 - LEFT JOIN store_map ebaim ON t1.id = ebaim.store_id AND ebaim.vendor_id = 3 + LEFT JOIN store_map jdm ON t1.id = jdm.store_id AND jdm.vendor_id = 0 AND jdm.deleted_at = '1970-01-01 00:00:00' + LEFT JOIN store_map elmm ON t1.id = elmm.store_id AND elmm.vendor_id = 2 AND elmm.deleted_at = '1970-01-01 00:00:00' + LEFT JOIN store_map ebaim ON t1.id = ebaim.store_id AND ebaim.vendor_id = 3 AND ebaim.deleted_at = '1970-01-01 00:00:00' ` sqlWhere := ` - WHERE + WHERE t1.deleted_at = '1970-01-01 00:00:00' ` sqlParams := make([]interface{}, 0) if keyword != "" { @@ -89,17 +89,7 @@ func GetStores(keyword string, params map[string]interface{}, offset, pageSize i sqlParams = append(sqlParams, "%"+params["tel"].(string)+"%") sqlParams = append(sqlParams, "%"+params["tel"].(string)+"%") } - // if params["cardCond"] != nil { - // cardCond := params["cardCond"].(int) - // if cardCond == -1 || cardCond == 1 { - // sqlFrom += "\nLEFT JOIN bill_info ON t1.store_id = bill_info.jx_store_id\n" - // if cardCond == -1 { - // sqlWhere += " AND bill_info.id IS NULL" - // } else { - // sqlWhere += " AND bill_info.id IS NOT NULL" - // } - // } - // } + if params["fromStatus"] != nil { fromStatus := params["fromStatus"].(int) toStatus := fromStatus @@ -196,21 +186,34 @@ func UpdateStore(storeID int, payload map[string]interface{}, userName string) ( } if len(valid) > 0 { db := dao.GetDB() - if num, err = dao.UpdateEntityByKV(db, store, valid, nil); err == nil && num == 1 { - dummy := &model.StoreMap{} - _, err2 := dao.UpdateEntityByKV(db, dummy, utils.Params2Map(model.FieldSyncStatus, model.SyncFlagModifiedMask), utils.Params2Map(model.FieldStoreID, store.ID)) - if err = err2; err == nil { - if err = dao.GetEntity(db, store); err == nil { - err = CurVendorSync.SyncStore(db, -1, store, false, userName) - } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) } + }() + if num, err = dao.UpdateEntityLogically(db, store, valid, userName, nil); err == nil && num == 1 { + dummy := &model.StoreMap{} + _, err2 := dao.UpdateEntityLogically(db, dummy, map[string]interface{}{ + model.FieldSyncStatus: model.SyncFlagModifiedMask, + }, userName, map[string]interface{}{ + model.FieldStoreID: store.ID, + }) + if err = err2; err == nil { + dao.Commit(db) + err = CurVendorSync.SyncStore(db, -1, store.ID, false, userName) + } + } + if err != nil { + dao.Rollback(db) } } return num, err } func CreateStore(store *model.Store, userName string) (id int, err error) { - dao.WrapAddIDCULEntity(store, userName) + dao.WrapAddIDCULDEntity(store, userName) if err = dao.CreateEntity(nil, store); err == nil { return store.ID, err } @@ -224,14 +227,14 @@ func GetStoreVendorMaps(db *dao.DaoDB, storeID int, vendorID int) (storeMaps []* if vendorID != -1 { cond[model.FieldVendorID] = vendorID } - return storeMaps, dao.GetEntities(db, &storeMaps, cond, false) + return storeMaps, dao.GetEntitiesByKV(db, &storeMaps, cond, false) } func AddStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, storeMap *model.StoreMap, userName string) (outStoreMap *model.StoreMap, err error) { if handler := GetPurchaseHandler(storeMap.VendorID); handler != nil { store, err := handler.ReadStore(storeMap.VendorStoreID) if err == nil { - dao.WrapAddIDCULEntity(storeMap, userName) + dao.WrapAddIDCULDEntity(storeMap, userName) storeMap.StoreID = storeID storeMap.VendorID = vendorID storeMap.DeliveryType = store.DeliveryType @@ -248,12 +251,9 @@ func AddStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, storeMap *model.Sto } }() if err = dao.CreateEntity(db, storeMap); err == nil { - store.ID = storeID - if err = dao.GetEntity(db, store); err == nil { - dao.Commit(db) - outStoreMap = storeMap - err = CurVendorSync.SyncStore(db, storeMap.VendorID, store, true, userName) - } + dao.Commit(db) + outStoreMap = storeMap + err = CurVendorSync.SyncStore(db, storeMap.VendorID, storeID, true, userName) } if err != nil { dao.Rollback(db) @@ -266,11 +266,17 @@ func AddStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, storeMap *model.Sto } func DeleteStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, userName string) (num int64, err error) { - storeMap := &model.StoreMap{ - StoreID: storeID, - VendorID: vendorID, + storeMap := &model.StoreMap{} + if num, err = dao.DeleteEntityLogically(db, storeMap, map[string]interface{}{ + model.FieldSyncStatus: model.SyncFlagDeletedMask, + model.FieldStatus: model.StoreStatusDisabled, + }, userName, map[string]interface{}{ + model.FieldStoreID: storeID, + model.FieldVendorID: vendorID, + }); err == nil && num > 0 { + err = CurVendorSync.SyncStore(db, vendorID, storeID, true, userName) } - return dao.DeleteEntity(db, storeMap, model.FieldStoreID, model.FieldVendorID) + return num, err } func UpdateStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, payload map[string]interface{}, userName string) (num int64, err error) { @@ -294,16 +300,19 @@ func UpdateStoreVendorMap(db *dao.DaoDB, storeID, vendorID int, payload map[stri if valid["status"] != nil { // 对于store vendor map,只有Status改变才需要同步到厂商 valid[model.FieldSyncStatus] = model.SyncFlagModifiedMask } - if num, err = dao.UpdateEntityByKV(db, dummyStoreMap, valid, utils.Params2Map(model.FieldStoreID, storeID, model.FieldVendorID, vendorID)); err == nil { + if num, err = dao.UpdateEntityLogically(db, dummyStoreMap, valid, userName, map[string]interface{}{ + model.FieldStoreID: storeID, + model.FieldVendorID: vendorID, + }); err == nil && num > 0 { if valid["status"] != nil { - store := &model.Store{} - store.ID = storeID - if err = dao.GetEntity(db, store); err == nil { - err = CurVendorSync.SyncStore(db, vendorID, store, false, userName) - } + err = CurVendorSync.SyncStore(db, vendorID, storeID, false, userName) } } } } return num, err } + +func DeleteStore(db *dao.DaoDB, storeID int, userName string) (num int64, err error) { + return 0, err +} diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 68132dbf1..88b37cd0f 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -296,12 +296,12 @@ func UpdateStoreSku(storeID int, skuBindInfo *StoreSkuBindInfo, userName string) if ok { if v.IsFocus == -1 { delNum++ - _, err = dao.DeleteEntityLogically(db, skuBind, nil, userName, map[string]interface{}{ + _, err = dao.DeleteEntityLogically(db, skuBind, map[string]interface{}{ model.FieldStatus: model.StoreSkuBindStatusDeleted, model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldElmSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, - }) + }, userName, nil) } else { // todo 如果修改ebai与elm ID怎么处理呢? if v.IsFocus == 1 { diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index e5e15d0ec..f26d585ae 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -3,7 +3,6 @@ package cms import ( "errors" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" @@ -54,7 +53,7 @@ func (v *VendorSync) SyncCategory(db *dao.DaoDB, categoryID int, isForce bool, u if categoryID > 0 { cond[model.FieldID] = categoryID } - if err = dao.GetEntities(db, &cats, cond, true); err == nil { + if err = dao.GetEntitiesByKV(db, &cats, cond, true); err == nil { tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { cat := batchItemList[0].(*model.SkuCategory) if (cat.JdSyncStatus & model.SyncFlagDeletedMask) != 0 { //删除 @@ -76,17 +75,16 @@ func (v *VendorSync) SyncCategory(db *dao.DaoDB, categoryID int, isForce bool, u return err } -func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID int, store *model.Store, isForce bool, userName string) (err error) { - globals.SugarLogger.Debugf("SyncStore, store:%s", utils.Format4Output(store, true)) +func (v *VendorSync) SyncStore(db *dao.DaoDB, vendorID, storeID int, isForce bool, userName string) (err error) { + globals.SugarLogger.Debugf("SyncStore, storeID:%d", storeID) if db == nil { db = dao.GetDB() } - err = v.LoopStoreMap(db, store.ID, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { + err = v.LoopStoreMap(db, storeID, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { storeMap := batchItemList[0].(*model.StoreMap) - globals.SugarLogger.Debugf("SyncStore, storeMap:%s", utils.Format4Output(store, true)) if (vendorID == -1 || vendorID == storeMap.VendorID) && (isForce || storeMap.SyncStatus != 0) { if handler := GetPurchaseHandler(storeMap.VendorID); handler != nil { - if err = handler.UpdateStore(store.ID, userName); err == nil { + if err = handler.UpdateStore(storeID, userName); err == nil { storeMap.SyncStatus = 0 _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) } @@ -116,7 +114,7 @@ func (v *VendorSync) SyncSku(db *dao.DaoDB, nameID, skuID int, isForce bool, use if skuID != -1 { cond[model.FieldID] = skuID } - if err = dao.GetEntities(db, &skuList, cond, true); err == nil { + if err = dao.GetEntitiesByKV(db, &skuList, cond, true); err == nil { tasksch.RunTask("", func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { sku := batchItemList[0].(*model.Sku) if (skuID == -1 || skuID == sku.ID) && (isForce || sku.JdSyncStatus != 0) { diff --git a/business/jxutils/dtask/dtask.go b/business/jxutils/dtask/dtask.go index 228c2f4b6..608a35b69 100644 --- a/business/jxutils/dtask/dtask.go +++ b/business/jxutils/dtask/dtask.go @@ -48,13 +48,13 @@ func Init(objCreator func(objHint string) interface{}, interfaceTypes ...interfa func (m *DurableTaskMan) LoadPendingTask() (err error) { db := dao.GetDB() tasks := make([]*model.DurableTask, 0) - if err = dao.GetEntities(db, &tasks, utils.Params2Map(model.FieldStatus, 0), true); err == nil { + if err = dao.GetEntitiesByKV(db, &tasks, utils.Params2Map(model.FieldStatus, 0), true); err == nil { for _, task := range tasks { dTask := &DurableTask{ data: task, } m.tasks[task.TaskID] = dTask - return dao.GetEntities(db, &dTask.items, utils.Params2Map(model.FieldStatus, 0), true) + return dao.GetEntitiesByKV(db, &dTask.items, utils.Params2Map(model.FieldStatus, 0), true) } } return err diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go index 0fdd7768d..e5b15d224 100644 --- a/business/model/dao/dao.go +++ b/business/model/dao/dao.go @@ -3,11 +3,8 @@ package dao import ( "errors" "reflect" - "time" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/jxutils" - "git.rosy.net.cn/jx-callback/business/model" "github.com/astaxie/beego/orm" ) @@ -54,7 +51,6 @@ type DaoDB struct { // } // return err // } - // beego orm的对于传代表字段的字串,数据库字段名(完全匹配,区分大小写),结构体字段名(不区分大小写)都可以 func GetDB() *DaoDB { @@ -115,31 +111,6 @@ func GetEntity(db *DaoDB, item interface{}, cols ...string) (err error) { return err } -func GetEntities(db *DaoDB, item interface{}, conditions map[string]interface{}, isIncludeDeleted bool) (err error) { - if db == nil { - db = GetDB() - } - err = utils.CallFuncLogError(func() error { - typeInfo := reflect.TypeOf(item).Elem().Elem() - if typeInfo.Kind() == reflect.Ptr { - typeInfo = typeInfo.Elem() - } - qs := db.db.QueryTable(reflect.New(typeInfo).Interface()) - for k, v := range conditions { - qs = qs.Filter(k, v) - } - qs = qs.Limit(-1) - if !isIncludeDeleted { - if _, ok := typeInfo.FieldByName(model.FieldDeletedAt); ok { - qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue) - } - } - _, err = qs.All(item) - return err - }, reflect.TypeOf(item).Name()) - return err -} - func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err error) { if db == nil { db = GetDB() @@ -151,25 +122,6 @@ func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err e return num, err } -func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, conditions map[string]interface{}) (num int64, err error) { - if db == nil { - db = GetDB() - } - err = utils.CallFuncLogError(func() error { - qs := db.db.QueryTable(item) - if conditions == nil { - qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID)) - } else { - for k, v := range conditions { - qs = qs.Filter(k, v) - } - } - num, err = qs.Update(kvs) - return err - }, reflect.TypeOf(item).Name()) - return num, err -} - func CreateEntity(db *DaoDB, item interface{}) (err error) { if db == nil { db = GetDB() @@ -192,31 +144,6 @@ func DeleteEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err e return num, err } -func DeleteEntityLogically(db *DaoDB, item interface{}, conditions map[string]interface{}, logicDeletedBy string, kvs map[string]interface{}) (num int64, err error) { - if db == nil { - db = GetDB() - } - err = utils.CallFuncLogError(func() error { - qs := db.db.QueryTable(item) - if len(conditions) == 0 { - qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID)) - } else { - for k, v := range conditions { - qs = qs.Filter(k, v) - } - } - qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue) - updateValues := map[string]interface{}{ - model.FieldDeletedAt: time.Now(), - model.FieldUpdatedAt: time.Now(), - model.FieldLastOperator: logicDeletedBy, - } - num, err = qs.Update(utils.MergeMaps(updateValues, kvs)) - return err - }, reflect.TypeOf(item).Name()) - return num, err -} - func ExecuteSQL(db *DaoDB, sql string, params ...interface{}) (num int64, err error) { if db == nil { db = GetDB() diff --git a/business/model/dao/dao_bz.go b/business/model/dao/dao_bz.go new file mode 100644 index 000000000..a49f1f2e7 --- /dev/null +++ b/business/model/dao/dao_bz.go @@ -0,0 +1,71 @@ +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" +) + +// 这里面的函数要求实体是IDCUDL的,即含有ID, UpdatedAt, LastOperator, DeletedAt字段 + +func GetEntitiesByKV(db *DaoDB, item interface{}, conditions map[string]interface{}, isIncludeDeleted bool) (err error) { + if db == nil { + db = GetDB() + } + err = utils.CallFuncLogError(func() error { + typeInfo := reflect.TypeOf(item).Elem().Elem() + if typeInfo.Kind() == reflect.Ptr { + typeInfo = typeInfo.Elem() + } + qs := db.db.QueryTable(reflect.New(typeInfo).Interface()) + for k, v := range conditions { + qs = qs.Filter(k, v) + } + qs = qs.Limit(-1) + if !isIncludeDeleted { + if _, ok := typeInfo.FieldByName(model.FieldDeletedAt); ok { + qs = qs.Filter(model.FieldDeletedAt, utils.DefaultTimeValue) + } + } + _, err = qs.All(item) + return err + }, reflect.TypeOf(item).Name()) + return err +} + +func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, conditions map[string]interface{}) (num int64, err error) { + if db == nil { + db = GetDB() + } + err = utils.CallFuncLogError(func() error { + qs := db.db.QueryTable(item) + if conditions == nil { + qs = qs.Filter(model.FieldID, jxutils.GetObjFieldByName(item, model.FieldID)) + } else { + for k, v := range conditions { + qs = qs.Filter(k, v) + } + } + num, err = qs.Update(kvs) + return err + }, reflect.TypeOf(item).Name()) + return num, err +} + +func UpdateEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) { + return UpdateEntityByKV(db, item, utils.MergeMaps(kvs, map[string]interface{}{ + model.FieldUpdatedAt: time.Now(), + model.FieldLastOperator: userName, + }), utils.MergeMaps(conditions, map[string]interface{}{ + model.FieldDeletedAt: utils.DefaultTimeValue, + })) +} + +func DeleteEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) { + return UpdateEntityLogically(db, item, utils.MergeMaps(kvs, map[string]interface{}{ + model.FieldDeletedAt: time.Now(), + }), userName, conditions) +} diff --git a/business/model/dao/dao_test.go b/business/model/dao/dao_test.go index b755af17b..eb4f141a7 100644 --- a/business/model/dao/dao_test.go +++ b/business/model/dao/dao_test.go @@ -44,17 +44,26 @@ func TestGetPlaceByName(t *testing.T) { func TestUpdateKV(t *testing.T) { dummy := &model.Store{} kvs := map[string]interface{}{ - "status": 100, - "Tel1": "tel1", - "tEl2": "tel2", - "deliverY_Range_type": 15, + "status": 100, + "Tel1": "tel1", + "tEl2": "tel2", + "deliveryRangeType": 15, } cond := map[string]interface{}{ "id": 100002, } - num, err := UpdateEntityByKV(nil, dummy, kvs, cond) + num, err := UpdateEntityLogically(nil, dummy, kvs, "autotest", cond) if err != nil { t.Fatal(err) } t.Log(num) } + +func TestWrapAddIDCULEntity(t *testing.T) { + dummy := &model.Store{} + WrapAddIDCULEntity(dummy, "autotest") + if dummy.LastOperator != "autotest" { + t.Fatal("last operator is not same") + } + t.Log(dummy) +} diff --git a/business/model/dao/dao_utils.go b/business/model/dao/dao_utils.go index 19916bf31..26bd8a9e5 100644 --- a/business/model/dao/dao_utils.go +++ b/business/model/dao/dao_utils.go @@ -16,17 +16,17 @@ func NormalFilterMapByStructObject(mapData map[string]interface{}, obj interface func NormalMakeMapByStructObject(mapData map[string]interface{}, obj interface{}, userName string) (retVal map[string]interface{}) { retVal, _ = NormalFilterMapByStructObject(mapData, obj) - if len(retVal) > 0 { - WrapUpdateULEntity(retVal, userName) - } + // if len(retVal) > 0 { + // WrapUpdateULEntity(retVal, userName) + // } return retVal } func NormalMakeMapByFieldList(mapData map[string]interface{}, fields []string, userName string) (retVal map[string]interface{}) { retVal, _ = jxutils.FilterMapByFieldList(mapData, fields) - if len(retVal) > 0 { - WrapUpdateULEntity(retVal, userName) - } + // if len(retVal) > 0 { + // WrapUpdateULEntity(retVal, userName) + // } return retVal } diff --git a/business/model/store.go b/business/model/store.go index 355d1222d..aacf19d16 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -112,9 +112,9 @@ func init() { } type Store struct { - ModelIDCUL + ModelIDCULD - Name string `orm:"size(255);unique" json:"name"` + Name string `orm:"size(255)" json:"name"` CityCode int `orm:"default(0);null" json:"cityCode"` // todo ? DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ? Address string `orm:"size(255)" json:"address"` @@ -133,8 +133,14 @@ type Store struct { DeliveryType int8 `orm:"-" json:"-"` } +func (*Store) TableUnique() [][]string { + return [][]string{ + []string{"Name", "DeletedAt"}, + } +} + type StoreSub struct { - ModelIDCUL + ModelIDCULD StoreID int `orm:"column(store_id)"` Index int // 子店序号,为0表示主店 @@ -148,12 +154,12 @@ type StoreSub struct { func (*StoreSub) TableUnique() [][]string { return [][]string{ - []string{"StoreID", "Index"}, + []string{"StoreID", "Index", "DeletedAt"}, } } type StoreMap struct { - ModelIDCUL + ModelIDCULD StoreID int `orm:"column(store_id)" json:"storeID"` VendorID int `orm:"column(vendor_id)" json:"vendorID"` @@ -170,13 +176,13 @@ type StoreMap struct { func (*StoreMap) TableUnique() [][]string { return [][]string{ - []string{"StoreID", "VendorID"}, - []string{"VendorStoreID", "VendorID"}, + []string{"StoreID", "VendorID", "DeletedAt"}, + []string{"VendorStoreID", "VendorID", "DeletedAt"}, } } type StoreCourierMap struct { - ModelIDCUL + ModelIDCULD StoreID int `orm:"column(store_id)"` VendorID int `orm:"column(vendor_id)"` @@ -186,7 +192,7 @@ type StoreCourierMap struct { func (*StoreCourierMap) TableUnique() [][]string { return [][]string{ - []string{"StoreID", "VendorID"}, - []string{"VendorStoreID", "VendorID"}, + []string{"StoreID", "VendorID", "DeletedAt"}, + []string{"VendorStoreID", "VendorID", "DeletedAt"}, } } diff --git a/business/partner/purchase/ebai/store.go b/business/partner/purchase/ebai/store.go index 71a64a091..2fc072972 100644 --- a/business/partner/purchase/ebai/store.go +++ b/business/partner/purchase/ebai/store.go @@ -109,7 +109,9 @@ func (p *PurchaseHandler) UpdateStore(storeID int, userName string) (err error) } // globals.SugarLogger.Debug(utils.Format4Output(params, false)) if globals.EnableStoreWrite { - err = api.EbaiAPI.ShopUpdate(params) + if err = api.EbaiAPI.ShopUpdate(params); err == nil { + // todo 设置 shop_id + } } } return err diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index eaa20febb..d34ceb6d1 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -26,6 +26,7 @@ type tJdStoreInfo struct { JdStoreStatus int VendorStoreID string `orm:"column(vendor_store_id)"` RealLastOperator string + SyncStatus int } func (p *PurchaseHandler) ReadStore(vendorStoreID string) (*model.Store, error) { @@ -82,15 +83,22 @@ func (p *PurchaseHandler) UpdateStore(storeID int, userName string) (err error) var store tJdStoreInfo sql := ` SELECT t1.*, city.jd_code jd_city_code, district.jd_code jd_district_code, t2.status jd_store_status, t2.vendor_store_id, - IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator + IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator, t2.sync_status FROM store t1 JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? LEFT JOIN place city ON t1.city_code = city.code LEFT JOIN place district ON t1.district_code = district.code - WHERE t1.id = ?` + WHERE t1.id = ? + ORDER BY t2.updated_at DESC + LIMIT 1; + ` if err = dao.GetRow(db, &store, sql, model.VendorIDJD, storeID); err == nil { + outSystemID := "" + if store.SyncStatus&model.SyncFlagDeletedMask == 0 { + outSystemID = utils.Int2Str(int(store.ID)) + } params := map[string]interface{}{ - "outSystemId": utils.Int2Str(int(store.ID)), // todo 直接修改这个字段可能会有问题 + "outSystemId": outSystemID, // todo 直接修改这个字段可能会有问题 "stationName": jxutils.ComposeStoreName(store.Name, partner.StoreNameSeparator, VendorStorePrefix), "stationAddress": store.Address, "serviceTimeStart1": JxOperationTime2JdOperationTime(store.OpenTime1), diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 0c49c1c25..add629c86 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -30,7 +30,7 @@ func Init() { if globals.EnableStore { orm.RegisterModel(&model.Place{}) - orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}) + orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{}) orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{}) // db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(&model.SkuCategory{}) orm.RegisterModel(&model.SkuCategory{})