using Admin.NET.Core; using Admin.NET.Core.Service; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Admin.NET.Application { /// /// 系统应用服务 /// [ApiDescriptionSettings(Name = "App", Order = 100)] [Route("api")] public class SysAppService : ISysAppService, IDynamicApiController, ITransient { private readonly IRepository _sysAppRep; // 应用表仓储 private readonly ISysMenuService _sysMenuService; /// /// 构造函数 /// /// /// public SysAppService(IRepository sysAppRep, ISysMenuService sysMenuService) { _sysAppRep = sysAppRep; _sysMenuService = sysMenuService; } /// /// 获取用户应用相关信息 /// /// /// [NonAction] public async Task> GetLoginApps(long userId) { var apps = _sysAppRep.DetachedEntities.Where(u => u.Status == CommonStatus.ENABLE); if (!CurrentUserInfo.IsSuperAdmin) { var appCodeList = await _sysMenuService.GetUserMenuAppCodeList(userId); apps = apps.Where(u => appCodeList.Contains(u.Code)); } var appList = await apps.OrderBy(u => u.Sort).ProjectToType().ToListAsync(); return appList; } /// /// 分页查询系统应用 /// /// /// [HttpGet("sysApp/page")] public async Task> QueryAppPageList([FromQuery] AppPageInput input) { var name = !string.IsNullOrEmpty(input.Name?.Trim()); var code = !string.IsNullOrEmpty(input.Code?.Trim()); var apps = await _sysAppRep.DetachedEntities .Where((name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%")), (code, u => EF.Functions.Like(u.Code, $"%{input.Code.Trim()}%"))) //.Where(u => u.Status == CommonStatus.ENABLE) .OrderBy(u => u.Sort) .ToADPagedListAsync(input.PageNo, input.PageSize); return apps; } /// /// 增加系统应用 /// /// /// [HttpPost("sysApp/add")] public async Task AddApp(AddAppInput input) { var isExist = await _sysAppRep.DetachedEntities.AnyAsync(u => u.Name == input.Name || u.Code == input.Code); if (isExist) throw Oops.Oh(ErrorCode.D5000); if (input.Active == YesOrNot.Y.ToString()) { isExist = await _sysAppRep.DetachedEntities.AnyAsync(u => u.Active == input.Active); if (isExist) throw Oops.Oh(ErrorCode.D5001); } var app = input.Adapt(); await app.InsertAsync(); } /// /// 删除系统应用 /// /// /// [HttpPost("sysApp/delete")] public async Task DeleteApp(BaseId input) { var app = await _sysAppRep.FirstOrDefaultAsync(u => u.Id == input.Id); // 该应用下是否有状态为正常的菜单 var hasMenu = await _sysMenuService.HasMenu(app.Code); if (hasMenu) throw Oops.Oh(ErrorCode.D5002); await app.DeleteAsync(); } /// /// 更新系统应用 /// /// /// [HttpPost("sysApp/edit")] public async Task UpdateApp(UpdateAppInput input) { var isExist = await _sysAppRep.DetachedEntities.AnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id); if (isExist) throw Oops.Oh(ErrorCode.D5000); if (input.Active == YesOrNot.Y.ToString()) { isExist = await _sysAppRep.DetachedEntities.AnyAsync(u => u.Active == input.Active && u.Id != input.Id); if (isExist) throw Oops.Oh(ErrorCode.D5001); } var app = input.Adapt(); await app.UpdateExcludeAsync(new[] { nameof(SysApp.Status) }, true); } /// /// 获取系统应用 /// /// /// [HttpGet("sysApp/detail")] public async Task GetApp([FromQuery] QueryAppInput input) { return await _sysAppRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id); } /// /// 获取系统应用列表 /// /// [HttpGet("sysApp/list")] public async Task> GetAppList() { return await _sysAppRep.DetachedEntities.Where(u => u.Status == CommonStatus.ENABLE).OrderBy(u => u.Sort).ToListAsync(); } /// /// 设为默认应用 /// /// /// [HttpPost("sysApp/setAsDefault")] public async Task SetAsDefault(SetDefaultAppInput input) { var apps = await _sysAppRep.Where(u => u.Status == CommonStatus.ENABLE).ToListAsync(); apps.ForEach(u => { u.Active = YesOrNot.N.ToString(); }); var app = await _sysAppRep.FirstOrDefaultAsync(u => u.Id == input.Id); app.Active = YesOrNot.Y.ToString(); } /// /// 修改用户状态 /// /// /// [HttpPost("sysApp/changeStatus")] public async Task ChangeUserAppStatus(ChangeUserAppStatusInput input) { if (!Enum.IsDefined(typeof(CommonStatus), input.Status)) throw Oops.Oh(ErrorCode.D3005); var app = await _sysAppRep.FirstOrDefaultAsync(u => u.Id == input.Id); app.Status = input.Status; } } }