package service import ( "errors" "fmt" "log" "sfbase/global" "sfbase/redis" "sfbase/utils" "sfis/db" "sfis/lock" "sfis/model" utils2 "sfis/utils" "strconv" "strings" "sync" "time" "github.com/gin-gonic/gin" "go.uber.org/zap" "gorm.io/gorm" ) func CreateUserProduct(appId string, productArr []map[string]interface{}) (status int, haveProductId string, errArr []error) { //取出用户锁 lock.MainLock.Lock() userLock := lock.UserLockMap[appId] lock.MainLock.Unlock() userLock.Lock() defer userLock.Unlock() var errs error haveProductId = "" //已经购买过的产品id //var errArr = make([]error, 0) for _, val := range productArr { productId := utils.IntAll(val["productId"]) costModel := utils.IntAll(val["costModel"]) userProduct := &model.UserProductModel{} userProduct.AppID = appId userProduct.CostModel = costModel userProduct.LeftNum = 0 userProduct.InterfaceStatus = utils.IntAll(val["interfaceStatus"]) userProduct.CallTimesLimitDay = utils.IntAll(val["callTimesLimitDay"]) userProduct.DataNumLimitOneTimes = utils.IntAll(val["dataNumOneTimes"]) userProduct.Discount = utils.IntAll(val["discount"]) userProduct.ProductID = productId //查询产品是否购买过 userProductInfo := model.UserProduct{} err := db.GetSFISDB().Where("product_id = ? and app_id = ?", productId, appId).Find(&userProductInfo).Error if err != nil { errArr = append(errArr, err) global.Logger.Error("CreateUserProduct查询user_product表出错:", zap.Any("err:", err)) return 0, haveProductId, errArr } //用户第一次购买产品 if userProductInfo.ID == 0 { err := db.GetSFISDB().Create(userProduct).Error if err != nil { errArr = append(errArr, errs) global.Logger.Info("用户购买产品失败:", zap.Any("appId:", appId), zap.Any("productId:", productId)) continue } } else { haveProductId += "[" + strconv.Itoa(productId) + "]" global.Logger.Info("用户已购买过该产品", zap.Any("appId:", appId), zap.Any("productId:", productId)) continue } } return 1, haveProductId, errArr } func UserProductList(appId string, c *gin.Context) (results []map[string]interface{}, err error) { err = db.GetSFISDB().Table("user_product").Select("user_product.app_id,user_product.discount,user_product.product_id,user_product.create_at,user_product.start_at,user_product.end_at,user_product.left_num,user_product.cost_model,user_product.interface_status,user_product.call_times_limit_day,user_product.data_num_limit_one_times,product.name").Joins("left join product on product.id = user_product.product_id").Where("app_id = ? ", appId).Scan(&results).Error if err != nil { log.Printf("appID:[%s] find into user_product error:[%v]", appId, err) } for _, v := range results { appId := utils.ObjToString(v["app_id"]) productId := utils.IntAll(v["product_id"]) limittodaykey := fmt.Sprintf("limittoday_%d_%d_%s", time.Now().Day(), productId, appId) limittoday := redis.GetInt("limit", limittodaykey) v["limittoday"] = limittoday } return results, err } //创建用户 func CreateUser(user model.User) (model.User, error) { var tempUser []model.User // 判断用户名是否重复 db.GetSFISDB().Where("name = ?", user.Name).Find(&tempUser) if len(tempUser) > 0 { global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", "用户名已存在")) return user, errors.New("用户名已存在") } // 判断手机号是否重复 var tempUser_ []model.User db.GetSFISDB().Where("phone = ?", user.Phone).Find(&tempUser_) if len(tempUser_) > 0 { global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", "手机号已存在")) return user, errors.New("手机号已存在") } errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error { // 新增用户 err := tx.Create(&user).Error if err != nil { global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", err)) tx.Rollback() return err } // 初始化用户账户 userAccount := model.UserAccount{AppID: user.AppID, Money: 0} err = tx.Create(&userAccount).Error if err != nil { global.Logger.Error("userAccountInit Error", zap.Any("user", user), zap.Any("userAccount", userAccount), zap.Any("error", err)) tx.Rollback() return err } return nil }) if errs != nil { global.Logger.Error("userCreate Error", zap.Any("user", user), zap.Any("error", errs)) return user, errors.New("创建失败") } else { global.Logger.Info("userCreate Success", zap.Any("user", user)) // 生全局内存锁 lock.MainLock.Lock() utils2.UserCaches.Map.Store(user.AppID, &user) lock.UserLockMap[user.AppID] = &sync.Mutex{} lock.MainLock.Unlock() return user, nil } } // 查询用户 func ListUser(condMap map[string]interface{}, page int, limit int) ([]map[string]interface{}, int64, error) { // 拼查询sql var key []string var param []interface{} for k, v := range condMap { if v == "" { continue } var kStr string kStr = fmt.Sprintf("%s like ?", k) v = "%" + v.(string) + "%" key = append(key, kStr) param = append(param, v) } whereSql := strings.Join(key, " and ") var totalCount int64 var userInfo []map[string]interface{} err := db.GetSFISDB().Table("user").Where(whereSql, param...).Where("delete_at is null").Count(&totalCount).Error if err != nil { return nil, 0, errors.New("查询失败") } if totalCount == 0 { return userInfo, 0, nil } if whereSql != "" { whereSql = " and " + whereSql } sql := "select user.app_id,user.name,user.phone,user.secret_key,user.ip_white_list,user.create_at,money from user LEFT JOIN user_account on user.app_id=user_account.app_id where user.delete_at is Null " + whereSql if limit != 0 && page > 0 { sql += fmt.Sprintf(" limit %d ,%d", (page-1)*limit, limit) } result := db.GetSFISDB().Raw(sql, param...).Scan(&userInfo) if result.Error != nil { return nil, 0, errors.New("查询失败") } return userInfo, totalCount, nil }