Ejemplo n.º 1
0
        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
                }
            }));
        }
Ejemplo n.º 2
0
        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()
            }));
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 public XResult <PersonalCancelBoundCardResponse> CancelBoundCard(PersonalCancelBoundCardRequest request)
 {
     return(Bill99UtilYZT.Execute <PersonalCancelBoundCardRequest, PersonalCancelBoundCardResponse>("/person/bankcard/cancel", request));
 }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
        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);
            }
        }
Ejemplo n.º 10
0
        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);
            }
        }
Ejemplo n.º 11
0
        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)
            }));
        }
Ejemplo n.º 12
0
        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);
            }
        }
Ejemplo n.º 13
0
        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);
            }
        }
Ejemplo n.º 14
0
        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);
            }
        }
Ejemplo n.º 15
0
 public XResult <SettlementPeriodModifyResponse> ModifySettlePeriod(SettlementPeriodModifyRequest request)
 {
     return(Bill99UtilYZT.Execute <SettlementPeriodModifyRequest, SettlementPeriodModifyResponse>("/settle/period/modify", request));
 }
Ejemplo n.º 16
0
 public XResult <AllotAmountResultQueryResponse> Query(AllotAmountResultQueryRequest request)
 {
     return(Bill99UtilYZT.Execute <AllotAmountResultQueryRequest, AllotAmountResultQueryResponse>("/settle/detail", request));
 }