|
@@ -1,14 +1,20 @@
|
|
|
-using DotNetCore.CAP;
|
|
|
+using DocumentFormat.OpenXml.Wordprocessing;
|
|
|
+using DotNetCore.CAP;
|
|
|
using Hotline.Api.Filter;
|
|
|
using Hotline.Application.Bulletin;
|
|
|
+using Hotline.Application.ExportExcel;
|
|
|
+using Hotline.Application.ExportWord;
|
|
|
using Hotline.Application.FlowEngine;
|
|
|
using Hotline.Application.Knowledge;
|
|
|
+using Hotline.Application.Systems;
|
|
|
+using Hotline.Application.Tools;
|
|
|
using Hotline.File;
|
|
|
using Hotline.FlowEngine.WorkflowModules;
|
|
|
using Hotline.KnowledgeBase;
|
|
|
using Hotline.KnowledgeBase.Notifies;
|
|
|
using Hotline.Permissions;
|
|
|
using Hotline.Repository.SqlSugar.Extensions;
|
|
|
+using Hotline.Repository.SqlSugar.Knowledge;
|
|
|
using Hotline.Repository.SqlSugar.Ts;
|
|
|
using Hotline.Settings;
|
|
|
using Hotline.Settings.Hotspots;
|
|
@@ -16,6 +22,8 @@ using Hotline.Share.Dtos;
|
|
|
using Hotline.Share.Dtos.File;
|
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
using Hotline.Share.Dtos.Knowledge;
|
|
|
+using Hotline.Share.Dtos.Order;
|
|
|
+using Hotline.Share.Enums.Article;
|
|
|
using Hotline.Share.Enums.KnowledgeBase;
|
|
|
using Hotline.Share.Mq;
|
|
|
using Hotline.Share.Tools;
|
|
@@ -26,6 +34,7 @@ using MapsterMapper;
|
|
|
using MediatR;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
|
|
+using Org.BouncyCastle.Utilities.IO;
|
|
|
using SqlSugar;
|
|
|
using System.Threading;
|
|
|
using XF.Domain.Authentications;
|
|
@@ -40,6 +49,11 @@ namespace Hotline.Api.Controllers
|
|
|
{
|
|
|
|
|
|
#region 注入
|
|
|
+ private readonly IExportApplication _exportApplication;
|
|
|
+ private readonly IRepository<KnowledgeHotWord> _knowledgeHotWordRepository;
|
|
|
+ private readonly IRepository<KnowledgeWord> _knowledgeWordRepository;
|
|
|
+ private readonly IWordHelperService _wordHelperService;
|
|
|
+ private readonly BaseDataApplication _baseDataApplication;
|
|
|
private readonly IKnowledgeRepository _knowledgeRepository;
|
|
|
private readonly ISessionContext _sessionContext;
|
|
|
private readonly IKnowledgeDomainService _knowledgeDomainService;
|
|
@@ -64,6 +78,7 @@ namespace Hotline.Api.Controllers
|
|
|
private readonly IRepository<KnowledgeRelationType> _knowledgeRelationTypeRepository;
|
|
|
private readonly IBulletinApplication _bulletinApplication;
|
|
|
private readonly IRepository<KnowledgeCollectGroup> _knowledgeCollectGroupRepository;
|
|
|
+ private readonly IRepository<KnowledgePv> _knowledgePvepository;
|
|
|
|
|
|
|
|
|
public KnowledgeController(
|
|
@@ -89,9 +104,15 @@ namespace Hotline.Api.Controllers
|
|
|
IFileRepository fileRepository,
|
|
|
ICapPublisher capPublisher,
|
|
|
IRepository<KnowledgeRelationType> knowledgeRelationTypeRepository,
|
|
|
- IBulletinApplication bulletinApplication
|
|
|
-,
|
|
|
- IRepository<KnowledgeCollectGroup> knowledgeCollectGroupRepository)
|
|
|
+ IBulletinApplication bulletinApplication,
|
|
|
+ IRepository<KnowledgeCollectGroup> knowledgeCollectGroupRepository,
|
|
|
+ IExportApplication exportApplication,
|
|
|
+ BaseDataApplication baseDataApplication,
|
|
|
+ IWordHelperService wordHelperService,
|
|
|
+ IRepository<KnowledgePv> knowledgePvepository,
|
|
|
+ IRepository<KnowledgeWord> knowledgeWordRepository,
|
|
|
+ IRepository<KnowledgeHotWord> knowledgeWordHotRepository,
|
|
|
+ IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
|
|
|
{
|
|
|
_knowledgeRepository = knowledgeRepository;
|
|
|
_sessionContext = sessionContext;
|
|
@@ -117,6 +138,12 @@ namespace Hotline.Api.Controllers
|
|
|
_knowledgeRelationTypeRepository = knowledgeRelationTypeRepository;
|
|
|
_bulletinApplication = bulletinApplication;
|
|
|
_knowledgeCollectGroupRepository = knowledgeCollectGroupRepository;
|
|
|
+ _exportApplication = exportApplication;
|
|
|
+ _baseDataApplication = baseDataApplication;
|
|
|
+ _wordHelperService = wordHelperService;
|
|
|
+ _knowledgePvepository = knowledgePvepository;
|
|
|
+ _knowledgeWordRepository = knowledgeWordRepository;
|
|
|
+ _knowledgeHotWordRepository = knowledgeHotWordRepository;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
@@ -136,24 +163,26 @@ namespace Hotline.Api.Controllers
|
|
|
//var addDto = _mapper.Map<AddKnowledgeDto>(dto.Data);
|
|
|
var kn = _mapper.Map<Knowledge>(dto.Data);
|
|
|
kn.SourceOrganizeId = _sessionContext.RequiredOrgId;
|
|
|
- var any = await _knowledgeRepository.Queryable().Where(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == kn.Title).AnyAsync();
|
|
|
+ var any = await _knowledgeRepository.Queryable().Where(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == kn.Title).AnyAsync();
|
|
|
if (any) throw UserFriendlyException.SameMessage("当前知识标题存在重复标题!");
|
|
|
|
|
|
//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.Keywords = (await _knowApplication.TitleParticiple(kn.Keywords, kn.Title)).ToList();
|
|
|
kn.Status = EKnowledgeStatus.Drafts;
|
|
|
kn.InitId();
|
|
|
if (dto.Data.Files.Any()) kn.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, kn.Id, "", HttpContext.RequestAborted);
|
|
|
await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
|
|
|
+
|
|
|
if (dto.Data.KnowledgeType.Any())
|
|
|
{
|
|
|
- List<KnowledgeRelationType> types = _mapper.Map<List<KnowledgeRelationType>>(dto.Data.KnowledgeType);
|
|
|
- types.ForEach(x => x.KnowledgeId = kn.Id);
|
|
|
- await _knowledgeRelationTypeRepository.AddRangeAsync(types, HttpContext.RequestAborted);
|
|
|
- }
|
|
|
- if (dto.Workflow != null && !string.IsNullOrEmpty(kn.Id))
|
|
|
+ List<KnowledgeRelationType> types = _mapper.Map<List<KnowledgeRelationType>>(dto.Data.KnowledgeType);
|
|
|
+ types.ForEach(x => x.KnowledgeId = kn.Id);
|
|
|
+ await _knowledgeRelationTypeRepository.AddRangeAsync(types, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+ if (dto.Workflow != null && !string.IsNullOrEmpty(kn.Id))
|
|
|
{
|
|
|
var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
|
|
|
startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeAdd;
|
|
@@ -165,7 +194,7 @@ namespace Hotline.Api.Controllers
|
|
|
//knowledge.Status = EKnowledgeStatus.Auditing;
|
|
|
//await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return kn.Id;
|
|
|
}
|
|
|
|
|
@@ -259,22 +288,22 @@ namespace Hotline.Api.Controllers
|
|
|
_mapper.Map(dto.Data, knowledge);
|
|
|
//if (update.Tags.Any()) await _repositoryts.UpdateVectorAsync(update.Id, update.Tags, HttpContext.RequestAborted);
|
|
|
|
|
|
- if (dto.Data.Files.Any())
|
|
|
+ if (dto.Data.Files.Any())
|
|
|
knowledge.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, knowledge.Id, "", HttpContext.RequestAborted);
|
|
|
else
|
|
|
- knowledge.FileJson = new List<Share.Dtos.File.FileJson>();
|
|
|
- if (dto.Workflow != null) knowledge.Renewaln = knowledge.Status != EKnowledgeStatus.Drafts;
|
|
|
+ knowledge.FileJson = new List<Share.Dtos.File.FileJson>();
|
|
|
+ if (dto.Workflow != null) knowledge.Renewaln = knowledge.Status != EKnowledgeStatus.Drafts;
|
|
|
await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted);
|
|
|
if (dto.Data.KnowledgeType.Any())
|
|
|
{
|
|
|
- var anyRelationTypes = await _knowledgeRelationTypeRepository.Queryable().Where(x => x.KnowledgeId == knowledge.Id).ToListAsync();
|
|
|
- if (anyRelationTypes.Any())
|
|
|
- await _knowledgeRelationTypeRepository.RemoveRangeAsync(anyRelationTypes);
|
|
|
- List<KnowledgeRelationType> types = _mapper.Map<List<KnowledgeRelationType>>(dto.Data.KnowledgeType);
|
|
|
- types.ForEach(x => x.KnowledgeId = update.Id);
|
|
|
- await _knowledgeRelationTypeRepository.AddRangeAsync(types, HttpContext.RequestAborted);
|
|
|
+ var anyRelationTypes = await _knowledgeRelationTypeRepository.Queryable().Where(x => x.KnowledgeId == knowledge.Id).ToListAsync();
|
|
|
+ if (anyRelationTypes.Any())
|
|
|
+ await _knowledgeRelationTypeRepository.RemoveRangeAsync(anyRelationTypes);
|
|
|
+ List<KnowledgeRelationType> types = _mapper.Map<List<KnowledgeRelationType>>(dto.Data.KnowledgeType);
|
|
|
+ types.ForEach(x => x.KnowledgeId = update.Id);
|
|
|
+ await _knowledgeRelationTypeRepository.AddRangeAsync(types, HttpContext.RequestAborted);
|
|
|
}
|
|
|
- if (dto.Workflow != null)
|
|
|
+ if (dto.Workflow != null)
|
|
|
{
|
|
|
if (knowledge.Status == EKnowledgeStatus.Drafts)
|
|
|
{
|
|
@@ -293,8 +322,8 @@ namespace Hotline.Api.Controllers
|
|
|
await StartFlow(knowledge.Id, WorkflowModuleConsts.KnowledgeUpdate, EKnowledgeApplyType.Update, startDto);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 删除知识
|
|
@@ -359,11 +388,11 @@ namespace Hotline.Api.Controllers
|
|
|
|
|
|
if (_sessionContext.OrgIsCenter == false)
|
|
|
{
|
|
|
- query = query.Where(m => m.KnowledgeType.Any(a => a.IsDeleted == false && a.KnowledgeType.KnowledgeTypeOrgs
|
|
|
+ query = query.Where(m => m.KnowledgeType.Any(a => a.IsDeleted == false && a.KnowledgeType.KnowledgeTypeOrgs
|
|
|
.Any(k => k.IsDeleted == false && k.OrgId.StartsWith(_sessionContext.OrgId))));
|
|
|
query = query.Where(m => m.Attribution == "部门知识库");
|
|
|
}
|
|
|
- var (total, items) = await query .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
return new PagedDto<KnowledgeDto>(total, _mapper.Map<IReadOnlyList<KnowledgeDto>>(items));
|
|
|
}
|
|
|
|
|
@@ -377,7 +406,7 @@ namespace Hotline.Api.Controllers
|
|
|
{
|
|
|
//var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
|
|
|
var know = await _knowledgeDomainService.KnowledgeInfo(Id, HttpContext.RequestAborted);
|
|
|
- if (know is null)
|
|
|
+ if (know is null)
|
|
|
throw UserFriendlyException.SameMessage("知识查询失败!");
|
|
|
|
|
|
var knowledgeInfoDto = _mapper.Map<KnowledgeInfoDto>(know);
|
|
@@ -412,7 +441,7 @@ namespace Hotline.Api.Controllers
|
|
|
var knowledge = await _knowledgeDomainService.KnowledgeInfo(Id, HttpContext.RequestAborted);
|
|
|
if (knowledge is null)
|
|
|
throw UserFriendlyException.SameMessage("知识查询失败!");
|
|
|
- if (knowledge.Workflow != null)
|
|
|
+ if (knowledge.Workflow != null)
|
|
|
knowledge.IsCanHandle = knowledge.Workflow.IsCanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles);
|
|
|
//转化
|
|
|
var knowledgeShowInfoDto = _mapper.Map<KnowledgeInfoDto>(knowledge);
|
|
@@ -450,6 +479,26 @@ namespace Hotline.Api.Controllers
|
|
|
return knowledgeShowInfoDto;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 知识详情--导出
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("info/export")]
|
|
|
+ public async Task<IActionResult> KnowledgeInfoExport([FromBody] KnowledgeInfoExportInDto dto)
|
|
|
+ {
|
|
|
+ if (dto.Ids.Length > 1)
|
|
|
+ {
|
|
|
+ var streams = await _knowApplication.KnowledgeInfoListExportAsync(dto, HttpContext.RequestAborted);
|
|
|
+ byte[] fileBytes = _wordHelperService.ConvertZipStream(streams);
|
|
|
+ var name = DateTime.Now.ToString("yyyyMMddHHmmss");
|
|
|
+ return File(fileBytes, "application/octet-stream", $"{name}.zip");
|
|
|
+ }
|
|
|
+
|
|
|
+ var info = await _knowledgeRepository.GetAsync(dto.Ids[0]) ?? throw UserFriendlyException.SameMessage("知识不存在");
|
|
|
+ return info.Content.HtmlToStream(dto.FileType).GetWordFile("知识详情");
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 知识申请-关联知识-获取知识列表
|
|
|
/// </summary>
|
|
@@ -513,13 +562,18 @@ namespace Hotline.Api.Controllers
|
|
|
[HttpGet("knowledge-status-data")]
|
|
|
public async Task<object> KnowledgeStatus()
|
|
|
{
|
|
|
- return new List<KeyValuePair<int, string>>
|
|
|
+ var tabNames = new List<KeyValuePair<int, string>>
|
|
|
{
|
|
|
new KeyValuePair<int, string>(3, "已上架"),
|
|
|
new KeyValuePair<int, string>(4, "已下架"),
|
|
|
new KeyValuePair<int, string>(1, "审核中"),
|
|
|
new KeyValuePair<int, string>(5, "审核不通过")
|
|
|
};
|
|
|
+
|
|
|
+ return _baseDataApplication
|
|
|
+ .FileType(0)
|
|
|
+ .Add("tabNames", tabNames)
|
|
|
+ .Build();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -530,66 +584,40 @@ namespace Hotline.Api.Controllers
|
|
|
[HttpGet]
|
|
|
public async Task<PagedDto<KnowledgeDataDto>> GetKnowList([FromQuery] KnowPagedListDto pagedDto)
|
|
|
{
|
|
|
- var typeSpliceName = string.Empty;
|
|
|
- var hotspotHotSpotFullName = string.Empty;
|
|
|
- if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
|
|
|
- {
|
|
|
- var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
- typeSpliceName = type?.SpliceName;
|
|
|
- }
|
|
|
- if (!string.IsNullOrEmpty(pagedDto.HotspotId))
|
|
|
- {
|
|
|
- var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
- hotspotHotSpotFullName = hotspot?.HotSpotFullName;
|
|
|
- }
|
|
|
- //var aa = _knowledgeRepository.Queryable().OrderByDescending(d => d.CreationTime).ToSql();
|
|
|
- var (total, temp) = await _knowledgeRepository.Queryable(false, false, false)
|
|
|
- .Includes(x => x.User)
|
|
|
- .Includes(x => x.SystemOrganize)
|
|
|
- .Includes(x => x.SourceOrganize)
|
|
|
- .Includes(x => x.HotspotType)
|
|
|
- .Includes(x => x.Workflow)
|
|
|
- .Includes(x=>x.KnowledgeType)
|
|
|
- //.Includes(x=>x.KnowledgeRelationTypes,t=> t.)
|
|
|
- .Where(x => x.IsDeleted == false)
|
|
|
- .Where(x=>x.KnowledgeType.Any(t=>t.KnowledgeType.KnowledgeTypeOrgs.Any(to=>to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
|
|
|
- .Where(x => (x.Status == EKnowledgeStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EKnowledgeStatus.Drafts))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), x => x.Title.Contains(pagedDto.Keyword!) || x.CreatorName.Contains(pagedDto.Keyword!) || x.CreatorOrgName.Contains(pagedDto.Keyword!) || x.SourceOrganize.Name.Contains(pagedDto.Keyword!))
|
|
|
- .WhereIF(pagedDto.Status.HasValue && pagedDto.Status != EKnowledgeStatus.OffShelf, x => x.Status == pagedDto.Status && ((x.ExpiredTime != null && x.ExpiredTime > DateTime.Now) || x.ExpiredTime == null))
|
|
|
- .WhereIF(pagedDto.Status.HasValue && pagedDto.Status == EKnowledgeStatus.OffShelf, x => x.Status == pagedDto.Status || (x.ExpiredTime != null && x.ExpiredTime < DateTime.Now && x.Status != EKnowledgeStatus.Drafts))
|
|
|
- .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(typeSpliceName), x => SqlFunc.JsonLike(x.KnowledgeType, typeSpliceName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t=>t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.SourceOrganizeId != null && x.SourceOrganizeId.EndsWith(pagedDto.CreateOrgId!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.ModuleCode), x => x.Workflow.ModuleCode == pagedDto.ModuleCode)
|
|
|
- .OrderByDescending(d => d.CreationTime)
|
|
|
- .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted);
|
|
|
- //temp.ForEach(x => x.IsCanHandle = x.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId));
|
|
|
- //返回数据
|
|
|
- return new PagedDto<KnowledgeDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeDataDto>>(temp));
|
|
|
+ return (await _knowApplication.GetKnowList(pagedDto, HttpContext.RequestAborted))
|
|
|
+ .ToPaged();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 知识查询-导出
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("export")]
|
|
|
+ public async Task<IActionResult> GetKnowListExportAsync([FromBody] ExportExcelDto<KnowPagedListDto> dto)
|
|
|
+ {
|
|
|
+ var items = (await _knowApplication.GetKnowList(dto.QueryDto, HttpContext.RequestAborted)).Item2;
|
|
|
+ return _exportApplication.GetExcelFile(dto, items, "知识明细导出");
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 知识检索
|
|
|
/// </summary>
|
|
|
- /// <param name="pagedDto"></param>
|
|
|
+ /// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
[HttpGet("knowretrieval")]
|
|
|
- public async Task<PagedDto<KnowledgeRetrievalDataDto>> KnowRetrieval([FromQuery] KnowledgeRetrievalPagedListDto pagedDto)
|
|
|
+ public async Task<PagedDto<KnowledgeRetrievalDataDto>> KnowRetrieval([FromQuery] KnowledgeRetrievalPagedListDto dto)
|
|
|
{
|
|
|
var typeSpliceName = string.Empty;
|
|
|
var hotspotHotSpotFullName = string.Empty;
|
|
|
- if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
|
|
|
+ if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
|
|
|
{
|
|
|
- var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
+ var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
|
|
|
typeSpliceName = type?.SpliceName;
|
|
|
}
|
|
|
- if (!string.IsNullOrEmpty(pagedDto.HotspotId))
|
|
|
+ if (!string.IsNullOrEmpty(dto.HotspotId))
|
|
|
{
|
|
|
- var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
+ var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == dto.HotspotId);
|
|
|
hotspotHotSpotFullName = hotspot?.HotSpotFullName;
|
|
|
}
|
|
|
var sugar = _knowledgeRepository
|
|
@@ -600,17 +628,35 @@ namespace Hotline.Api.Controllers
|
|
|
.Where(x => x.IsDeleted == false)
|
|
|
.Where(x => x.Status == EKnowledgeStatus.OnShelf)
|
|
|
.Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
|
|
|
- .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 != null && d.Summary.Contains(pagedDto.Keyword!))
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.KnowledgeType, typeSpliceName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t=>t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.HotspotName), x => x.HotspotType.HotSpotFullName.EndsWith(pagedDto.HotspotName!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.EndsWith(pagedDto.CreateOrgId!))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution), x => x.Attribution == pagedDto.Attribution!);
|
|
|
- switch (pagedDto.Sort)
|
|
|
+ // .WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.Content.Contains(dto.Keyword!))
|
|
|
+ //.WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.Title && !string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!))
|
|
|
+ //.WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.Content && !string.IsNullOrEmpty(dto.Keyword), d => d.Content.Contains(dto.Keyword!))
|
|
|
+ //.WhereIF(dto.RetrievalType == EKnowledgeRetrievalType.Summary && !string.IsNullOrEmpty(dto.Keyword), d => d.Summary != null && d.Summary.Contains(dto.Keyword!))
|
|
|
+ //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.KnowledgeType, typeSpliceName))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.HotspotName), x => x.HotspotType.HotSpotFullName.EndsWith(dto.HotspotName!))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.EndsWith(dto.CreateOrgId!))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.Attribution), x => x.Attribution == dto.Attribution!);
|
|
|
+ if (dto.Keyword.NotNullOrEmpty())
|
|
|
+ {
|
|
|
+ var keywords = dto.Keyword!.SplitKeywords();
|
|
|
+ var exp = Expressionable.Create<Knowledge>();
|
|
|
+ foreach (var keyword in keywords)
|
|
|
+ {
|
|
|
+ if (dto.RetrievalType == EKnowledgeRetrievalType.All)
|
|
|
+ exp.Or(m => m.Title.Contains(keyword) || m.Content.Contains(keyword));
|
|
|
+ if (dto.RetrievalType == EKnowledgeRetrievalType.Title)
|
|
|
+ exp.Or(m => m.Title.Contains(keyword));
|
|
|
+ if (dto.RetrievalType == EKnowledgeRetrievalType.Content)
|
|
|
+ exp.Or(m => m.Content.Contains(keyword));
|
|
|
+ if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
|
|
|
+ exp.Or(m => m.Summary != null && m.Summary.Contains(keyword));
|
|
|
+ }
|
|
|
+ sugar.Where(exp.ToExpression());
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (dto.Sort)
|
|
|
{
|
|
|
case "2":
|
|
|
sugar = sugar.OrderByDescending(p => p.Score);
|
|
@@ -622,7 +668,7 @@ namespace Hotline.Api.Controllers
|
|
|
sugar = sugar.OrderByDescending(p => p.PageView);
|
|
|
break;
|
|
|
}
|
|
|
- var (total, temp) = await sugar.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize);
|
|
|
+ var (total, temp) = await sugar.ToPagedListAsync(dto.PageIndex, dto.PageSize);
|
|
|
return new PagedDto<KnowledgeRetrievalDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeRetrievalDataDto>>(temp));
|
|
|
}
|
|
|
|
|
@@ -641,7 +687,7 @@ namespace Hotline.Api.Controllers
|
|
|
.Includes(x => x.Workflow)
|
|
|
.Where(x => x.KnowledgeId == pagedDto.id)
|
|
|
.Where(x => x.IsDeleted == false)
|
|
|
- .OrderBy(x=>x.CreationTime)
|
|
|
+ .OrderBy(x => x.CreationTime)
|
|
|
.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize);
|
|
|
return new PagedDto<KnowledgeWorkFlowDto>(total, _mapper.Map<IReadOnlyList<KnowledgeWorkFlowDto>>(temp));
|
|
|
}
|
|
@@ -658,7 +704,7 @@ namespace Hotline.Api.Controllers
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Equals(dto.Title))
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Summary), x => x.Summary.Equals(dto.Summary))
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.Content), x => x.Content.Equals(dto.Content))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.Id),x=> x.Id != dto.Id)
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.Id), x => x.Id != dto.Id)
|
|
|
.AnyAsync();
|
|
|
return any;
|
|
|
}
|
|
@@ -733,7 +779,7 @@ namespace Hotline.Api.Controllers
|
|
|
.Includes(it => it.Knowledge)
|
|
|
.Includes(it => it.User)
|
|
|
.Includes(it => it.SystemOrganize)
|
|
|
- .Includes(it => it.Workflow, d=>d.Steps)
|
|
|
+ .Includes(it => it.Workflow, d => d.Steps)
|
|
|
.Where(it => it.WorkflowId != null)
|
|
|
.WhereIF(pagedDto.EKnowledgeApplyType.HasValue, d => d.WorkflowModuleStatus == pagedDto.EKnowledgeApplyType)
|
|
|
.WhereIF(pagedDto.EKnowledgeWorkFlowStatus.HasValue, d => d.WorkFlowApplyStatus == pagedDto.EKnowledgeWorkFlowStatus)
|
|
@@ -872,7 +918,7 @@ namespace Hotline.Api.Controllers
|
|
|
dto.DefinitionModuleCode = moduleCode;
|
|
|
dto.Title = knowledge.Title;
|
|
|
return await _workflowApplication.StartWorkflowAsync(dto, _sessionContext, id, cancellationToken: HttpContext.RequestAborted);
|
|
|
- }
|
|
|
+ }
|
|
|
#endregion
|
|
|
|
|
|
#region 知识库词库
|
|
@@ -1047,9 +1093,9 @@ namespace Hotline.Api.Controllers
|
|
|
.Includes(x => x.Knowledge)
|
|
|
//.WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!)
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.Knowledge.KnowledgeType, typeSpliceName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.Knowledge.KnowledgeType.Any(t=>t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
- .Where(x => !string.IsNullOrEmpty(x.Knowledge.Id))
|
|
|
+ //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.Knowledge.KnowledgeType, typeSpliceName))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.Knowledge.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
+ .Where(x => !string.IsNullOrEmpty(x.Knowledge.Id))
|
|
|
.OrderByDescending(x => x.CreationTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
return new PagedDto<KnowledgeCorrectionDto>(total, _mapper.Map<IReadOnlyList<KnowledgeCorrectionDto>>(items));
|
|
@@ -1150,10 +1196,10 @@ namespace Hotline.Api.Controllers
|
|
|
}
|
|
|
var (total, items) = await _knowledgeQuestionsRepository.Queryable()
|
|
|
.Includes(x => x.Knowledge)
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!)
|
|
|
- //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.Knowledge.KnowledgeType, typeSpliceName))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.Knowledge.KnowledgeType.Any(t=>t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!)
|
|
|
+ //.WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!)
|
|
|
+ //.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.Knowledge.KnowledgeType, typeSpliceName))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.Knowledge.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith(typeSpliceName)))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!)
|
|
|
.Where(x => !string.IsNullOrEmpty(x.Knowledge.Id))
|
|
|
.OrderByDescending(x => x.CreationTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
@@ -1336,7 +1382,7 @@ namespace Hotline.Api.Controllers
|
|
|
/// 增加收藏分组
|
|
|
/// </summary>
|
|
|
[HttpPost("group")]
|
|
|
- public async Task<KnowledgeCollectGroupOutDto> SaveKnowledgeCoolectGroupAsync([FromBody]KnowledgeCollectGroupInDto dto)
|
|
|
+ public async Task<KnowledgeCollectGroupOutDto> SaveKnowledgeCoolectGroupAsync([FromBody] KnowledgeCollectGroupInDto dto)
|
|
|
{
|
|
|
var entity = dto.Adapt<KnowledgeCollectGroup>();
|
|
|
if (await _knowledgeCollectGroupRepository
|
|
@@ -1374,7 +1420,7 @@ namespace Hotline.Api.Controllers
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
[HttpGet("group")]
|
|
|
- public async Task<PagedDto<KnowledgeCollectGroupOutDto>> GetKnowledgeCollectGroupListAsync([FromQuery]KnowledgeCollectGroupListInDto dto)
|
|
|
+ public async Task<PagedDto<KnowledgeCollectGroupOutDto>> GetKnowledgeCollectGroupListAsync([FromQuery] KnowledgeCollectGroupListInDto dto)
|
|
|
{
|
|
|
return (await _knowledgeCollectGroupRepository.Queryable()
|
|
|
.WhereIF(dto.Keyword.NotNullOrEmpty(), m => m.Name.Contains(dto.Keyword))
|
|
@@ -1384,5 +1430,84 @@ namespace Hotline.Api.Controllers
|
|
|
).ToPaged();
|
|
|
}
|
|
|
#endregion
|
|
|
+
|
|
|
+ #region PageView 浏览记录
|
|
|
+ /// <summary>
|
|
|
+ /// 浏览记录集合
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("pageview")]
|
|
|
+ public async Task<PagedDto<PageViewOutDto>> GetPageViewListAsync([FromQuery] PageViewInDto dto)
|
|
|
+ {
|
|
|
+ return (await _knowApplication.GetPageViewListAsync(dto, HttpContext.RequestAborted))
|
|
|
+ .ToPaged();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 浏览记录集合-导出
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("pageview/export")]
|
|
|
+ public async Task<FileStreamResult> GetPageViewListAsync([FromBody] ExportExcelDto<PageViewInDto> dto)
|
|
|
+ {
|
|
|
+ var items = (await _knowApplication.GetPageViewListAsync(dto.QueryDto, HttpContext.RequestAborted))
|
|
|
+ .Item2;
|
|
|
+ return _exportApplication.GetExcelFile(dto, items, "浏览记录");
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 热词
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 新增热词
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPost("hotword")]
|
|
|
+ public async Task AddKnowledgeHotWordAsync([FromBody] AddKnowledgeHotWordInDto dto)
|
|
|
+ {
|
|
|
+ await _knowApplication.AddKnowledgeHotWordAsync(dto, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 热词集合
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpGet("hotword")]
|
|
|
+ public async Task<PagedDto<KnowledgeWordOutDto>> GetKnowledgeHotWordListAsync([FromQuery] KnowledgeHotWordInDto dto)
|
|
|
+ {
|
|
|
+ return (await _knowApplication.GetKnowledgeHotWordListAsync(dto, HttpContext.RequestAborted))
|
|
|
+ .ToPaged();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 修改热词
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpPut("hotword")]
|
|
|
+ public async Task UpdateKnowledgeHotWordAsync([FromQuery] UpdateKnowledgeHotWordInDto dto)
|
|
|
+ {
|
|
|
+ await _knowApplication.UpdateKnowledgeHotWordAsync(dto, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 删除热词
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [HttpDelete("hotword")]
|
|
|
+ public async Task DeleteKnowledgeHotWordAsync([FromBody] string id)
|
|
|
+ {
|
|
|
+ await _knowledgeHotWordRepository
|
|
|
+ .RemoveAsync(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|