| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | package reportimport (	"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		}	}}
 |