172 lines
5.8 KiB
C#
172 lines
5.8 KiB
C#
namespace SimpleAdmin.Application;
|
|
|
|
/// <summary>
|
|
/// 维护员工端动态补充字段和材料类型;与公司、岗位的组合关系由入职模板统一管理。
|
|
/// </summary>
|
|
public class OnboardingEntryConfigService : IOnboardingEntryConfigService
|
|
{
|
|
private readonly SqlSugarScope _db;
|
|
|
|
public OnboardingEntryConfigService()
|
|
{
|
|
_db = DbContext.DB;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询全部动态入职字段。
|
|
/// </summary>
|
|
public Task<List<ObFormField>> ListFormFields()
|
|
{
|
|
return _db.Queryable<ObFormField>()
|
|
.OrderBy(x => x.FieldCode)
|
|
.ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 新增或编辑动态入职字段。
|
|
/// </summary>
|
|
public async Task SaveFormField(OnboardingFormFieldSaveInput input)
|
|
{
|
|
var fieldCodeQuery = _db.Queryable<ObFormField>()
|
|
.Where(x => x.FieldCode == input.FieldCode);
|
|
if (input.Id.HasValue)
|
|
fieldCodeQuery = fieldCodeQuery.Where(x => x.Id != input.Id.Value);
|
|
|
|
var fieldCodeExists = await fieldCodeQuery.AnyAsync();
|
|
if (fieldCodeExists)
|
|
throw Oops.Bah("字段编码已存在");
|
|
|
|
var entity = new ObFormField
|
|
{
|
|
Id = input.Id ?? global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(),
|
|
FieldCode = input.FieldCode,
|
|
FieldName = input.FieldName,
|
|
DataType = input.DataType,
|
|
OptionsJson = NormalizeOptionsJson(input.OptionsJson),
|
|
ValidationRule = input.ValidationRule,
|
|
Placeholder = input.Placeholder,
|
|
Status = input.Status
|
|
};
|
|
|
|
if (input.Id.HasValue)
|
|
{
|
|
var exists = await _db.Queryable<ObFormField>().AnyAsync(x => x.Id == input.Id.Value);
|
|
if (!exists)
|
|
throw Oops.Bah("字段不存在");
|
|
|
|
await _db.Updateable(entity).ExecuteCommandAsync();
|
|
return;
|
|
}
|
|
|
|
await _db.Insertable(entity).ExecuteCommandAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 将空白的可选项转换为 null,避免 MySQL JSON 字段写入空字符串时报错。
|
|
/// </summary>
|
|
private static string NormalizeOptionsJson(string optionsJson)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(optionsJson))
|
|
return null;
|
|
|
|
var normalizedJson = optionsJson.Trim();
|
|
|
|
try
|
|
{
|
|
using var jsonDocument = global::System.Text.Json.JsonDocument.Parse(normalizedJson);
|
|
return normalizedJson;
|
|
}
|
|
catch (global::System.Text.Json.JsonException)
|
|
{
|
|
throw Oops.Bah("可选项不是有效的 JSON 格式");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除未被填写要求引用的动态字段。
|
|
/// </summary>
|
|
public async Task DeleteFormFields(BaseIdListInput input)
|
|
{
|
|
if (input.Ids.Count == 0)
|
|
return;
|
|
|
|
var isReferenced = await _db.Queryable<ObFormRequirement>()
|
|
.AnyAsync(x => input.Ids.Contains(x.FieldId));
|
|
var isReferencedByTemplate = await _db.Queryable<ObOnboardingTemplateFormField>()
|
|
.AnyAsync(x => input.Ids.Contains(x.FieldId));
|
|
if (isReferenced || isReferencedByTemplate)
|
|
throw Oops.Bah("字段已被入职模板引用,不能删除");
|
|
|
|
await _db.Deleteable<ObFormField>().In(input.Ids).ExecuteCommandAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询全部入职材料类型。
|
|
/// </summary>
|
|
public Task<List<ObMaterialType>> ListMaterialTypes()
|
|
{
|
|
return _db.Queryable<ObMaterialType>()
|
|
.OrderBy(x => x.MaterialCode)
|
|
.ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 新增或编辑入职材料类型。
|
|
/// </summary>
|
|
public async Task SaveMaterialType(OnboardingMaterialTypeSaveInput input)
|
|
{
|
|
if (input.MaxFileCount <= 0)
|
|
throw Oops.Bah("最大文件数量必须大于0");
|
|
|
|
var materialCodeExists = await _db.Queryable<ObMaterialType>()
|
|
.AnyAsync(x => x.MaterialCode == input.MaterialCode && x.Id != input.Id);
|
|
if (materialCodeExists)
|
|
throw Oops.Bah("资料编码已存在");
|
|
|
|
var entity = new ObMaterialType
|
|
{
|
|
Id = input.Id ?? global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(),
|
|
MaterialCode = input.MaterialCode,
|
|
MaterialName = input.MaterialName,
|
|
AllowedExtensions = input.AllowedExtensions,
|
|
MaxFileCount = input.MaxFileCount,
|
|
MaxFileSizeMb = input.MaxFileSizeMb,
|
|
Status = input.Status
|
|
};
|
|
|
|
if (input.Id.HasValue)
|
|
{
|
|
var exists = await _db.Queryable<ObMaterialType>().AnyAsync(x => x.Id == input.Id.Value);
|
|
if (!exists)
|
|
throw Oops.Bah("资料类型不存在");
|
|
|
|
await _db.Updateable(entity).ExecuteCommandAsync();
|
|
return;
|
|
}
|
|
|
|
await _db.Insertable(entity).ExecuteCommandAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除未被要求或上传记录引用的材料类型。
|
|
/// </summary>
|
|
public async Task DeleteMaterialTypes(BaseIdListInput input)
|
|
{
|
|
if (input.Ids.Count == 0)
|
|
return;
|
|
|
|
var isReferenced = await _db.Queryable<ObMaterialRequirement>()
|
|
.AnyAsync(x => input.Ids.Contains(x.MaterialTypeId));
|
|
var isReferencedByTemplate = await _db.Queryable<ObOnboardingTemplateMaterial>()
|
|
.AnyAsync(x => input.Ids.Contains(x.MaterialTypeId));
|
|
if (isReferenced || isReferencedByTemplate)
|
|
throw Oops.Bah("资料类型已被入职模板引用,不能删除");
|
|
|
|
var hasUploads = await _db.Queryable<ObTaskMaterial>()
|
|
.AnyAsync(x => input.Ids.Contains(x.MaterialTypeId));
|
|
if (hasUploads)
|
|
throw Oops.Bah("资料类型已有上传记录,不能删除");
|
|
|
|
await _db.Deleteable<ObMaterialType>().In(input.Ids).ExecuteCommandAsync();
|
|
}
|
|
} |