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;
}
}
}