|
@@ -1,24 +1,40 @@
|
|
package utils
|
|
package utils
|
|
|
|
|
|
import (
|
|
import (
|
|
- "gorm.io/gorm"
|
|
|
|
|
|
+ "errors"
|
|
"log"
|
|
"log"
|
|
"sfbase/global"
|
|
"sfbase/global"
|
|
"sfbase/utils"
|
|
"sfbase/utils"
|
|
"sfis/db"
|
|
"sfis/db"
|
|
"sfis/model"
|
|
"sfis/model"
|
|
|
|
+
|
|
|
|
+ "gorm.io/gorm"
|
|
)
|
|
)
|
|
|
|
|
|
/**
|
|
/**
|
|
扣产品剩余量
|
|
扣产品剩余量
|
|
*/
|
|
*/
|
|
-func costByLeftNum(getData func() ([]interface{}, int, error), appID string, productID int, userProduct *model.UserProduct, product *model.Product, param, ip string) {
|
|
|
|
|
|
+func costByLeftNum(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
|
|
|
|
+ datas := []map[string]interface{}{}
|
|
|
|
+ var err error
|
|
beforeJudge := before(productType, userProduct)
|
|
beforeJudge := before(productType, userProduct)
|
|
if beforeJudge {
|
|
if beforeJudge {
|
|
data, statusCode, _ := execute(getData, appID, productID)
|
|
data, statusCode, _ := execute(getData, appID, productID)
|
|
- after(productType, len(data), userProduct, statusCode, param, ip)
|
|
|
|
|
|
+ err = after(productType, len(data), userProduct, statusCode, param, ip)
|
|
|
|
+ if err == nil && data != nil && len(data) > 0 {
|
|
|
|
+ datas = data
|
|
|
|
+ } else {
|
|
|
|
+ if err != nil {
|
|
|
|
+ global.Logger.Error("数据库操作失败", getUserProductError(appID, productID, err)...)
|
|
|
|
+ } else {
|
|
|
|
+ global.Logger.Info("无数据", getUserProductError(appID, productID, err)...)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ err = errors.New("剩余量不足")
|
|
}
|
|
}
|
|
|
|
+ return datas, err
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -45,7 +61,7 @@ func before(productType int, userProduct *model.UserProduct) bool {
|
|
/**
|
|
/**
|
|
执行接口查询
|
|
执行接口查询
|
|
*/
|
|
*/
|
|
-func execute(getData func() ([]interface{}, int, error), appID string, productID int) ([]interface{}, int, error) {
|
|
|
|
|
|
+func execute(getData func() ([]map[string]interface{}, int, error), appID string, productID int) ([]map[string]interface{}, int, error) {
|
|
data, statusCode, err := getData()
|
|
data, statusCode, err := getData()
|
|
if err != nil {
|
|
if err != nil {
|
|
global.Logger.Error("调用数据出错:", getUserProductError(appID, productID, err)...)
|
|
global.Logger.Error("调用数据出错:", getUserProductError(appID, productID, err)...)
|
|
@@ -56,14 +72,15 @@ func execute(getData func() ([]interface{}, int, error), appID string, productID
|
|
return data, statusCode, nil
|
|
return data, statusCode, nil
|
|
}
|
|
}
|
|
|
|
|
|
-func after(productType int, dataLen int, userProduct *model.UserProduct, statusCode int, param, ip string) {
|
|
|
|
|
|
+func after(productType int, dataLen int, userProduct *model.UserProduct, statusCode int, param, ip string) error {
|
|
appID := userProduct.AppID
|
|
appID := userProduct.AppID
|
|
productID := userProduct.ProductID
|
|
productID := userProduct.ProductID
|
|
userProductID := userProduct.ID
|
|
userProductID := userProduct.ID
|
|
|
|
+ var errs error
|
|
switch productType {
|
|
switch productType {
|
|
case 0:
|
|
case 0:
|
|
//按次扣费-(每调一次剩余量-1)
|
|
//按次扣费-(每调一次剩余量-1)
|
|
- _ = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
|
|
|
|
|
|
+ errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
|
|
orderBefore := userProduct.LeftNum
|
|
orderBefore := userProduct.LeftNum
|
|
orderAfter := userProduct.LeftNum - 1
|
|
orderAfter := userProduct.LeftNum - 1
|
|
//扣费
|
|
//扣费
|
|
@@ -93,13 +110,29 @@ func after(productType int, dataLen int, userProduct *model.UserProduct, statusC
|
|
})
|
|
})
|
|
case 1:
|
|
case 1:
|
|
//按条扣费-(每调一次剩余量-len(getDataList))
|
|
//按条扣费-(每调一次剩余量-len(getDataList))
|
|
- _ = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
|
|
|
|
|
|
+ errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
|
|
|
|
+ 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)
|
|
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("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, 0, 1).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 nil
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
+ return errs
|
|
}
|
|
}
|