田爽 1 tydzień temu
rodzic
commit
d914013c6b

+ 130 - 2
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -39,6 +39,7 @@ using MiniExcelLibs;
 using NPOI.SS.Formula.Functions;
 using SqlSugar;
 using System.Text;
+using System.Threading;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
@@ -75,6 +76,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<KnowledgeQuestions> _knowledgeQuestionsRepository;
         private readonly IRepository<KnowledgeCorrection> _knowledgeCorrectionRepository;
         private readonly IRepository<KnowledgeCollect> _knowledgeCollectRepository;
+        private readonly IRepository<KnowledgeRecord> _knowledgeRecordRepository;
         private readonly ISystemDomainService _systemDomainService;
         private readonly IRepository<KnowledgeComment> _knowledgeCommentRepository;
         private readonly ISystemOrganizeRepository _systemOrganizeRepository;
@@ -104,6 +106,7 @@ namespace Hotline.Api.Controllers
             IRepository<KnowledgeQuestions> knowledgeQuestionsRepository,
             IRepository<KnowledgeCorrection> knowledgeCorrectionRepository,
             IRepository<KnowledgeCollect> knowledgeCollectRepository,
+            IRepository<KnowledgeRecord> knowledgeRecordRepository,
             ISystemDomainService systemDomainService,
             IRepository<KnowledgeComment> knowledgeCommentRepository,
             ISystemOrganizeRepository systemOrganizeRepository,
@@ -140,6 +143,7 @@ namespace Hotline.Api.Controllers
             _knowledgeQuestionsRepository = knowledgeQuestionsRepository;
             _knowledgeCorrectionRepository = knowledgeCorrectionRepository;
             _knowledgeCollectRepository = knowledgeCollectRepository;
+            _knowledgeRecordRepository = knowledgeRecordRepository;
             _systemDomainService = systemDomainService;
             _knowledgeCommentRepository = knowledgeCommentRepository;
             _systemOrganizeRepository = systemOrganizeRepository;
@@ -337,7 +341,7 @@ namespace Hotline.Api.Controllers
             }).ToList();
             await _knowledgeRepository.Updateable(kns)
                 .UpdateColumns(d => d.Status)
-                .Where(d => d.Status == EKnowledgeStatus.OffShelf)
+                //.WhereColumns(d => d.Status == EKnowledgeStatus.OffShelf)
                 .ExecuteCommandAsync(HttpContext.RequestAborted);
         }
 
@@ -503,6 +507,120 @@ namespace Hotline.Api.Controllers
             }
         }
 
+        /// <summary>
+        /// 知识库-记录
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("update-and-record")]
+        [LogFilter("知识修改并且保存修改之前的信息")]
+        public async Task UpdateAndRecord([FromBody] UpdateKnowledgeAndApproveDto dto)
+        {
+            // 知识库记录
+            var knowledge = await _knowledgeRepository.GetAsync(d => d.Id == dto.Id);
+            if (knowledge != null)
+            {
+                var data = _mapper.Map<KnowledgeRecord>(knowledge);
+                data.RecordId = knowledge.Id;
+                await _knowledgeRecordRepository.AddNav(data)
+                      .Include(d => d.KnowledgeTypes)
+                      .Include(d => d.KnowledgeOrganizes)
+                      .ExecuteCommandAsync();
+
+                // 知识库修改
+                await _knowledgeDomainService.UpdateKnowledgeAsync(dto, HttpContext.RequestAborted);
+            }
+        }
+
+        /// <summary>
+        /// 知识库-记录
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        [HttpGet("queryRecord/{Id}")]
+        [LogFilter("查询知识库修改记录")]
+        public async Task<object> QueryRecord(string Id)
+        {
+            var query = await _knowledgeRecordRepository.Queryable()
+                .Includes(x => x.SourceOrganize)
+                .Includes(x => x.KnowledgeTypes)
+                .Includes(x => x.KnowledgeOrganizes)
+                .Includes(x => x.HotspotType)
+                .OrderByDescending(d => d.CreationTime)
+                .FirstAsync(d => d.RecordId == Id, HttpContext.RequestAborted);
+
+            if (query != null)
+            {
+                #region 最新修改记录
+
+                //转化
+                var knowledgeInfoDto1 = _mapper.Map<KnowledgeDto>(query);
+
+                if (knowledgeInfoDto1 != null && !string.IsNullOrEmpty(knowledgeInfoDto1.Content))
+                    knowledgeInfoDto1.Content = _bulletinApplication.GetSiteUrls(knowledgeInfoDto1.Content);
+
+                //收藏
+                var collect1 = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == Id && x.CreatorId == _sessionContext.UserId);
+                if (knowledgeInfoDto1 != null && collect1 != null)
+                    knowledgeInfoDto1.Collect = _mapper.Map<KnowledgeCollectDto>(collect1);
+                //关联知识
+                var knowledges1 = await _knowledgeRepository.Queryable().In(x => x.Id, query.Knowledges).Where(x => x.Status == EKnowledgeStatus.OnShelf && ((x.ExpiredTime != null && x.ExpiredTime >= DateTime.Now) || x.ExpiredTime == null)).ToListAsync();
+                if (knowledgeInfoDto1 != null && knowledges1.Any())
+                    knowledgeInfoDto1.KnowledgeDtos = _mapper.Map<List<KnowledgeDto>>(knowledges1);
+                //关键词
+                var knowledgeWords1 = await _knowledgeWrodRepository.Queryable().In(x => x.Id, query.Keywords).ToListAsync();
+                if (knowledgeInfoDto1 != null && knowledgeWords1.Any())
+                    knowledgeInfoDto1.KeywordsDto = _mapper.Map<List<KnowledgeWordDto>>(knowledgeWords1);
+
+                if (knowledgeInfoDto1 != null && knowledgeInfoDto1.FileJson != null && knowledgeInfoDto1.FileJson.Any())
+                {
+                    var ids = knowledgeInfoDto1.FileJson.Select(x => x.Id).ToList();
+                    knowledgeInfoDto1.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+                }
+
+                #endregion
+            }
+
+            var knowledge = await _knowledgeRepository.Queryable()
+                .Includes(x => x.SourceOrganize)
+                .Includes(x => x.KnowledgeTypes)
+                .Includes(x => x.KnowledgeOrganizes)
+                .Includes(x => x.HotspotType)
+                .FirstAsync(p => p.Id == Id, HttpContext.RequestAborted);
+            if (knowledge != null)
+            {
+                #region 当前知识库
+
+                //转化
+                var knowledgeShowInfoDto = _mapper.Map<KnowledgeDto>(knowledge);
+
+                if (knowledgeShowInfoDto != null && !string.IsNullOrEmpty(knowledgeShowInfoDto.Content))
+                    knowledgeShowInfoDto.Content = _bulletinApplication.GetSiteUrls(knowledgeShowInfoDto.Content);
+
+                //收藏
+                var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == Id && x.CreatorId == _sessionContext.UserId);
+                if (knowledgeShowInfoDto != null && collect != null)
+                    knowledgeShowInfoDto.Collect = _mapper.Map<KnowledgeCollectDto>(collect);
+                //关联知识
+                var knowledges = await _knowledgeRepository.Queryable().In(x => x.Id, knowledge.Knowledges).Where(x => x.Status == EKnowledgeStatus.OnShelf && ((x.ExpiredTime != null && x.ExpiredTime >= DateTime.Now) || x.ExpiredTime == null)).ToListAsync();
+                if (knowledgeShowInfoDto != null && knowledges.Any())
+                    knowledgeShowInfoDto.KnowledgeDtos = _mapper.Map<List<KnowledgeDto>>(knowledges);
+                //关键词
+                var knowledgeWords = await _knowledgeWrodRepository.Queryable().In(x => x.Id, knowledge.Keywords).ToListAsync();
+                if (knowledgeShowInfoDto != null && knowledgeWords.Any())
+                    knowledgeShowInfoDto.KeywordsDto = _mapper.Map<List<KnowledgeWordDto>>(knowledgeWords);
+
+                if (knowledgeShowInfoDto != null && knowledgeShowInfoDto.FileJson != null && knowledgeShowInfoDto.FileJson.Any())
+                {
+                    var ids = knowledgeShowInfoDto.FileJson.Select(x => x.Id).ToList();
+                    knowledgeShowInfoDto.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+                }
+
+                #endregion
+            }
+            return new { OldInfo = query, NewInfo = knowledge };
+        }
+
         /// <summary>
         /// 批量更新公开状态(new)
         /// </summary>
