代码优化
This commit is contained in:
+23
-1
@@ -1,10 +1,32 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 合同变量字典服务。
|
||||
/// </summary>
|
||||
public interface IOnboardingVariableDefinitionService : ITransient
|
||||
{
|
||||
/// <summary>
|
||||
/// 分页查询合同变量定义。
|
||||
/// </summary>
|
||||
Task<SqlSugarPagedList<ObVariableDefinition>> Page(OnboardingVariableDefinitionPageInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 查询全部合同变量定义。
|
||||
/// </summary>
|
||||
Task<List<ObVariableDefinition>> ListAll();
|
||||
|
||||
/// <summary>
|
||||
/// 新增合同变量定义。
|
||||
/// </summary>
|
||||
Task Add(OnboardingVariableDefinitionAddInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 编辑合同变量定义。
|
||||
/// </summary>
|
||||
Task Edit(OnboardingVariableDefinitionEditInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 删除非内置合同变量定义。
|
||||
/// </summary>
|
||||
Task Delete(BaseIdListInput input);
|
||||
}
|
||||
}
|
||||
|
||||
+48
-1
@@ -2,32 +2,79 @@
|
||||
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 合同变量字典分页查询参数。
|
||||
/// </summary>
|
||||
public class OnboardingVariableDefinitionPageInput : BasePageInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 变量编码或名称关键字。
|
||||
/// </summary>
|
||||
public string Keyword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 变量分类:employee、hr、company 或 system。
|
||||
/// </summary>
|
||||
public string VariableCategory { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增合同变量定义参数。
|
||||
/// </summary>
|
||||
public class OnboardingVariableDefinitionAddInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 完整变量编码,例如 employee.EmployeeName 或 hr.BaseSalary。
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "变量编码不能为空")]
|
||||
public string VariableCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 后台展示的变量名称。
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "变量名称不能为空")]
|
||||
public string VariableName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 变量分类:employee、hr、company 或 system。
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "变量分类不能为空")]
|
||||
public string VariableCategory { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据类型:string、number 或 date。
|
||||
/// </summary>
|
||||
public string DataType { get; set; } = "string";
|
||||
|
||||
/// <summary>
|
||||
/// 未提供变量值时使用的默认值。
|
||||
/// </summary>
|
||||
public string DefaultValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否必须填写。
|
||||
/// </summary>
|
||||
public bool Required { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 展示排序值。
|
||||
/// </summary>
|
||||
public int SortCode { get; set; } = 100;
|
||||
|
||||
/// <summary>
|
||||
/// 变量用途说明。
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 编辑合同变量定义参数。
|
||||
/// </summary>
|
||||
public class OnboardingVariableDefinitionEditInput : OnboardingVariableDefinitionAddInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 变量定义主键。
|
||||
/// </summary>
|
||||
[IdNotNull(ErrorMessage = "Id不能为空")]
|
||||
public long Id { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
+68
-11
@@ -1,26 +1,37 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 实现合同变量字典的查询和维护。
|
||||
/// </summary>
|
||||
public class OnboardingVariableDefinitionService : IOnboardingVariableDefinitionService
|
||||
{
|
||||
private readonly SqlSugarScope _db;
|
||||
private static bool _initialized = false;
|
||||
private static readonly object _lock = new();
|
||||
|
||||
/// <summary>
|
||||
/// 初始化合同变量字典服务。
|
||||
/// </summary>
|
||||
public OnboardingVariableDefinitionService()
|
||||
{
|
||||
_db = DbContext.DB;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<SqlSugarPagedList<ObVariableDefinition>> Page(OnboardingVariableDefinitionPageInput input)
|
||||
{
|
||||
return await _db.Queryable<ObVariableDefinition>()
|
||||
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), it => it.VariableCode.Contains(input.Keyword) || it.VariableName.Contains(input.Keyword))
|
||||
.WhereIF(!string.IsNullOrWhiteSpace(input.VariableCategory), it => it.VariableCategory == input.VariableCategory)
|
||||
.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>()
|
||||
@@ -29,26 +40,34 @@ public class OnboardingVariableDefinitionService : IOnboardingVariableDefinition
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task Add(OnboardingVariableDefinitionAddInput input)
|
||||
{
|
||||
var code = input.VariableCode.Trim();
|
||||
var exists = await _db.Queryable<ObVariableDefinition>().AnyAsync(it => it.VariableCode == code);
|
||||
NormalizeAndValidate(input);
|
||||
|
||||
var exists = await _db.Queryable<ObVariableDefinition>()
|
||||
.AnyAsync(item => item.VariableCode == input.VariableCode);
|
||||
if (exists)
|
||||
throw Oops.Bah($"变量编码“{code}”已存在");
|
||||
throw Oops.Bah($"变量编码“{input.VariableCode}”已存在");
|
||||
|
||||
var entity = input.Adapt<ObVariableDefinition>();
|
||||
entity.VariableCode = code;
|
||||
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("变量不存在");
|
||||
|
||||
if (!string.Equals(entity.VariableCode, input.VariableCode, StringComparison.Ordinal))
|
||||
throw Oops.Bah("变量编码创建后不能修改");
|
||||
|
||||
entity.VariableName = input.VariableName;
|
||||
entity.DataType = input.DataType ?? "string";
|
||||
entity.DataType = input.DataType;
|
||||
entity.DefaultValue = input.DefaultValue;
|
||||
entity.Required = input.Required;
|
||||
entity.SortCode = input.SortCode;
|
||||
@@ -61,9 +80,11 @@ public class OnboardingVariableDefinitionService : IOnboardingVariableDefinition
|
||||
await _db.Updateable(entity).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task Delete(BaseIdListInput input)
|
||||
{
|
||||
if (input.Ids.Count == 0) return;
|
||||
if (input.Ids.Count == 0)
|
||||
return;
|
||||
|
||||
var hasBuiltIn = await _db.Queryable<ObVariableDefinition>()
|
||||
.Where(it => input.Ids.Contains(it.Id) && it.IsBuiltIn)
|
||||
@@ -75,4 +96,40 @@ public class OnboardingVariableDefinitionService : IOnboardingVariableDefinition
|
||||
.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("数据类型只能是文本、数字或日期");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user