Files
OnboardXAdmin/SimpleAdmin.Application/Services/Onboarding/Position/OnboardingPositionService.cs
T
2026-08-24 15:32:50 +08:00

100 lines
3.6 KiB
C#

namespace SimpleAdmin.Application;
/// <summary>
/// 实现入职业务岗位业务能力。
/// </summary>
public class OnboardingPositionService : DbRepository<ObPosition>, IOnboardingPositionService
{
/// <summary>
/// 分页查询入职业务岗位。
/// </summary>
public async Task<SqlSugarPagedList<ObPosition>> Page(OnboardingPositionPageInput input)
{
return await Context.Queryable<ObPosition>()
.WhereIF(input.CompanyId.HasValue, it => it.CompanyId == input.CompanyId.Value)
.WhereIF(
!string.IsNullOrWhiteSpace(input.PositionName),
it => it.PositionName.Contains(input.PositionName) || it.PositionCode.Contains(input.PositionName))
.WhereIF(!string.IsNullOrWhiteSpace(input.Status), it => it.Status == input.Status)
.OrderByIF(!string.IsNullOrWhiteSpace(input.SortField), $"{input.SortField} {input.SortOrder}")
.OrderBy(it => it.PositionName)
.ToPagedListAsync(input.PageNum, input.PageSize);
}
/// <summary>
/// 查询指定公司下全部已启用岗位。
/// </summary>
public Task<List<ObPosition>> ListEnabled(long companyId)
{
return Context.Queryable<ObPosition>()
.Where(it => it.CompanyId == companyId && it.Status == "enable")
.OrderBy(it => it.PositionName)
.ToListAsync();
}
/// <summary>
/// 查询岗位详情。
/// </summary>
public async Task<ObPosition> Detail(BaseIdInput input)
{
return await GetByIdAsync(input.Id) ?? throw Oops.Bah("岗位不存在");
}
/// <summary>
/// 新增入职业务岗位。
/// </summary>
public async Task Add(OnboardingPositionAddInput input)
{
await EnsureCompanyExists(input.CompanyId);
await EnsureCodeUnique(input.CompanyId, input.PositionCode, 0);
await InsertAsync(input.Adapt<ObPosition>());
}
/// <summary>
/// 编辑入职业务岗位。
/// </summary>
public async Task Edit(OnboardingPositionEditInput input)
{
await Detail(new BaseIdInput { Id = input.Id });
await EnsureCompanyExists(input.CompanyId);
await EnsureCodeUnique(input.CompanyId, input.PositionCode, input.Id);
await UpdateAsync(input.Adapt<ObPosition>());
}
/// <summary>
/// 删除未被任务或正式员工引用的岗位。
/// </summary>
public async Task Delete(BaseIdListInput input)
{
if (input.Ids.Count == 0)
return;
var hasTasks = await Context.Queryable<ObOnboardingTask>()
.AnyAsync(it => input.Ids.Contains(it.PositionId));
if (hasTasks)
throw Oops.Bah("岗位已有入职任务,不能删除");
var hasEmployees = await Context.Queryable<ObEmployee>()
.AnyAsync(it => input.Ids.Contains(it.PositionId));
if (hasEmployees)
throw Oops.Bah("岗位已有正式员工,不能删除");
await DeleteByIdsAsync(input.Ids.Cast<object>().ToArray());
}
private async Task EnsureCompanyExists(long companyId)
{
var exists = await Context.Queryable<ObCompany>().AnyAsync(it => it.Id == companyId);
if (!exists)
throw Oops.Bah("所属公司不存在或已删除");
}
private async Task EnsureCodeUnique(long companyId, string code, long id)
{
var exists = await Context.Queryable<ObPosition>()
.AnyAsync(it => it.CompanyId == companyId && it.PositionCode == code && it.Id != id);
if (exists)
throw Oops.Bah("该公司下岗位编码已存在");
}
}