using Aop.Api.Domain; using Azure; using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.FriendlyException; using Furion.HttpRemote; using Mapster; using MediatR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// /// 支付宝资金二级商户KYB代进件 /// public class AlipayFundExpandindirectCommandHandler( IOptions options, AlipayUtils alipayUtils, IHttpRemoteService httpRemoteService, IRepository rep ) : IRequestHandler, IRequestHandler, IRequestHandler { private readonly IOptions options = options; private readonly AlipayUtils alipayUtils = alipayUtils; private readonly IHttpRemoteService httpRemoteService = httpRemoteService; private readonly IRepository rep = rep; /// /// 支付宝资金二级商户KYB代进件 /// /// /// /// [UnitOfWork(false)] public async Task Handle(AlipayFundExpandindirectCreateCommand request, CancellationToken cancellationToken) { AlipayFundExpandindirectOrder? entity; if (request.Id.HasValue) { entity = await rep.AsQueryable() .Where(it => it.Id == request.Id) .FirstOrDefaultAsync(cancellationToken); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "代进件单"); } else { entity = new AlipayFundExpandindirectOrder(); } if (request.SceneImageOssUrl.IsNotNull() && entity.SceneImageOssUrl != request.SceneImageOssUrl) { entity.SceneImage = await GetAlipayImageIdAsync(request, request.SceneImageOssUrl); } if (request.SceneQualificationText.IsNotNull()) { entity.SceneQualificationImage = request.SceneQualificationText; } else if (request.SceneQualificationImageOssUrl.IsNotNull() && entity.SceneQualificationImageOssUrl != request.SceneQualificationImageOssUrl) { entity.SceneQualificationImage = await GetAlipayImageIdAsync(request, request.SceneQualificationImageOssUrl); } entity.Sites = request.SitesInfo.ToJson(); request.Adapt(entity); if (request.Id.HasValue) { await rep.UpdateNowAsync(entity); } else { await rep.InsertNowAsync(entity); } var model = entity.Adapt(); var result = alipayUtils.FundExpandindirectCreate(model, $"{options.Value.NotifyUrl}/api/user/enterpriseWallet/alipayFundExpandindirectCreateNotify"); if (result.IsError) { entity.RiskReviewRemark = result.Msg; } entity.TaskFinishTime = result.TaskFinishTime; entity.OrderId = result.OrderId; entity.Status = result.Status; await rep.UpdateNowAsync(entity); if (result.IsError) { throw Oops.Oh(EnumErrorCodeType.s510, result.Msg); } return entity.Id; } /// /// 支付宝资金二级商户KYB代进件单取消接口 /// /// /// /// /// public async Task Handle(AlipayFundExpandindirectOrderCancelCommand request, CancellationToken cancellationToken) { var entity = await rep.AsQueryable() .Where(it => it.Id == request.Id) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "代进件单"); var result = alipayUtils.FundExpandindirectOrderCancel(new AlipayFundExpandindirectOrderCancelModel { BizScene = entity.BizScene, OrderId = entity.OrderId, OutBizNo = entity.OutBizNo, ProductCode = entity.ProductCode, }); if (result.IsError) throw Oops.Oh(EnumErrorCodeType.s510, result.Msg); result.Status = result.Status; await rep.UpdateAsync(entity); return entity.Id; } /// /// 支付宝资金二级商户KYB代进件状态通知 /// /// /// /// public Task Handle(AlipayFundExpandindirectCreateNotifyCommand request, CancellationToken cancellationToken) { return Task.FromResult(Guid.Empty); } private async Task GetAlipayImageIdAsync(AlipayFundExpandindirectCreateCommand request, string ossUrl) { var url = AliyunOSSUtils.GetUrl(ossUrl); var bytes = await httpRemoteService.GetAsByteArrayAsync(url); var imageType = url.Substring(url.LastIndexOf(".") + 1); var fileName = url.Substring(url.LastIndexOf("/") + 1); var result = alipayUtils.FundExpandindirectImageUpload(new Aop.Api.Request.AlipayFundExpandindirectImageUploadRequest { ProductCode = request.ProductCode, BizScene = request.BizScene, ImageType = imageType, ImageContent = new Aop.Api.Util.FileItem(fileName, bytes) }); if (result.IsError) throw Oops.Oh(EnumErrorCodeType.s510, result.Msg); return result.ImageId; } } }