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" "git.rosy.net.cn/jx-callback/globals" ) // 这里面的函数要求实体是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) } } globals.SugarLogger.Debugf("UpdateEntityByKV befor item:%s, kvs:%s, conditions:%s", utils.Format4Output(item, false), utils.Format4Output(kvs, false), utils.Format4Output(conditions, false)) num, err = qs.Update(kvs) globals.SugarLogger.Debugf("UpdateEntityByKV after update, num:%d", num) 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) { if conditions != nil { conditions = utils.MergeMaps(conditions, map[string]interface{}{ model.FieldDeletedAt: utils.DefaultTimeValue, }) } return UpdateEntityByKV(db, item, utils.MergeMaps(kvs, map[string]interface{}{ model.FieldUpdatedAt: time.Now(), model.FieldLastOperator: userName, }), conditions) } 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) }