shang.hu.ka.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. account.AccountStatus = 1 //未分账
  19. account.Status = 2 //支付成功
  20. clientTrans, err := account.GetPayTransByStatus()
  21. if err != nil {
  22. fmt.Println("GetPayTransByStatus err ", err.Error())
  23. break
  24. }
  25. data := make(map[string]interface{})
  26. data["account_status"] = 3 //分账中
  27. data["updated_at"] = time.Now()
  28. err = clientTrans.UpdateById(data)
  29. if err != nil {
  30. fmt.Println("UpdateById err ", err.Error())
  31. break
  32. }
  33. //查询卡信息
  34. var cardInfo shanghu.MerchantCard
  35. cardInfo.ID = clientTrans.MerchantCardID
  36. merchantCard, err := cardInfo.GetMerchantCard()
  37. if err != nil {
  38. dataErr := make(map[string]interface{})
  39. dataErr["account_status"] = 2 //分账失败
  40. dataErr["account_err_log"] = err.Error() //分账失败日志
  41. dataErr["updated_at"] = time.Now()
  42. err = clientTrans.UpdateById(dataErr)
  43. if err != nil {
  44. fmt.Println("GetMerchantCard err ", err.Error())
  45. break
  46. }
  47. continue
  48. }
  49. //分账
  50. //按比例商户一部分,分销一部分
  51. //计算金额
  52. fmt.Println(merchantCard.RebateRate)
  53. fmt.Println(clientTrans.Amount)
  54. clientAmount := clientTrans.Amount.Mul(decimal.NewFromInt(merchantCard.RebateRate)).Div(decimal.NewFromInt(100)).Round(2)
  55. fmt.Println(clientAmount)
  56. merchantAmount := clientTrans.Amount.Sub(clientAmount).Round(2)
  57. fmt.Println(merchantAmount)
  58. //乐观锁
  59. err = account.SettleAdd(merchantAmount, clientAmount, merchantCard.MerchantOpenID, clientTrans.ClientOpenID)
  60. if err != nil {
  61. dataErr := make(map[string]interface{})
  62. dataErr["account_status"] = 2 //分账失败
  63. dataErr["account_err_log"] = err.Error() //分账失败日志
  64. dataErr["updated_at"] = time.Now()
  65. err = clientTrans.UpdateById(dataErr)
  66. if err != nil {
  67. break
  68. }
  69. continue
  70. }
  71. dataSuccess := make(map[string]interface{})
  72. dataSuccess["account_status"] = 99 //
  73. dataSuccess["updated_at"] = time.Now()
  74. err = clientTrans.UpdateById(dataSuccess)
  75. if err != nil {
  76. dataErr := make(map[string]interface{})
  77. dataErr["account_err_log"] = "99 error" //分账失败日志
  78. dataErr["updated_at"] = time.Now()
  79. err = clientTrans.UpdateById(dataErr)
  80. if err != nil {
  81. fmt.Println("GetMerchantCard err ", err.Error())
  82. break
  83. }
  84. fmt.Println("UpdateById err ", err.Error())
  85. break
  86. }
  87. }
  88. }