public XResult <WithdrawResponse> Withdraw(WithdrawRequest request) { if (request == null) { return(new XResult <WithdrawResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.Withdraw(...)"; if (!request.IsValid) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", LogPhase.ACTION, $"请求参数验证失败:{request.ErrorMessage}", request); return(new XResult <WithdrawResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } if (request.Amount < GlobalConfig.X99bill_YZT_WithdrawMinAmount) { return(new XResult <WithdrawResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException($"提现金额至少为{GlobalConfig.X99bill_YZT_WithdrawMinAmount.ToString()}元"))); } var requestHash = $"withdraw:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <WithdrawResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <WithdrawResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existedOrder = _allotAmountWithdrawOrderRepository.QueryProvider.FirstOrDefault(x => x.OutTradeNo == request.OutTradeNo); if (existedOrder == null) { var newId = IDGenerator.GenerateID(); existedOrder = new AllotAmountWithdrawOrder() { Id = newId, AppId = request.AppId, TradeNo = newId.ToString(), PayeeId = request.PayeeId, OutTradeNo = request.OutTradeNo, Amount = request.Amount, SettlePeriod = request.SettlePeriod, CustomerFee = request.CustomerFee, MerchantFee = request.MerchantFee, Status = WithdrawOrderStatus.APPLY.ToString(), ApplyTime = DateTime.Now }; _allotAmountWithdrawOrderRepository.Add(existedOrder); var saveResult = _allotAmountWithdrawOrderRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_allotAmountWithdrawOrderRepository)}.SaveChanges()", "保存分账提现记录失败", saveResult.FirstException, existedOrder); return(new XResult <WithdrawResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } } if (existedOrder.Status == WithdrawOrderStatus.SUCCESS.ToString() || existedOrder.Status == WithdrawOrderStatus.FAILURE.ToString()) { return(new XResult <WithdrawResponse>(null, ErrorCode.OUT_TRADE_NO_EXISTED)); } String traceMethod = $"Bill99Util.Execute(/account/withdraw)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN); var execResult = Bill99UtilYZT.Execute <RawWithdrawRequest, RawWithdrawResponse>("/account/withdraw", new RawWithdrawRequest() { uId = request.PayeeId, outTradeNo = request.OutTradeNo, amount = request.Amount, customerFee = request.CustomerFee, merchantFee = request.MerchantFee }); _logger.Trace(TraceType.BLL.ToString(), (execResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END); if (!execResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "申请分账提现失败", execResult.FirstException, request); return(new XResult <WithdrawResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, execResult.FirstException)); } var resp = execResult.Value; if (resp == null) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(execResult)}.Value", LogPhase.ACTION, "快钱未返回任何数据"); return(new XResult <WithdrawResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING)); } if (resp.ResponseCode != "0000") { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(resp)}.ResponseCode", $"申请分账提现失败:{resp.ResponseCode}:{resp.ResponseMessage}"); return(new XResult <WithdrawResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException($"{resp.ResponseCode}:{resp.ResponseMessage}"))); } Boolean statusHasChanged = false; switch (resp.status) { case "1": existedOrder.Status = WithdrawOrderStatus.SUCCESS.ToString(); existedOrder.CompleteTime = DateTime.Now; statusHasChanged = true; break; case "2": existedOrder.Status = WithdrawOrderStatus.FAILURE.ToString(); existedOrder.CompleteTime = DateTime.Now; statusHasChanged = true; break; case "3": existedOrder.Status = WithdrawOrderStatus.PROCESSING.ToString(); statusHasChanged = true; break; } if (statusHasChanged) { _allotAmountWithdrawOrderRepository.Update(existedOrder); var updateResult = _allotAmountWithdrawOrderRepository.SaveChanges(); if (!updateResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_allotAmountWithdrawOrderRepository)}.SaveChanges()", "更新申请提交结果失败", updateResult.FirstException, existedOrder); } } return(new XResult <WithdrawResponse>(new WithdrawResponse() { Status = existedOrder.Status, Msg = GetWithdrawOrderStatusMsg(existedOrder.Status) })); } finally { _lockProvider.UnLock(requestHash); } }
//private readonly IWithdrawService _withdrawService = null; public XResult <AllotAmountWithdrawApplyResponse> Apply(AllotAmountWithdrawApplyRequest request) { if (request == null) { return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.Apply(...)"; if (!request.IsValid) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", LogPhase.ACTION, $"快钱盈帐通:{request.ErrorMessage}", request); return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } if (request.Amount < GlobalConfig.X99bill_YZT_WithdrawMinAmount) { return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException($"提现金额至少为{GlobalConfig.X99bill_YZT_WithdrawMinAmount.ToString()}元"))); } var requestHash = $"withdraw:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.SUBMIT_REPEAT)); } //检查是否已开户 if (!_personalSubAccountRepository.Exists(x => x.AppId == request.AppId && x.UID == request.PayeeId)) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "__CheckPersonalAccountRegisterInfo", LogPhase.ACTION, "该用户尚未开户", request); return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.UN_REGISTERED)); } //检查是否已绑卡 if (!_withdrawBankCardBindInfoRepository.Exists(x => x.AppId == request.AppId && x.PayeeId == request.PayeeId)) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "__CheckBankCardBindInfo", LogPhase.ACTION, "该用户尚未绑卡", request); return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.NO_BANKCARD_BOUND)); } var existsOrder = _allotAmountWithdrawOrderRepository.Exists(x => x.OutTradeNo == request.OutTradeNo); if (existsOrder) { return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.OUT_TRADE_NO_EXISTED)); } var newId = IDGenerator.GenerateID(); var newWithdrawOrder = new AllotAmountWithdrawOrder() { Id = newId, AppId = request.AppId, TradeNo = newId.ToString(), PayeeId = request.PayeeId, OutTradeNo = request.OutTradeNo, Amount = request.Amount, CustomerFee = request.CustomerFee, MerchantFee = request.MerchantFee, SettlePeriod = request.SettlePeriod, Status = WithdrawOrderStatus.APPLY.ToString(), ApplyTime = DateTime.Now }; _allotAmountWithdrawOrderRepository.Add(newWithdrawOrder); var saveResult = _allotAmountWithdrawOrderRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_allotAmountWithdrawOrderRepository)}.SaveChanges()", "保存分账提现记录失败", saveResult.FirstException, newWithdrawOrder); return(new XResult <AllotAmountWithdrawApplyResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } var resp = new AllotAmountWithdrawApplyResponse() { PayeeId = newWithdrawOrder.PayeeId, OutTradeNo = newWithdrawOrder.OutTradeNo, Amount = newWithdrawOrder.Amount, Status = CommonStatus.SUCCESS.ToString(), Msg = $"申请{CommonStatus.SUCCESS.GetDescription()}" }; return(new XResult <AllotAmountWithdrawApplyResponse>(resp)); } finally { _lockProvider.UnLock(requestHash); } }