123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- 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
- }
|