123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package utils
- import (
- "errors"
- "fmt"
- "log"
- "sfbase/global"
- "sfbase/utils"
- "sfis/db"
- "sfis/model"
- "time"
- "go.uber.org/zap"
- "gorm.io/gorm"
- )
- /**
- 扣账户余额
- */
- 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{}, string, error, string) {
- productType := product.ProductType
- //productUnit := product.UnitPrice
- // 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
- errStr := ""
- orderCode := ""
- data, statusCode, errs := execute(getData, appID, productID)
- if errs != nil {
- return nil, "", errs, "查询失败"
- }
- beforeJudge, payMoney := beforeCheck(productType, product.UnitPrice, len(data), userProduct)
- if beforeJudge {
- global.Logger.Info("交易金额", zap.Any("payMoney:", payMoney))
- datas = data
- if len(datas) == 0 {
- global.Logger.Info("无数据", getUserProductError(appID, productID, err)...)
- orderCode, err = afterCheck(len(data), payMoney, userProduct, statusCode, param, ip)
- } else {
- orderCode, err = afterCheck(len(data), payMoney, userProduct, statusCode, param, ip)
- }
- } else {
- errStr = "余额不足"
- err = errors.New("剩余余额不足")
- }
- return datas, orderCode, err, errStr
- }
- func beforeCheck(productType, unitPrice, dataLen int, userProduct *model.UserProduct) (bool, int) {
- userAccount := &model.UserAccount{}
- db.GetSFISDB().First(userAccount, &model.UserAccount{AppID: userProduct.AppID})
- money := float64(0)
- switch productType {
- case 0:
- money = float64(unitPrice) / 10 * float64(userProduct.Discount)
- //按次扣费-判断left_num
- if money > float64(userAccount.Money) {
- return false, int(money)
- }
- case 1:
- money = (float64(unitPrice) / 10 * float64(userProduct.Discount)) * float64(dataLen)
- //按条扣费-判断单次调用的limit
- if money > float64(userAccount.Money) {
- return false, int(money)
- }
- }
- return true, int(money)
- }
- func afterCheck(dataLen, payMoney int, userProduct *model.UserProduct, statusCode int, param, ip string) (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
- orderCode := utils.CreateOrderCode()
- //按次扣费-(每调一次剩余量-1)
- errs = db.GetSFISDB().Transaction(func(tx *gorm.DB) error {
- orderBefore := userAccount.Money
- orderAfter := userAccount.Money - payMoney
- nowStr := time.Now().Local().Format("2006-01-02 15:04:05")
- log.Println("nowStr", nowStr)
- //扣费
- err := tx.Exec("update user_account set money = money - ?,update_at = ? WHERE `app_id` = ?", fmt.Sprint(payMoney), nowStr, 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,product_id,user_product_id,status,ip,param,order_code,create_at) values (?,?,?,?,?,?,?,?)", appID, productID, userProductID, statusCode, ip, param, orderCode, nowStr).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
- }
- //生订单
- err = tx.Exec("insert into interface_order (order_code,app_id,product_id,user_product_id,`before`,`after`,cost_model,trade_num,create_at) values (?,?,?,?,?,?,?,?,?)", orderCode, appID, productID, userProductID, orderBefore, orderAfter, 1, payMoney, nowStr).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 orderCode, errs
- }
|