| 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
 
- 		}
 
- 	}
 
- }
 
 
  |