|
@@ -3,8 +3,8 @@ using Hotline.Application.Knowledge;
|
|
|
using Hotline.FlowEngine.WorkflowModules;
|
|
|
using Hotline.KnowledgeBase;
|
|
|
using Hotline.KnowledgeBase.Notifies;
|
|
|
-using Hotline.Orders;
|
|
|
using Hotline.Permissions;
|
|
|
+using Hotline.Quality;
|
|
|
using Hotline.Repository.SqlSugar.Extensions;
|
|
|
using Hotline.Repository.SqlSugar.Ts;
|
|
|
using Hotline.Settings;
|
|
@@ -13,11 +13,14 @@ using Hotline.Share.Dtos;
|
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
using Hotline.Share.Dtos.Knowledge;
|
|
|
using Hotline.Share.Dtos.Order;
|
|
|
+using Hotline.Share.Dtos.Quality;
|
|
|
using Hotline.Share.Enums.KnowledgeBase;
|
|
|
using Hotline.Users;
|
|
|
using MapsterMapper;
|
|
|
using MediatR;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
+using Org.BouncyCastle.Utilities;
|
|
|
+using Polly.Caching;
|
|
|
using SqlSugar;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Exceptions;
|
|
@@ -47,6 +50,7 @@ namespace Hotline.Api.Controllers
|
|
|
private readonly IRepository<KnowledgeCorrection> _knowledgeCorrectionRepository;
|
|
|
private readonly IRepository<KnowledgeCollect> _knowledgeCollectRepository;
|
|
|
private readonly ISystemDomainService _systemDomainService;
|
|
|
+ private readonly IRepository<KnowledgeComment> _knowledgeCommentRepository;
|
|
|
|
|
|
|
|
|
public KnowledgeController(
|
|
@@ -66,7 +70,8 @@ namespace Hotline.Api.Controllers
|
|
|
IRepository<KnowledgeQuestions> knowledgeQuestionsRepository,
|
|
|
IRepository<KnowledgeCorrection> knowledgeCorrectionRepository,
|
|
|
IRepository<KnowledgeCollect> knowledgeCollectRepository,
|
|
|
- ISystemDomainService systemDomainService
|
|
|
+ ISystemDomainService systemDomainService,
|
|
|
+ IRepository<KnowledgeComment> knowledgeCommentRepository
|
|
|
)
|
|
|
{
|
|
|
_knowledgeRepository = knowledgeRepository;
|
|
@@ -86,6 +91,7 @@ namespace Hotline.Api.Controllers
|
|
|
_knowledgeCorrectionRepository = knowledgeCorrectionRepository;
|
|
|
_knowledgeCollectRepository = knowledgeCollectRepository;
|
|
|
_systemDomainService = systemDomainService;
|
|
|
+ _knowledgeCommentRepository = knowledgeCommentRepository;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
@@ -109,13 +115,15 @@ namespace Hotline.Api.Controllers
|
|
|
|
|
|
kn.Status = EKnowledgeStatus.Drafts;
|
|
|
var id = await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
|
|
|
- if (addDto.Tags.Any()) await _repositoryts.AddVectorAsync(id, DateTime.Now, addDto.Tags, HttpContext.RequestAborted);
|
|
|
- if (dto.Workflow != null)
|
|
|
+ if (dto.Workflow != null && !string.IsNullOrEmpty(id))
|
|
|
{
|
|
|
var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeAdd;
|
|
|
startDto.Title = "知识库新增";
|
|
|
await StartFlow(id, WorkflowModuleConsts.KnowledgeAdd, EKnowledgeApplyType.Add, startDto);
|
|
|
+ var knowledge = await _knowledgeRepository.GetAsync(id);
|
|
|
+ knowledge.Status = EKnowledgeStatus.Auditing;
|
|
|
+ await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
}
|
|
|
return id;
|
|
|
}
|
|
@@ -164,6 +172,17 @@ namespace Hotline.Api.Controllers
|
|
|
throw UserFriendlyException.SameMessage("知识上架失败");
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 知识库-标题
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="title"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("{Title}")]
|
|
|
+ public async Task<bool> KnowledgeTitle(string Title) {
|
|
|
+ var count = await _knowledgeRepository.Queryable().Where(x => x.Title == Title).CountAsync();
|
|
|
+ return count > 0;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 知识库-修改
|
|
|
/// </summary>
|
|
@@ -180,15 +199,16 @@ namespace Hotline.Api.Controllers
|
|
|
if (knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing)
|
|
|
throw UserFriendlyException.SameMessage("知识库数据不可修改");
|
|
|
_mapper.Map(dto.Data, knowledge);
|
|
|
- if (update.Tags.Any()) await _repositoryts.UpdateVectorAsync(update.Id, update.Tags, HttpContext.RequestAborted);
|
|
|
- await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
+ //if (update.Tags.Any()) await _repositoryts.UpdateVectorAsync(update.Id, update.Tags, HttpContext.RequestAborted);
|
|
|
if (dto.Workflow != null)
|
|
|
{
|
|
|
var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeAdd;
|
|
|
startDto.Title = "知识库修改";
|
|
|
await StartFlow(update.Id, WorkflowModuleConsts.KnowledgeUpdate, EKnowledgeApplyType.Update, startDto);
|
|
|
+ knowledge.Status = EKnowledgeStatus.Auditing;
|
|
|
}
|
|
|
+ await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -205,11 +225,13 @@ namespace Hotline.Api.Controllers
|
|
|
if (knowledge == null) return;
|
|
|
if (knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing)
|
|
|
throw UserFriendlyException.SameMessage("知识库数据不可删除");
|
|
|
- await _knowledgeRepository.RemoveAsync(knowledge, false, HttpContext.RequestAborted);
|
|
|
+ //await _knowledgeRepository.RemoveAsync(knowledge, false, HttpContext.RequestAborted);
|
|
|
+ knowledge.Status = EKnowledgeStatus.Auditing;
|
|
|
+ await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeDelete;
|
|
|
startDto.Title = "知识库删除";
|
|
|
- await StartFlow(delete.Id, WorkflowModuleConsts.KnowledgeDelete, EKnowledgeApplyType.Add, startDto);
|
|
|
+ await StartFlow(delete.Id, WorkflowModuleConsts.KnowledgeDelete, EKnowledgeApplyType.Delete, startDto);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -254,7 +276,6 @@ namespace Hotline.Api.Controllers
|
|
|
var knowledge = await _knowledgeDomainService.KnowledgeInfo(Id, HttpContext.RequestAborted);
|
|
|
if (knowledge is null)
|
|
|
throw UserFriendlyException.SameMessage("知识查询失败!");
|
|
|
-
|
|
|
//转化
|
|
|
var knowledgeShowInfoDto = _mapper.Map<KnowledgeInfoDto>(knowledge);
|
|
|
|
|
@@ -271,7 +292,14 @@ namespace Hotline.Api.Controllers
|
|
|
var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == Id && x.CreatorId == _sessionContext.UserId);
|
|
|
if (collect != null)
|
|
|
knowledgeShowInfoDto.Collect = _mapper.Map<KnowledgeCollectDto>(collect);
|
|
|
-
|
|
|
+ //关联知识
|
|
|
+ var knowledges = await _knowledgeRepository.Queryable().In(x=>x.Id,knowledge.Knowledges).ToListAsync();
|
|
|
+ if (knowledges.Any())
|
|
|
+ knowledgeShowInfoDto.KnowledgeDtos = _mapper.Map<List<KnowledgeDto>>(knowledges);
|
|
|
+ //关键词
|
|
|
+ var knowledgeWords= await _knowledgeWrodRepository.Queryable().In(x => x.Id, knowledge.Keywords).ToListAsync();
|
|
|
+ if (knowledgeWords.Any())
|
|
|
+ knowledgeShowInfoDto.KeywordsDto = _mapper.Map<List<KnowledgeWordDto>>(knowledgeWords);
|
|
|
if (IsAddPv == true)
|
|
|
_mediator.Publish(new GetKnowledgeInfoNotify(knowledge));
|
|
|
return knowledgeShowInfoDto;
|
|
@@ -356,13 +384,18 @@ namespace Hotline.Api.Controllers
|
|
|
[HttpGet]
|
|
|
public async Task<PagedDto<KnowledgeDataDto>> GetKnowList([FromQuery] KnowPagedListDto pagedDto)
|
|
|
{
|
|
|
- var type = new KnowledgeType();
|
|
|
- var hotspot = new Hotspot();
|
|
|
- var organize = new SystemOrganize();
|
|
|
+ var typeSpliceName = string.Empty;
|
|
|
+ var hotspotHotSpotFullName = string.Empty;
|
|
|
if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
|
|
|
- type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
+ {
|
|
|
+ var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
+ typeSpliceName = type?.SpliceName;
|
|
|
+ }
|
|
|
if (!string.IsNullOrEmpty(pagedDto.HotspotId))
|
|
|
- hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
+ {
|
|
|
+ var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
+ hotspotHotSpotFullName = hotspot?.HotSpotFullName;
|
|
|
+ }
|
|
|
var (total, temp) = await _knowledgeRepository.Queryable()
|
|
|
.Includes(x => x.User)
|
|
|
.Includes(x => x.SystemOrganize)
|
|
@@ -373,8 +406,8 @@ namespace Hotline.Api.Controllers
|
|
|
.WhereIF(pagedDto.Status.HasValue, x => x.Status == pagedDto.Status)
|
|
|
.WhereIF(pagedDto.IsPublic.HasValue, x => x.IsPublic == pagedDto.IsPublic)
|
|
|
.WhereIF(!string.IsNullOrEmpty(pagedDto.Summary), x => x.Summary != null && x.Summary.Contains(pagedDto.Summary!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId), x => type != null && x.KnowledgeType.SpliceName.EndsWith(type.SpliceName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.HotspotId), x => hotspot != null && x.HotspotType.HotSpotFullName.EndsWith(hotspot.HotSpotFullName))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.SpliceName.EndsWith(typeSpliceName!))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
|
|
|
.WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.HotspotType.CreatorId != null && x.HotspotType.CreatorId.EndsWith(pagedDto.CreateOrgId!))
|
|
|
.OrderByDescending(d => d.CreationTime)
|
|
|
//转分页数据
|
|
@@ -392,13 +425,18 @@ namespace Hotline.Api.Controllers
|
|
|
[HttpGet("knowretrieval")]
|
|
|
public async Task<PagedDto<KnowledgeRetrievalDataDto>> KnowRetrieval([FromQuery] KnowledgeRetrievalPagedListDto pagedDto)
|
|
|
{
|
|
|
- var type = new KnowledgeType();
|
|
|
- var hotspot = new Hotspot();
|
|
|
- var organize = new SystemOrganize();
|
|
|
+ var typeSpliceName = string.Empty;
|
|
|
+ var hotspotHotSpotFullName = string.Empty;
|
|
|
if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
|
|
|
- type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
+ {
|
|
|
+ var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
+ typeSpliceName = type?.SpliceName;
|
|
|
+ }
|
|
|
if (!string.IsNullOrEmpty(pagedDto.HotspotId))
|
|
|
- hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
+ {
|
|
|
+ var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
+ hotspotHotSpotFullName = hotspot?.HotSpotFullName;
|
|
|
+ }
|
|
|
var sugar = _knowledgeRepository
|
|
|
.Queryable()
|
|
|
.Includes(x => x.User)
|
|
@@ -409,9 +447,9 @@ namespace Hotline.Api.Controllers
|
|
|
.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!) || d.Content.Contains(pagedDto.Keyword!))// || d.Additions.Contains(pagedDto.Keyword)
|
|
|
.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Title && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!))
|
|
|
.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Content && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Content.Contains(pagedDto.Keyword!))
|
|
|
- .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Summary && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Summary.Contains(pagedDto.Keyword!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId), x => type != null && x.KnowledgeType.SpliceName.EndsWith(type.SpliceName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.HotspotId), x => hotspot != null && x.HotspotType.HotSpotFullName.EndsWith(hotspot.HotSpotFullName))
|
|
|
+ .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Summary && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Summary != null && d.Summary.Contains(pagedDto.Keyword!))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.SpliceName.EndsWith(typeSpliceName!))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
|
|
|
.WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.HotspotType.CreatorId != null && x.HotspotType.CreatorId.EndsWith(pagedDto.CreateOrgId!))
|
|
|
.WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution), x => x.Attribution == pagedDto.Attribution!);
|
|
|
switch (pagedDto.Sort)
|
|
@@ -525,16 +563,6 @@ namespace Hotline.Api.Controllers
|
|
|
return new PagedDto<KnowledgeApprovalDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApprovalDataDto>>(items));
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 获取知识热点词
|
|
|
- /// </summary>
|
|
|
- /// <returns></returns>
|
|
|
- [HttpGet("getkeyword")]
|
|
|
- public async Task<List<string>> GetKeyWord()
|
|
|
- {
|
|
|
- return await _knowledgeDomainService.GetKeyWord();
|
|
|
- }
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 工单受理知识检索
|
|
|
/// </summary>
|
|
@@ -968,8 +996,8 @@ namespace Hotline.Api.Controllers
|
|
|
await _knowledgeCollectRepository.UpdateAsync(collect, HttpContext.RequestAborted);
|
|
|
}
|
|
|
else {
|
|
|
- var questions = _mapper.Map<KnowledgeCollect>(dto);
|
|
|
- await _knowledgeCollectRepository.AddAsync(questions, HttpContext.RequestAborted);
|
|
|
+ var collectNew = _mapper.Map<KnowledgeCollect>(dto);
|
|
|
+ await _knowledgeCollectRepository.AddAsync(collectNew, HttpContext.RequestAborted);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -989,23 +1017,75 @@ namespace Hotline.Api.Controllers
|
|
|
throw UserFriendlyException.SameMessage("当前知识已经评分");
|
|
|
collect.Score = dto.Score;
|
|
|
await _knowledgeCollectRepository.UpdateAsync(collect, HttpContext.RequestAborted);
|
|
|
- //计算总分
|
|
|
- var sugar = _knowledgeCollectRepository.Queryable().Where(x => x.KnowledgeId == dto.KnowledgeId);
|
|
|
- var count = await sugar.CountAsync();
|
|
|
- var collects = await sugar.SumAsync(x=>x.Score);
|
|
|
- var score = collects / count;
|
|
|
- var knowledge = await _knowledgeRepository.GetAsync(x => x.Id == dto.KnowledgeId);
|
|
|
- if (knowledge != null)
|
|
|
- {
|
|
|
- knowledge.Score = score;
|
|
|
- await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
- }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var questions = _mapper.Map<KnowledgeCollect>(dto);
|
|
|
await _knowledgeCollectRepository.AddAsync(questions, HttpContext.RequestAborted);
|
|
|
}
|
|
|
+ //计算总分
|
|
|
+ var sugar = _knowledgeCollectRepository.Queryable().Where(x => x.KnowledgeId == dto.KnowledgeId);
|
|
|
+ var count = await sugar.CountAsync();
|
|
|
+ var collects = await sugar.SumAsync(x => x.Score);
|
|
|
+ var score = collects / count;
|
|
|
+ var knowledge = await _knowledgeRepository.GetAsync(x => x.Id == dto.KnowledgeId);
|
|
|
+ if (knowledge != null)
|
|
|
+ {
|
|
|
+ knowledge.Score = decimal.Round(score.Value,1);
|
|
|
+ await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 知识评论
|
|
|
+
|
|
|
+ //[Permission(EPermission.AddKnowledgeCollect)]
|
|
|
+ [HttpPost("knowledge_comment")]
|
|
|
+ public async Task Add([FromBody] KnowledgeCommentAddDto dto)
|
|
|
+ {
|
|
|
+ var model = _mapper.Map<KnowledgeComment>(dto);
|
|
|
+ await _knowledgeCommentRepository.AddAsync(model, HttpContext.RequestAborted);
|
|
|
+ if (!string.IsNullOrEmpty(dto.ReplyId))
|
|
|
+ {
|
|
|
+ var comment = await _knowledgeCommentRepository.GetAsync(dto.ReplyId);
|
|
|
+ if (comment != null)
|
|
|
+ {
|
|
|
+ comment.ReplyNum++;
|
|
|
+ await _knowledgeCommentRepository.UpdateAsync(comment, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //[Permission(EPermission.DeleteQualityItem)]
|
|
|
+ [HttpDelete("itemBatch")]
|
|
|
+ public async Task Delete([FromBody] KnowledgeCommentDeleteDto dto)
|
|
|
+ {
|
|
|
+ await _knowledgeCommentRepository.RemoveAsync(x => x.Id == dto.Id);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //[Permission(EPermission.UpdateQualityItem)]
|
|
|
+ [HttpPut("item")]
|
|
|
+ public async Task Update([FromBody] KnowledgeCommentUpdateDto dto)
|
|
|
+ {
|
|
|
+ var comment = await _knowledgeCommentRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
|
|
|
+ if (comment is null)
|
|
|
+ throw UserFriendlyException.SameMessage("无效评论");
|
|
|
+ _mapper.Map(dto, comment);
|
|
|
+ await _knowledgeCommentRepository.UpdateAsync(comment, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ //[Permission(EPermission.QualityItemList)]
|
|
|
+ [HttpGet("item/list")]
|
|
|
+ public async Task<List<KnowledgeCommentDto>> List([FromQuery] KnowledgeCommentListDto dto)
|
|
|
+ {
|
|
|
+ var comments = await _knowledgeCommentRepository.Queryable()
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.KnowledgeId), x => x.KnowledgeId == dto.KnowledgeId)
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.ReplyId), x => x.ReplyId == dto.ReplyId)
|
|
|
+ .WhereIF(dto.All.HasValue && dto.All == false, x => x.CreatorId == _sessionContext.UserId)
|
|
|
+ .OrderByDescending(x => x.CreationTime)
|
|
|
+ .ToListAsync();
|
|
|
+ return new List<KnowledgeCommentDto>(_mapper.Map<IReadOnlyList<KnowledgeCommentDto>>(comments));
|
|
|
}
|
|
|
#endregion
|
|
|
}
|