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
{
///
/// 企业费用命令处理器
///
public class EnterpriseCostCommandHandler(
IRepository repEnterpriseCost,
IRepository repEnterprise,
IRepository repEnterpriseEmployeeContract,
IRepository repElectronSignSetting,
IRepository repContractTemplate
) :
IRequestHandler
{
private readonly IRepository repEnterpriseCost = repEnterpriseCost;
private readonly IRepository repEnterprise = repEnterprise;
private readonly IRepository repEnterpriseEmployeeContract = repEnterpriseEmployeeContract;
private readonly IRepository repElectronSignSetting = repElectronSignSetting;
private readonly IRepository repContractTemplate = repContractTemplate;
///
/// 保存企业费用
///
///
///
///
///
public async Task 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;
}
}
}