using NCC.Common.Filter; using NCC.Common.Util; using NCC.Dependency; using NCC.DynamicApiController; using NCC.System.Entitys.Permission; using NCC.System.Entitys.System; using NCC.VisualDev.Entitys; using NCC.VisualDev.Entitys.Dto.Portal; using NCC.VisualDev.Interfaces; using Microsoft.AspNetCore.Mvc; using Mapster; using SqlSugar; using System.Linq; using System.Threading.Tasks; using NCC.Common.Core.Manager; using NCC.FriendlyException; using NCC.Common.Enum; using System.Collections.Generic; using NCC.Common.Extension; using NCC.JsonSerialization; using NCC.System.Interfaces.Common; using Microsoft.AspNetCore.Http; namespace NCC.VisualDev { /// /// 业务实现:门户设计 /// [ApiDescriptionSettings(Tag = "VisualDev", Name = "Portal", Order = 173)] [Route("api/visualdev/[controller]")] public class PortalService : IPortalService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _portalRepository; private readonly ISqlSugarRepository _dictionaryDataRepository;// 数据字典表仓储 private readonly ISqlSugarRepository _authorizeRepository; //权限操作表仓储 private readonly ISqlSugarRepository _roleRepository; private readonly IUserManager _userManager; private readonly IFileService _fileService; /// /// 初始化一个类型的新实例 /// public PortalService(ISqlSugarRepository portalRepository, ISqlSugarRepository roleRepository, ISqlSugarRepository dictionaryDataRepository, IUserManager userManager, ISqlSugarRepository authorizeRepository, IFileService fileService) { _portalRepository = portalRepository; _dictionaryDataRepository = dictionaryDataRepository; _userManager = userManager; _authorizeRepository = authorizeRepository; _roleRepository = roleRepository; _fileService = fileService; } #region Get /// /// 列表 /// /// 请求参数 /// 返回列表 [HttpGet("")] public async Task GetList([FromQuery] KeywordInput input) { var portalList = await _portalRepository.Context.Queryable((a, b, c) => new JoinQueryInfos(JoinType.Left, b.Id == a.CreatorUserId, JoinType.Left, c.Id == a.LastModifyUserId)) .Select((a, b, c) => new PortalListOutput { id = a.Id, fullName = a.FullName, enCode = a.EnCode, deleteMark = SqlFunc.ToString(a.DeleteMark), description = a.Description, creatorTime = a.CreatorTime, creatorUser = SqlFunc.MergeString(b.RealName, "/", b.Account), parentId = a.Category, lastModifyUser = SqlFunc.MergeString(c.RealName, SqlFunc.IIF(c.RealName == null, "", "/"), c.Account), lastModifyTime = SqlFunc.ToDate(a.LastModifyTime), enabledMark = a.EnabledMark, sortCode = SqlFunc.ToString(a.SortCode) }) .MergeTable() .WhereIF(!string.IsNullOrEmpty(input.keyword), p => p.fullName.Contains(input.keyword) || p.enCode.Contains(input.keyword)) .Where(p => p.deleteMark == null) .OrderBy(p => p.sortCode).ToListAsync(); var parentIds = portalList.Select(x => x.parentId).ToList().Distinct(); var treeList = await _dictionaryDataRepository.Where(d => parentIds.Contains(d.Id) && d.DeleteMark == null && d.EnabledMark.Equals(1)) .Select(d => new { id = d.Id, parentId = "0", enCode = "", fullName = d.FullName, sortCode = d.SortCode }) .MergeTable().Select().OrderBy(o => o.sortCode).ToListAsync(); return new { list = treeList.Union(portalList).ToList().ToTree("0") }; } /// /// 获取门户侧边框列表 /// /// [HttpGet("Selector")] public async Task GetSelector([FromQuery] string type) { var userInfo = await _userManager.GetUserInfo(); var data = new List(); if ("1".Equals(type) && !userInfo.isAdministrator) { var roleId = await _roleRepository.Entities.In(r => r.Id, userInfo.roleIds).Where(r => r.EnabledMark.Equals(1) && r.DeleteMark == null).Select(r => r.Id).ToListAsync(); var items = await _authorizeRepository.Entities.In(a => a.ObjectId, roleId).Where(a => a.ItemType == "portal").GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count != 0) data = await _portalRepository.Entities.In(p => p.Id, items.Select(it => it.ItemId).ToArray()).Select(s => new PortalSelectOutput { id = s.Id, fullName = s.FullName, parentId = s.Category, enabledMark = SqlFunc.ToInt32(s.EnabledMark), sortCode = SqlFunc.ToString(s.SortCode), deleteMark = SqlFunc.ToString(s.DeleteMark) }) .MergeTable() .Where(p => p.enabledMark.Equals(1) && p.deleteMark == null).OrderBy(p => p.sortCode).ToListAsync(); } else { data = await _portalRepository.Entities.Select(s => new PortalSelectOutput { id = s.Id, fullName = s.FullName, parentId = s.Category, enabledMark = SqlFunc.ToInt32(s.EnabledMark), sortCode = SqlFunc.ToString(s.SortCode), deleteMark = SqlFunc.ToString(s.DeleteMark) }) .MergeTable().Where(p => p.enabledMark.Equals(1) && p.deleteMark == null).OrderBy(o => o.sortCode).ToListAsync(); } var parentIds = data.Select(it => it.parentId).Distinct().ToList(); var treeList = new List(); if (parentIds.Count() != 0) treeList = await _dictionaryDataRepository.Entities.In(it => it.Id, parentIds.ToArray()).Where(d => d.DeleteMark == null && d.EnabledMark.Equals(1)).Select(d => new PortalSelectOutput { id = d.Id, parentId = "0", fullName = d.FullName, sortCode = SqlFunc.ToString(d.SortCode) }).MergeTable().OrderBy(o => o.sortCode).ToListAsync(); return new { list = treeList.Union(data).ToList().ToTree("0") }; } /// /// 获取门户信息 /// /// 主键id /// [HttpGet("{id}")] public async Task GetInfo(string id) { var data = await _portalRepository.SingleAsync(p => p.Id == id); var output = data.Adapt(); return output; } /// /// 信息 /// /// /// [HttpGet("{id}/auth")] public async Task GetInfoAuth(string id) { var userInfo = await _userManager.GetUserInfo(); if (userInfo.roleIds != null && !userInfo.isAdministrator) { var roleId = await _roleRepository.Entities.In(r => r.Id, userInfo.roleIds).Where(r => r.EnabledMark.Equals(1) && r.DeleteMark == null).Select(r => r.Id).ToListAsync(); var items = await _authorizeRepository.Entities.In(a => a.ObjectId, roleId).Where(a => a.ItemType == "portal").GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return null; var entity = await _portalRepository.Entities.In(p => p.Id, items.Select(it => it.ItemId).ToArray()).SingleAsync(p => p.Id == id && p.EnabledMark.Equals(1) && p.DeleteMark == null); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); return new { formData = entity.FormData }; } if (userInfo.isAdministrator) { var entity = await _portalRepository.SingleAsync(p => p.Id == id && p.EnabledMark.Equals(1) && p.DeleteMark == null); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); return new { formData = entity.FormData }; } throw NCCException.Oh(ErrorCode.D1900); } #endregion #region Post /// /// 门户导出 /// /// /// [HttpPost("{modelId}/Actions/ExportData")] public async Task ActionsExportData(string modelId) { //模板实体 var templateEntity = await _portalRepository.SingleAsync(p => p.Id == modelId); var jsonStr = templateEntity.Serialize(); return _fileService.Export(jsonStr, templateEntity.FullName); } /// /// 门户导入 /// /// /// [HttpPost("Model/Actions/ImportData")] public async Task ActionsImportData(IFormFile file) { var josn = _fileService.Import(file); var templateEntity = josn.Deserialize(); if (templateEntity == null) throw NCCException.Oh(ErrorCode.D3006); if (templateEntity != null && templateEntity.FormData.IndexOf("layouyId") <= 0) throw NCCException.Oh(ErrorCode.D3006); if (!string.IsNullOrEmpty(templateEntity.Id) && await _portalRepository.AnyAsync(it => it.Id == templateEntity.Id && it.DeleteMark == null)) throw NCCException.Oh(ErrorCode.D1400); if (await _portalRepository.AnyAsync(it => it.EnCode == templateEntity.EnCode && it.FullName == templateEntity.FullName && it.DeleteMark == null)) throw NCCException.Oh(ErrorCode.D1400); await _portalRepository.Context.Insertable(templateEntity).CallEntityMethod(m => m.Create()).ExecuteCommandAsync(); } /// /// 新建功能信息 /// /// 实体对象 /// [HttpPost("")] public async Task Create([FromBody] PortalCrInput input) { var entity = input.Adapt(); await _portalRepository.Context.Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); } /// /// 修改接口 /// /// 主键id /// 参数 /// [HttpPut("{id}")] public async Task Update(string id, [FromBody] PortalUpInput input) { var entity = input.Adapt(); var isOk = await _portalRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001); } /// /// 删除接口 /// /// 主键id /// [HttpDelete("{id}")] public async Task Delete(string id) { var entity = await _portalRepository.SingleAsync(p => p.Id == id && p.DeleteMark == null); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005); var isOk = await _portalRepository.Context.Updateable(entity).UpdateColumns(it => new { it.DeleteMark, it.DeleteUserId, it.DeleteTime }).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002); } /// /// 复制 /// /// 主键值 /// [HttpPost("{id}/Actions/Copy")] public async Task ActionsCopy(string id) { var newEntity = new PortalEntity(); var entity = await _portalRepository.SingleAsync(p => p.Id == id && p.DeleteMark == null); newEntity.FullName = entity.FullName + "_副本"; newEntity.EnCode = entity.EnCode + "_1"; newEntity.Category = entity.Category; newEntity.FormData = entity.FormData; newEntity.Description = entity.Description; newEntity.EnabledMark = 0; var isOk = await _portalRepository.Context.Insertable(newEntity).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); } /// /// 设置默认门户 /// /// [HttpPut("{id}/Actions/SetDefault")] public async Task SetDefault(string id) { var userEntity = _userManager.User; _ = userEntity ?? throw NCCException.Oh(ErrorCode.D5002); if (userEntity != null) { userEntity.PortalId = id; var isOk = await _portalRepository.Context.Updateable().SetColumns(it => new UserEntity() { PortalId = id, LastModifyTime = SqlFunc.GetDate(), LastModifyUserId = _userManager.UserId }).Where(it => it.Id == userEntity.Id).ExecuteCommandAsync(); if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.D5014); } } #endregion #region PublicMethod /// /// 获取默认 /// /// [NonAction] public async Task GetDefault() { var user = _userManager.User; if (!user.IsAdministrator.ToBool()) { if (!string.IsNullOrEmpty(user.RoleId)) { var roleIds = user.RoleId.Split(','); var roleId = await _roleRepository.Entities.In(r => r.Id, roleIds).Where(r => r.EnabledMark.Equals(1) && r.DeleteMark == null).Select(r => r.Id).ToListAsync(); var items = await _authorizeRepository.Entities.In(a => a.ObjectId, roleId).Where(a => a.ItemType == "portal").GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync(); if (items.Count == 0) return null; var portalList = await _portalRepository.Entities.In(p => p.Id, items.Select(it => it.ItemId).ToArray()).Where(p => p.EnabledMark.Equals(1) && p.DeleteMark == null).OrderBy(o => o.SortCode).Select(s => s.Id).ToListAsync(); return portalList.FirstOrDefault(); } return null; } else { var portalList = await _portalRepository.Entities.Where(p => p.EnabledMark.Equals(1) && p.DeleteMark == null).OrderBy(o => o.SortCode).Select(s => s.Id).ToListAsync(); return portalList.FirstOrDefault(); } } #endregion } }