using Hotline.Application.FlowEngine; using Hotline.Application.Knowledge; using Hotline.FlowEngine.WorkflowModules; using Hotline.KnowledgeBase; using Hotline.KnowledgeBase.Notifies; using Hotline.Orders; using Hotline.Permissions; using Hotline.Repository.SqlSugar.Extensions; using Hotline.Repository.SqlSugar.Ts; using Hotline.Settings; using Hotline.Settings.Hotspots; using Hotline.Share.Dtos; using Hotline.Share.Dtos.FlowEngine; using Hotline.Share.Dtos.Knowledge; using Hotline.Share.Dtos.Order; 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.Domain.Repository; 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 IRepository _userRepository; private readonly IRepository _knowledgeTypeRepository; private readonly IRepository _hotspotTypeRepository; private readonly IRepositoryTextSearch _repositoryts; private readonly IRepository _knowledgeWrodRepository; private readonly IRepository _knowledgeQuestionsRepository; private readonly IRepository _knowledgeCorrectionRepository; private readonly IRepository _knowledgeCollectRepository; private readonly ISystemDomainService _systemDomainService; public KnowledgeController( IKnowledgeRepository knowledgeRepository, ISessionContext sessionContext, IKnowledgeDomainService knowledgeDomainService, IMapper mapper, IKnowApplication knowApplication, IMediator mediator, IWorkflowApplication workflowApplication, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository, IRepository userRepository, IRepository knowledgeTypeRepository, IRepository hotspotTypeRepository, IRepositoryTextSearch repositoryts, IRepository knowledgeWrodRepository, IRepository knowledgeQuestionsRepository, IRepository knowledgeCorrectionRepository, IRepository knowledgeCollectRepository, ISystemDomainService systemDomainService ) { _knowledgeRepository = knowledgeRepository; _sessionContext = sessionContext; _knowledgeDomainService = knowledgeDomainService; _mapper = mapper; _knowApplication = knowApplication; _mediator = mediator; _workflowApplication = workflowApplication; _knowledgeWorkFlowRepository = knowledgeWorkFlowRepository; _userRepository = userRepository; _knowledgeTypeRepository = knowledgeTypeRepository; _hotspotTypeRepository = hotspotTypeRepository; _repositoryts = repositoryts; _knowledgeWrodRepository = knowledgeWrodRepository; _knowledgeQuestionsRepository = knowledgeQuestionsRepository; _knowledgeCorrectionRepository = knowledgeCorrectionRepository; _knowledgeCollectRepository = knowledgeCollectRepository; _systemDomainService = systemDomainService; } #endregion #region 知识管理 /// /// 知识库-新增 /// /// /// [Permission(EPermission.AddKnowledge)] [HttpPost("add")] public async Task AddKnowledge([FromBody] AddStartFlowDto dto) { var addDto = _mapper.Map(dto.Data); var kn = _mapper.Map(dto.Data); //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; 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 && !string.IsNullOrEmpty(id)) { var startDto = _mapper.Map(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; } /// /// 知识库-知识下架 /// /// /// [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("知识上架失败"); } /// /// 知识库-修改 /// /// /// [Permission(EPermission.KnowledgeDraftsUpdate)] [HttpPut("update")] public async Task UpdateKnowledge([FromBody] UpdateStartFlowDto dto) { var update = _mapper.Map(dto.Data); var knowledge = await _knowledgeRepository.GetAsync(update.Id); if (knowledge == null) throw UserFriendlyException.SameMessage("知识库数据错误"); 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); if (dto.Workflow != null) { var startDto = _mapper.Map(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); } /// /// 删除知识 /// /// /// [Permission(EPermission.KnowledgeDraftsDelete)] [HttpDelete] public async Task Remove([FromBody] DeleteStartFlowDto dto) { var delete = _mapper.Map(dto.Data); var knowledge = await _knowledgeRepository.GetAsync(delete.Id, HttpContext.RequestAborted); if (knowledge == null) return; if (knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing) throw UserFriendlyException.SameMessage("知识库数据不可删除"); //await _knowledgeRepository.RemoveAsync(knowledge, false, HttpContext.RequestAborted); knowledge.Status = EKnowledgeStatus.Auditing; await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted); var startDto = _mapper.Map(dto.Workflow); startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeDelete; startDto.Title = "知识库删除"; await StartFlow(delete.Id, WorkflowModuleConsts.KnowledgeDelete, EKnowledgeApplyType.Delete, startDto); } /// /// 知识库-知识修改-查询详情 /// /// /// [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; //收藏 var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == Id && x.CreatorId == _sessionContext.UserId); if (collect != null) knowledgeInfoDto.Collect = _mapper.Map(collect); 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 type = await _knowledgeTypeRepository.GetAsync(knowledge.KnowledgeTypeId, HttpContext.RequestAborted); if (type != null) { knowledgeShowInfoDto.KnowledgeTypeName = type.SpliceName; knowledgeShowInfoDto.KnowledgeType =_mapper.Map(type); } var hot = await _hotspotTypeRepository.GetAsync(knowledge.HotspotId, HttpContext.RequestAborted); if (hot != null) knowledgeShowInfoDto.HotspotName = hot.HotSpotFullName; //收藏 var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == Id && x.CreatorId == _sessionContext.UserId); if (collect != null) knowledgeShowInfoDto.Collect = _mapper.Map(collect); if (IsAddPv == true) _mediator.Publish(new GetKnowledgeInfoNotify(knowledge)); return knowledgeShowInfoDto; } /// /// 知识申请-关联知识-获取知识列表 /// /// [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.Name, o.Id, o.Title, o.Status, o.Code }) //将结果合并成一个表 .MergeTable() //取第一条数据 .Where(d => d.index == 1 && d.Status == EKnowledgeStatus.OnShelf) .ToListAsync(); //返回数据 return _mapper.Map>(temp); } /// /// 我的草稿箱 /// /// /// [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)); } /// /// 知识库列表页面枚举值 /// /// [HttpGet("knowledge-status-data")] public async Task KnowledgeStatus() { return new List> { new KeyValuePair(1, "审核中"), new KeyValuePair(3, "已上架"), new KeyValuePair(4, "已下架") }; } /// /// 知识查询 /// /// /// [Permission(EPermission.KnowledgeAllList)] [HttpGet] public async Task> GetKnowList([FromQuery] KnowPagedListDto pagedDto) { var type = new KnowledgeType(); var hotspot = new Hotspot(); var organize = new SystemOrganize(); if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId)) type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId); if (!string.IsNullOrEmpty(pagedDto.HotspotId)) hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId); var (total, temp) = await _knowledgeRepository.Queryable() .Includes(x => x.User) .Includes(x => x.SystemOrganize) .Includes(x => x.KnowledgeType) .Includes(x => x.HotspotType) .Where(o => o.IsDeleted == false) .WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!)) .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(pagedDto.CreateOrgId), x => x.HotspotType.CreatorId != null && x.HotspotType.CreatorId.EndsWith(pagedDto.CreateOrgId!)) .OrderByDescending(d => d.CreationTime) //转分页数据 .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted); //返回数据 return new PagedDto(total, _mapper.Map>(temp)); } /// /// 知识检索 /// /// /// [Permission(EPermission.KnowledgeRetrieval)] [HttpGet("knowretrieval")] public async Task> KnowRetrieval([FromQuery] KnowledgeRetrievalPagedListDto pagedDto) { var type = new KnowledgeType(); var hotspot = new Hotspot(); var organize = new SystemOrganize(); if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId)) type = await _knowledgeTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId); if (!string.IsNullOrEmpty(pagedDto.HotspotId)) hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId); var sugar = _knowledgeRepository .Queryable() .Includes(x => x.User) .Includes(x => x.SystemOrganize) .Includes(x => x.KnowledgeType) .Includes(x => x.HotspotType) .Where(o => o.IsDeleted == 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.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(!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) { case "2": sugar = sugar.OrderByDescending(p => p.Score); break; case "3": sugar = sugar.OrderByDescending(p => p.CreationTime); break; default: sugar = sugar.OrderByDescending(p => p.PageView); break; } var (total, temp) = await sugar.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize); return new PagedDto(total, _mapper.Map>(temp)); } #endregion #region 我的知识删除列表 /// /// 我的知识删除列表页面枚举值 /// /// [HttpGet("delete-status-data")] public async Task DeleteApplyStatus() { return EnumExts.GetDescriptions(); } /// /// 我的知识删除列表 /// /// /// [HttpGet("deletelist")] [Permission(EPermission.KnowledgeDeleteApply)] public async Task> GetDeleteApplyList([FromQuery] KnowledgeDeletelPagedListDto pagedDto) { var (total, items) = await _knowledgeWorkFlowRepository .Queryable(includeDeleted: true) .Includes(it => it.Knowledge) .Includes(it => it.User) .Includes(it => it.SystemOrganize) .Includes(it => it.Knowledge, it => it.KnowledgeType) .Includes(it => it.Knowledge, it => it.HotspotType) .Includes(it => it.Workflow) .Where(d => d.CreatorId == _sessionContext.RequiredUserId && d.WorkflowModuleStatus == EKnowledgeApplyType.Delete && d.WorkflowId != null) .WhereIF(pagedDto.EKnowledgeWorkFlowStatus.HasValue, d => d.WorkFlowApplyStatus == pagedDto.EKnowledgeWorkFlowStatus) .WhereIF(pagedDto.StartApplyTime.HasValue, d => d.CreationTime >= pagedDto.StartApplyTime) .WhereIF(pagedDto.EndApplyTime.HasValue, d => d.CreationTime <= pagedDto.EndApplyTime) .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.Knowledge.User.Name.Contains(pagedDto.Keyword!) || d.Knowledge.SystemOrganize.Name.Contains(pagedDto.Keyword!) || d.Knowledge.Title.Contains(pagedDto.Keyword!)) .OrderByDescending(p => p.CreationTime) .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 审核管理页面枚举值 /// /// [HttpGet("approval-base-data")] public async Task ApprovalBaseData() { return new { EKnowledgeWorkFlowStatus = EnumExts.GetDescriptions(), EKnowledgeApplyType = EnumExts.GetDescriptions() }; } /// /// 审核管理 /// /// /// [Permission(EPermission.KnowledgeApprovedAllList)] [HttpGet("approvedlist")] public async Task> ApprovedList([FromQuery] KnowledgeApprovalPagedListDto pagedDto) { var (total, items) = await _knowledgeWorkFlowRepository .Queryable(includeDeleted: true) .Includes(it => it.Knowledge) .Includes(it => it.User) .Includes(it => it.SystemOrganize) .Includes(it => it.Knowledge, it => it.KnowledgeType) .Includes(it => it.Workflow) .Where(it => it.WorkflowId != null) .WhereIF(pagedDto.EKnowledgeApplyType.HasValue, d => d.WorkflowModuleStatus == pagedDto.EKnowledgeApplyType) .WhereIF(pagedDto.EKnowledgeWorkFlowStatus.HasValue, d => d.WorkFlowApplyStatus == pagedDto.EKnowledgeWorkFlowStatus) .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.Knowledge.User.Name.Contains(pagedDto.Keyword!) || d.Knowledge.SystemOrganize.Name.Contains(pagedDto.Keyword!) || d.Knowledge.Title.Contains(pagedDto.Keyword!)) .OrderByDescending(p => p.CreationTime) .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, HttpContext.RequestAborted); foreach (var item in items) { if (item.Workflow != null) item.CanHandle = item.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId); } //处理是否可以办理 //items.ForEach(d => d.CanHandle = d.Workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode)); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取知识热点词 /// /// [HttpGet("getkeyword")] public async Task> GetKeyWord() { return await _knowledgeDomainService.GetKeyWord(); } /// /// 工单受理知识检索 /// /// /// [HttpGet("knowpopscreen")] public async Task> KnowPopScreen([FromQuery] KnowledgePopScreenPagedListDto pagedDto) { RefAsync total = 0; var temp = await _knowledgeRepository .Queryable() .Select(o => new { index = SqlFunc.RowNumber($"{o.Version} desc ", $"{o.Code}"), o.Id, o.Code, o.Title, o.Summary, o.Content, o.PageView, o.Keywords, o.HotspotId, o.Status }) //将结果合并成一个表 .MergeTable() //取第一条数据 .Where(d => d.index == 1 && d.Status == EKnowledgeStatus.OnShelf) .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), p => p.Title.Contains(pagedDto.Keyword) || p.Keywords.Contains(pagedDto.Keyword)) .WhereIF(!string.IsNullOrEmpty(pagedDto.HotspotId), p => p.HotspotId == pagedDto.HotspotId) .OrderByDescending(p => p.PageView) .ToPageListAsync(pagedDto.PageIndex, pagedDto.PageSize, total); return new PagedDto(total, _mapper.Map>(temp)); } ///// ///// 新增-开始流程 ///// ///// 知识id ///// 流程开启参数 ///// //[Permission(EPermission.AddKnowledge)] //[HttpPost("{id}/add-startflow")] //public async Task AddStartFlow(string id, [FromBody] StartWorkflowDto dto) //{ // await StartFlow(id, WorkflowModuleConsts.KnowledgeAdd, EKnowledgeApplyType.Add, dto); //} ///// ///// 删除-开始流程 ///// ///// 知识id ///// 流程开启参数 ///// //[Permission(EPermission.KnowledgeDelete)] //[HttpPost("{id}/remove-startflow")] //public async Task RemoveStartFlow(string id, [FromBody] StartWorkflowDto dto) //{ // await StartFlow(id, WorkflowModuleConsts.KnowledgeDelete, EKnowledgeApplyType.Delete, dto); //} /// /// 查询知识库办理流程开启参数-新增 /// /// //[Permission(EPermission.AddKnowledge)] [HttpGet("add-flow-start")] public async Task GetAddFlowStartOptionsAsync() { return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.KnowledgeAdd, HttpContext.RequestAborted); } /// /// 查询知识库办理流程开启参数-新增 /// /// //[Permission(EPermission.AddKnowledge)] [HttpGet("update-flow-start")] public async Task GetUpdateFlowStartOptionsAsync() { return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.KnowledgeUpdate, HttpContext.RequestAborted); } /// /// 查询知识库办理流程开启参数-删除 /// /// //[Permission(EPermission.KnowledgeDelete)] [HttpGet("remove-flow-start")] public async Task GetRemoveFlowStartOptionsAsync() { return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.KnowledgeDelete, HttpContext.RequestAborted); } /// /// 开始流程 /// /// 知识ID /// 知识模板编号 /// 申请类型 /// 流程开启参数 /// private async Task StartFlow(string id, string moduleCode, EKnowledgeApplyType eKnowledgeApplyType, StartWorkflowDto dto) { var knowledge = await _knowledgeRepository.GetAsync(id, HttpContext.RequestAborted); if (knowledge == null) throw UserFriendlyException.SameMessage("无效知识编号"); if (eKnowledgeApplyType == EKnowledgeApplyType.Delete) { if (knowledge.IsDeleted == true) throw UserFriendlyException.SameMessage("知识删除失败"); //验证是否已经发起过知识删除流程 var exists = await _knowledgeWorkFlowRepository.GetAsync(p => p.KnowledgeId == knowledge.Id && p.WorkflowModuleStatus == EKnowledgeApplyType.Delete && (p.WorkFlowApplyStatus == EKnowledgeWorkFlowStatus.Success || p.WorkFlowApplyStatus == EKnowledgeWorkFlowStatus.Auditing) && p.WorkflowId != null); if (exists != null) throw UserFriendlyException.SameMessage($"该知识已发起过{/*WorkflowModule.Modules[WorkflowModuleConsts.KnowledgeDelete]*/WorkflowModuleConsts.KnowledgeDelete}流程");//todo } //if (!string.IsNullOrEmpty(knowledge.WorkflowId) && eKnowledgeApplyType != EKnowledgeApplyType.Delete) // throw UserFriendlyException.SameMessage("知识已发起流程"); //知识审批主表 var flowId = await _knowledgeDomainService.AddWorkFlowAsync(id, eKnowledgeApplyType, HttpContext.RequestAborted); dto.DefinitionModuleCode = moduleCode; dto.Title = knowledge.Title; await _workflowApplication.StartWorkflowAsync(dto, flowId, HttpContext.RequestAborted); } #endregion #region 知识库词库 /// /// 新增知识库词库 /// /// /// [Permission(EPermission.AddKnowledgeWord)] [HttpPost("knowledge_word")] public async Task Add([FromBody] KnowledgeWordAddDto dto) { var word = _mapper.Map(dto); await _knowledgeWrodRepository.AddAsync(word, HttpContext.RequestAborted); } /// /// 删除知识库词库 /// /// /// [Permission(EPermission.DeleteKnowledgeWord)] [HttpDelete("knowledge_word")] public async Task Delete([FromBody] KnowledgeWordDeleteDto dto) { await _knowledgeRepository.RemoveKnowledgeWrodBatchAsync(dto.Ids, HttpContext.RequestAborted); } /// /// 更新知识库词库 /// /// /// [Permission(EPermission.UpdateKnowledgeWord)] [HttpPut("knowledge_word")] public async Task Update([FromBody] KnowledgeWordUpdateDto dto) { var word = await _knowledgeWrodRepository.GetAsync(dto.Id, HttpContext.RequestAborted); if (word is null) throw UserFriendlyException.SameMessage("无效知识库词库"); _mapper.Map(dto, word); word.LastModificationName = _sessionContext.UserName; await _knowledgeWrodRepository.UpdateAsync(word, HttpContext.RequestAborted); } /// /// 获取知识库词库列表 /// /// /// [Permission(EPermission.KnowledgeWordList)] [HttpGet("knowledge_word/list")] public async Task> List([FromQuery] KnowledgeWordListDto dto) { var (total, items) = await _knowledgeWrodRepository.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.Tag), x => x.Tag == dto.Tag!) .WhereIF(!string.IsNullOrEmpty(dto.Classify), x => x.Classify == dto.Classify!) .WhereIF(!string.IsNullOrEmpty(dto.Synonym), x => x.Synonym != null && x.Synonym.Contains(dto.Synonym!)) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取知识库词库 /// /// /// [HttpGet("knowledge_word/{id}")] public async Task WordEntity(string id) { return await _knowledgeWrodRepository.Queryable() .FirstAsync(x => x.Id == id); } /// /// 获取知识库词库基本信息 /// /// [HttpGet("knowledge_word/base")] public async Task Base() { var rsp = new { KnowledgeWordClassify = await _systemDomainService.GetSysDicDataByCodeAsync(SysDicTypeConsts.KnowledgeWordClassify), }; return rsp; } #endregion #region 知识纠错 /// /// 新增知识纠错 /// /// /// [Permission(EPermission.AddKnowledgeCorrection)] [HttpPost("knowledge_correction")] public async Task Add([FromBody] KnowledgeCorrectionAddDto dto) { var correction = _mapper.Map(dto); await _knowledgeCorrectionRepository.AddAsync(correction, HttpContext.RequestAborted); } /// /// 删除知识纠错 /// /// /// [Permission(EPermission.DeleteKnowledgeCorrection)] [HttpDelete("knowledge_correction")] public async Task Delete([FromBody] KnowledgeCorrectionDeleteDto dto) { await _knowledgeCorrectionRepository.RemoveAsync(x => x.Id == dto.Id); } /// /// 更新知识纠错 /// /// /// [Permission(EPermission.UpdateKnowledgeCorrection)] [HttpPut("knowledge_correction")] public async Task Update([FromBody] KnowledgeCorrectionUpdateDto dto) { var correction = await _knowledgeCorrectionRepository.GetAsync(dto.Id, HttpContext.RequestAborted); if (correction is null) throw UserFriendlyException.SameMessage("无效知识纠错"); _mapper.Map(dto, correction); await _knowledgeCorrectionRepository.UpdateAsync(correction, HttpContext.RequestAborted); } /// /// 答复知识纠错 /// /// /// [Permission(EPermission.UpdateKnowledgeCorrection)] [HttpPut("knowledge_correction/Reply")] public async Task Reply([FromBody] KnowledgeCorrectionUpdateDto dto) { var correction = await _knowledgeCorrectionRepository.GetAsync(dto.Id, HttpContext.RequestAborted); if (correction is null) throw UserFriendlyException.SameMessage("无效知识纠错"); _mapper.Map(dto, correction); correction.ReplyTime = DateTime.Now; correction.ReplyUserName = _sessionContext.UserName; correction.State = ECorrectionState.AlreadyAnswered; await _knowledgeCorrectionRepository.UpdateAsync(correction, HttpContext.RequestAborted); } /// /// 获取知识纠错列表 /// /// /// [Permission(EPermission.KnowledgeCorrectionList)] [HttpGet("knowledge_correction/list")] public async Task> List([FromQuery] KnowledgeCorrectionListDto dto) { var (total, items) = await _knowledgeCorrectionRepository.Queryable() .Includes(x => x.Knowledge) .Includes(x => x.Knowledge, y => y.KnowledgeType) .WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!) .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取知识库纠错 /// /// /// [Permission(EPermission.KnowledgeCorrectionEntity)] [HttpGet("knowledge_correction/{id}")] public async Task CorrectionEntity(string id) { return await _knowledgeCorrectionRepository.Queryable() .Includes(x=>x.Knowledge) .FirstAsync(x => x.Id == id); } #endregion #region 知识提问 /// /// 新增知识提问 /// /// /// [Permission(EPermission.AddKnowledgeQuestions)] [HttpPost("knowledge_questions")] public async Task Add([FromBody] KnowledgeQuestionsAddDto dto) { var questions = _mapper.Map(dto); await _knowledgeQuestionsRepository.AddAsync(questions, HttpContext.RequestAborted); } /// /// 删除知识提问 /// /// /// [Permission(EPermission.DeleteKnowledgeQuestions)] [HttpDelete("knowledge_questions")] public async Task Delete([FromBody] KnowledgeQuestionsDeleteDto dto) { await _knowledgeQuestionsRepository.RemoveAsync(x => x.Id == dto.Id); } /// /// 更新知识提问 /// /// /// [Permission(EPermission.UpdateKnowledgeQuestions)] [HttpPut("knowledge_questions")] public async Task Update([FromBody] KnowledgeQuestionsUpdateDto dto) { var questions = await _knowledgeQuestionsRepository.GetAsync(dto.Id, HttpContext.RequestAborted); if (questions is null) throw UserFriendlyException.SameMessage("无效知识提问"); _mapper.Map(dto, questions); await _knowledgeQuestionsRepository.UpdateAsync(questions, HttpContext.RequestAborted); } /// /// 答复知识提问 /// /// /// [Permission(EPermission.UpdateKnowledgeQuestions)] [HttpPut("knowledge_questions/Reply")] public async Task Reply([FromBody] KnowledgeQuestionsUpdateDto dto) { var questions = await _knowledgeQuestionsRepository.GetAsync(dto.Id, HttpContext.RequestAborted); if (questions is null) throw UserFriendlyException.SameMessage("无效知识提问"); _mapper.Map(dto, questions); questions.ReplyTime = DateTime.Now; questions.ReplyUserName = _sessionContext.UserName; questions.State = ECorrectionState.AlreadyAnswered; await _knowledgeQuestionsRepository.UpdateAsync(questions, HttpContext.RequestAborted); } /// /// 获取知识提问列表 /// /// /// [Permission(EPermission.KnowledgeQuestionsList)] [HttpGet("knowledge_questions/list")] public async Task> List([FromQuery] KnowledgeQuestionsListDto dto) { var (total, items) = await _knowledgeQuestionsRepository.Queryable() .Includes(x => x.Knowledge) .Includes(x => x.Knowledge, y => y.KnowledgeType) .WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!) .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取知识提问 /// /// /// [Permission(EPermission.KnowledgeQuestionsEntity)] [HttpGet("knowledge_questions/{id}")] public async Task QuestionsEntity(string id) { return await _knowledgeQuestionsRepository.Queryable() .Includes(x=>x.Knowledge) .FirstAsync(x => x.Id == id); } #endregion #region 知识收藏 /// /// 新增知识收藏 /// /// /// [Permission(EPermission.AddKnowledgeCollect)] [HttpPost("knowledge_collect")] public async Task Add([FromBody] KnowledgeCollectAddDto dto) { var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == dto.KnowledgeId && x.CreatorId == _sessionContext.UserId); if (collect != null) { collect.Collect = dto.Collect; await _knowledgeCollectRepository.UpdateAsync(collect, HttpContext.RequestAborted); } else { var collectNew = _mapper.Map(dto); await _knowledgeCollectRepository.AddAsync(collectNew, HttpContext.RequestAborted); } } /// /// 知识评分 /// /// /// [Permission(EPermission.AddKnowledgeScore)] [HttpDelete("knowledge_score")] public async Task Delete([FromBody] KnowledgeCollectAddDto dto) { var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == dto.KnowledgeId && x.CreatorId == _sessionContext.UserId); if (collect != null) { if (collect.Score > 0) throw UserFriendlyException.SameMessage("当前知识已经评分"); collect.Score = dto.Score; await _knowledgeCollectRepository.UpdateAsync(collect, HttpContext.RequestAborted); } else { var questions = _mapper.Map(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 = score; await _knowledgeRepository.UpdateAsync(knowledge, HttpContext.RequestAborted); } } #endregion } }