#nullable enable using Furion; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using iWare.Wms.Core; using iWare.Wms.Core.Util; using iWareCommon.Utils; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.ComponentModel; using System.Linq.Dynamic.Core; using System.Reflection; namespace iWare.Wms.Application { /// /// 字典类型服务 /// [ApiDescriptionSettings(Name = "DictType", Order = 100)] [AllowAnonymous] [Route("api")] public class SysDictTypeService : ISysDictTypeService, IDynamicApiController, ITransient { private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysDictDataService _sysDictDataService; private readonly ISysCacheService _sysCacheService; /// /// 构造函数 /// /// 字典类型表服务 /// 字典数据表仓储 /// 字典类型表仓储 /// public SysDictTypeService(ISysDictDataService sysDictDataService, IRepository sysDictDataRep, IRepository sysDictTypeRep, ISysCacheService sysCacheService) { _sysDictDataService = sysDictDataService; _sysDictDataRep = sysDictDataRep; _sysDictTypeRep = sysDictTypeRep; _sysCacheService = sysCacheService; } /// /// 分页查询字典类型 /// /// [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 c = input.Code?.Trim() ?? ""; var n = input.Name?.Trim() ?? ""; var dictTypes = await _sysDictTypeRep.DetachedEntities .Where((code, u => EF.Functions.Like(u.Code, $"%{c}%")),(name, u => EF.Functions.Like(u.Name, $"%{n}%"))) .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 = true; } } /// /// 更新字典类型 /// /// /// [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, Remark = u.Remark, Children = u.SysDictDatas.Select(c => new DictTreeOutput { Id = c.Id, Pid = c.TypeId, Code = c.Code, Name = c.Value }).ToList() }).ToListAsync(); } /// /// 根据枚举类型创建数据 /// /// 枚举类型名称 /// [AllowAnonymous] [HttpGet("sysDictType/parseDataFromEnumType")] public async Task ParseDataFromEnumType([FromQuery] string className) { Type? type = TypeUtil.GetType(className); if (type == null) { throw new Exception($"类型{className}不存在"); } if(!type.IsEnum) { throw new Exception($"{className}不是枚举类型"); } var lastDictType = await _sysDictTypeRep.DetachedEntities.OrderByDescending(x => x.Id).FirstOrDefaultAsync(); var tId = lastDictType?.Id + 1 ?? 1; var remark = "无"; if (type.IsDefined(typeof(DescriptionAttribute), true)) { remark = ((DescriptionAttribute?)type.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无"; } var lastDictData = await _sysDictDataRep.DetachedEntities.OrderByDescending(x => x.Id).FirstOrDefaultAsync(); var dId = lastDictData?.Id + 1 ?? 1; var sort = 10; var folder = App.Configuration["Desktop"]; string fileName = DateTime.Now.Ticks + ".txt"; string msgDictType = $"new SysDictType {{ Id={tId}, Name=\"{remark}\", Sort=100, Code=\"{StringUtil.ToUnderLine(type.Name)}\", Remark=\"{remark}\", Status=0, EnumClassName=\"{type.FullName}\" }},"; FileUtil.WriteLine(folder, fileName, msgDictType); FileUtil.WriteLine(folder, fileName, ""); foreach (var field in type.GetFields()) { if(field.IsDefined(typeof(DescriptionAttribute), true)) { var descr = ((DescriptionAttribute?)field.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无"; string msgDictData = $"new SysDictData {{ Id={dId++}, TypeId={tId}, Value=\"{descr}\", Code=\"{(int)Enum.Parse(type, field.Name)}\", Sort={sort}, Remark=\"{field.Name}\", Status=0}},"; FileUtil.WriteLine(folder, fileName, msgDictData); sort += 10; } } return Path.Combine(folder, fileName); } [NonAction] public async Task> GetDictTreeOutput() { var dictTree = await GetDictTree(); await _sysCacheService.SetDict(dictTree); // 缓存结果 return dictTree; } } }