feat: initialize Evergreen Health backend
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user