package report import ( "duoduo/models/shanghu" "fmt" "github.com/shopspring/decimal" "time" ) // C端分账 // 分账逻辑: // 1.获取待分账、分账失败的数据 // 2.根据商户卡id 将 90%分给商家,剩下的 10% 分给用户 // 3.一条一条的处理,防止处理数据太多导致重复重复分账 查到数据里面修改成分账中 func ClientAccount() { // for true { //查询订单信息 var account shanghu.ClientPayTrans account.AccountStatus = 1 //未分账 account.Status = 2 //支付成功 clientTrans, err := account.GetPayTransByStatus() if err != nil { fmt.Println("GetPayTransByStatus err ", err.Error()) break } data := make(map[string]interface{}) data["account_status"] = 3 //分账中 data["updated_at"] = time.Now() err = clientTrans.UpdateById(data) if err != nil { fmt.Println("UpdateById err ", err.Error()) break } //查询卡信息 var cardInfo shanghu.MerchantCard cardInfo.ID = clientTrans.MerchantCardID merchantCard, err := cardInfo.GetMerchantCard() if err != nil { dataErr := make(map[string]interface{}) dataErr["account_status"] = 2 //分账失败 dataErr["account_err_log"] = err.Error() //分账失败日志 dataErr["updated_at"] = time.Now() err = clientTrans.UpdateById(dataErr) if err != nil { fmt.Println("GetMerchantCard err ", err.Error()) break } continue } //分账 //按比例商户一部分,分销一部分 //计算金额 fmt.Println(merchantCard.RebateRate) fmt.Println(clientTrans.Amount) clientAmount := clientTrans.Amount.Mul(decimal.NewFromInt(merchantCard.RebateRate)).Div(decimal.NewFromInt(100)).Round(2) fmt.Println(clientAmount) merchantAmount := clientTrans.Amount.Sub(clientAmount).Round(2) fmt.Println(merchantAmount) //乐观锁 err = account.SettleAdd(merchantAmount, clientAmount, merchantCard.MerchantOpenID, clientTrans.ClientOpenID) if err != nil { dataErr := make(map[string]interface{}) dataErr["account_status"] = 2 //分账失败 dataErr["account_err_log"] = err.Error() //分账失败日志 dataErr["updated_at"] = time.Now() err = clientTrans.UpdateById(dataErr) if err != nil { break } continue } dataSuccess := make(map[string]interface{}) dataSuccess["account_status"] = 99 // dataSuccess["updated_at"] = time.Now() err = clientTrans.UpdateById(dataSuccess) if err != nil { fmt.Println("UpdateById err ", err.Error()) break } } }