package utils import ( "errors" "fmt" "log" "sfbase/global" "sfbase/utils" "sfis/db" "sfis/model" "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)) if err != nil { errStr = "内部错误" global.Logger.Error("数据库操作失败", getUserProductError(appID, productID, err)...) } else { 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 := 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) (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 //扣费 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,order_code) values (?,?,?,?,?,?)", appID, userProductID, statusCode, ip, param, orderCode).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,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 orderCode, errs }