using Hotline.Application.FlowEngine;
using Hotline.Application.Knowledge;
using Hotline.FlowEngine;
using Hotline.KnowledgeBase;
using Hotline.KnowledgeBase.Notifies;
using Hotline.Permissions;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Settings;
using Hotline.Settings.Hotspots;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.FlowEngine;
using Hotline.Share.Dtos.Knowledge;
using Hotline.Share.Enums.KnowledgeBase;
using Hotline.Users;
using MapsterMapper;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using XF.Domain.Authentications;
using XF.Domain.Exceptions;
using XF.Utility.EnumExtensions;
namespace Hotline.Api.Controllers
{
///
///
///
public class KnowledgeController : BaseController
{
#region 注入
private readonly IKnowledgeRepository _knowledgeRepository;
private readonly ISessionContext _sessionContext;
private readonly IKnowledgeDomainService _knowledgeDomainService;
private readonly IMapper _mapper;
private readonly IKnowApplication _knowApplication;
private readonly IMediator _mediator;
private readonly IWorkflowApplication _workflowApplication;
private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
private readonly IUserRepository _userRepository;
private readonly IKnowledgeTypeRepository _knowledgeTypeRepository;
private readonly IHotspotTypeRepository _hotspotTypeRepository;
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public KnowledgeController(IKnowledgeRepository knowledgeRepository, ISessionContext sessionContext, IKnowledgeDomainService knowledgeDomainService, IMapper mapper, IKnowApplication knowApplication,
IMediator mediator, IWorkflowApplication workflowApplication, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository
, IUserRepository userRepository, IKnowledgeTypeRepository knowledgeTypeRepository, IHotspotTypeRepository hotspotTypeRepository)
{
_knowledgeRepository = knowledgeRepository;
_sessionContext = sessionContext;
_knowledgeDomainService = knowledgeDomainService;
_mapper = mapper;
_knowApplication = knowApplication;
_mediator = mediator;
_workflowApplication = workflowApplication;
_knowledgeWorkFlowRepository = knowledgeWorkFlowRepository;
_userRepository = userRepository;
_knowledgeTypeRepository = knowledgeTypeRepository;
_hotspotTypeRepository = hotspotTypeRepository;
}
#endregion
#region 知识管理
///
/// 知识库-知识修改-查询详情
///
///
///
[HttpGet("updateinfo/{Id}")]
public async Task KnowledgeUpdateInfo(string Id)
{
var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
if (know is null)
throw UserFriendlyException.SameMessage("知识查询失败!");
var knowledgeInfoDto = _mapper.Map(know);
//分类
var type = await _knowledgeTypeRepository.GetAsync(know.KnowledgeTypeId, HttpContext.RequestAborted);
if (type != null)
knowledgeInfoDto.KnowledgeTypeName = type.SpliceName;
//热点
var hot = await _hotspotTypeRepository.GetAsync(know.HotspotId, HttpContext.RequestAborted);
if (hot != null)
knowledgeInfoDto.HotspotName = hot.HotSpotFullName;
return knowledgeInfoDto;
}
///
/// 知识库-查询详情-增加浏览量
///
/// 知识Id
/// 默认不增加,false不增加,true增加浏览量
///
[HttpGet("info/{Id}")]
public async Task KnowledgeInfo(string Id, bool? IsAddPv)
{
var knowledge = await _knowledgeDomainService.KnowledgeInfo(Id, HttpContext.RequestAborted);
if (knowledge is null)
throw UserFriendlyException.SameMessage("知识查询失败!");
//转化
var knowledgeShowInfoDto = _mapper.Map(knowledge);
//查询其他
var user = await _userRepository.GetAsync(knowledge.CreatorId, HttpContext.RequestAborted);
if (user != null)
knowledgeShowInfoDto.CreatorName = user.Name;
var type = await _knowledgeTypeRepository.GetAsync(knowledge.KnowledgeTypeId, HttpContext.RequestAborted);
if (type != null)
knowledgeShowInfoDto.KnowledgeTypeName = type.SpliceName;
var hot = await _hotspotTypeRepository.GetAsync(knowledge.HotspotId, HttpContext.RequestAborted);
if (hot != null)
knowledgeShowInfoDto.HotspotName = hot.HotSpotFullName;
if (IsAddPv == true)
_mediator.Publish(new GetKnowledgeInfoNotify(knowledge));
return knowledgeShowInfoDto;
}
///
/// 知识库-新增
///
///
///
[Permission(EPermission.AddKnowledge)]
[HttpPost("add")]
public async Task AddKnowledge([FromBody] AddKnowledgeDto dto)
{
var kn = _mapper.Map(dto);
//Code为空,从新生成Code
if (string.IsNullOrEmpty(kn.Code))
kn.Code = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();
kn.Status = EKnowledgeStatus.Drafts;
return await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
}
///
/// 知识库-知识下架
///
///
///
[Permission(EPermission.KnowledgeOffShelf)]
[HttpPut("offshelf")]
public async Task KnowledgeOffShelf(string Id)
{
var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
if (know != null && know.Status == EKnowledgeStatus.OnShelf)
{
know.Status = EKnowledgeStatus.OffShelf;
know.OnShelfTime = null;
know.OffShelfTime = DateTime.Now;
await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
}
else
throw UserFriendlyException.SameMessage("知识下架失败");
}
///
/// 知识库-知识上架
///
///
///
[Permission(EPermission.KnowledgeOnTheShelf)]
[HttpPut("ontheshelf")]
public async Task KnowledgeOnTheShelf(string Id)
{
var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
if (know != null && know.Status == EKnowledgeStatus.OffShelf)
{
know.Status = EKnowledgeStatus.OnShelf;
know.OnShelfTime = DateTime.Now;
know.OffShelfTime = null;
await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
}
else
throw UserFriendlyException.SameMessage("知识上架失败");
}
///
/// 知识申请-关联知识-获取知识列表
///
///
[HttpGet("getknowledge")]
public async Task> GetKnowledge()
{
var temp = await _knowledgeRepository
.Queryable()
.LeftJoin((o, sys) => o.CreatorOrgId == sys.Id)
//重新构建数据
.Select((o, sys) => new
{
index = SqlFunc.RowNumber($"{o.Version} desc ", $"{o.Code}"),
DepartmentId = sys.Id,
Department = sys.OrgName,
o.Id,
o.Title,
o.Status,
o.Code
})
//将结果合并成一个表
.MergeTable()
//取第一条数据
.Where(d => d.index == 1 && d.Status == EKnowledgeStatus.OnShelf)
.ToListAsync();
//返回数据
return _mapper.Map>(temp);
}
#endregion
#region 我的草稿箱
///
/// 我的草稿箱
///
///
///
[Permission(EPermission.KnowledgeMyDraftsList)]
[HttpGet("mydraftslist")]
public async Task> MyDraftsList([FromQuery] MyDraftsListPagedDto pagedDto)
{
var (total, items) = await _knowledgeRepository
.Queryable()
.Includes(it => it.User)
.Includes(it => it.KnowledgeType)
.Where(p => p.CreatorId == _sessionContext.RequiredUserId && p.Status == EKnowledgeStatus.Drafts)
.WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!))
.WhereIF(!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId), d => d.KnowledgeTypeId == pagedDto.KnowledgeTypeId)
.WhereIF(pagedDto.StartTime != null, d => d.CreationTime >= pagedDto.StartTime)
.WhereIF(pagedDto.EndTime != null, d => d.CreationTime <= pagedDto.EndTime)
.OrderByDescending(p => p.CreationTime)
.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 知识库-修改知识草稿
///
///
///
[Permission(EPermission.KnowledgeDraftsUpdate)]
[HttpPut("update")]
public async Task UpdateKnowledge([FromBody] UpdateKnowledgeDto dto)
{
if (dto.Status != EKnowledgeStatus.Drafts)
throw UserFriendlyException.SameMessage("非草稿数据不可修改");
var kn = _mapper.Map(dto);
await _knowledgeRepository.UpdateAsync(kn, HttpContext.RequestAborted);
}
///
/// 删除知识草稿
///
///
///
[Permission(EPermission.KnowledgeDraftsDelete)]
[HttpDelete("{id}")]
public async Task Remove(string id)
{
var knowledge = await _knowledgeRepository.GetAsync(id, HttpContext.RequestAborted);
if (knowledge == null) return;
if (knowledge.Status != EKnowledgeStatus.Drafts)
throw UserFriendlyException.SameMessage("非草稿数据不可删除");
await _knowledgeRepository.RemoveAsync(knowledge, false, HttpContext.RequestAborted);
}
#endregion
#region 知识列表
///
/// 知识库列表页面枚举值
///
///
[HttpGet("knowledge-status-data")]
public async Task