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