using System.ComponentModel.DataAnnotations;
using Fake.Auditing;
using Fake.UnitOfWork;
using InterfaceForward.Application.Contracts.Dtos.ServiceProvider;
using InterfaceForward.Application.Helpers;
using InterfaceForward.Domain.Shared;
using InterfaceForward.Domain.Shared.Enum;
using InterfaceForward.Repositories.ServiceProvider.Entitys;
using InterfaceForward.Repositories.ServiceProvider.Services;
using Microsoft.AspNetCore.Mvc;
namespace InterfaceForward.Application.Services.Parameter;
///
/// 固定参数配置
///
[ApiExplorerSettings(GroupName = "参数服务")]
public class FixedParameterService : ApplicationService, IAuditingEnabled
{
private readonly IFixedParameterRepository _fixedParameterRepository;
private readonly IServiceProviderRepository _serviceProviderRepository;
///
public FixedParameterService(
IFixedParameterRepository fixedParameterRepository,
IServiceProviderRepository serviceProviderRepository)
{
_fixedParameterRepository = fixedParameterRepository;
_serviceProviderRepository = serviceProviderRepository;
}
///
/// 获取固定参数列表
///
/// 服务商id
/// 接口id
///
///
[HttpGet("FixedParameter/GetFixedParameterList")]
public async Task> GetFixedParameterList([Required] int serviceProviderId,
int? interfaceId)
{
var list = interfaceId == null
? await _fixedParameterRepository.GetListAsync(x => x.ServiceProviderId == serviceProviderId)
: await _fixedParameterRepository.GetListAsync(x =>
x.ServiceProviderId == serviceProviderId || x.InterfaceId == interfaceId);
var res = ObjectMapper.Map, List>(list);
for (var i = 0; i < res.Count; i++)
{
var item = res[i];
item.FieldPositionList = string.IsNullOrWhiteSpace(list[i].FieldPositions)
? new List()
: list[i].FieldPositions.Split(",").Select(Enum.Parse).ToList();
item.DisableEdit = interfaceId != null && list[i].ServiceProviderId != null;
}
return res.OrderByDescending(x => x.DisableEdit).ToList();
}
///
/// 维护固定参数
///
///
///
[HttpPost("FixedParameter/MaintainParameter")]
public virtual async Task MaintainParameterAsync([FromBody] FixedParameterInput input)
{
// 校验服务商是否存在
if (!await _serviceProviderRepository.IsAnyAsync(x => x.Id == input.ServiceProviderId))
{
throw new BusinessException("服务商不存在");
}
// 校验账户字段是否合法
await ValidationAccountFieldAsync(input);
using var ts = TransacationHelper.GetReadCommitted();
var delIds = input.Items
.Where(x => x.Options == OptionType.删除)
.Select(x => x.Id).ToArray();
await _fixedParameterRepository.SoftDeleteAsync(x => delIds.Contains(x.Id));
await UpdateFieldAsync(input);
await CreateFieldAsync(input);
ts.Complete();
return true;
}
///
/// 更新字段
///
///
///
private async Task UpdateFieldAsync(FixedParameterInput input)
{
using var ts = TransacationHelper.GetReadCommitted();
foreach (var item in input.Items.Where(x => x.Options == OptionType.修改).ToList())
{
if (input.InterfaceId != null)
{
if (await _fixedParameterRepository.IsAnyAsync(x =>
input.InterfaceId == x.InterfaceId &&
x.FieldName == item.FieldName && x.Id != item.Id))
{
throw new BusinessException($"参数{item.FieldName}已存在");
}
}
else
{
if (await _fixedParameterRepository.IsAnyAsync(x =>
input.ServiceProviderId == x.ServiceProviderId &&
x.FieldName == item.FieldName && x.Id != item.Id))
{
throw new BusinessException($"参数{item.FieldName}已存在");
}
}
var entity = ObjectMapper.Map(item);
entity.FieldPositions = item.FieldPositionList.JoinAsString(",");
await _fixedParameterRepository.UpdateFieldAsync(entity);
}
ts.Complete();
}
///
/// 创建字段
///
///
///
private async Task CreateFieldAsync(FixedParameterInput input)
{
foreach (var item in input.Items.Where(x => x.Options == OptionType.新增))
{
if ((input.InterfaceId != null &&
await _fixedParameterRepository.IsAnyAsync(x =>
input.InterfaceId == x.InterfaceId && x.FieldName == item.FieldName))
|| (input.InterfaceId == null &&
await _fixedParameterRepository.IsAnyAsync(x =>
input.ServiceProviderId == x.ServiceProviderId && x.FieldName == item.FieldName))
)
{
throw new BusinessException($"参数{item.FieldName}已存在");
}
var entity = ObjectMapper.Map(item);
if (input.InterfaceId != null)
{
entity.InterfaceId = input.InterfaceId;
}
else
{
entity.ServiceProviderId = input.ServiceProviderId;
}
entity.FieldPositions = item.FieldPositionList.JoinAsString(",");
await _fixedParameterRepository.InsertAsync(entity);
}
}
private async Task ValidationAccountFieldAsync(FixedParameterInput input)
{
var accountFields =
await _serviceProviderRepository.GetAccountParameterDropdownListAsync(input.ServiceProviderId);
foreach (var item in input.Items.Where(x => x.Options == OptionType.新增 || x.Options == OptionType.修改))
{
if (item.FieldValue.Equals(GlobalConst.FromAccount))
{
var fieldName = item.FieldName;
if (item.FieldPositionList.Contains(FieldPosition.Body))
{
var idx = fieldName.LastIndexOf('.');
if (idx != -1 && idx + 1 < fieldName.Length)
{
fieldName = fieldName.Substring(idx + 1);
}
}
if (accountFields.All(x => x.Value != fieldName))
{
throw new BusinessException($"账户中不存在字段:{fieldName}");
}
}
}
}
}