@@ -2008,7 +2126,17 @@ namespace Hotline.Api.Controllers
 
             var (total, items) = await query.ToPagedListAsync(request, HttpContext.RequestAborted);
 
-            return new PagedDto<KnowledgeApproveDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApproveDto>>(items));
+            var data = _mapper.Map<List<KnowledgeApproveDto>>(items);
+
+            data.ForEach(d =>
+            {
+                if (_knowledgeRecordRepository.Queryable().Where(x => x.RecordId == d.KnowledgeId).Count() > 0)
+                {
+                    d.IsRecord = true;
+                }
+            });
+
+            return new PagedDto<KnowledgeApproveDto>(total, data);
         }
 
         /// <summary>

+ 3 - 1
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -1418,7 +1418,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             if (order.DuplicateIds != null)
             {
                 order.DuplicateIds.Add(dto.Data.DuplicateId);
-            }else
+            }
+            else
             {
                 order.DuplicateIds = new List<string>() { dto.Data.DuplicateId };
             }
@@ -4706,6 +4707,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByIF(dto is { SortField: "visitTime", SortRule: 0 }, d => d.VisitTime, OrderByType.Asc) // 回访时间升序
             .OrderByIF(dto is { SortField: "visitTime", SortRule: 1 }, d => d.VisitTime, OrderByType.Desc) // 回访时间升序
             .OrderByIF(_appOptions.Value.IsZiGong && string.IsNullOrEmpty(dto.SortField), d => d.PublishTime, OrderByType.Desc)
+            .WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval), d => d.Order.Content.Contains(dto.ContentRetrieval!))
             ;
         return query;
     }

+ 5 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeApproveDto.cs

@@ -70,5 +70,10 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 审批人
         /// </summary>
         public UserDto Approver { get; set; }
+
+        /// <summary>
+        /// 是否存在知识修改记录
+        /// </summary>
+        public bool? IsRecord { get; set; } = false;
     }
 }

+ 4 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -158,6 +158,10 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public bool? IsEmployeeNameNull { get; set; }
 
+        /// <summary>
+        /// 受理内容
+        /// </summary>
+        public string? ContentRetrieval { get; set; }
     }
 
     public record QueryOrderVisitListDto : QueryOrderVisitDto

+ 18 - 0
src/Hotline/KnowledgeBase/KnowledgeRecord.cs

@@ -0,0 +1,18 @@
+using SqlSugar;
+using System.ComponentModel;
+
+namespace Hotline.KnowledgeBase
+{
+    /// <summary>
+    /// 知识库记录
+    /// </summary>
+    [Description("知识库记录")]
+    public class KnowledgeRecord : Knowledge
+    {
+        /// <summary>
+        /// 记录ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "记录ID")]
+        public string RecordId { get; set; }
+    }
+}