package service import ( "github.com/gin-gonic/gin" "gorm.io/gorm" "log" "sfis/db" "sfis/lock" "sfis/model" "sfis/utils" "time" ) func MoneyRecharge(appid string, money int, remark string, discount int) error { //取出用户锁 lock.MainLock.Lock() userLock := lock.UserLockMap[appid] lock.MainLock.Unlock() userLock.Lock() defer userLock.Unlock() //查用户当前余额 userAccount := &model.UserAccount{} db.GetSFISDB().First(userAccount, &model.UserAccount{AppID: appid}) // 更新时间 nowStr := time.Now().Local().Format("2006-01-02 15:04:05") errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error { moneyBefore := userAccount.Money moneyAfter := userAccount.Money + money var err error //修改折扣discount if discount != 0 { err = tx.Exec("update user_product set discount = ? WHERE `app_id` = ?", discount, appid).Error if err != nil { log.Printf("appID:[%s],money:[%d] execute cost user_account error:[%v]", appid, moneyAfter, err) tx.Rollback() return err } } //充值 err = tx.Exec("update user_account set money = ?,update_at = ? WHERE `app_id` = ?", moneyAfter, nowStr, appid).Error if err != nil { log.Printf("appID:[%s],money:[%d] execute cost user_account error:[%v]", appid, moneyAfter, err) tx.Rollback() return err } //生充值记录 err = tx.Exec("insert into user_money_record (app_id,`before`,`after`,trade_money,remark,create_at) values (?,?,?,?,?,?)", appid, moneyBefore, moneyAfter, money, remark, nowStr).Error if err != nil { log.Printf("appID:[%s],trade_money:[%d] execute insert into user_money_record error:[%v]", appid, money, err) tx.Rollback() return err } return nil }) return errs } func ProductRecharge(appid string, productId, rechargeNum int, startTime string, endTime string, tradeMoney int, context *gin.Context) error { //取出用户锁 lock.MainLock.Lock() userLock := lock.UserLockMap[appid] lock.MainLock.Unlock() userLock.Lock() defer userLock.Unlock() //查用户当前剩余量 userProduct := &model.UserProduct{} db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appid, ProductID: productId}) product := &model.Product{} if products, ok := utils.ProductCaches.Map.Load(productId); ok { product = products.(*model.Product) } // 更新时间 nowStr := time.Now().Local().Format("2006-01-02 15:04:05") errs := db.GetSFISDB().Transaction(func(tx *gorm.DB) error { before := userProduct.LeftNum after := userProduct.LeftNum + rechargeNum //充值 var err error if endTime != "" && startTime != "" { err = tx.Exec("update user_product set left_num = ?,start_at=?,end_at = ? ,update_at = ? WHERE `app_id` = ? and product_id = ?", after, startTime, endTime, nowStr, appid, productId).Error if err != nil { log.Printf("appID:[%s],left_num:[%d],endtime:[%s],starttime:[%s] execute cost user_product error:[%v]", appid, after, endTime, startTime, err) tx.Rollback() return err } } else { err = tx.Exec("update user_product set left_num = ?,update_at = ? WHERE `app_id` = ? and product_id = ?", after, nowStr, appid, productId).Error if err != nil { log.Printf("appID:[%s],left_num:[%d] execute cost user_product error:[%v]", appid, after, err) tx.Rollback() return err } } //生购买记录 err = tx.Exec("insert into user_buy_record (app_id,product_id,user_product_id,`before`,`after`,trade_money,buy_type,history_unit_price,create_at) values (?,?,?,?,?,?,?,?,?)", appid, productId, userProduct.ID, before, after, tradeMoney, 1, product.UnitPrice, nowStr).Error if err != nil { log.Printf("appID:[%s],product_id:[%d],user_product_id:[%d],after:[%d],trade_money:[%d] execute insert into user_buy_record error:[%v]", appid, productId, userProduct.ID, after, tradeMoney, err) tx.Rollback() return err } return nil }) return errs }