using Hotline.KnowledgeBase; using Hotline.Permissions; using Hotline.Settings; using Hotline.Settings.Hotspots; using Hotline.Share.Dtos.Knowledge; using MapsterMapper; using Microsoft.AspNetCore.Mvc; using SqlSugar; using XF.Domain.Authentications; using XF.Domain.Exceptions; using XF.Domain.Repository; namespace Hotline.Api.Controllers { /// /// /// public class KnowledgeCommonController : BaseController { #region 注入 private readonly IRepository _knowledgeTypeRepository; private readonly IKnowledgeTypeDomainService _knowledgeTypeDomainService; private readonly IRepository _knowledgeStandardRepository; private readonly IMapper _mapper; private readonly ISessionContext _sessionContext; private readonly ISystemOrganizeRepository _systemOrganizeRepository; private readonly IRepository _hotspotTypeRepository; /// /// /// /// /// /// /// public KnowledgeCommonController(IRepository knowledgeTypeRepository, IKnowledgeTypeDomainService knowledgeTypeDomainService, IRepository knowledgeStandardRepository, ISessionContext sessionContext, IMapper mapper, ISystemOrganizeRepository systemOrganizeRepository, IRepository hotspotTypeRepository) { _knowledgeTypeRepository = knowledgeTypeRepository; _knowledgeTypeDomainService = knowledgeTypeDomainService; _knowledgeStandardRepository = knowledgeStandardRepository; _mapper = mapper; _sessionContext = sessionContext; _systemOrganizeRepository = systemOrganizeRepository; _hotspotTypeRepository = hotspotTypeRepository; } #endregion #region 知识分类 /// ///知识分类- 新增 /// /// /// [HttpPost("add")] public async Task AddType([FromBody] AddKnowledgeTypeDto dto) { return await _knowledgeTypeDomainService.AddType(dto, HttpContext.RequestAborted); } /// ///知识分类- 编辑 /// /// /// [HttpPut("update")] public async Task UpdateType([FromBody] UpdateKnowledgeTypeDto dto) { await _knowledgeTypeDomainService.UpdateType(dto, HttpContext.RequestAborted); } /// /// 知识分类-新增、编辑初始化 /// /// /// /// [HttpGet("init")] public async Task InitType(string Id, string ParentId) { return await _knowledgeTypeDomainService.InitType(Id, ParentId, HttpContext.RequestAborted); } /// /// 知识分类-查询详情 /// /// /// [HttpGet("info/{Id}")] public async Task GetType(string Id) { var types = await _knowledgeTypeRepository.Queryable() .Includes(x => x.KnowledgeTypeOrgs) .Where(x => x.Id == Id) .FirstAsync(HttpContext.RequestAborted); if (types is null) throw UserFriendlyException.SameMessage("查询失败!"); return types; } /// /// 知识分类-删除 /// /// /// [HttpDelete("remove")] public async Task RemoveType(string Id) { await _knowledgeTypeDomainService.RemoveType(Id, HttpContext.RequestAborted); } /// /// 知识分类-启用、禁用切换 /// /// /// [HttpPut("changestate")] public async Task ChangeStateType(string Id) { await _knowledgeTypeDomainService.ChangeStateType(Id, HttpContext.RequestAborted); } /// /// 知识分类-禁用,并且下架知识 /// /// /// [HttpPut("changestateandoffshelf")] public async Task TypeChangeStateAndOffShelf(string Id) { await _knowledgeTypeDomainService.ChangeStateTypeAndOffShelf(Id, HttpContext.RequestAborted); } /// /// 知识分类- 获取层级分类 /// /// 不传查询所有 /// [HttpGet("treelist")] public async Task> GetTreeList(bool? IsEnable, string? Attribution) { var query = _knowledgeTypeRepository.Queryable(); if (!_sessionContext.OrgIsCenter) query.Where(d => d.Orgs.Any(s => s.Id == _sessionContext.RequiredOrgId)); return await query.WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable) .Select(x => new KnowledgeTypeDto() { Id = x.Id.SelectAll(), KnowledgeNum = SqlFunc.Subqueryable().LeftJoin((kr, k) => kr.KnowledgeId == k.Id) .Where((kr, k) => kr.KnowledgeTypeSpliceName.StartsWith(x.SpliceName)) .WhereIF(!string.IsNullOrEmpty(Attribution), (kr, k) => k.Attribution == Attribution).DistinctCount(kr => kr.KnowledgeId) }) .OrderBy(x => x.Sort) .ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id); } //[HttpGet("treelist")] //public async Task> GetTreeList(bool? IsEnable, string? Attribution) //{ // return await _knowledgeTypeRepository.Queryable() // .WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable) // .Where(x => SqlFunc.Subqueryable().Where(to => to.TypeId == x.Id && to.OrgId == _sessionContext.RequiredOrgId).Any() // || SqlFunc.Subqueryable().Where(to => to.TypeId == x.Id).NotAny()) // .Select(x => new KnowledgeTypeDto() // { // Id = x.Id.SelectAll(), // KnowledgeNum = SqlFunc.Subqueryable().LeftJoin((kr, k) => kr.KnowledgeId == k.Id) // .Where((kr, k) => kr.KnowledgeTypeSpliceName.StartsWith(x.SpliceName)) // .WhereIF(!string.IsNullOrEmpty(Attribution), (kr, k) => k.Attribution == Attribution).DistinctCount(kr => kr.KnowledgeId) // }) // .OrderBy(x => x.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id); //} /// /// 知识部门 /// /// 不传查询所有 /// [HttpGet("treelist/org")] public async Task> GetTreeList(string? Attribution) { //await Db.Queryable() // .Where(it => it.Id.StartsWith(orgCode)) // .OrderBy(d => d.Id) // .ToTreeAsync(it => it.Children, it => it.ParentId, orgCode.Length > 6 ? orgCode.Substring(0, orgCode.Length - 3) : null); var orgCode = _sessionContext.RequiredOrgId; var query = _systemOrganizeRepository.Queryable().WhereIF(!_sessionContext.OrgIsCenter, it => it.Id.StartsWith(_sessionContext.RequiredOrgId)) .Select(it => new KnowledgeOrgDto() { Id = it.Id.SelectAll(), KnowledgeNum = SqlFunc.Subqueryable() .Where(k => k.CreatorOrgId.StartsWith(it.Id)) .WhereIF(!string.IsNullOrEmpty(Attribution), k => k.Attribution == Attribution).DistinctCount(k => k.Id) }).OrderBy(d => d.Id); if (_sessionContext.OrgIsCenter) { return await query.ToTreeAsync(x => x.Children, it => it.ParentId, null); } return await query.ToTreeAsync(it => it.Children, it => it.ParentId, orgCode.Length > 6 ? orgCode.Substring(0, orgCode.Length - 3) : null); } /// /// 查询子项 /// [HttpGet("treelist/hotspot")] public async Task> GetChildren([FromQuery] string? id, string? Attribution) { var list = await _hotspotTypeRepository.Queryable() .WhereIF(!string.IsNullOrEmpty(id), x => x.ParentId == id) .WhereIF(string.IsNullOrEmpty(id), x => x.ParentId == null || x.ParentId == "") .OrderBy(d => d.HotSpotName) .Select(x => new KnowledgeHotSpotDto { Id = x.Id.SelectAll(), HasChild = SqlFunc.Subqueryable().Where(d => d.ParentId == x.Id).NotAny(), KnowledgeNum = SqlFunc.Subqueryable().LeftJoin((k, h) => k.HotspotId == h.Id) .Where((k, h) => h.HotSpotFullName.StartsWith(x.HotSpotFullName)) .WhereIF(!string.IsNullOrEmpty(Attribution), (k, h) => k.Attribution == Attribution).DistinctCount(k => k.Id) }).ToListAsync(); return list; } /// /// 名称检索热点树形 /// /// /// [HttpGet("treelist/children-hasname")] public async Task> GetChildrenHasName([FromQuery] string Name, string? Attribution) { var arr = _hotspotTypeRepository.Queryable() .WhereIF(!string.IsNullOrEmpty(Name), x => x.HotSpotFullName.Contains(Name)).Select(x => x.Id).ToList().Cast().ToArray(); //.ToTreeAsync(x => x.Children, it => it.ParentId, null); return await _hotspotTypeRepository.Queryable().Select(x => new KnowledgeHotSpotDto { Id = x.Id.SelectAll(), HasChild = SqlFunc.Subqueryable().Where(d => d.ParentId == x.Id).NotAny(), KnowledgeNum = SqlFunc.Subqueryable().LeftJoin((k, h) => k.HotspotId == h.Id) .Where((k, h) => h.HotSpotFullName.StartsWith(x.HotSpotFullName)) .WhereIF(!string.IsNullOrEmpty(Attribution), (k, h) => k.Attribution == Attribution).DistinctCount(k => k.Id) }).ToTreeAsync(x => x.Children, it => it.ParentId, "", arr); } /// /// 知识分类- 只获取一级 /// /// 不传默认查询第一级 /// 不传查询所有,包含已经禁用的 /// [HttpGet("typelist")] public async Task> GetTypeList(string? ParentId, bool? IsEnable) { return await _knowledgeTypeRepository .Queryable() .Where(p => p.ParentId == ParentId) .WhereIF(IsEnable.HasValue, p => p.IsEnable == IsEnable) .OrderByDescending(p => p.Sort) .ToListAsync(); } #endregion #region 编写规范 /// /// 编写规范-查询详情 /// /// [HttpGet("info-standard")] public async Task GetStandard() { var sandard = await _knowledgeStandardRepository.Queryable().FirstAsync(); if (sandard == null) { KnowledgeStandard standard = new() { Title = "", Content = "" }; var Id = await _knowledgeStandardRepository.AddAsync(standard, HttpContext.RequestAborted); return await _knowledgeStandardRepository.GetAsync(Id, HttpContext.RequestAborted); } return sandard; } /// /// 编写规范-修改 /// /// /// [HttpPut("update-standard")] public async Task UpdateStandard([FromBody] UpdateKnowledgeStandardDto dto) { var standard = await _knowledgeStandardRepository.GetAsync(dto.Id); _mapper.Map(dto, standard); await _knowledgeStandardRepository.UpdateAsync(standard, HttpContext.RequestAborted); } #endregion } }