public XResult <AccountBalanceQueryResponse> GetBalance(AccountBalanceQueryRequest request) { var queryResult = Bill99UtilYZT.Execute <RawAccountBalanceQueryRequest, RawAccountBalanceQueryResponse>("/account/balance/query", new RawAccountBalanceQueryRequest() { accountBalanceType = request.AccountBalanceTypes, uId = request.PayeeId }); if (!queryResult.Success) { return(new XResult <AccountBalanceQueryResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, queryResult.FirstException)); } if (queryResult.Value == null) { return(new XResult <AccountBalanceQueryResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING)); } if (queryResult.Value.ResponseCode != "0000") { return(new XResult <AccountBalanceQueryResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException(queryResult.Value.ResponseMessage))); } return(new XResult <AccountBalanceQueryResponse>(new AccountBalanceQueryResponse() { AccountBalances = from t0 in queryResult.Value.accountBalanceList select new AccountBalanceInfo() { AccountBalanceType = t0.accountBalanceType, AccountName = t0.accountName, AvailableBalance = t0.availableBalance, Balance = t0.balance } })); }
public XResult <WithdrawQueryFeeResponse> QueryFee(WithdrawQueryFeeRequest request) { if (request == null) { return(new XResult <WithdrawQueryFeeResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } if (!request.IsValid) { return(new XResult <WithdrawQueryFeeResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } var queryResult = Bill99UtilYZT.Execute <RawWithdrawQueryFeeRequest, RawWithdrawQueryFeeResponse>("/withdraw/queryFee", new RawWithdrawQueryFeeRequest() { uId = request.PayeeId, amount = request.Amount }); if (!queryResult.Success) { return(new XResult <WithdrawQueryFeeResponse>(null, ErrorCode.FAILURE, queryResult.FirstException)); } if (queryResult.Value == null) { return(new XResult <WithdrawQueryFeeResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING)); } if (queryResult.Value.ResponseCode != "0000") { return(new XResult <WithdrawQueryFeeResponse>(null, ErrorCode.FAILURE, new RemoteException(queryResult.Value.ResponseMessage))); } return(new XResult <WithdrawQueryFeeResponse>(new WithdrawQueryFeeResponse() { Fee = queryResult.Value.Fee, Status = CommonStatus.SUCCESS.ToString(), Msg = CommonStatus.SUCCESS.GetDescription() })); }
public XResult <PersonalWithdrawRebindCardResponse> WithdrawRebindCard(PersonalWithdrawRebindCardRequest request) { if (request == null) { return(new XResult <PersonalWithdrawRebindCardResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.WithdrawRebindCard(...)"; if (!request.IsValid) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", LogPhase.ACTION, $"请求参数验证失败:{request.ErrorMessage}", request); return(new XResult <PersonalWithdrawRebindCardResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } var requestHash = $"rebindcard:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <PersonalWithdrawRebindCardResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <PersonalWithdrawRebindCardResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existedBindInfo = _withdrawBankCardBindInfoRepository.QueryProvider.FirstOrDefault(x => x.PayeeId == request.PayeeId); if (existedBindInfo == null) { return(new XResult <PersonalWithdrawRebindCardResponse>(null, ErrorCode.DB_QUERY_FAILED, new DbQueryException("未查询到用户的绑卡信息"))); } Boolean hasChanged = false; if (String.Compare(existedBindInfo.BankCardNo, request.BankCardNo, true) != 0) { existedBindInfo.BankCardNo = request.BankCardNo; hasChanged = true; } Int32 secondAccountFlag = request.SecondAccountFlag.ToInt32(); if (existedBindInfo.BankCardFlag != secondAccountFlag) { existedBindInfo.BankCardFlag = secondAccountFlag; hasChanged = true; } if (String.Compare(existedBindInfo.Mobile, request.Mobile, true) != 0) { existedBindInfo.Mobile = request.Mobile; hasChanged = true; } if (!hasChanged) { return(new XResult <PersonalWithdrawRebindCardResponse>(new PersonalWithdrawRebindCardResponse() { MemberBankAccountId = existedBindInfo.MemberBankAccountId, Status = CommonStatus.SUCCESS.ToString(), Msg = CommonStatus.SUCCESS.GetDescription() })); } String traceMethod = $"Bill99Util.Execute(/person/bankcard/rebind)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN); var execResult = Bill99UtilYZT.Execute <RawPersonalWithdrawRebindCardRequest, RawPersonalWithdrawRebindCardResponse>("/person/bankcard/rebind", new RawPersonalWithdrawRebindCardRequest() { bankAcctId = request.BankCardNo, mobile = request.Mobile, secondAcct = request.SecondAccountFlag, uId = request.PayeeId }); _logger.Trace(TraceType.BLL.ToString(), (execResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END); if (!execResult.Success || execResult.Value == null) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "变更绑卡失败", execResult.FirstException, request); return(new XResult <PersonalWithdrawRebindCardResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException("变更绑卡失败"))); } var rebindStatus = CommonStatus.FAILURE; if (execResult.Value.ResponseCode == "0000") { existedBindInfo.MemberBankAccountId = execResult.Value.MemberBankAccountId; var updateResult = _withdrawBankCardBindInfoRepository.SaveChanges(); if (!updateResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_withdrawBankCardBindInfoRepository)}.SaveChanges()", "保存变更绑卡信息失败", updateResult.FirstException, existedBindInfo); } rebindStatus = CommonStatus.SUCCESS; } return(new XResult <PersonalWithdrawRebindCardResponse>(new PersonalWithdrawRebindCardResponse() { Status = rebindStatus.ToString(), Msg = $"换卡{rebindStatus.GetDescription()}" })); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <PersonalWithdrawBindCardResponse> WithdrawBindCard(PersonalWithdrawBindCardRequest request) { if (request == null) { return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.WithdrawBindCard(...)"; if (!request.IsValid) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", LogPhase.ACTION, $"请求参数验证失败:{request.ErrorMessage}", request); return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(request.ErrorMessage))); } var requestHash = $"bindcard:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existedBindInfo = _withdrawBankCardBindInfoRepository.Exists(x => x.PayeeId == request.PayeeId && x.BankCardNo == request.BankCardNo); if (existedBindInfo) { return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.INFO_EXISTED, new ArgumentException("绑卡信息已存在"))); } var newBindInfo = new WithdrawBankCardBindInfo() { Id = IDGenerator.GenerateID(), AppId = request.AppId, PayeeId = request.PayeeId, BankCardNo = request.BankCardNo, Mobile = request.Mobile, ApplyTime = DateTime.Now, BankCardFlag = request.SecondAccountFlag.ToInt32(), BindStatus = WithdrawBindCardStatus.PROCESSING.ToString() }; using (var tx = new TransactionScope()) { _withdrawBankCardBindInfoRepository.Add(newBindInfo); var saveResult = _withdrawBankCardBindInfoRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_withdrawBankCardBindInfoRepository)}.SaveChanges()", "保存提现绑卡信息失败", saveResult.FirstException, request); return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } String traceMethod = "Bill99Util.Execute(/person/bankcard/bind)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN); var execResult = Bill99UtilYZT.Execute <RawPersonalWithdrawBindCardRequest, RawPersonalWithdrawBindCardResponse>("/person/bankcard/bind", new RawPersonalWithdrawBindCardRequest() { uId = request.PayeeId, bankAcctId = request.BankCardNo, mobile = request.Mobile, secondAcct = request.SecondAccountFlag }); _logger.Trace(TraceType.BLL.ToString(), (execResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END); if (!execResult.Success || execResult.Value == null) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "提现绑卡失败", execResult.FirstException, request); return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, execResult.FirstException)); } if (execResult.Value.ResponseCode != "0000") { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "提现绑卡失败", null, execResult.Value); return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException(execResult.Value.ResponseMessage))); } newBindInfo.MemberBankAccountId = execResult.Value.memberBankAcctId; var updateResult = _withdrawBankCardBindInfoRepository.SaveChanges(); if (!updateResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "更新绑卡信息失败", updateResult.FirstException, newBindInfo); return(new XResult <PersonalWithdrawBindCardResponse>(null, ErrorCode.DB_UPDATE_FAILED, new RequestException("更新绑卡信息失败"))); } tx.Complete(); } var resp = new PersonalWithdrawBindCardResponse() { MemberBankAccountId = newBindInfo.MemberBankAccountId, Status = CommonStatus.SUCCESS.ToString(), Msg = $"绑卡{CommonStatus.SUCCESS.GetDescription()}" }; return(new XResult <PersonalWithdrawBindCardResponse>(resp)); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <PersonalInfoUpdateResponse> UpdateAccountInfo(PersonalInfoUpdateRequest request) { if (request == null) { return(new XResult <PersonalInfoUpdateResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } if (!request.IsValid) { return(new XResult <PersonalInfoUpdateResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } String service = $"{this.GetType().FullName}.UpdateAccountInfo(...)"; var requestHash = $"update:{request.UID}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <PersonalInfoUpdateResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <PersonalInfoUpdateResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var find = _personalSubAccountRepository.QueryProvider.FirstOrDefault(x => x.UID == request.UID); if (find == null) { return(new XResult <PersonalInfoUpdateResponse>(null, ErrorCode.INFO_NOT_EXIST, new ArgumentException("开户信息不存在"))); } Boolean hasChanged = false; if (String.Compare(find.Mobile, request.Mobile, true) != 0) { find.Mobile = request.Mobile; hasChanged = true; } if (String.Compare(find.Email, request.Email, true) != 0) { find.Email = request.Email; hasChanged = true; } if (!hasChanged) { return(new XResult <PersonalInfoUpdateResponse>(new PersonalInfoUpdateResponse() { Status = CommonStatus.SUCCESS.ToString(), Msg = CommonStatus.SUCCESS.GetDescription() })); } String traceMethod = "Bill99Util.Execute(/person/updateMember)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN, "开始更新个人账户信息", request); var execResult = Bill99UtilYZT.Execute <PersonalInfoUpdateRequest, RawPersonalInfoUpdateResponse>("/person/updateMember", request); _logger.Trace(TraceType.BLL.ToString(), (execResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END, "结束更新个人账户信息", execResult.Value); if (!execResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "更新个人账户信息失败", execResult.FirstException, request); return(new XResult <PersonalInfoUpdateResponse>(new PersonalInfoUpdateResponse() { Status = CommonStatus.FAILURE.ToString(), Msg = CommonStatus.FAILURE.GetDescription() })); } _personalSubAccountRepository.Update(find); var saveResult = _personalSubAccountRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "更新个人账户信息失败", saveResult.FirstException, request); return(new XResult <PersonalInfoUpdateResponse>(null, saveResult.FirstException)); } return(new XResult <PersonalInfoUpdateResponse>(new PersonalInfoUpdateResponse() { Status = CommonStatus.SUCCESS.ToString(), Msg = CommonStatus.SUCCESS.GetDescription() })); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <PersonalInfoQueryResponse> GetAccountInfo(PersonalInfoQueryRequest request) { if (request == null) { return(new XResult <PersonalInfoQueryResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.GetAccountInfo(...)"; if (!request.IsValid) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", LogPhase.ACTION, $"请求参数验证失败:{request.ErrorMessage}", request); return(new XResult <PersonalInfoQueryResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } var requestHash = $"getaccountinfo:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <PersonalInfoQueryResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <PersonalInfoQueryResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existedRegisterInfo = _personalSubAccountRepository.QueryProvider.FirstOrDefault(x => x.UID == request.PayeeId); if (existedRegisterInfo == null) { return(new XResult <PersonalInfoQueryResponse>(null, ErrorCode.UN_REGISTERED)); } if (existedRegisterInfo.Status != PersonalInfoRegisterStatus.SUCCESS.ToString()) { var queryResult = Bill99UtilYZT.Execute <RawPersonalInfoQueryRequest, RawPersonalInfoQueryResponse>("/person/info", new RawPersonalInfoQueryRequest() { PayeeId = request.PayeeId }); if (queryResult.Success && queryResult.Value != null && queryResult.Value.AuditStatus == "03") { existedRegisterInfo.Status = PersonalInfoRegisterStatus.SUCCESS.ToString(); _personalSubAccountRepository.Update(existedRegisterInfo); var updateStatusResult = _personalSubAccountRepository.SaveChanges(); if (!updateStatusResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_personalSubAccountRepository)}.SaveChanges()", "更新开户状态失败", updateStatusResult.FirstException, existedRegisterInfo); } } } return(new XResult <PersonalInfoQueryResponse>(new PersonalInfoQueryResponse() { PayeeId = existedRegisterInfo.UID, Email = existedRegisterInfo.Email, IDCardNo = existedRegisterInfo.IDCardNo, IDCardType = existedRegisterInfo.IDCardType, Mobile = existedRegisterInfo.Mobile, RealName = existedRegisterInfo.RealName, Status = existedRegisterInfo.Status, Msg = GetRegisterAuditStatusMsg(existedRegisterInfo.Status) })); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <PersonalCancelBoundCardResponse> CancelBoundCard(PersonalCancelBoundCardRequest request) { return(Bill99UtilYZT.Execute <PersonalCancelBoundCardRequest, PersonalCancelBoundCardResponse>("/person/bankcard/cancel", request)); }
public XResult <PersonalRegisterResponse> Register(PersonalRegisterRequest request) { if (request == null) { return(new XResult <PersonalRegisterResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.Register(...)"; if (!request.IsValid) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(request)}.IsValid", LogPhase.ACTION, $"请求参数验证失败:{request.ErrorMessage}", request); return(new XResult <PersonalRegisterResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } var requestHash = $"register:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <PersonalRegisterResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <PersonalRegisterResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existedRegisterInfo = _personalSubAccountRepository.QueryProvider.Where(x => x.AppId == request.AppId && x.UID == request.PayeeId).Count() > 0; if (existedRegisterInfo) { return(new XResult <PersonalRegisterResponse>(null, ErrorCode.INFO_EXISTED, new RequestException("开户信息已存在"))); } var newId = IDGenerator.GenerateID(); var newAccount = new PersonalSubAccount() { Id = newId, AppId = request.AppId, UID = request.PayeeId, IDCardNo = request.IDCardNo, IDCardType = request.IDCardType, RealName = request.RealName, Mobile = request.Mobile, Email = request.Email, Status = PersonalInfoRegisterStatus.WAITFORAUDIT.ToString(), UpdateTime = DateTime.Now }; _personalSubAccountRepository.Add(newAccount); var saveResult = _personalSubAccountRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_personalSubAccountRepository)}.SaveChanges()", "保存个人开户信息失败", saveResult.FirstException, request); return(new XResult <PersonalRegisterResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } String traceMethod = "Bill99Util.Execute(/person/register)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN, "开始调用快钱个人开户接口", request); var execResult = Bill99UtilYZT.Execute <RawPersonalRegisterRequest, RawPersonalRegisterResponse>("/person/register", new RawPersonalRegisterRequest() { uId = request.PayeeId, email = request.Email, idCardNumber = request.IDCardNo, idCardType = request.IDCardType, mobile = request.Mobile, name = request.RealName }); _logger.Trace(TraceType.BLL.ToString(), (execResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END, $"结束调用快钱开户接口", request); if (!execResult.Success || execResult.Value == null) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "个人开户失败", execResult.FirstException, execResult.Value); _personalSubAccountRepository.Remove(newAccount); saveResult = _personalSubAccountRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "删除个人开户记录失败", saveResult.FirstException, newAccount); } _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.ACTION, "已删除开户失败的记录"); return(new XResult <PersonalRegisterResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, execResult.FirstException)); } //开户成功之后要更新openid if (execResult.Value.ResponseCode == "0000") { Boolean statusHasChanged = false; switch (execResult.Value.AuditStatus) { case "03": newAccount.Status = PersonalInfoRegisterStatus.SUCCESS.ToString(); newAccount.OpenId = execResult.Value.OpenId; statusHasChanged = true; break; case "02": newAccount.Status = PersonalInfoRegisterStatus.WAITFORREVIEW.ToString(); statusHasChanged = true; break; } if (statusHasChanged) { _personalSubAccountRepository.Update(newAccount); var updateResult = _personalSubAccountRepository.SaveChanges(); if (!updateResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "更新开户信息的OpenId失败", updateResult.FirstException, newAccount); return(new XResult <PersonalRegisterResponse>(null, ErrorCode.DB_UPDATE_FAILED, new DbUpdateException("更新开户信息失败"))); } } } var resp = new PersonalRegisterResponse() { Status = newAccount.Status, OpenId = newAccount.OpenId, Msg = GetRegisterAuditStatusMsg(newAccount.Status) }; return(new XResult <PersonalRegisterResponse>(resp)); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <WithdrawBindCardQueryStatusResponse> QueryBindCardStatus(WithdrawBindCardQueryStatusRequest request) { if (request == null) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.QueryBindCardStatus(...)"; if (!request.IsValid) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } var requestHash = $"querybindcardstatus:{request.PayeeId}.{request.BankCardNo}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var queryResult = Bill99UtilYZT.Execute <RawWithdrawBindCardQueryStatusRequest, RawWithdrawBindCardQueryStatusResponse>("/bankacct/queryStatus", new RawWithdrawBindCardQueryStatusRequest() { uId = request.PayeeId, bankAcctId = request.BankCardNo }); if (!queryResult.Success) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, queryResult.ErrorCode, queryResult.FirstException)); } if (queryResult.Value == null) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING, new RemoteException("快钱未返回任何数据"))); } if (queryResult.Value.ResponseCode != "0000") { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.FAILURE, new RemoteException($"{queryResult.Value.ResponseCode}:{queryResult.Value.ResponseMessage}"))); } var bindcards = queryResult.Value.BindCards; if (bindcards == null || bindcards.Count() == 0) { return(new XResult <WithdrawBindCardQueryStatusResponse>(null, ErrorCode.NO_BANKCARD_BOUND)); } var first = bindcards.FirstOrDefault(); String status = WithdrawBindCardStatus.PROCESSING.ToString(); switch (first.Status) { case "1": status = WithdrawBindCardStatus.SUCCESS.ToString(); break; case "9": status = WithdrawBindCardStatus.FAILURE.ToString(); break; } return(new XResult <WithdrawBindCardQueryStatusResponse>(new WithdrawBindCardQueryStatusResponse() { BankCardNo = first.BankCardNo, MemberBankAcctId = first.MemberBankAcctId, Status = status, Msg = GetBindCardStatusMsg(status) })); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <PersonalBoundCardListQueryResponse> GetBoundCards(PersonalBoundCardListQueryRequest request) { if (request == null) { return(new XResult <PersonalBoundCardListQueryResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } String service = $"{this.GetType().FullName}.GetBoundCards(...)"; if (!request.IsValid) { return(new XResult <PersonalBoundCardListQueryResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } var requestHash = $"getboundcards:{request.PayeeId}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <PersonalBoundCardListQueryResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <PersonalBoundCardListQueryResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existedBoundInfos = _withdrawBankCardBindInfoRepository.QueryProvider.Where(x => x.PayeeId == request.PayeeId).ToList(); if (existedBoundInfos == null || existedBoundInfos.Count == 0) { var queryResult = Bill99UtilYZT.Execute <RawPersonalBoundCardListQueryRequest, RawPersonalBoundCardListQueryResponse>("/person/bankcard/list", new RawPersonalBoundCardListQueryRequest() { PayeeId = request.PayeeId }); if (queryResult.Success && queryResult.Value != null && queryResult.Value.ResponseCode == "0000") { var bindcards = queryResult.Value.BindCards; if (bindcards != null && bindcards.Count() > 0) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "existedBoundInfos", "数据库中没有绑卡信息但快钱返回有绑卡信息", null, new Object[] { request, bindcards }); } } return(new XResult <PersonalBoundCardListQueryResponse>(null, ErrorCode.INFO_NOT_EXIST, new RemoteException("绑卡信息不存在"))); } //获取既不是成功也不是失败的绑卡信息,然后查快钱接口更新它们 var unConfirmBoundInfos = existedBoundInfos.Where(x => x.BindStatus != WithdrawBindCardStatus.SUCCESS.ToString() && x.BindStatus != WithdrawBindCardStatus.FAILURE.ToString()); if (unConfirmBoundInfos.Count() > 0) { var queryResult = Bill99UtilYZT.Execute <RawPersonalBoundCardListQueryRequest, RawPersonalBoundCardListQueryResponse>("/person/bankcard/list", new RawPersonalBoundCardListQueryRequest() { PayeeId = request.PayeeId }); if (queryResult.Success && queryResult.Value != null && queryResult.Value.ResponseCode == "0000") { var bindcards = queryResult.Value.BindCards; if (bindcards != null && bindcards.Count() > 0) { var joined = from t0 in bindcards join t1 in unConfirmBoundInfos on t0.BankCardNo equals t1.BankCardNo where t0.Status == "1" || t0.Status == "9" select new { LocalBoundInfo = t1, RemoteBoundInfo = t0 }; Boolean statusHasChanged = false; if (joined.Count() > 0) { foreach (var item in joined) { //状态为1,绑卡成功 if (item.RemoteBoundInfo.Status == "1") { item.LocalBoundInfo.BindStatus = WithdrawBindCardStatus.SUCCESS.ToString(); statusHasChanged = true; } else { //状态为9,绑卡失败,删除绑卡记录 _withdrawBankCardBindInfoRepository.Remove(item.LocalBoundInfo); existedBoundInfos.Remove(item.LocalBoundInfo); statusHasChanged = true; } } } if (statusHasChanged) { var updateStatusResult = _withdrawBankCardBindInfoRepository.SaveChanges(); if (!updateStatusResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_withdrawBankCardBindInfoRepository)}.SaveChanges()", "更新绑卡状态失败", updateStatusResult.FirstException, existedBoundInfos); } } } } } return(new XResult <PersonalBoundCardListQueryResponse>(new PersonalBoundCardListQueryResponse() { BindCards = existedBoundInfos })); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <WithdrawQueryResponse> QueryDetails(WithdrawQueryRequest request) { if (request == null) { return(new XResult <WithdrawQueryResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } if (!request.IsValid) { return(new XResult <WithdrawQueryResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } String service = $"{this.GetType().FullName}.QueryDetails(...)"; var existedInfo = _allotAmountWithdrawOrderRepository.QueryProvider.FirstOrDefault(x => x.PayeeId == request.PayeeId && x.OutTradeNo == request.OutTradeNo); if (existedInfo == null) { var queryResult = Bill99UtilYZT.Execute <RawWithdrawQueryRequest, RawWithdrawQueryResponse>("/withdraw/query", new RawWithdrawQueryRequest() { uId = request.PayeeId, outTradeNo = request.OutTradeNo }); if (queryResult.Success && queryResult.Value != null && queryResult.Value.ResponseCode == "0000") { if (queryResult.Value.BankCardNo.HasValue()) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, nameof(existedInfo), "数据库中不存在提现记录但快钱返回存在", null, new Object[] { request, queryResult.Value }); } } return(new XResult <WithdrawQueryResponse>(null, ErrorCode.INFO_NOT_EXIST, new ArgumentException("提现记录不存在"))); } if (existedInfo.Status != WithdrawOrderStatus.SUCCESS.ToString() && existedInfo.Status != WithdrawOrderStatus.FAILURE.ToString()) { var queryResult = Bill99UtilYZT.Execute <RawWithdrawQueryRequest, RawWithdrawQueryResponse>("/withdraw/query", new RawWithdrawQueryRequest() { uId = request.PayeeId, outTradeNo = request.OutTradeNo }); if (queryResult.Success && queryResult.Value != null && queryResult.Value.ResponseCode == "0000") { Boolean statusHasChanged = false; if (queryResult.Value.Status == "1") { existedInfo.Status = WithdrawOrderStatus.SUCCESS.ToString(); _allotAmountWithdrawOrderRepository.Update(existedInfo); statusHasChanged = true; } else if (queryResult.Value.Status == "2") { existedInfo.Status = WithdrawOrderStatus.FAILURE.ToString(); _allotAmountWithdrawOrderRepository.Update(existedInfo); statusHasChanged = true; } if (statusHasChanged) { var updateStatusResult = _allotAmountWithdrawOrderRepository.SaveChanges(); if (!updateStatusResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_allotAmountWithdrawOrderRepository)}.SaveChanges()", "更新提现状态失败", updateStatusResult.FirstException, existedInfo); } } } } var bindcardinfo = _withdrawBankCardBindInfoRepository.QueryProvider.FirstOrDefault(x => x.PayeeId == request.PayeeId); if (bindcardinfo == null) { return(new XResult <WithdrawQueryResponse>(null, ErrorCode.NO_BANKCARD_BOUND)); } return(new XResult <WithdrawQueryResponse>(new WithdrawQueryResponse() { Amount = existedInfo.Amount, BankCardNo = bindcardinfo.BankCardNo, CustomerFee = existedInfo.CustomerFee, MemberBankAcctId = bindcardinfo.MemberBankAccountId, MerchantFee = existedInfo.MerchantFee, OutTradeNo = existedInfo.OutTradeNo, Status = existedInfo.Status, Msg = GetWithdrawOrderStatusMsg(existedInfo.Status) })); }
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); } }
public XResult <Int32> PullWithdrawResult(Int32 count = 20) { if (count <= 0) { return(new XResult <Int32>(0)); } String service = $"{this.GetType().FullName}.PullWithdrawResult()"; var hashKey = $"pullwithdrawresult:{DateTime.Now.ToString("yyMMddHH")}".GetHashCode(); if (_lockProvider.Exists(hashKey)) { return(new XResult <Int32>(0, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(hashKey)) { return(new XResult <Int32>(0, ErrorCode.SUBMIT_REPEAT)); } var withdrawOrders = (from t0 in _allotAmountWithdrawOrderRepository.QueryProvider where t0.Status == WithdrawOrderStatus.PROCESSING.ToString() orderby t0.ApplyTime select t0).Take(count).ToList(); if (withdrawOrders == null || withdrawOrders.Count == 0) { return(new XResult <Int32>(0)); } var c_withdrawOrders = new Stack <AllotAmountWithdrawOrder>(withdrawOrders); var successCount = 0; while (c_withdrawOrders.Count > 0) { var withdrawOrder = c_withdrawOrders.Pop(); var request = new RawWithdrawQueryRequest() { outTradeNo = withdrawOrder.OutTradeNo, uId = withdrawOrder.PayeeId }; String traceMethod = "Bill99Util.Execute(/withdraw/query)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN); var respResult = Bill99UtilYZT.Execute <RawWithdrawQueryRequest, RawWithdrawQueryResponse>("/withdraw/query", request); _logger.Trace(TraceType.BLL.ToString(), (respResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.END); if (!respResult.Success || respResult.Value == null) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "查询提现结果失败", respResult.FirstException, request); continue; } if (respResult.Value.ResponseCode == "0000") { Boolean statusHasChanged = false; switch (respResult.Value.Status) { case "1": withdrawOrder.Status = WithdrawOrderStatus.SUCCESS.ToString(); statusHasChanged = true; break; case "2": withdrawOrder.Status = WithdrawOrderStatus.FAILURE.ToString(); statusHasChanged = true; break; } if (statusHasChanged) { var updateResult = _allotAmountWithdrawOrderRepository.SaveChanges(); if (!updateResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_allotAmountWithdrawOrderRepository)}.SaveChanges()", "更新提现结果状态失败", updateResult.FirstException, withdrawOrder); continue; } } successCount++; } } return(new XResult <Int32>(successCount)); } finally { _lockProvider.UnLock(hashKey); } }
public XResult <Int32> PullAllotAmountResult(Int32 count = 20) { if (count <= 0) { return(new XResult <Int32>(0)); } String service = $"{this.GetType().FullName}.PullAllotAmountResult()"; var hashKey = $"pullallotamount:{DateTime.Now.ToString("yyMMddHH")}".GetHashCode(); if (_lockProvider.Exists(hashKey)) { return(new XResult <Int32>(0, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(hashKey)) { return(new XResult <Int32>(0, ErrorCode.SUBMIT_REPEAT)); } var allotAmountOrders = (from t0 in _allotAmountOrderRepository.QueryProvider where t0.Status == AllotAmountOrderStatus.PROCESSING.ToString() orderby t0.ApplyTime select t0).Take(count).ToList(); if (allotAmountOrders == null || allotAmountOrders.Count == 0) { return(new XResult <Int32>(0)); } var c_allotAmountOrders = new Stack <AllotAmountOrder>(allotAmountOrders); var successCount = 0; while (c_allotAmountOrders.Count > 0) { var allotAmountOrder = c_allotAmountOrders.Pop(); var request = new AllotAmountResultQueryRequest() { AppId = allotAmountOrder.AppId, OutOrderNo = allotAmountOrder.OutTradeNo }; String traceMethod = $"Bill99Util.Execute(/settle/detail)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, traceMethod, LogPhase.BEGIN); var respResult = Bill99UtilYZT.Execute <AllotAmountResultQueryRequest, AllotAmountResultQueryResponse>("/settle/detail", request); _logger.Trace(TraceType.BLL.ToString(), (respResult.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, traceMethod, LogPhase.BEGIN); if (!respResult.Success || respResult.Value == null) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "Bill99Util.Execute(...)", "快钱盈帐通:查询分账结果失败", respResult.FirstException, request); continue; } if (respResult.Value.ResponseCode == "0000") { if (respResult.Value.SettleResults == null || respResult.Value.SettleResults.Count() == 0) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "respResult.Value.SettleResults", "快钱盈帐通:查询成功但第三方返回的分账结果为空", null, respResult.Value); } else { var settleResult = respResult.Value.SettleResults.FirstOrDefault(); Boolean statusHasChanged = false; switch (settleResult.SettleStatus) { case "9": allotAmountOrder.Status = AllotAmountOrderStatus.SUCCESS.ToString(); statusHasChanged = true; break; case "8": allotAmountOrder.Status = AllotAmountOrderStatus.FAILURE.ToString(); statusHasChanged = true; break; } if (statusHasChanged) { var updateResult = _allotAmountOrderRepository.SaveChanges(); if (!updateResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_allotAmountOrderRepository)}.SaveChanges()", "快钱盈帐通:更新分账结果状态失败", updateResult.FirstException, allotAmountOrder); continue; } } successCount++; } } } return(new XResult <Int32>(successCount)); } finally { _lockProvider.UnLock(hashKey); } }
public XResult <SettlementPeriodModifyResponse> ModifySettlePeriod(SettlementPeriodModifyRequest request) { return(Bill99UtilYZT.Execute <SettlementPeriodModifyRequest, SettlementPeriodModifyResponse>("/settle/period/modify", request)); }
public XResult <AllotAmountResultQueryResponse> Query(AllotAmountResultQueryRequest request) { return(Bill99UtilYZT.Execute <AllotAmountResultQueryRequest, AllotAmountResultQueryResponse>("/settle/detail", request)); }