From c682cd59ded8e71957a802dd4f8dcf58e0113c0f Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期四, 11 九月 2025 15:33:30 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 266 insertions(+), 33 deletions(-) diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs index 140759f..a2e4c86 100644 --- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs +++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Queries/EnterpriseWalletQueryHandler.cs @@ -1,9 +1,13 @@ -锘縰sing FlexJobApi.Core; +锘縰sing Aop.Api.Domain; +using Azure; +using FlexJobApi.Core; using Furion.DatabaseAccessor; +using Furion.DistributedIDGenerator; using Furion.FriendlyException; using Mapster; using MediatR; using Microsoft.EntityFrameworkCore; +using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; @@ -17,11 +21,18 @@ /// </summary> public class EnterpriseWalletQueryHandler( IRepository<EnterpriseWallet> rep, + IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction, + IRepository<EnterpriseWalletExpandindirectOrder> repEnterpriseWalletExpandindirectOrder, + IRepository<Enterprise> repEnterprise, AlipayUtils alipayUtils ) : - IRequestHandler<GetEnterpriseWalletQuery, GetEnterpriseWalletQueryResult> + IRequestHandler<GetEnterpriseWalletQuery, GetEnterpriseWalletQueryResult>, + IRequestHandler<GetEnterpriseWalletTransactionQuery, GetEnterpriseWalletTransactionQueryResult> { private readonly IRepository<EnterpriseWallet> rep = rep; + private readonly IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction = repEnterpriseWalletTransaction; + private readonly IRepository<EnterpriseWalletExpandindirectOrder> repEnterpriseWalletExpandindirectOrder = repEnterpriseWalletExpandindirectOrder; + private readonly IRepository<Enterprise> repEnterprise = repEnterprise; private readonly AlipayUtils alipayUtils = alipayUtils; /// <summary> @@ -30,44 +41,266 @@ /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> + [UnitOfWork(false)] public async Task<GetEnterpriseWalletQueryResult> Handle(GetEnterpriseWalletQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); - var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) - .FirstOrDefaultAsync(); - if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); - if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Apply) + if (request.EnterpriseId == null || logier.Type == EnumUserType.Enterprise) { - var response = alipayUtils.UserAgreementQuery(new Aop.Api.Domain.AlipayUserAgreementQueryModel - { - PersonalProductCode = entity.PersonalProductCode, - SignScene = entity.SignScene, - ExternalAgreementNo = entity.Code, - ThirdPartyType = entity.ThirdPartyType, - }); - if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); - entity.AgreementNo = response.AgreementNo; - entity.SignTime = response.SignTime.ToDateTime(); - entity.ValidTime = response.ValidTime.ToDateTime(); - entity.InvalidTime = response.InvalidTime.ToDateTime(); - entity.SignStatus = response.Status == "TEMP" - ? EnumEnterpriseWalletSignStatus.Apply - : response.Status == "NORMAL" - ? EnumEnterpriseWalletSignStatus.Normal - : response.Status == "STOP" - ? EnumEnterpriseWalletSignStatus.Stop - : throw Oops.Oh(EnumErrorCodeType.s510, "鐘舵�佸紓甯�"); - entity.PricipalType = response.PricipalType; - entity.AlipayLogonId = response.AlipayLogonId; - entity.PrincipalId = response.PrincipalId; - entity.PrincipalOpenId = response.PrincipalOpenId; - entity.ZmOpenId = response.ZmOpenId; - entity.CreditAuthMode = response.CreditAuthMode; - await rep.UpdateAsync(entity); + request.EnterpriseId = logier.EnterpriseId; } + var enterprise = repEnterprise.AsQueryable().AsNoTracking() + .Where(it => it.Id == request.EnterpriseId) + .FirstOrDefault(); + if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟"); + var entity = await rep.AsQueryable() + .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access) + .FirstOrDefaultAsync(); + if (entity == null) + { + entity = new EnterpriseWallet(); + entity.EnterpriseId = request.EnterpriseId!.Value; + entity.Access = EnumEnterpriseWalletAccess.Alipay; + entity.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P"; + entity.SignScene = "INDUSTRY|SATF_ACC"; + entity.ThirdPartyType = "PARTNER"; + entity.ProductCode = "FUND_SAFT_SIGN_WITHHOLDING"; + entity.SignStatus = EnumEnterpriseWalletSignStatus.Wait; + await SetCode(entity); + await rep.InsertAsync(entity); + + return new GetEnterpriseWalletQueryResult + { + Id = entity.Id, + Code = entity.Code, + Access = request.Access, + SignStatus = EnumEnterpriseWalletSignStatus.Wait, + ExpandindirectOrderStatus = EnumEnterpriseWalletExpandindirectOrderStatus.Wait, + }; + } + var update = false; + if (entity.Access == EnumEnterpriseWalletAccess.Alipay) + { + if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Apply) + { + var response = alipayUtils.UserAgreementQuery(new Aop.Api.Domain.AlipayUserAgreementQueryModel + { + PersonalProductCode = entity.PersonalProductCode, + SignScene = entity.SignScene, + ExternalAgreementNo = entity.Code, + ThirdPartyType = entity.ThirdPartyType, + }); + if (!response.IsError) + { + entity.AgreementNo = response.AgreementNo; + entity.SignTime = response.SignTime.ToDateTime(); + entity.ValidTime = response.ValidTime.ToDateTime(); + entity.InvalidTime = response.InvalidTime.ToDateTime(); + entity.SignStatus = response.Status == "TEMP" + ? EnumEnterpriseWalletSignStatus.Apply + : response.Status == "NORMAL" + ? EnumEnterpriseWalletSignStatus.Normal + : response.Status == "STOP" + ? EnumEnterpriseWalletSignStatus.Stop + : throw Oops.Oh(EnumErrorCodeType.s510, "鐘舵�佸紓甯�"); + entity.PricipalType = response.PricipalType; + entity.AlipayLogonId = response.AlipayLogonId; + entity.PrincipalId = response.PrincipalId; + entity.PrincipalOpenId = response.PrincipalOpenId; + entity.ZmOpenId = response.ZmOpenId; + entity.CreditAuthMode = response.CreditAuthMode; + update = true; + } + else + { + entity.ErrorCode = response.Code; + entity.FailReason = response.SubMsg ?? response.Msg; + update = true; + } + } + + if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal && entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) + { + var response = alipayUtils.FundAccountbookCreate(new Aop.Api.Domain.AlipayFundAccountbookCreateModel + { + MerchantUserId = entity.Code, + MerchantUserType = "BUSINESS_ORGANIZATION", + SceneCode = "SATF_FUND_BOOK", + ExtInfo = new + { + agreement_no = entity.AgreementNo, + cert_no = enterprise.SocietyCreditCode + }.ToJson() + }); + if (!response.IsError) + { + entity.AccountBookId = response.AccountBookId; + entity.BankAccName = response.ExtCardInfo.BankAccName; + entity.CardBank = response.ExtCardInfo.CardBank; + entity.CardBranch = response.ExtCardInfo.CardBranch; + entity.CardDeposit = response.ExtCardInfo.CardDeposit; + entity.CardLocation = response.ExtCardInfo.CardLocation; + entity.CardNo = response.ExtCardInfo.CardNo; + entity.AccountBookStatus = response.ExtCardInfo.Status == "A" + ? EnumEnterpriseWalletAccountBookStatus.Normal + : EnumEnterpriseWalletAccountBookStatus.Exception; + update = true; + } + else + { + entity.ErrorCode = response.Code; + entity.FailReason = response.SubMsg ?? response.Msg; + update = true; + } + } + + if (entity.AccountBookStatus == EnumEnterpriseWalletAccountBookStatus.Normal) + { + 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); + entity.Balance = response.AvailableAmount.ToDecimal() ?? 0; + update = true; + } + } + + if (update) + { + await rep.UpdateNowAsync(entity); + } + var model = entity.Adapt<GetEnterpriseWalletQueryResult>(); + + var expandindirectOrder = await repEnterpriseWalletExpandindirectOrder.AsQueryable() + .Include(it => it.Files) + .OrderByDescending(it => it.CreatedTime) + .Where(it => it.WalletId == model.Id) + .FirstOrDefaultAsync(); + if (expandindirectOrder != null) + { + if (expandindirectOrder.OrderStatus == EnumEnterpriseWalletExpandindirectOrderStatus.PROCESSING) + { + var response = alipayUtils.FundExpandindirectOrderQuery(new Aop.Api.Domain.AlipayFundExpandindirectOrderQueryModel + { + BizScene = expandindirectOrder.BizScene, + OrderId = expandindirectOrder.OrderId, + OutBizNo = expandindirectOrder.OutBizNo, + ProductCode = expandindirectOrder.ProductCode, + }); + if (!response.IsError) + { + expandindirectOrder.Status = response.Status; + expandindirectOrder.OrderStatus = expandindirectOrder.Status.ToEnum<EnumEnterpriseWalletExpandindirectOrderStatus>("鏈瘑鍒殑鐘舵��")!.Value; + expandindirectOrder.TaskFinishTime = response.TaskFinishTime.ToDateTime(); + expandindirectOrder.RiskReviewRemark = response.RiskReviewRemark; + } + else + { + expandindirectOrder.RiskReviewRemark = response.SubMsg ?? response.Msg; + } + await repEnterpriseWalletExpandindirectOrder.UpdateNowAsync(expandindirectOrder); + } + + model.Name = expandindirectOrder.Name; + model.Identity = expandindirectOrder.Identity; + model.Scene = expandindirectOrder.Scene; + model.SceneDirections = expandindirectOrder.SceneDirections; + model.TaskFinishTime = expandindirectOrder.TaskFinishTime; + model.SitesInfo = expandindirectOrder.Sites?.JsonTo<GetEnterpriseWalletExpandindirectOrderQueryResultSites>(); + model.Files = expandindirectOrder.Files?.Adapt<List<GetEnterpriseWalletExpandindirectOrderQueryResultFile>>() ?? new List<GetEnterpriseWalletExpandindirectOrderQueryResultFile>(); + model.ExpandindirectOrderStatus = expandindirectOrder.OrderStatus; + } + else + { + model.ExpandindirectOrderStatus = EnumEnterpriseWalletExpandindirectOrderStatus.Wait; + } + return model; } + + private async Task SetCode(EnterpriseWallet entity) + { + entity.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; + var exist = await rep.AsQueryable().AsNoTracking() + .AnyAsync(it => it.Code == entity.Code); + if (exist) + { + await SetCode(entity); + } + } + + /// <summary> + /// 鏌ヨ浼佷笟閽卞寘浜ゆ槗璇︽儏 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<GetEnterpriseWalletTransactionQueryResult> Handle(GetEnterpriseWalletTransactionQuery request, CancellationToken cancellationToken) + { + var entity = await repEnterpriseWalletTransaction.AsQueryable() + .Where(it => it.Id == request.Id) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浜ゆ槗"); + var response = alipayUtils.FundTransCommonQuery(new Aop.Api.Domain.AlipayFundTransCommonQueryModel + { + ProductCode = entity.ProductCode, + BizScene = entity.BizScene, + OutBizNo = entity.Code + }); + if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); + entity.OrderId = response.OrderId; + entity.InflowSettleSerialNo = response.InflowSettleSerialNo; + entity.SettleSerialNo = response.SettleSerialNo; + entity.ReceiverOpenId = response.ReceiverOpenId; + entity.ReceiverUserId = response.ReceiverUserId; + entity.PayFundOrderId = response.PayFundOrderId; + entity.ArrivalTimeEnd = response.ArrivalTimeEnd.ToDateTime(); + entity.OrderFee = response.OrderFee.ToDecimal(); + entity.ErrorCode = response.ErrorCode; + entity.FailReason = response.FailReason; + entity.FailInstReason = response.FailInstReason; + entity.FailInstName = response.FailInstName; + entity.FailInstErrorCode = response.FailInstErrorCode; + entity.SubStatus = response.SubStatus; + entity.TransDate = response.PayDate.ToDateTime(); + entity.Status = response.Status; + entity.TransactionStatus = response.Status == "SUCCESS" + ? EnumWalletTransactionStatus.Success + : response.Status == "DEALING" + ? EnumWalletTransactionStatus.Dealing + : response.Status == "REFUND" + ? EnumWalletTransactionStatus.Refund + : response.Status == "FAIL" + ? EnumWalletTransactionStatus.Fail + : throw Oops.Oh(EnumErrorCodeType.s510, $"鏈瘑鍒殑鐘舵�侊細{response.Status}"); + await repEnterpriseWalletTransaction.UpdateAsync(entity); + if (entity.TransactionStatus == EnumWalletTransactionStatus.Success) + { + await GetBalance(entity.WalletId); + } + return entity.Adapt<GetEnterpriseWalletTransactionQueryResult>(); + } + + private async Task GetBalance(Guid id) + { + var entity = await rep.AsQueryable() + .Where(it => it.Id == id) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); + 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); + entity.Balance = response.AvailableAmount.ToDecimal() ?? 0; + await rep.UpdateNowAsync(entity); + } + } } -- Gitblit v1.9.1