namespace SimpleAdmin.Application; /// /// 实现合同变量字典的查询和维护。 /// public class OnboardingVariableDefinitionService : IOnboardingVariableDefinitionService { private readonly SqlSugarScope _db; private readonly IOnboardingDataPermissionService _dataPermission; /// /// 初始化合同变量字典服务。 /// public OnboardingVariableDefinitionService(IOnboardingDataPermissionService dataPermission) { _db = DbContext.DB; _dataPermission = dataPermission; } /// public async Task> Page(OnboardingVariableDefinitionPageInput input) { return await _db.Queryable() .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); } /// public async Task> ListAll() { return await _db.Queryable() .OrderBy(it => it.SortCode) .OrderBy(it => it.Id) .ToListAsync(); } /// public async Task Add(OnboardingVariableDefinitionAddInput input) { NormalizeAndValidate(input); var exists = await _db.Queryable() .AnyAsync(item => item.VariableCode == input.VariableCode); if (exists) throw Oops.Bah($"变量编码“{input.VariableCode}”已存在"); var entity = input.Adapt(); entity.IsBuiltIn = false; await _db.Insertable(entity).ExecuteCommandAsync(); } /// public async Task Edit(OnboardingVariableDefinitionEditInput input) { NormalizeAndValidate(input); var entity = await _db.Queryable().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(); } /// public async Task Delete(BaseIdListInput input) { if (input.Ids.Count == 0) return; var variables = await _db.Queryable() .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() .Where(it => input.Ids.Contains(it.Id) && it.IsBuiltIn) .AnyAsync(); if (hasBuiltIn) throw Oops.Bah("系统内置的标准入职登记表变量不能删除"); await _db.Deleteable() .Where(it => input.Ids.Contains(it.Id)) .ExecuteCommandAsync(); } /// /// 规范化并校验合同变量定义,防止无效编码在生成合同时才暴露。 /// 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("数据类型只能是文本、数字或日期"); } }