shang.hu.ka.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package report
  2. import (
  3. "duoduo/models/shanghu"
  4. "fmt"
  5. "github.com/shopspring/decimal"
  6. "time"
  7. )
  8. // C端分账
  9. // 分账逻辑:
  10. // 1.获取待分账、分账失败的数据
  11. // 2.根据商户卡id 将 90%分给商家,剩下的 10% 分给用户
  12. // 3.一条一条的处理,防止处理数据太多导致重复重复分账 查到数据里面修改成分账中
  13. func ClientAccount() {
  14. //
  15. for true {
  16. //查询订单信息
  17. var account shanghu.ClientPayTrans
  18. var saleOpenid string //分销人员id
  19. account.AccountStatus = 1 //未分账
  20. account.Status = 2 //支付成功
  21. clientTrans, err := account.GetPayTransByStatus()
  22. if err != nil {
  23. fmt.Println("GetPayTransByStatus err ", err.Error())
  24. break
  25. }
  26. data := make(map[string]interface{})
  27. data["account_status"] = 3 //分账中
  28. data["updated_at"] = time.Now()
  29. err = clientTrans.UpdateById(data)
  30. if err != nil {
  31. fmt.Println("UpdateById err ", err.Error())
  32. break
  33. }
  34. //查询卡信息
  35. var cardInfo shanghu.MerchantCard
  36. cardInfo.ID = clientTrans.MerchantCardID
  37. merchantCard, err := cardInfo.GetMerchantCard()
  38. if err != nil {
  39. dataErr := make(map[string]interface{})
  40. dataErr["account_status"] = 2 //分账失败
  41. dataErr["account_err_log"] = err.Error() //分账失败日志
  42. dataErr["updated_at"] = time.Now()
  43. err = clientTrans.UpdateById(dataErr)
  44. if err != nil {
  45. fmt.Println("GetMerchantCard err ", err.Error())
  46. break
  47. }
  48. continue
  49. }
  50. //分账
  51. //按比例商户一部分,分销一部分
  52. //计算金额
  53. fmt.Println(merchantCard.RebateRate)
  54. fmt.Println(clientTrans.Amount)
  55. var clientAmount decimal.Decimal
  56. if clientTrans.InvitationCode == "yuanshima" {
  57. clientAmount = decimal.NewFromInt(0)
  58. saleOpenid = ""
  59. } else {
  60. clientAmount = clientTrans.Amount.Mul(decimal.NewFromInt(merchantCard.RebateRate)).Div(decimal.NewFromInt(100)).Round(2)
  61. var accountByCode shanghu.MerchantClientUser
  62. accountByCode.Code = clientTrans.InvitationCode
  63. codeInfo, err := accountByCode.GetUserInfoByCode()
  64. if err != nil {
  65. dataErr := make(map[string]interface{})
  66. dataErr["account_status"] = 2 //分账失败
  67. dataErr["account_err_log"] = err.Error() //分账失败日志
  68. dataErr["updated_at"] = time.Now()
  69. err = clientTrans.UpdateById(dataErr)
  70. }
  71. saleOpenid = codeInfo.ClientOpenID
  72. }
  73. fmt.Println(clientAmount)
  74. merchantAmount := clientTrans.Amount.Sub(clientAmount).Round(2)
  75. fmt.Println(merchantAmount)
  76. //乐观锁
  77. err = account.SettleAdd(merchantAmount, clientAmount, merchantCard.MerchantOpenID, saleOpenid, clientTrans.ID)
  78. if err != nil {
  79. dataErr := make(map[string]interface{})
  80. dataErr["account_status"] = 2 //分账失败
  81. dataErr["account_err_log"] = err.Error() //分账失败日志
  82. dataErr["updated_at"] = time.Now()
  83. err = clientTrans.UpdateById(dataErr)
  84. if err != nil {
  85. break
  86. }
  87. continue
  88. }
  89. dataSuccess := make(map[string]interface{})
  90. dataSuccess["account_status"] = 99 //
  91. dataSuccess["updated_at"] = time.Now()
  92. err = clientTrans.UpdateById(dataSuccess)
  93. if err != nil {
  94. dataErr := make(map[string]interface{})
  95. dataErr["account_err_log"] = "99 error" //分账失败日志
  96. dataErr["updated_at"] = time.Now()
  97. err = clientTrans.UpdateById(dataErr)
  98. if err != nil {
  99. fmt.Println("GetMerchantCard err ", err.Error())
  100. break
  101. }
  102. fmt.Println("UpdateById err ", err.Error())
  103. break
  104. }
  105. }
  106. }