shang.hu.ka.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. break
  23. }
  24. data := make(map[string]interface{})
  25. data["account_status"] = 3 //分账中
  26. data["updated_at"] = time.Now()
  27. err = clientTrans.UpdateById(data)
  28. if err != nil {
  29. break
  30. }
  31. //查询卡信息
  32. var cardInfo shanghu.MerchantCard
  33. cardInfo.ID = clientTrans.MerchantCardID
  34. merchantCard, err := cardInfo.GetMerchantCard()
  35. if err != nil {
  36. dataErr := make(map[string]interface{})
  37. dataErr["account_status"] = 2 //分账失败
  38. dataErr["account_err_log"] = err.Error() //分账失败日志
  39. dataErr["updated_at"] = time.Now()
  40. err = clientTrans.UpdateById(dataErr)
  41. if err != nil {
  42. break
  43. }
  44. continue
  45. }
  46. //分账
  47. //按比例商户一部分,分销一部分
  48. //计算金额
  49. fmt.Println(merchantCard.RebateRate)
  50. fmt.Println(clientTrans.Amount)
  51. clientAmount := clientTrans.Amount.Mul(decimal.NewFromInt(merchantCard.RebateRate)).Div(decimal.NewFromInt(100)).Round(2)
  52. fmt.Println(clientAmount)
  53. merchantAmount := clientTrans.Amount.Sub(clientAmount).Round(2)
  54. fmt.Println(merchantAmount)
  55. //乐观锁
  56. err = account.SettleAdd(merchantAmount, clientAmount, merchantCard.MerchantOpenID, clientTrans.ClientOpenID)
  57. if err != nil {
  58. dataErr := make(map[string]interface{})
  59. dataErr["account_status"] = 2 //分账失败
  60. dataErr["account_err_log"] = err.Error() //分账失败日志
  61. dataErr["updated_at"] = time.Now()
  62. err = clientTrans.UpdateById(dataErr)
  63. if err != nil {
  64. break
  65. }
  66. continue
  67. }
  68. }
  69. }