sunpengfei
2 天以前 8f87da840cc16936e77402cf229237023098382b
FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs
@@ -19,12 +19,13 @@
    /// </summary>
    public class EnterpriseWalletCommandHandler(
            IRepository<EnterpriseWallet> rep,
            IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction,
            IRepository<Enterprise> repEnterprise,
            AlipayUtils alipayUtils
        ) :
        IRequestHandler<OpenEnterpriseWalletCommand, OpenEnterpriseWalletCommandResult>,
        IRequestHandler<CloseEnterpriseWalletCommand, Guid>,
        IRequestHandler<AlipayTransferCommand, Guid>
        IRequestHandler<RechargeEnterpriseWalletCommand, RechargeEnterpriseWalletCommandResult>
    {
        private readonly IRepository<EnterpriseWallet> rep = rep;
        private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
@@ -39,19 +40,26 @@
        public async Task<OpenEnterpriseWalletCommandResult> Handle(OpenEnterpriseWalletCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            if (logier.Type == EnumUserType.Enterprise)
            {
                request.EnterpriseId = logier.EnterpriseId;
            }
            if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请填写企业Id");
            var enterprise = await repEnterprise.AsQueryable().AsNoTracking()
                .Where(it => it.Id == logier.EnterpriseId)
                .Where(it => it.Id == request.EnterpriseId)
                .FirstOrDefaultAsync();
            if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业");
            if (!enterprise.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "请先实名");
            var entity = await rep.AsQueryable()
                .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access)
                .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access)
                .FirstOrDefaultAsync();
            if (entity == null)
            {
                entity = new EnterpriseWallet();
                entity.EnterpriseId = logier.EnterpriseId!.Value;
                entity.EnterpriseId = request.EnterpriseId!.Value;
                entity.Access = EnumEnterpriseWalletAccess.Alipay;
                entity.Account = request.Account;
                entity.MerchantId = request.MerchantId;
                entity.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P";
                entity.SignScene = "INDUSTRY|SATF_ACC";
                entity.ThirdPartyType = "PARTNER";
@@ -63,6 +71,8 @@
            else
            {
                if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "已签约");
                entity.Account = request.Account;
                entity.MerchantId = request.MerchantId;
                entity.SignStatus = EnumEnterpriseWalletSignStatus.Apply;
                await rep.UpdateAsync(entity);
            }
@@ -93,8 +103,13 @@
        public async Task<Guid> Handle(CloseEnterpriseWalletCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            if (logier.Type == EnumUserType.Enterprise)
            {
                request.EnterpriseId = logier.EnterpriseId;
            }
            if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请填写企业Id");
            var entity = await rep.AsQueryable()
                .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access)
                .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access)
                .FirstOrDefaultAsync();
            if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业钱包");
            if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未签约");
@@ -109,41 +124,93 @@
            return entity.Id;
        }
        public async Task<Guid> Handle(AlipayTransferCommand request, CancellationToken cancellationToken)
        /// <summary>
        /// 企业钱包充值
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        [UnitOfWork(false)]
        public async Task<RechargeEnterpriseWalletCommandResult> Handle(RechargeEnterpriseWalletCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            if (logier.Type == EnumUserType.Enterprise)
            {
                request.EnterpriseId = logier.EnterpriseId;
            }
            if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请填写企业Id");
            var entity = await rep.AsQueryable()
                .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == EnumEnterpriseWalletAccess.Alipay)
                .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access)
                .FirstOrDefaultAsync();
            if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业钱包");
            var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel
            if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未签约");
            if (entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未开通记账本");
            await GetBalance(entity);
            var order = new EnterpriseWalletTransaction();
            order.Type = EnumEnterpriseWalletTransactionType.Recharge;
            order.WalletId = entity.Id;
            order.Amount = request.Amount;
            order.Remark = request.Remark ?? "充值";
            order.ProductCode = "FUND_ACCOUNT_BOOK";
            order.BizScene = "SATF_DEPOSIT";
            order.TransactionStatus = EnumWalletTransactionStatus.WaitSubmit;
            order.Balance = entity.Balance;
            order.OperatorUserId = logier.Id;
            order.OperatorTime = DateTime.Now;
            await SetCode(order);
            await repEnterpriseWalletTransaction.InsertAsync(order);
            var response = alipayUtils.FundTransPagePay(new AlipayFundTransPagePayModel
            {
                OutBizNo = $"Test{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}",
                TransAmount = "0.01",
                ProductCode = "TRANS_ACCOUNT_NO_PWD",
                OutBizNo = order.Code,
                TransAmount = order.Amount.ToString(),
                ProductCode = order.ProductCode,
                BizScene = order.BizScene,
                Remark = order.Remark,
                OrderTitle = order.Remark,
                TimeExpire = DateTime.Now.AddMinutes(15).ToString("yyyy-MM-dd HH:mm"),
                PayeeInfo = new Participant
                {
                    IdentityType = "BANKCARD_ACCOUNT",
                    Identity = "6214180000016351382",
                    Name = "孙鹏飞",
                    BankcardExtInfo = new BankcardExtInfo
                    IdentityType = "ACCOUNT_BOOK_ID",
                    Identity = entity.AccountBookId,
                    ExtInfo = new
                    {
                        AccountType = "2",
                        InstName = "宁波银行"
                    }
                        agreement_no = entity.AgreementNo,
                    }.ToJson(),
                },
                PayerInfo = new Participant
                {
                    IdentityType = "ALIPAY_OPEN_ID",
                    Identity = entity.PrincipalOpenId,
                    Name = "孙鹏飞"
                },
                BizScene = "CAE_TRANSFER",
                OrderTitle = "测试代扣",
                Remark = "测试代扣备注"
            }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify");
            if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
            order.TransactionStatus = EnumWalletTransactionStatus.WaitPay;
            await repEnterpriseWalletTransaction.UpdateAsync(order);
            return new RechargeEnterpriseWalletCommandResult
            {
                PayUrl = response.Body
            };
        }
        private async Task GetBalance(EnterpriseWallet entity)
        {
            var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel
            {
                AccountBookId = entity.AccountBookId,
                SceneCode = "SATF_FUND_BOOK",
                MerchantUserId = entity.Code,
            });
            if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg);
            return entity.Id;
            entity.Balance = response.AvailableAmount.ToDecimal() ?? 0;
            await rep.UpdateNowAsync(entity);
        }
        private async Task SetCode(EnterpriseWalletTransaction entity)
        {
            entity.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
            var exist = await repEnterpriseWalletTransaction.AsQueryable().AsNoTracking()
                .AnyAsync(it => it.Code == entity.Code);
            if (exist)
            {
                await SetCode(entity);
            }
        }
        private async Task SetCode(EnterpriseWallet entity)