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 }