|
@@ -1,19 +1,106 @@
|
|
package utils
|
|
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
|
|
productType := product.ProductType
|
|
//productUnit := product.UnitPrice
|
|
//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
|
|
}
|
|
}
|