package services import ( "app/commons/constant" "app/commons/core" "app/commons/core/exchange" "app/commons/model/entity" "fmt" "github.com/shopspring/decimal" ) // // 处理充值 回调处理逻辑 func (s *CommonService) handleRecharge(callbackLog *entity.AssetRwCallbackLog) { if callbackLog.State != constant.RwCallbackStateWaiting || callbackLog.Type != exchange.TransferUserToApp { return } var err error defer func() { callbackLog.State = constant.RwCallbackStateFinish callbackLog.ErrDesc = "success" if err != nil { callbackLog.State = constant.RwCallbackStateFail callbackLog.ErrDesc = err.Error() } if err = s.DB().Model(&entity.AssetRwCallbackLog{}).Where("id", callbackLog.Id).Updates(map[string]interface{}{ "state": callbackLog.State, "err_desc": callbackLog.ErrDesc, }).Error; err != nil { core.Log.Error(err.Error()) } }() // 币种获取检查 coinInfo, err := s.FirstCoin(s.DB().Where("symbol", callbackLog.Currency)) if err != nil { core.Log.Error(err) return } symbol := coinInfo.Symbol user, err := s.GetUserInfoByOpenId(callbackLog.OpenId) if err != nil { core.Log.Error(err) return } amount, err := decimal.NewFromString(callbackLog.Amount) if err != nil { core.Log.Error(err) return } if amount.LessThanOrEqual(decimal.Zero) { err = fmt.Errorf("充值金额:%s", amount) return } // 构建转账订单 成功 rwOrder := s.buildRwRecord( coinInfo.Symbol, user.Id, callbackLog.OpenId, callbackLog.OrderId, constant.RwDirectionRecharge, amount, decimal.Zero, decimal.Zero, decimal.Zero, amount, ) // todo:转入成功 开启事务处理 userAsset, err := s.GetAssetBySymbol(user.Id, coinInfo.Symbol) if err != nil { err = fmt.Errorf("用户资产信息获取失败:%d-%s", user.Id, symbol) return } dbTx := s.DB().Begin() // 修改订单状态 rwOrder.Status = constant.RwStateFinish // 构建流水 err = dbTx.Create(&rwOrder).Error if err != nil { core.Log.Error(err) dbTx.Rollback() return } bs := constant.BsById(constant.BsAssetDeposit) bs.ContextName = rwOrder.TableName() bs.ContextValue = rwOrder.OrderId err = s.GenBillAndActionAsset(dbTx, userAsset.UserId, userAsset.Symbol, amount, decimal.Zero, bs) if err != nil { dbTx.Rollback() return } dbTx.Commit() return }