com_handler_asset_withdraw_verify.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package services
  2. import (
  3. "app/commons/constant"
  4. "app/commons/core"
  5. "app/commons/core/redisclient"
  6. "app/commons/model/entity"
  7. "fmt"
  8. "github.com/demdxx/gocast"
  9. )
  10. type TransferParam struct {
  11. OrderId interface{} `json:"orderId"` // 订单ID 0 表示处理异常订单
  12. Step interface{} `json:"step"` // 1 通过 非1 驳回
  13. Desc string `json:"desc"`
  14. }
  15. // 处理提现审核
  16. func (s *CommonService) VerifyWithdrawApply(req *TransferParam) error {
  17. lockKey := fmt.Sprintf("%s", "VerifyTransferOutApply") // 分布式系统级锁
  18. lock, err := redisclient.Lock(lockKey)
  19. if err != nil {
  20. core.Log.Errorf("转账锁获取锁失败: %v", err)
  21. return err
  22. }
  23. core.Log.Infof("转账锁获取锁成功: %s ", lockKey)
  24. defer func() {
  25. err = redisclient.UnlockSafe(lock)
  26. if err != nil {
  27. core.Log.Errorf("转账锁解锁失败:%s", err.Error())
  28. } else {
  29. core.Log.Infof("转账锁解锁完成 %s UnlockSafe", lockKey)
  30. }
  31. }()
  32. orderId := gocast.ToString(req.OrderId)
  33. if orderId == "" {
  34. go s.handleAllWithdraw() // 直接触发转账处理
  35. return nil
  36. }
  37. // 当txId != "" 表示触发审核
  38. if err = s.verifyWithdrawOrder(req); err != nil {
  39. return err
  40. }
  41. go s.handleAllWithdraw() // 审核完成后 触发转账处理
  42. return nil
  43. }
  44. // 通过或者驳回提现申请
  45. func (s *CommonService) verifyWithdrawOrder(param *TransferParam) error {
  46. record, err := s.FirstAssetRwRecord(s.DB().
  47. Where("order_id = ?", param.OrderId).
  48. Where("direction", constant.RwDirectionWithdraw).
  49. Where("status", constant.RwStateWaiting))
  50. if err != nil {
  51. return fmt.Errorf("转账状态错误")
  52. }
  53. status := constant.RwStateReject // 驳回
  54. step := gocast.ToInt(param.Step)
  55. if step == constant.RwStatePass {
  56. status = constant.RwStatePass // 通过
  57. }
  58. record.Describe = fmt.Sprintf("%s\n%s", record.Describe, param.Desc)
  59. dbTx := s.DB().Begin()
  60. err = dbTx.Model(&entity.AssetRwRecord{}).
  61. Where("id", record.Id).
  62. Where("status", constant.RwStateWaiting).
  63. Updates(map[string]interface{}{
  64. "status": status,
  65. "describe": record.Describe,
  66. }).Error
  67. if err != nil {
  68. dbTx.Rollback()
  69. core.Log.Error(err.Error())
  70. return fmt.Errorf("状态修改错误")
  71. }
  72. dbTx.Commit()
  73. return nil
  74. }