feat: initialize Evergreen Health backend

This commit is contained in:
fuenmao
2026-09-21 14:08:22 +08:00
commit 8553df5dd2
493 changed files with 75649 additions and 0 deletions
@@ -0,0 +1,64 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
public class DictDataInput : BaseStatusInput
{
}
public class PageDictDataInput : BasePageInput
{
/// <summary>
/// 字典类型Id
/// </summary>
public long DictTypeId { get; set; }
/// <summary>
/// 文本
/// </summary>
public string Label { get; set; }
/// <summary>
/// 编码
/// </summary>
public string Code { get; set; }
}
public class AddDictDataInput : SysDictData
{
}
public class UpdateDictDataInput : AddDictDataInput
{
}
public class DeleteDictDataInput : BaseIdInput
{
}
public class GetDataDictDataInput
{
/// <summary>
/// 字典类型Id
/// </summary>
[Required(ErrorMessage = "字典类型Id不能为空"), DataValidation(ValidationTypes.Numeric)]
public long DictTypeId { get; set; }
}
public class QueryDictDataInput
{
/// <summary>
/// 字典值
/// </summary>
[Required(ErrorMessage = "字典值不能为空")]
public string Value { get; set; }
/// <summary>
/// 状态
/// </summary>
public int? Status { get; set; }
}
@@ -0,0 +1,23 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
public class DictDataOutput
{
public long DictDataId { get; set; }
public string TypeCode { get; set; }
public string Label { get; set; }
public string Value { get; set; }
public string Code { get; set; }
public string TagType { get; set; }
public string StyleSetting { get; set; }
public string ClassSetting { get; set; }
public string ExtData { get; set; }
public string Remark { get; set; }
public int OrderNo { get; set; }
public StatusEnum Status { get; set; }
}
@@ -0,0 +1,54 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
public class DictTypeInput : BaseStatusInput
{
}
public class PageDictTypeInput : BasePageInput
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 编码
/// </summary>
public string Code { get; set; }
}
public class AddDictTypeInput : SysDictType
{
/// <summary>
/// 是否是租户字典(Y-是,N-否)
/// </summary>
public override YesNoEnum IsTenant { get; set; } = YesNoEnum.Y;
/// <summary>
/// 是否是内置字典(Y-是,N-否)
/// </summary>
public override YesNoEnum SysFlag { get; set; } = YesNoEnum.N;
}
public class UpdateDictTypeInput : AddDictTypeInput
{
}
public class DeleteDictTypeInput : BaseIdInput
{
}
public class GetDataDictTypeInput
{
/// <summary>
/// 编码
/// </summary>
[Required(ErrorMessage = "字典类型编码不能为空")]
public string Code { get; set; }
}
@@ -0,0 +1,331 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
/// <summary>
/// 系统字典值服务 🧩
/// </summary>
[ApiDescriptionSettings(Order = 420, Description = "系统字典值")]
public class SysDictDataService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<SysDictData> _sysDictDataRep;
public readonly ISugarQueryable<SysDictData> VSysDictData;
private readonly SysCacheService _sysCacheService;
private readonly UserManager _userManager;
private readonly SysLangTextCacheService _sysLangTextCacheService;
public SysDictDataService(SqlSugarRepository<SysDictData> sysDictDataRep,
SysCacheService sysCacheService,
UserManager userManager,
SysLangTextCacheService sysLangTextCacheService)
{
_userManager = userManager;
_sysDictDataRep = sysDictDataRep;
_sysCacheService = sysCacheService;
_sysLangTextCacheService = sysLangTextCacheService;
VSysDictData = _sysDictDataRep.Context.UnionAll(
_sysDictDataRep.AsQueryable(),
_sysDictDataRep.Change<SysDictDataTenant>().AsQueryable()
//.WhereIF(_userManager.SuperAdmin, d => d.TenantId == _userManager.TenantId)
.Select<SysDictData>());
}
/// <summary>
/// 获取字典值分页列表 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取字典值分页列表")]
public async Task<SqlSugarPagedList<SysDictData>> Page(PageDictDataInput input)
{
var langCode = _userManager.LangCode;
var baseQuery = VSysDictData
.Where(u => u.DictTypeId == input.DictTypeId)
.WhereIF(!string.IsNullOrEmpty(input.Code?.Trim()), u => u.Code.Contains(input.Code))
.WhereIF(!string.IsNullOrEmpty(input.Label?.Trim()), u => u.Label.Contains(input.Label))
.OrderBy(u => new { u.OrderNo, u.Code });
var pageList = await baseQuery.ToPagedListAsync(input.Page, input.PageSize);
var list = pageList.Items;
var ids = list.Select(d => d.Id).Distinct().ToList();
var translations = await _sysLangTextCacheService.GetTranslations(
"SysDictData",
"Label",
ids,
langCode);
foreach (var item in list)
{
if (translations.TryGetValue(item.Id, out var translatedLabel) && !string.IsNullOrEmpty(translatedLabel))
{
item.Label = translatedLabel;
}
}
pageList.Items = list;
return pageList;
}
/// <summary>
/// 获取字典值列表 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取字典值列表")]
public async Task<List<SysDictData>> GetList([FromQuery] GetDataDictDataInput input)
{
var langCode = _userManager.LangCode;
var list = await GetDictDataListByDictTypeId(input.DictTypeId);
var ids = list.Select(d => d.Id).Distinct().ToList();
var translations = await _sysLangTextCacheService.GetTranslations(
"SysDictData",
"Label",
ids,
langCode);
foreach (var item in list)
{
if (translations.TryGetValue(item.Id, out var translatedLabel) && !string.IsNullOrEmpty(translatedLabel))
{
item.Label = translatedLabel;
}
}
return await GetDictDataListByDictTypeId(input.DictTypeId);
}
/// <summary>
/// 增加字典值 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("增加字典值")]
public async Task AddDictData(AddDictDataInput input)
{
var isExist = await VSysDictData.AnyAsync(u => u.Value == input.Value && u.DictTypeId == input.DictTypeId);
if (isExist) throw Oops.Oh(ErrorCodeEnum.D3003);
var dictType = await _sysDictDataRep.Change<SysDictType>().GetByIdAsync(input.DictTypeId);
if (dictType.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3008);
Remove(dictType);
dynamic dictData = dictType.IsTenant == YesNoEnum.Y ? input.Adapt<SysDictDataTenant>() : input.Adapt<SysDictData>();
await _sysDictDataRep.Context.Insertable(dictData).ExecuteCommandAsync();
}
/// <summary>
/// 更新字典值 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新字典值")]
public async Task UpdateDictData(UpdateDictDataInput input)
{
var isExist = await VSysDictData.AnyAsync(u => u.Id == input.Id);
if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3004);
isExist = await VSysDictData.AnyAsync(u => u.Value == input.Value && u.DictTypeId == input.DictTypeId && u.Id != input.Id);
if (isExist) throw Oops.Oh(ErrorCodeEnum.D3003);
var dictType = await _sysDictDataRep.Change<SysDictType>().GetByIdAsync(input.DictTypeId);
if (dictType.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3009);
Remove(dictType);
dynamic dictData = dictType.IsTenant == YesNoEnum.Y ? input.Adapt<SysDictDataTenant>() : input.Adapt<SysDictData>();
await _sysDictDataRep.Context.Updateable(dictData).ExecuteCommandAsync();
}
/// <summary>
/// 删除字典值 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除字典值")]
public async Task DeleteDictData(DeleteDictDataInput input)
{
var dictData = await VSysDictData.FirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3004);
var dictType = await _sysDictDataRep.Change<SysDictType>().GetByIdAsync(dictData.DictTypeId);
if (dictType.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3010);
Remove(dictType);
dynamic entity = dictType.IsTenant == YesNoEnum.Y ? input.Adapt<SysDictDataTenant>() : input.Adapt<SysDictData>();
await _sysDictDataRep.Context.Deleteable(entity).ExecuteCommandAsync();
}
/// <summary>
/// 获取字典值详情 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取字典值详情")]
public async Task<SysDictData> GetDetail([FromQuery] DictDataInput input)
{
return (await VSysDictData.FirstAsync(u => u.Id == input.Id))?.Adapt<SysDictData>();
}
/// <summary>
/// 修改字典值状态 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("修改字典值状态")]
public async Task SetStatus(DictDataInput input)
{
var dictData = await VSysDictData.FirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3004);
var dictType = await _sysDictDataRep.Change<SysDictType>().GetByIdAsync(dictData.DictTypeId);
if (dictType.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3009);
Remove(dictType);
dictData.Status = input.Status;
dynamic entity = dictType.IsTenant == YesNoEnum.Y ? input.Adapt<SysDictDataTenant>() : input.Adapt<SysDictData>();
await _sysDictDataRep.Context.Updateable(entity).ExecuteCommandAsync();
}
/// <summary>
/// 根据字典类型Id获取字典值集合
/// </summary>
/// <param name="dictTypeId"></param>
/// <returns></returns>
[NonAction]
public async Task<List<SysDictData>> GetDictDataListByDictTypeId(long dictTypeId)
{
return await GetDataListByIdOrCode(dictTypeId, null);
}
/// <summary>
/// 根据字典类型编码获取字典值集合 🔖
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
[DisplayName("根据字典类型编码获取字典值集合")]
public async Task<List<SysDictData>> GetDataList(string code)
{
return await GetDataListByIdOrCode(null, code);
}
/// <summary>
/// 获取字典值集合 🔖
/// </summary>
/// <param name="typeId"></param>
/// <param name="code"></param>
/// <returns></returns>
[NonAction]
public async Task<List<SysDictData>> GetDataListByIdOrCode(long? typeId, string code)
{
if (string.IsNullOrWhiteSpace(code) && typeId == null ||
!string.IsNullOrWhiteSpace(code) && typeId != null)
throw Oops.Oh(ErrorCodeEnum.D3011);
var dictType = await _sysDictDataRep.Change<SysDictType>().AsQueryable()
.Where(u => u.Status == StatusEnum.Enable)
.WhereIF(!string.IsNullOrWhiteSpace(code), u => u.Code == code)
.WhereIF(typeId != null, u => u.Id == typeId)
.FirstAsync();
if (dictType == null) return null;
string dicKey = dictType.IsTenant == YesNoEnum.N ? $"{CacheConst.KeyDict}{dictType.Code}" : $"{CacheConst.KeyTenantDict}{_userManager}:{dictType?.Code}";
var dictDataList = _sysCacheService.Get<List<SysDictData>>(dicKey);
if (dictDataList == null)
{
//平台字典和租户字典分开缓存
if (dictType.IsTenant == YesNoEnum.Y)
{
dictDataList = await _sysDictDataRep.Change<SysDictDataTenant>().AsQueryable()
.Where(u => u.DictTypeId == dictType.Id)
.Where(u => u.Status == StatusEnum.Enable)
.WhereIF(_userManager.SuperAdmin, d => d.TenantId == _userManager.TenantId).Select<SysDictData>()
.OrderBy(u => new { u.OrderNo, u.Value, u.Code })
.ToListAsync();
}
else
{
dictDataList = await _sysDictDataRep.AsQueryable()
.Where(u => u.DictTypeId == dictType.Id)
.Where(u => u.Status == StatusEnum.Enable)
.OrderBy(u => new { u.OrderNo, u.Value, u.Code })
.ToListAsync();
}
_sysCacheService.Set(dicKey, dictDataList);
}
return dictDataList;
}
/// <summary>
/// 根据查询条件获取字典值集合 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("根据查询条件获取字典值集合")]
public async Task<List<SysDictData>> GetDataList([FromQuery] QueryDictDataInput input)
{
var dataList = await GetDataList(input.Value);
if (input.Status.HasValue) return dataList.Where(u => u.Status == (StatusEnum)input.Status.Value).ToList();
return dataList;
}
/// <summary>
/// 根据字典类型Id删除字典值
/// </summary>
/// <param name="dictTypeId"></param>
/// <returns></returns>
[NonAction]
public async Task DeleteDictData(long dictTypeId)
{
var dictType = await _sysDictDataRep.Change<SysDictType>().AsQueryable().Where(u => u.Id == dictTypeId).FirstAsync();
Remove(dictType);
if (dictType?.IsTenant == YesNoEnum.Y)
await _sysDictDataRep.Change<SysDictDataTenant>().DeleteAsync(u => u.DictTypeId == dictTypeId);
else
await _sysDictDataRep.DeleteAsync(u => u.DictTypeId == dictTypeId);
}
/// <summary>
/// 通过字典数据Value查询显示文本Label
/// 适用于列表中根据字典数据值找文本的子查询 _sysDictDataService.MapDictValueToLabel(() =>obj.Type, "org_type",obj);
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="mappingFiled"></param>
/// <param name="dictTypeCode"></param>
/// <param name="parameter"></param>
/// <returns></returns>
public string MapDictValueToLabel<T>(Expression<Func<object>> mappingFiled, string dictTypeCode, T parameter)
{
return VSysDictData.InnerJoin<SysDictType>((d, dt) => d.DictTypeId.Equals(dt.Id) && dt.Code == dictTypeCode)
.SetContext(d => d.Value, mappingFiled, parameter).FirstOrDefault()?.Label;
}
/// <summary>
/// 通过字典数据显示文本Label查询Value
/// 适用于列表数据导入根据字典数据文本找值的子查询 _sysDictDataService.MapDictLabelToValue(() => obj.Type, "org_type",obj);
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="mappingFiled"></param>
/// <param name="dictTypeCode"></param>
/// <param name="parameter"></param>
/// <returns></returns>
public string MapDictLabelToValue<T>(Expression<Func<object>> mappingFiled, string dictTypeCode, T parameter)
{
return VSysDictData.InnerJoin<SysDictType>((d, dt) => d.DictTypeId.Equals(dt.Id) && dt.Code == dictTypeCode)
.SetContext(d => d.Label, mappingFiled, parameter).FirstOrDefault()?.Value;
}
/// <summary>
/// 清理字典数据缓存
/// </summary>
/// <param name="dictType"></param>
private void Remove(SysDictType dictType)
{
_sysCacheService.Remove($"{CacheConst.KeyDict}{dictType?.Code}");
_sysCacheService.Remove($"{CacheConst.KeyTenantDict}{_userManager}:{dictType?.Code}");
}
}
@@ -0,0 +1,262 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
/// <summary>
/// 系统字典类型服务 🧩
/// </summary>
[ApiDescriptionSettings(Order = 430, Description = "系统字典类型")]
public class SysDictTypeService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<SysDictType> _sysDictTypeRep;
private readonly SysDictDataService _sysDictDataService;
private readonly SysCacheService _sysCacheService;
private readonly UserManager _userManager;
private readonly SysLangTextCacheService _sysLangTextCacheService;
public SysDictTypeService(SqlSugarRepository<SysDictType> sysDictTypeRep,
SysDictDataService sysDictDataService,
SysCacheService sysCacheService,
UserManager userManager,
SysLangTextCacheService sysLangTextCacheService)
{
_sysDictTypeRep = sysDictTypeRep;
_sysDictDataService = sysDictDataService;
_sysCacheService = sysCacheService;
_userManager = userManager;
_sysLangTextCacheService = sysLangTextCacheService;
}
/// <summary>
/// 获取字典类型分页列表 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取字典类型分页列表")]
public async Task<SqlSugarPagedList<SysDictType>> Page(PageDictTypeInput input)
{
var langCode = _userManager.LangCode;
var baseQuery = _sysDictTypeRep.AsQueryable()
.WhereIF(!_userManager.SuperAdmin, u => u.IsTenant == YesNoEnum.Y)
.WhereIF(!string.IsNullOrEmpty(input.Code?.Trim()), u => u.Code.Contains(input.Code))
.WhereIF(!string.IsNullOrEmpty(input.Name?.Trim()), u => u.Name.Contains(input.Name));
//.OrderBy(u => new { u.OrderNo, u.Code })
var pageList = await baseQuery.ToPagedListAsync(input.Page, input.PageSize);
var list = pageList.Items;
var ids = list.Select(d => d.Id).Distinct().ToList();
var translations = await _sysLangTextCacheService.GetTranslations(
"SysDictType",
"Name",
ids,
langCode);
foreach (var item in list)
{
if (translations.TryGetValue(item.Id, out var translatedName) && !string.IsNullOrEmpty(translatedName))
{
item.Name = translatedName;
}
}
pageList.Items = list;
return pageList;
}
/// <summary>
/// 获取字典类型列表 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取字典类型列表")]
public async Task<List<SysDictType>> GetList()
{
var langCode = _userManager.LangCode;
var list = await _sysDictTypeRep.AsQueryable().OrderBy(u => new { u.OrderNo, u.Code }).ToListAsync();
var ids = list.Select(d => d.Id).Distinct().ToList();
var translations = await _sysLangTextCacheService.GetTranslations(
"SysDictType",
"Name",
ids,
langCode);
foreach (var item in list)
{
if (translations.TryGetValue(item.Id, out var translatedName) && !string.IsNullOrEmpty(translatedName))
{
item.Name = translatedName;
}
}
return list;
}
/// <summary>
/// 获取字典类型-值列表 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取字典类型-值列表")]
public async Task<List<SysDictData>> GetDataList([FromQuery] GetDataDictTypeInput input)
{
var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Code == input.Code) ?? throw Oops.Oh(ErrorCodeEnum.D3000);
var langCode = _userManager.LangCode;
var list = await _sysDictDataService.GetDictDataListByDictTypeId(dictType.Id);
var ids = list.Select(d => d.Id).Distinct().ToList();
var translations = await _sysLangTextCacheService.GetTranslations(
"SysDictType",
"Name",
ids,
langCode);
foreach (var item in list)
{
if (translations.TryGetValue(item.Id, out var translatedName) && !string.IsNullOrEmpty(translatedName))
{
item.Name = translatedName;
}
}
return list;
}
/// <summary>
/// 添加字典类型 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("添加字典类型")]
public async Task AddDictType(AddDictTypeInput input)
{
if (input.Code.ToLower().EndsWith("enum")) throw Oops.Oh(ErrorCodeEnum.D3006);
if (input.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3008);
var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code);
if (isExist) throw Oops.Oh(ErrorCodeEnum.D3001);
if (_userManager.SuperAdmin) input.IsTenant = YesNoEnum.N; // 超级管理员添加的字典类型默认非租户级
await _sysDictTypeRep.InsertAsync(input.Adapt<SysDictType>());
}
/// <summary>
/// 更新字典类型 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新字典类型")]
public async Task UpdateDictType(UpdateDictTypeInput input)
{
var dict = await _sysDictTypeRep.GetFirstAsync(x => x.Id == input.Id);
if (dict.IsTenant != input.IsTenant) throw Oops.Oh(ErrorCodeEnum.D3012);
if (dict == null) throw Oops.Oh(ErrorCodeEnum.D3000);
if (dict.Code.ToLower().EndsWith("enum") && input.Code != dict.Code) throw Oops.Oh(ErrorCodeEnum.D3007);
if (input.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3009);
var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code && u.Id != input.Id);
if (isExist) throw Oops.Oh(ErrorCodeEnum.D3001);
_sysCacheService.Remove($"{CacheConst.KeyDict}{input.Code}");
await _sysDictTypeRep.UpdateAsync(input.Adapt<SysDictType>());
}
/// <summary>
/// 删除字典类型 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除字典类型")]
public async Task DeleteDictType(DeleteDictTypeInput input)
{
var dictType = await _sysDictTypeRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3000);
if (dictType.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3010);
// 删除字典值
await _sysDictTypeRep.DeleteAsync(dictType);
await _sysDictDataService.DeleteDictData(input.Id);
}
/// <summary>
/// 获取字典类型详情 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取字典类型详情")]
public async Task<SysDictType> GetDetail([FromQuery] DictTypeInput input)
{
return await _sysDictTypeRep.GetByIdAsync(input.Id);
}
/// <summary>
/// 修改字典类型状态 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("修改字典类型状态")]
public async Task SetStatus(DictTypeInput input)
{
var dictType = await _sysDictTypeRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3000);
if (dictType.SysFlag == YesNoEnum.Y && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D3009);
_sysCacheService.Remove($"{CacheConst.KeyDict}{dictType.Code}");
dictType.Status = input.Status;
await _sysDictTypeRep.AsUpdateable(dictType).UpdateColumns(u => new { u.Status }, true).ExecuteCommandAsync();
}
/// <summary>
/// 获取所有字典集合 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取所有字典集合")]
public async Task<dynamic> GetAllDictList()
{
var langCode = _userManager.LangCode;
var ds = await _sysDictTypeRep.AsQueryable()
.InnerJoin(_sysDictDataService.VSysDictData, (u, w) => u.Id == w.DictTypeId)
.Select((u, w) => new DictDataOutput
{
DictDataId = w.Id, // 给翻译用
TypeCode = u.Code,
Label = w.Label,
Value = w.Value,
Code = w.Code,
TagType = w.TagType,
StyleSetting = w.StyleSetting,
ClassSetting = w.ClassSetting,
ExtData = w.ExtData,
Remark = w.Remark,
OrderNo = w.OrderNo,
Status = w.Status == StatusEnum.Enable && u.Status == StatusEnum.Enable ? StatusEnum.Enable : StatusEnum.Disable
})
.ToListAsync();
var ids = ds.Select(x => x.DictDataId).Distinct().ToList();
Dictionary<long, string> translations = new();
if (ids.Any())
{
translations = await _sysLangTextCacheService.GetTranslations(
"SysDictData",
"Label",
ids,
langCode
);
}
foreach (var item in ds)
{
if (translations.TryGetValue(item.DictDataId, out var translated) && !string.IsNullOrEmpty(translated))
{
item.Label = translated;
}
}
var result = ds
.OrderBy(u => u.OrderNo)
.GroupBy(u => u.TypeCode)
.ToDictionary(u => u.Key, u => u.ToList());
return result;
}
}