123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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
- var saleOpenid string //分销人员id
- 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)
- var clientAmount decimal.Decimal
- if clientTrans.InvitationCode == "yuanshima" {
- clientAmount = decimal.NewFromInt(0)
- saleOpenid = ""
- } else {
- clientAmount = clientTrans.Amount.Mul(decimal.NewFromInt(merchantCard.RebateRate)).Div(decimal.NewFromInt(100)).Round(2)
- var accountByCode shanghu.MerchantClientUser
- accountByCode.Code = clientTrans.InvitationCode
- codeInfo, err := accountByCode.GetUserInfoByCode()
- 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)
- }
- saleOpenid = codeInfo.ClientOpenID
- }
- fmt.Println(clientAmount)
- merchantAmount := clientTrans.Amount.Sub(clientAmount).Round(2)
- fmt.Println(merchantAmount)
- //乐观锁
- err = account.SettleAdd(merchantAmount, clientAmount, merchantCard.MerchantOpenID, saleOpenid, clientTrans.ID)
- 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 {
- dataErr := make(map[string]interface{})
- dataErr["account_err_log"] = "99 error" //分账失败日志
- dataErr["updated_at"] = time.Now()
- err = clientTrans.UpdateById(dataErr)
- if err != nil {
- fmt.Println("GetMerchantCard err ", err.Error())
- break
- }
- fmt.Println("UpdateById err ", err.Error())
- break
- }
- }
- }
|