using Aop.Api.Domain; using Azure; using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.FriendlyException; using MediatR; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// /// 企业钱包命令处理器 /// public class EnterpriseWalletCommandHandler( IRepository rep, IRepository repEnterprise, AlipayUtils alipayUtils ) : IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler { private readonly IRepository rep = rep; private readonly IRepository repEnterprise = repEnterprise; private readonly AlipayUtils alipayUtils = alipayUtils; /// /// 开通企业钱包 /// /// /// /// public async Task Handle(OpenEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var enterprise = await repEnterprise.AsQueryable().AsNoTracking() .Where(it => it.Id == logier.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) .FirstOrDefaultAsync(); if (entity == null) { entity = new EnterpriseWallet(); entity.EnterpriseId = logier.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.Apply; await SetCode(entity); await rep.InsertAsync(entity); } else { if (entity.SignStatus == EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "已签约"); entity.SignStatus = EnumEnterpriseWalletSignStatus.Apply; await rep.UpdateAsync(entity); } var model = new AlipayUserAgreementPageSignModel(); model.ExternalLogonId = enterprise.Id.ToString(); model.PersonalProductCode = entity.PersonalProductCode; model.SignScene = entity.SignScene; model.ExternalAgreementNo = entity.Code; model.ThirdPartyType = entity.ThirdPartyType; model.ProductCode = entity.ProductCode; model.AccessParams = new AccessParams { Channel = "QRCODE" }; var response = alipayUtils.UserAgreementPageSign(model, $"/api/user/enterpriseWallet/alipayUserAgreementPageSignNotify"); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); var result = new OpenEnterpriseWalletCommandResult(); result.SignUrl = response.Body; return result; } /// /// 关闭企业钱包 /// /// /// /// public async Task Handle(CloseEnterpriseWalletCommand 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.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未签约"); var response = alipayUtils.UserAgreementUnsign(new AlipayUserAgreementUnsignModel { ExternalAgreementNo = entity.Code, PersonalProductCode = entity.PersonalProductCode, SignScene = entity.SignScene }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); entity.SignStatus = EnumEnterpriseWalletSignStatus.Stop; return entity.Id; } /// /// 企业钱包充值 /// /// /// /// /// public async Task Handle(RechargeEnterpriseWalletCommand 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.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未签约"); if (entity.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "未开通记账本"); var order = new EnterpriseWalletTransaction(); order.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; order.WalletId = entity.Id; order.Amount = request.Amount; var response = alipayUtils.FundTransPagePay(new AlipayFundTransPagePayModel { OutBizNo = order.Code, TransAmount = order.Amount.ToString(), ProductCode = "FUND_ACCOUNT_BOOK", BizScene = "SATF_DEPOSIT", Remark = "记账本充值", OrderTitle = "记账本充值", TimeExpire = DateTime.Now.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss"), PayeeInfo = new Participant { IdentityType = "ACCOUNT_BOOK_ID", Identity = entity.AccountBookId, ExtInfo = new { agreement_no = entity.AgreementNo, }.ToJson(), }, }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); order.OrderId = response.OrderId; return order.Id; } public async Task Handle(AlipayTransferCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var entity = await rep.AsQueryable() .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == EnumEnterpriseWalletAccess.Alipay) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业钱包"); var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel { OutBizNo = $"Test{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}", TransAmount = "0.01", ProductCode = "TRANS_ACCOUNT_NO_PWD", PayeeInfo = new Participant { IdentityType = "BANKCARD_ACCOUNT", Identity = "6214180000016351382", Name = "孙鹏飞", BankcardExtInfo = new BankcardExtInfo { AccountType = "2", InstName = "宁波银行" } }, PayerInfo = new Participant { IdentityType = "ALIPAY_OPEN_ID", Identity = entity.PrincipalOpenId, Name = "孙鹏飞" }, BizScene = "CAE_TRANSFER", OrderTitle = "测试代扣", Remark = "测试代扣备注" }); if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); return entity.Id; } 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); } } } }