Files
2026-09-10 16:43:11 +08:00

152 lines
5.8 KiB
C#

namespace SimpleAdmin.Application;
/// <summary>
/// 实现合同变量字典的查询和维护。
/// </summary>
public class OnboardingVariableDefinitionService : IOnboardingVariableDefinitionService
{
private readonly SqlSugarScope _db;
private readonly IOnboardingDataPermissionService _dataPermission;
/// <summary>
/// 初始化合同变量字典服务。
/// </summary>
public OnboardingVariableDefinitionService(IOnboardingDataPermissionService dataPermission)
{
_db = DbContext.DB;
_dataPermission = dataPermission;
}
/// <inheritdoc />
public async Task<SqlSugarPagedList<ObVariableDefinition>> Page(OnboardingVariableDefinitionPageInput input)
{
return await _db.Queryable<ObVariableDefinition>()
.WhereIF(
!string.IsNullOrWhiteSpace(input.Keyword),
item => item.VariableCode.Contains(input.Keyword)
|| item.VariableName.Contains(input.Keyword))
.WhereIF(
!string.IsNullOrWhiteSpace(input.VariableCategory),
item => item.VariableCategory == input.VariableCategory)
.OrderBy(it => it.SortCode)
.OrderBy(it => it.Id)
.ToPagedListAsync(input.PageNum, input.PageSize);
}
/// <inheritdoc />
public async Task<List<ObVariableDefinition>> ListAll()
{
return await _db.Queryable<ObVariableDefinition>()
.OrderBy(it => it.SortCode)
.OrderBy(it => it.Id)
.ToListAsync();
}
/// <inheritdoc />
public async Task Add(OnboardingVariableDefinitionAddInput input)
{
NormalizeAndValidate(input);
var exists = await _db.Queryable<ObVariableDefinition>()
.AnyAsync(item => item.VariableCode == input.VariableCode);
if (exists)
throw Oops.Bah($"变量编码“{input.VariableCode}”已存在");
var entity = input.Adapt<ObVariableDefinition>();
entity.IsBuiltIn = false;
await _db.Insertable(entity).ExecuteCommandAsync();
}
/// <inheritdoc />
public async Task Edit(OnboardingVariableDefinitionEditInput input)
{
NormalizeAndValidate(input);
var entity = await _db.Queryable<ObVariableDefinition>().InSingleAsync(input.Id)
?? throw Oops.Bah("变量不存在");
await _dataPermission.EnsureCanManage(
entity.CreateUserId,
OnboardingPermissionCodes.EntryConfigManageAll,
"合同变量");
if (!string.Equals(entity.VariableCode, input.VariableCode, StringComparison.Ordinal))
throw Oops.Bah("变量编码创建后不能修改");
entity.VariableName = input.VariableName;
entity.DataType = input.DataType;
entity.DefaultValue = input.DefaultValue;
entity.Required = input.Required;
entity.SortCode = input.SortCode;
entity.Remark = input.Remark;
if (!entity.IsBuiltIn)
{
entity.VariableCategory = input.VariableCategory;
}
await _db.Updateable(entity).ExecuteCommandAsync();
}
/// <inheritdoc />
public async Task Delete(BaseIdListInput input)
{
if (input.Ids.Count == 0)
return;
var variables = await _db.Queryable<ObVariableDefinition>()
.Where(item => input.Ids.Contains(item.Id))
.ToListAsync();
if (variables.Count != input.Ids.Distinct().Count())
throw Oops.Bah("变量不存在");
await _dataPermission.EnsureCanManage(
variables.Select(item => item.CreateUserId),
OnboardingPermissionCodes.EntryConfigManageAll,
"合同变量");
var hasBuiltIn = await _db.Queryable<ObVariableDefinition>()
.Where(it => input.Ids.Contains(it.Id) && it.IsBuiltIn)
.AnyAsync();
if (hasBuiltIn)
throw Oops.Bah("系统内置的标准入职登记表变量不能删除");
await _db.Deleteable<ObVariableDefinition>()
.Where(it => input.Ids.Contains(it.Id))
.ExecuteCommandAsync();
}
/// <summary>
/// 规范化并校验合同变量定义,防止无效编码在生成合同时才暴露。
/// </summary>
private static void NormalizeAndValidate(OnboardingVariableDefinitionAddInput input)
{
input.VariableCode = input.VariableCode?.Trim();
input.VariableName = input.VariableName?.Trim();
input.VariableCategory = input.VariableCategory?.Trim().ToLowerInvariant();
input.DataType = string.IsNullOrWhiteSpace(input.DataType)
? "string"
: input.DataType.Trim().ToLowerInvariant();
input.DefaultValue = input.DefaultValue?.Trim();
input.Remark = input.Remark?.Trim();
if (string.IsNullOrWhiteSpace(input.VariableCode))
throw Oops.Bah("变量编码不能为空");
if (string.IsNullOrWhiteSpace(input.VariableName))
throw Oops.Bah("变量名称不能为空");
var validCategories = new[] { "employee", "hr", "company", "system" };
if (!validCategories.Contains(input.VariableCategory))
throw Oops.Bah("变量分类只能是员工填写、人事填写、公司信息或系统生成");
var codePattern = $@"^{input.VariableCategory}\.[A-Za-z][A-Za-z0-9_]*$";
var codeIsValid = global::System.Text.RegularExpressions.Regex.IsMatch(
input.VariableCode,
codePattern);
if (!codeIsValid)
throw Oops.Bah($"变量编码必须以“{input.VariableCategory}.”开头,后半段只能包含字母、数字和下划线");
var validDataTypes = new[] { "string", "number", "date" };
if (!validDataTypes.Contains(input.DataType))
throw Oops.Bah("数据类型只能是文本、数字或日期");
}
}