using FlexJobApi.Core;
|
using Furion.DatabaseAccessor;
|
using Furion.FriendlyException;
|
using MediatR;
|
using Microsoft.EntityFrameworkCore;
|
using System;
|
using System.Collections.Generic;
|
using System.Diagnostics.Contracts;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace FlexJobApi.UserServer.Application
|
{
|
/// <summary>
|
/// 企业费用命令处理器
|
/// </summary>
|
public class EnterpriseCostCommandHandler(
|
IRepository<EnterpriseCost> repEnterpriseCost,
|
IRepository<Enterprise> repEnterprise,
|
IRepository<EnterpriseEmployeeContract> repEnterpriseEmployeeContract,
|
IRepository<ElectronSignSetting> repElectronSignSetting,
|
IRepository<ContractTemplate> repContractTemplate
|
) :
|
IRequestHandler<SaveEnterpriseCostCommand, Guid>
|
{
|
private readonly IRepository<EnterpriseCost> repEnterpriseCost = repEnterpriseCost;
|
private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
|
private readonly IRepository<EnterpriseEmployeeContract> repEnterpriseEmployeeContract = repEnterpriseEmployeeContract;
|
private readonly IRepository<ElectronSignSetting> repElectronSignSetting = repElectronSignSetting;
|
private readonly IRepository<ContractTemplate> repContractTemplate = repContractTemplate;
|
|
/// <summary>
|
/// 保存企业费用
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
/// <exception cref="NotImplementedException"></exception>
|
public async Task<Guid> Handle(SaveEnterpriseCostCommand request, CancellationToken cancellationToken)
|
{
|
var cost = await repEnterpriseCost.AsQueryable()
|
.Where(it =>
|
it.EnterpriseId == request.EnterpriseId
|
&& it.Type == request.Type
|
&& it.EnterpriseEmployeeContractId == request.EnterpriseEmployeeContractId)
|
.FirstOrDefaultAsync();
|
var add = false;
|
if (cost == null)
|
{
|
cost = new EnterpriseCost
|
{
|
EnterpriseId = request.EnterpriseId,
|
Type = request.Type,
|
EnterpriseEmployeeContractId = request.EnterpriseEmployeeContractId,
|
};
|
add = true;
|
}
|
else
|
{
|
cost.Status = request.Status;
|
}
|
if (cost.Amount == null)
|
{
|
if (request.Type == EnumEnterpriseCostType.ElectronSign && request.EnterpriseEmployeeContractId.HasValue)
|
{
|
SaveEnterpriseCostCommandElectronSignSetting? setting = null;
|
if (request.ContractTemplateId.HasValue)
|
{
|
setting = await (from ess in repElectronSignSetting.AsQueryable().AsNoTracking()
|
join ct in repContractTemplate.AsQueryable().AsNoTracking() on ess.Access equals ct.Access
|
where ct.Id == request.ContractTemplateId
|
select new SaveEnterpriseCostCommandElectronSignSetting
|
{
|
MergeSignCost = ess.MergeSignCost,
|
SignCost = ess.SignCost,
|
}).FirstOrDefaultAsync();
|
}
|
else
|
{
|
setting = await (from ess in repElectronSignSetting.AsQueryable().AsNoTracking()
|
join ct in repContractTemplate.AsQueryable().AsNoTracking() on ess.Access equals ct.Access
|
join eec in repEnterpriseEmployeeContract.AsQueryable().AsNoTracking() on ct.Id equals eec.ContractTemplateId
|
where eec.Id == request.EnterpriseEmployeeContractId
|
select new SaveEnterpriseCostCommandElectronSignSetting
|
{
|
MergeSignCost = ess.MergeSignCost,
|
SignCost = ess.SignCost,
|
}).FirstOrDefaultAsync();
|
}
|
if (setting == null) throw Oops.Oh(EnumErrorCodeType.s404, "电子签配置");
|
cost.Amount = setting.MergeSignCost ?? setting.SignCost;
|
}
|
if (request.Type == EnumEnterpriseCostType.SMS)
|
{
|
cost.Amount = await repEnterprise.AsQueryable().AsNoTracking()
|
.Where(it => it.Id == request.EnterpriseId)
|
.Select(it => it.SmsCost)
|
.FirstOrDefaultAsync();
|
}
|
}
|
if (add)
|
{
|
await repEnterpriseCost.UpdateAsync(cost);
|
}
|
else
|
{
|
await repEnterpriseCost.InsertAsync(cost);
|
}
|
return cost.Id;
|
}
|
}
|
}
|