package dao import ( "reflect" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals/gormdb" "github.com/jinzhu/gorm" ) func GetRows(db *gorm.DB, inPtr interface{}, sql string, values ...interface{}) (err error) { if db == nil { db = gormdb.GetDB() } topTypeInfo := reflect.TypeOf(inPtr) if topTypeInfo.Kind() != reflect.Ptr { panic("SelectEntities inPtr should be slice ptr (*[]Type)") } typeInfo := topTypeInfo.Elem() if typeInfo.Kind() != reflect.Slice { panic("SelectEntities inPtr should be slice ptr (*[]Type)") } elmType := typeInfo.Elem() valueInfo := reflect.ValueOf(inPtr) rows, err := db.Raw(sql, values...).Rows() if err == nil { defer rows.Close() for rows.Next() { var value reflect.Value if elmType.Kind() == reflect.Ptr { value = reflect.New(elmType.Elem()) } else { value = reflect.New(elmType) } db.ScanRows(rows, value.Interface()) if elmType.Kind() != reflect.Ptr { value = value.Elem() } valueInfo.Elem().Set(reflect.Append(valueInfo.Elem(), value)) } return nil } return err } func GetEntity(db *gorm.DB, item interface{}) error { if db == nil { db = gormdb.GetDB() } err := utils.CallFuncLogError(func() error { return db.First(item).Error }, reflect.TypeOf(item).Name()) return err } func UpdateEntity(db *gorm.DB, item interface{}, values map[string]interface{}) error { if db == nil { db = gormdb.GetDB() } err := utils.CallFuncLogError(func() error { return db.Model(item).Updates(values).Error }, reflect.TypeOf(item).Name()) return err } func CreateEntity(db *gorm.DB, item interface{}) error { if db == nil { db = gormdb.GetDB() } err := utils.CallFuncLogError(func() error { return db.Create(item).Error }, reflect.TypeOf(item).Name()) return err } func GetSellCities(skuNameID int, vendorID int, db *gorm.DB) (cities []*model.Place, err error) { cities = []*model.Place{} sql := ` SELECT DISTINCT t3.* FROM sku_name_place_bind t1 JOIN place t2 ON t1.place_code = t2.code JOIN place t3 ON (t2.level = 2 AND t2.code = t3.code) OR (t2.level = 1 AND t2.code = t3.parent_code) WHERE t1.sku_name_id = ? ` if vendorID == model.VendorIDJD { sql += "AND t3.jd_code <> 0\n" } return cities, GetRows(nil, &cities, sql, skuNameID) } func GetPlaceByCode(db *gorm.DB, code int) (place *model.Place, err error) { if db == nil { db = gormdb.GetDB() } place = new(model.Place) err = db.Where("code = ?", code).First(place).Error return place, err } func GetPlaceByName(db *gorm.DB, name string, level int, parentCode int) (place *model.Place, err error) { if db == nil { db = gormdb.GetDB() } place = new(model.Place) if err = db.Where("parent_code = ? AND level = ? AND name = ?", parentCode, level, name).First(place).Error; err == gorm.ErrRecordNotFound { err = db.Where("parent_code = ? AND level = ? AND name LIKE ?", parentCode, level, "%"+name+"%").First(place).Error } return place, err } func GetPlaceByJdCode(db *gorm.DB, jdCode int) (place *model.Place, err error) { if db == nil { db = gormdb.GetDB() } place = new(model.Place) err = db.Where("jd_code = ?", jdCode).First(place).Error return place, err }