xuzhiheng %!s(int64=4) %!d(string=hai) anos
pai
achega
51f8fd01a7
Modificáronse 4 ficheiros con 116 adicións e 14 borrados
  1. 10 0
      model/product.go
  2. 2 2
      utils/api_util.go
  3. 96 9
      utils/cost_by_account_balance.go
  4. 8 3
      utils/cost_by_left_num.go

+ 10 - 0
model/product.go

@@ -33,3 +33,13 @@ type UserProduct struct {
 func (p *UserProduct) TableName() string {
 	return "user_product"
 }
+
+type UserAccount struct {
+	ID    int    `json:"id" gorm:"primaryKey"`
+	AppID string `json:"app_id"`
+	Money int    `json:"money"`
+}
+
+func (p *UserAccount) TableName() string {
+	return "user_account"
+}

+ 2 - 2
utils/api_util.go

@@ -33,14 +33,14 @@ func Check(appID string, productID int, context *gin.Context, getData func() ([]
 	userLock.Lock()
 	log.Println(param + "锁住......")
 	db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
-	costModel = 0 //
+	// costModel = 0
 	switch costModel {
 	case 0:
 		//按剩余量扣费
 		datas, err = costByLeftNum(getData, appID, productID, userProduct, product, param, ip)
 	case 1:
 		//按账户钱包余额扣费
-		datas, err = costByAccountBalance(getData, appID, userProduct, product)
+		datas, err = costByAccountBalance(getData, appID, productID, userProduct, product, param, ip)
 	case 2:
 		//优先扣剩余量,剩余量为0,扣钱包余额
 	}

+ 96 - 9
utils/cost_by_account_balance.go

@@ -1,19 +1,106 @@
 package utils
 
-import "sfis/model"
+import (
+	"errors"
+	"log"
+	"sfbase/global"
+	"sfbase/utils"
+	"sfis/db"
+	"sfis/model"
+
+	"fmt"
+
+	"go.uber.org/zap"
+	"gorm.io/gorm"
+)
 
 /**
 扣账户余额
 */
-func costByAccountBalance(getData func() ([]map[string]interface{}, int, error), appID string, userProduct *model.UserProduct, product *model.Product) ([]map[string]interface{}, error) {
+func costByAccountBalance(getData func() ([]map[string]interface{}, int, error), appID string, productID int, userProduct *model.UserProduct, product *model.Product, param, ip string) ([]map[string]interface{}, error) {
 	productType := product.ProductType
 	//productUnit := product.UnitPrice
-	if productType == 0 {
-		//按次扣费-每调一次
-		//todo 账户余额表user_account的余额 减去 product单价*1
-	} else if productType == 1 {
-		//按条扣费-每调一次
-		//todo 账户余额表user_account的余额 减去 product单价*len(getDataList)
+	// if productType == 0 {
+	//按次扣费-每调一次
+	//todo 账户余额表user_account的余额 减去 product单价*1
+	// } else if productType == 1 {
+	//按条扣费-每调一次
+	//todo 账户余额表user_account的余额 减去 product单价*len(getDataList)
+	// }
+	datas := []map[string]interface{}{}
+	var err error
+	data, statusCode, _ := execute(getData, appID, productID)
+	beforeJudge, payMoney := beforeCheck(productType, product.UnitPrice, len(data), userProduct)
+	if beforeJudge {
+		global.Logger.Info("交易金额", zap.Any("payMoney:", payMoney))
+		err = afterCheck(len(data), payMoney, userProduct, statusCode, param, ip)
+		if err != nil {
+			global.Logger.Error("数据库操作失败", getUserProductError(appID, productID, err)...)
+		} else {
+			datas = data
+		}
+	} else {
+		err = errors.New("剩余余额不足")
 	}
-	return nil, nil
+	return datas, err
+}
+
+func beforeCheck(productType, unitPrice, dataLen int, userProduct *model.UserProduct) (bool, int) {
+	userAccount := &model.UserAccount{}
+	db.GetSFISDB().First(userAccount, &model.UserAccount{AppID: userProduct.AppID})
+	money := 0
+	switch productType {
+	case 0:
+		money = unitPrice
+		//按次扣费-判断left_num
+		if money > userAccount.Money {
+			return false, money
+		}
+	case 1:
+		money = unitPrice * dataLen
+		//按条扣费-判断单次调用的limit
+		if money > userAccount.Money {
+			return false, money
+		}
+	}
+	return true, money
+}
+
+func afterCheck(dataLen, payMoney int, userProduct *model.UserProduct, statusCode int, param, ip string) error {
+	appID := userProduct.AppID
+	productID := userProduct.ProductID
+	userProductID := userProduct.ID
+	userAccount := &model.UserAccount{}
+	db.GetSFISDB().First(userAccount, &model.UserAccount{AppID: userProduct.AppID})
+	var errs error
+	//按次扣费-(每调一次剩余量-1)
+	errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
+		orderBefore := userAccount.Money
+		orderAfter := userAccount.Money - payMoney
+		//扣费
+		err := tx.Exec("update user_account set money = money - ? WHERE `app_id` = ?", fmt.Sprint(payMoney), appID).Error
+		if err != nil {
+			log.Printf("appID:[%s],money:[%d] execute cost money error:[%v]", appID, payMoney, err)
+			tx.Rollback()
+			return err
+		}
+		//生调用记录
+		err = tx.Exec("insert into user_call_record (app_id,user_product_id,status,ip,param) values (?,?,?,?,?)", appID, userProductID, statusCode, ip, param).Error
+		if err != nil {
+			log.Printf("appID:[%s],productID:[%d] execute insert into user_call_record error:[%v]", appID, productID, err)
+			tx.Rollback()
+			return err
+		}
+		//生订单
+		orderCode := utils.GenerateSimpleToken()
+		err = tx.Exec("insert into interface_order (order_code,app_id,user_product_id,`before`,`after`,cost_model,trade_num) values (?,?,?,?,?,?,?)", orderCode, appID, userProductID, orderBefore, orderAfter, 1, payMoney).Error
+		if err != nil {
+			log.Printf("appID:[%s],productID:[%d] execute insert into interface_order error:[%v]", appID, productID, err)
+			tx.Rollback()
+			return err
+		}
+		//存历史数据
+		return nil
+	})
+	return errs
 }

+ 8 - 3
utils/cost_by_left_num.go

@@ -114,9 +114,14 @@ func after(productType int, dataLen int, userProduct *model.UserProduct, statusC
 			orderBefore := userProduct.LeftNum
 			orderAfter := userProduct.LeftNum - dataLen
 			//扣费
-			tx.Exec("update user_product set left_num = IF(`left_num`<1, 0, `left_num`-?) WHERE `app_id` = ? and product_id=?", dataLen, appID, productID)
+			err := tx.Exec("update user_product set left_num = IF(`left_num`<1, 0, `left_num`-?) WHERE `app_id` = ? and product_id=?", dataLen, appID, productID).Error
+			if err != nil {
+				log.Printf("appID:[%s],productID:[%d] execute cost money error:[%v]", appID, productID, err)
+				tx.Rollback()
+				return err
+			}
 			//生调用记录
-			err := tx.Exec("insert into user_call_record (app_id,user_product_id,status,ip,param) values (?,?,?,?,?)", appID, userProductID, statusCode, ip, param).Error
+			err = tx.Exec("insert into user_call_record (app_id,user_product_id,status,ip,param) values (?,?,?,?,?)", appID, userProductID, statusCode, ip, param).Error
 			if err != nil {
 				log.Printf("appID:[%s],productID:[%d] execute insert into user_call_record error:[%v]", appID, productID, err)
 				tx.Rollback()
@@ -124,7 +129,7 @@ func after(productType int, dataLen int, userProduct *model.UserProduct, statusC
 			}
 			//生订单
 			orderCode := utils.GenerateSimpleToken()
-			err = tx.Exec("insert into interface_order (order_code,app_id,user_product_id,`before`,`after`,cost_model,trade_num) values (?,?,?,?,?,?,?)", orderCode, appID, userProductID, orderBefore, orderAfter, 0, 1).Error
+			err = tx.Exec("insert into interface_order (order_code,app_id,user_product_id,`before`,`after`,cost_model,trade_num) values (?,?,?,?,?,?,?)", orderCode, appID, userProductID, orderBefore, orderAfter, 0, dataLen).Error
 			if err != nil {
 				log.Printf("appID:[%s],productID:[%d] execute insert into interface_order error:[%v]", appID, productID, err)
 				tx.Rollback()