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;
}
}
}