| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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
- }
|