代码优化
This commit is contained in:
+20
-3
@@ -1,4 +1,4 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 入职业务岗位分页查询参数。
|
||||
@@ -10,6 +10,11 @@ public class OnboardingPositionPageInput : BasePageInput
|
||||
/// </summary>
|
||||
public long? CompanyId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 入职业务部门 Id。
|
||||
/// </summary>
|
||||
public long? DepartmentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 岗位编码。
|
||||
/// </summary>
|
||||
@@ -21,7 +26,7 @@ public class OnboardingPositionPageInput : BasePageInput
|
||||
public virtual string PositionName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 启用状态或状态筛选条件。
|
||||
/// 启用状态。
|
||||
/// </summary>
|
||||
public string Status { get; set; }
|
||||
}
|
||||
@@ -31,6 +36,18 @@ public class OnboardingPositionPageInput : BasePageInput
|
||||
/// </summary>
|
||||
public class OnboardingPositionAddInput : ObPosition
|
||||
{
|
||||
/// <summary>
|
||||
/// 所属公司 Id。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.DataAnnotations.Required(ErrorMessage = "所属公司不能为空")]
|
||||
public new long CompanyId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属部门 Id。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.DataAnnotations.Required(ErrorMessage = "所属部门不能为空")]
|
||||
public new long? DepartmentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 岗位业务编码。
|
||||
/// </summary>
|
||||
@@ -54,4 +71,4 @@ public class OnboardingPositionEditInput : OnboardingPositionAddInput
|
||||
/// </summary>
|
||||
[IdNotNull(ErrorMessage = "岗位Id不能为空")]
|
||||
public override long Id { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 定义入职业务岗位业务能力。
|
||||
@@ -9,24 +9,34 @@ public interface IOnboardingPositionService : ITransient
|
||||
/// 分页查询入职业务岗位。
|
||||
/// </summary>
|
||||
Task<SqlSugarPagedList<ObPosition>> Page(OnboardingPositionPageInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 查询指定公司下全部已启用岗位。
|
||||
/// </summary>
|
||||
Task<List<ObPosition>> ListEnabled(long companyId);
|
||||
|
||||
/// <summary>
|
||||
/// 查询指定部门下全部已启用岗位。
|
||||
/// </summary>
|
||||
Task<List<ObPosition>> ListEnabledByDepartment(long departmentId);
|
||||
|
||||
/// <summary>
|
||||
/// 查询岗位详情。
|
||||
/// </summary>
|
||||
Task<ObPosition> Detail(BaseIdInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 新增入职业务岗位。
|
||||
/// </summary>
|
||||
Task Add(OnboardingPositionAddInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 编辑入职业务岗位。
|
||||
/// </summary>
|
||||
Task Edit(OnboardingPositionEditInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 删除未被任务或正式员工引用的岗位。
|
||||
/// </summary>
|
||||
Task Delete(BaseIdListInput input);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 实现入职业务岗位业务能力。
|
||||
@@ -10,14 +10,45 @@ public class OnboardingPositionService : DbRepository<ObPosition>, IOnboardingPo
|
||||
/// </summary>
|
||||
public async Task<SqlSugarPagedList<ObPosition>> Page(OnboardingPositionPageInput input)
|
||||
{
|
||||
return await Context.Queryable<ObPosition>()
|
||||
var list = await Context.Queryable<ObPosition>()
|
||||
.WhereIF(input.CompanyId.HasValue, it => it.CompanyId == input.CompanyId.Value)
|
||||
.WhereIF(input.DepartmentId.HasValue, it => it.DepartmentId == input.DepartmentId.Value)
|
||||
.WhereIF(!string.IsNullOrWhiteSpace(input.PositionCode), it => it.PositionCode.Contains(input.PositionCode))
|
||||
.WhereIF(!string.IsNullOrWhiteSpace(input.PositionName), it => it.PositionName.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);
|
||||
|
||||
if (list.List != null && list.List.Any())
|
||||
{
|
||||
var companyIds = list.List.Select(p => p.CompanyId).Distinct().ToList();
|
||||
var departmentIds = list.List.Where(p => p.DepartmentId.HasValue).Select(p => p.DepartmentId.Value).Distinct().ToList();
|
||||
|
||||
var companies = await Context.Queryable<ObCompany>()
|
||||
.Where(c => companyIds.Contains(c.Id))
|
||||
.ToListAsync();
|
||||
var departments = departmentIds.Count == 0
|
||||
? new List<ObDepartment>()
|
||||
: await Context.Queryable<ObDepartment>().Where(d => departmentIds.Contains(d.Id)).ToListAsync();
|
||||
|
||||
var companyMap = companies.ToDictionary(c => c.Id, c => c.CompanyName);
|
||||
var departmentMap = departments.ToDictionary(d => d.Id, d => d.DepartmentName);
|
||||
|
||||
foreach (var item in list.List)
|
||||
{
|
||||
if (companyMap.TryGetValue(item.CompanyId, out var cName))
|
||||
{
|
||||
item.CompanyName = cName;
|
||||
}
|
||||
if (item.DepartmentId.HasValue && departmentMap.TryGetValue(item.DepartmentId.Value, out var dName))
|
||||
{
|
||||
item.DepartmentName = dName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -31,6 +62,17 @@ public class OnboardingPositionService : DbRepository<ObPosition>, IOnboardingPo
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询指定部门下全部已启用岗位。
|
||||
/// </summary>
|
||||
public Task<List<ObPosition>> ListEnabledByDepartment(long departmentId)
|
||||
{
|
||||
return Context.Queryable<ObPosition>()
|
||||
.Where(it => it.DepartmentId == departmentId && it.Status == "enable")
|
||||
.OrderBy(it => it.PositionName)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询岗位详情。
|
||||
/// </summary>
|
||||
@@ -44,7 +86,12 @@ public class OnboardingPositionService : DbRepository<ObPosition>, IOnboardingPo
|
||||
/// </summary>
|
||||
public async Task Add(OnboardingPositionAddInput input)
|
||||
{
|
||||
NormalizeInput(input);
|
||||
if (!input.DepartmentId.HasValue)
|
||||
throw Oops.Bah("请选择所属部门");
|
||||
|
||||
await EnsureCompanyExists(input.CompanyId);
|
||||
await EnsureDepartmentExists(input.CompanyId, input.DepartmentId.Value);
|
||||
await EnsureCodeUnique(input.CompanyId, input.PositionCode, 0);
|
||||
await InsertAsync(input.Adapt<ObPosition>());
|
||||
}
|
||||
@@ -54,8 +101,14 @@ public class OnboardingPositionService : DbRepository<ObPosition>, IOnboardingPo
|
||||
/// </summary>
|
||||
public async Task Edit(OnboardingPositionEditInput input)
|
||||
{
|
||||
await Detail(new BaseIdInput { Id = input.Id });
|
||||
NormalizeInput(input);
|
||||
if (!input.DepartmentId.HasValue)
|
||||
throw Oops.Bah("请选择所属部门");
|
||||
|
||||
var position = await Detail(new BaseIdInput { Id = input.Id });
|
||||
await EnsureScopeCanChange(position, input.CompanyId, input.DepartmentId.Value);
|
||||
await EnsureCompanyExists(input.CompanyId);
|
||||
await EnsureDepartmentExists(input.CompanyId, input.DepartmentId.Value);
|
||||
await EnsureCodeUnique(input.CompanyId, input.PositionCode, input.Id);
|
||||
await UpdateAsync(input.Adapt<ObPosition>());
|
||||
}
|
||||
@@ -78,14 +131,75 @@ public class OnboardingPositionService : DbRepository<ObPosition>, IOnboardingPo
|
||||
if (hasEmployees)
|
||||
throw Oops.Bah("岗位已有正式员工,不能删除");
|
||||
|
||||
var hasOnboardingTemplates = await Context.Queryable<ObOnboardingTemplatePosition>()
|
||||
.AnyAsync(item => input.Ids.Contains(item.PositionId));
|
||||
if (hasOnboardingTemplates)
|
||||
throw Oops.Bah("岗位已被入职模板引用,不能删除");
|
||||
|
||||
var hasContractTemplates = await Context.Queryable<ObContractTemplatePosition>()
|
||||
.AnyAsync(item => input.Ids.Contains(item.PositionId));
|
||||
if (hasContractTemplates)
|
||||
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);
|
||||
var exists = await Context.Queryable<ObCompany>()
|
||||
.AnyAsync(it => it.Id == companyId && it.Status == "enable");
|
||||
if (!exists)
|
||||
throw Oops.Bah("所属公司不存在或已删除");
|
||||
throw Oops.Bah("所属公司不存在、已删除或未启用");
|
||||
}
|
||||
|
||||
private async Task EnsureDepartmentExists(long companyId, long departmentId)
|
||||
{
|
||||
var exists = await Context.Queryable<ObDepartment>()
|
||||
.AnyAsync(it => it.Id == departmentId
|
||||
&& it.CompanyId == companyId
|
||||
&& it.Status == "enable");
|
||||
if (!exists)
|
||||
throw Oops.Bah("所属部门不存在、未启用或不属于该公司");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 标准化岗位输入并拒绝非法状态。
|
||||
/// </summary>
|
||||
private static void NormalizeInput(OnboardingPositionAddInput input)
|
||||
{
|
||||
input.PositionCode = input.PositionCode?.Trim();
|
||||
input.PositionName = input.PositionName?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(input.PositionCode)
|
||||
|| string.IsNullOrWhiteSpace(input.PositionName))
|
||||
{
|
||||
throw Oops.Bah("请填写岗位编码和岗位名称");
|
||||
}
|
||||
|
||||
if (input.Status != "enable" && input.Status != "disable")
|
||||
throw Oops.Bah("岗位状态不正确");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 已被业务配置或历史数据引用的岗位不允许直接改变公司、部门归属。
|
||||
/// </summary>
|
||||
private async Task EnsureScopeCanChange(
|
||||
ObPosition position,
|
||||
long companyId,
|
||||
long departmentId)
|
||||
{
|
||||
if (position.CompanyId == companyId && position.DepartmentId == departmentId)
|
||||
return;
|
||||
|
||||
var hasTask = await Context.Queryable<ObOnboardingTask>()
|
||||
.AnyAsync(item => item.PositionId == position.Id);
|
||||
var hasEmployee = await Context.Queryable<ObEmployee>()
|
||||
.AnyAsync(item => item.PositionId == position.Id);
|
||||
var hasOnboardingTemplate = await Context.Queryable<ObOnboardingTemplatePosition>()
|
||||
.AnyAsync(item => item.PositionId == position.Id);
|
||||
var hasContractTemplate = await Context.Queryable<ObContractTemplatePosition>()
|
||||
.AnyAsync(item => item.PositionId == position.Id);
|
||||
if (hasTask || hasEmployee || hasOnboardingTemplate || hasContractTemplate)
|
||||
throw Oops.Bah("岗位已被模板、任务或员工引用,不能直接变更所属公司、部门");
|
||||
}
|
||||
|
||||
private async Task EnsureCodeUnique(long companyId, string code, long id)
|
||||
|
||||
Reference in New Issue
Block a user