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