using Admin.NET.Core; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Admin.NET.Application { /// /// 字典类型服务 /// [ApiDescriptionSettings(Name = "DictType", Order = 100)] [AllowAnonymous] [Route("api")] public class SysDictTypeService : ISysDictTypeService, IDynamicApiController, ITransient { private readonly IRepository _sysDictTypeRep; // 字典类型表仓储 private readonly ISysDictDataService _sysDictDataService; /// /// 构造函数 /// /// /// public SysDictTypeService(ISysDictDataService sysDictDataService, IRepository sysDictTypeRep) { _sysDictDataService = sysDictDataService; _sysDictTypeRep = sysDictTypeRep; } /// /// 分页查询字典类型 /// /// [HttpGet("sysDictType/page")] public async Task> QueryDictTypePageList([FromQuery] DictTypePageInput input) { bool supperAdmin = CurrentUserInfo.IsSuperAdmin; var code = !string.IsNullOrEmpty(input.Code?.Trim()); var name = !string.IsNullOrEmpty(input.Name?.Trim()); var dictTypes = await _sysDictTypeRep.DetachedEntities .Where((code, u => EF.Functions.Like(u.Code, $"%{input.Code.Trim()}%")), (name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%"))) .Where(u => (u.Status != CommonStatus.DELETED && !supperAdmin) || (u.Status <= CommonStatus.DELETED && supperAdmin)).OrderBy(u => u.Sort) .ToADPagedListAsync(input.PageNo, input.PageSize); return dictTypes; } /// /// 获取字典类型列表 /// /// [HttpGet("sysDictType/list")] public async Task> GetDictTypeList() { return await _sysDictTypeRep.DetachedEntities.Where(u => u.Status != CommonStatus.DELETED).ToListAsync(); } /// /// 获取字典类型下所有字典值 /// /// /// [AllowAnonymous] [HttpGet("sysDictType/dropDown")] public async Task> GetDictTypeDropDown([FromQuery] DropDownDictTypeInput input) { var dictType = await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Code == input.Code, false); if (dictType == null) throw Oops.Oh(ErrorCode.D3000); return await _sysDictDataService.GetDictDataListByDictTypeId(dictType.Id); } /// /// 添加字典类型 /// /// /// [HttpPost("sysDictType/add")] public async Task AddDictType(AddDictTypeInput input) { var isExist = await _sysDictTypeRep.AnyAsync(u => u.Name == input.Name || u.Code == input.Code, false); if (isExist) throw Oops.Oh(ErrorCode.D3001); var dictType = input.Adapt(); await _sysDictTypeRep.InsertAsync(dictType); } /// /// 删除字典类型 /// /// /// [HttpPost("sysDictType/delete")] public async Task DeleteDictType(DeleteDictTypeInput input) { var dictType = await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (dictType == null) throw Oops.Oh(ErrorCode.D3000); if (dictType.Status == CommonStatus.DELETED) { await dictType.DeleteAsync(); } else { dictType.Status = CommonStatus.DELETED; dictType.IsDeleted = false;; } } /// /// 更新字典类型 /// /// /// [HttpPost("sysDictType/edit"),] public async Task UpdateDictType(UpdateDictTypeInput input) { var isExist = await _sysDictTypeRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D3000); // 排除自己并且判断与其他是否相同 isExist = await _sysDictTypeRep.AnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id, false); if (isExist) throw Oops.Oh(ErrorCode.D3001); var dictType = input.Adapt(); await _sysDictTypeRep.UpdateAsync(dictType, ignoreNullValues: true); } /// /// 字典类型详情 /// /// /// [HttpGet("sysDictType/detail")] public async Task GetDictType([FromQuery] QueryDictTypeInfoInput input) { return await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Id == input.Id, false); } /// /// 更新字典类型状态 /// /// /// [HttpPost("sysDictType/changeStatus")] public async Task ChangeDictTypeStatus(ChangeStateDictTypeInput input) { var dictType = await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (dictType == null) throw Oops.Oh(ErrorCode.D3000); if (!Enum.IsDefined(typeof(CommonStatus), input.Status)) throw Oops.Oh(ErrorCode.D3005); dictType.Status = input.Status; dictType.IsDeleted = false;; } /// /// 字典类型与字典值构造的字典树 /// /// [AllowAnonymous] [HttpGet("sysDictType/tree")] public async Task> GetDictTree() { return await _sysDictTypeRep.DetachedEntities.Select(u => new DictTreeOutput { Id = u.Id, Code = u.Code, Name = u.Name, Children = u.SysDictDatas.Select(c => new DictTreeOutput { Id = c.Id, Pid = c.TypeId, Code = c.Code, Name = c.Value }).ToList() }).ToListAsync(); } } }