Răsfoiți Sursa

知识库管理

libin 2 săptămâni în urmă
părinte
comite
a91754989d

+ 59 - 0
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -36,6 +36,7 @@ using MediatR;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using MiniExcelLibs;
+using NPOI.SS.Formula.Functions;
 using SqlSugar;
 using System.Text;
 using XF.Domain.Authentications;
@@ -319,6 +320,28 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("知识上架失败");
         }
 
+        /// <summary>
+        /// 批量上架
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("ontheshelfbatch")]
+        [LogFilter("批量上架")]
+        public async Task KnowledgeOnTheShelfBatch([FromBody] UnshelveBatchRequest request)
+        {
+            var kns = request.KnowledgeIds.Select(d => new Knowledge
+            {
+                Id = d,
+                Status = EKnowledgeStatus.OnShelf,
+                OnShelfTime = DateTime.Now,
+                OffShelfTime = null
+            }).ToList();
+            await _knowledgeRepository.Updateable(kns)
+                .UpdateColumns(d => d.Status)
+                .Where(d => d.Status == EKnowledgeStatus.OffShelf)
+                .ExecuteCommandAsync(HttpContext.RequestAborted);
+        }
+
+
         /// <summary>
         /// 知识库-标题
         /// </summary>
@@ -444,6 +467,42 @@ namespace Hotline.Api.Controllers
             }
         }
 
+        /// <summary>
+        /// 知识库-修改(new)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("update-and-approve-batch")]
+        [LogFilter("知识修改批量")]
+        public async Task UpdateAndApproveBatch([FromBody] UpdateKnowledgeAndApproveBatchDto dto)
+        {
+            foreach (var item in dto.KnowledgeIds)
+            {
+                var knowledge = await _knowledgeRepository.GetAsync(d => d.Id == item && d.Status == EKnowledgeStatus.Drafts);
+                UpdateKnowledgeAndApproveDto ukaa = _mapper.Map<UpdateKnowledgeAndApproveDto>(knowledge);
+                ukaa.Opinion = dto.Opinion;
+
+                var kn = await _knowledgeDomainService.UpdateKnowledgeAsync(ukaa, HttpContext.RequestAborted);
+
+                var exists = await _knowledgeApproRepository.Queryable()
+                    .AnyAsync(d => d.KnowledgeId == item && d.KnowledgeApproveStatus == EKnowledgeApproveStatus.Unhandle,
+                        HttpContext.RequestAborted);
+                if (!exists)
+                {
+                    if (kn.Status == EKnowledgeStatus.Drafts)
+                    {
+                        await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.Add, kn, null,
+                            HttpContext.RequestAborted);
+                    }
+                    else
+                    {
+                        await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.Update, kn, dto.Opinion,
+                            HttpContext.RequestAborted);
+                    }
+                }
+            }
+        }
+
         /// <summary>
         /// 批量更新公开状态(new)
         /// </summary>

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -1,7 +1,7 @@
 {
   "AllowedHosts": "*",
   "AppConfiguration": {
-    "AppScope": "YiBin",
+    "AppScope": "ZiGong",
     "YiBin": {
       "AreaCode": "511500",
       "CallCenterType": "TianRun", //XunShi、WeiErXin、TianRun、XingTang

+ 5 - 1
src/Hotline.Share/Dtos/Knowledge/KnowledgeDataDto.cs

@@ -284,7 +284,11 @@ namespace Hotline.Share.Dtos.Knowledge
 			return "";
 		}
 
-	}
+        /// <summary>
+        /// 上架时间
+        /// </summary>
+        public DateTime? OnShelfTime { get; set; }
+    }
 
     /// <summary>
     /// 获取知识创建部门信息

+ 134 - 112
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -21,6 +21,20 @@ namespace Hotline.Share.Dtos.Knowledge
         public string Opinion { get; set; }
     }
 
+    public class UpdateKnowledgeAndApproveBatchDto : AddKnowledgeDto
+    {
+        /// <summary>
+        /// 更新意见
+        /// </summary>
+        public string Opinion { get; set; }
+
+        /// <summary>
+        /// 知识库ID
+        /// </summary>
+
+        public List<string> KnowledgeIds { get; set; }
+    }
+
     /// <summary>
     /// 编辑
     /// </summary>
@@ -30,7 +44,7 @@ namespace Hotline.Share.Dtos.Knowledge
         /// ID
         /// </summary>
         public string Id { get; set; }
-	}
+    }
 
     /// <summary>
     /// 新增知识
@@ -57,15 +71,15 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public List<KnowledgeRelationTypeDto> KnowledgeType { get; set; }
 
-		/// <summary>
-		/// 知识归属
-		/// </summary>
-		public List<string> KnowledgeOrg { get; set; }
+        /// <summary>
+        /// 知识归属
+        /// </summary>
+        public List<string> KnowledgeOrg { get; set; }
 
-		/// <summary>
-		/// 到期时间
-		/// </summary>
-		public DateTime? ExpiredTime { get; set; }
+        /// <summary>
+        /// 到期时间
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
 
         /// <summary>
         /// 是否公开
@@ -81,7 +95,7 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 外部数据(为前端提供级联功能)
         /// </summary>
         public string HotspotExternal { get; set; }
-        
+
         /// <summary>
         /// 标题
         /// </summary>
@@ -126,36 +140,37 @@ namespace Hotline.Share.Dtos.Knowledge
 
     }
 
-    public record KnowledgeRelationTypeDto {
+    public record KnowledgeRelationTypeDto
+    {
 
 
-		/// <summary>
-		/// 知识库类型ID
-		/// </summary>
-		public string KnowledgeTypeId { get; set; }
+        /// <summary>
+        /// 知识库类型ID
+        /// </summary>
+        public string KnowledgeTypeId { get; set; }
 
-		/// <summary>
-		/// 知识库类型名称
-		/// </summary>
-		public string KnowledgeTypeName { get; set; }
+        /// <summary>
+        /// 知识库类型名称
+        /// </summary>
+        public string KnowledgeTypeName { get; set; }
 
 
-		/// <summary>
-		/// 知识库类型名称
-		/// </summary>
-		public string KnowledgeTypeSpliceName { get; set; }
-	}
+        /// <summary>
+        /// 知识库类型名称
+        /// </summary>
+        public string KnowledgeTypeSpliceName { get; set; }
+    }
 
-	public record KnowledgeRelationOrgDto
-	{
-		public string OrgId { get; set; }
-	}
+    public record KnowledgeRelationOrgDto
+    {
+        public string OrgId { get; set; }
+    }
 
-	/// <summary>
-	/// 基础
-	/// </summary>
-	public class KnowledgeDto : UpdateKnowledgeDto
-	{
+    /// <summary>
+    /// 基础
+    /// </summary>
+    public class KnowledgeDto : UpdateKnowledgeDto
+    {
         /// <summary>
         /// 来源部门
         /// </summary>
@@ -182,7 +197,7 @@ namespace Hotline.Share.Dtos.Knowledge
         public EKnowledgeStatus Status { get; set; }
 
         public string StatusText => Status.GetDescription();
-        
+
         /// <summary>
         /// 知识归属
         /// </summary>
@@ -193,15 +208,15 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public int PageView { get; set; } = 0;
 
-		/// <summary>
-		/// 搜索量
-		/// </summary>
-		public int? SearchNum { get; set; } = 0;
+        /// <summary>
+        /// 搜索量
+        /// </summary>
+        public int? SearchNum { get; set; } = 0;
 
-		/// <summary>
-		/// 评分
-		/// </summary>
-		public decimal? Score { get; set; } = decimal.Zero;
+        /// <summary>
+        /// 评分
+        /// </summary>
+        public decimal? Score { get; set; } = decimal.Zero;
 
         /// <summary>
         /// 评论数
@@ -255,105 +270,112 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public List<string> Knowledges { get; set; }
 
-		/// <summary>
-		/// 关联知识对象
-		/// </summary>
-		public List<KnowledgeDto> KnowledgeDtos { get; set; }
+        /// <summary>
+        /// 关联知识对象
+        /// </summary>
+        public List<KnowledgeDto> KnowledgeDtos { get; set; }
 
-		/// <summary>
-		/// 关键词
-		/// </summary>
-		public List<KnowledgeWordDto> KeywordsDto { get; set; }
+        /// <summary>
+        /// 关键词
+        /// </summary>
+        public List<KnowledgeWordDto> KeywordsDto { get; set; }
 
         public List<FileJson>? FileJson { get; set; }
 
         public List<KnowledgeTypeDto> KnowledgeTypes { get; set; }
-		public List<OrgDto> KnowledgeOrganizes { get; set; }
-	}
+        public List<OrgDto> KnowledgeOrganizes { get; set; }
 
-    public class KnowledgeBaseDto {
-		public DateTime? LastModificationTime { get; set; }
+        /// <summary>
+        /// 上架时间
+        /// </summary>
+        public DateTime? OnShelfTime { get; set; }
+    }
 
-		public bool IsDeleted { get; set; }
+    public class KnowledgeBaseDto
+    {
+        public DateTime? LastModificationTime { get; set; }
 
-		/// <summary>
-		/// 删除时间
-		/// </summary>
-		public DateTime? DeletionTime { get; set; }
+        public bool IsDeleted { get; set; }
 
+        /// <summary>
+        /// 删除时间
+        /// </summary>
+        public DateTime? DeletionTime { get; set; }
 
-		/// <summary>
-		/// 创建时间
-		/// </summary>
-		public DateTime CreationTime { get; set; }
 
-		public string Id { get; set; }
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
 
-		/// <summary>
-		/// 组织Id
-		/// </summary>
-		public string? CreatorOrgId { get; set; }
+        public string Id { get; set; }
 
+        /// <summary>
+        /// 组织Id
+        /// </summary>
+        public string? CreatorOrgId { get; set; }
 
-		public string? CreatorOrgName { get; set; }
 
-		/// <summary>
-		/// 创建人
-		/// </summary>
-		public string? CreatorId { get; set; }
+        public string? CreatorOrgName { get; set; }
 
-		public string? CreatorName { get; set; }
-	}
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorId { get; set; }
 
-    public class KnowledgeTitleDto {
+        public string? CreatorName { get; set; }
+    }
 
-		/// <summary>
-		/// ID
-		/// </summary>
-		public string? Id { get; set; }
+    public class KnowledgeTitleDto
+    {
 
-		/// <summary>
-		/// 标题
-		/// </summary>
-		public string Title { get; set; }
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string? Id { get; set; }
 
-	}
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+    }
 
     public class KnowledgeSearchNumDto
-	{
+    {
 
-	    /// <summary>
-	    /// ID
-	    /// </summary>
-	    public string? Id { get; set; }
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string? Id { get; set; }
 
     }
 
     public class KnowledgeFindingDuplicateDto
     {
-	    /// <summary>
-	    /// 标题
-	    /// </summary>
-	    public string Title { get; set; }
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
 
-	    /// <summary>
-	    /// 摘要
-	    /// </summary>
-	    public string? Summary { get; set; }
+        /// <summary>
+        /// 摘要
+        /// </summary>
+        public string? Summary { get; set; }
 
-	    /// <summary>
-	    /// 内容
-	    /// </summary>
-	    public string Content { get; set; }
+        /// <summary>
+        /// 内容
+        /// </summary>
+        public string Content { get; set; }
 
-	    /// <summary>
-	    /// ID
-	    /// </summary>
-	    public string? Id { get; set; }
-	}
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string? Id { get; set; }
+    }
 
 
-	public class AddStartFlowDto : StartWorkflowDto<AddKnowledgeDto>
+    public class AddStartFlowDto : StartWorkflowDto<AddKnowledgeDto>
     {
 
     }
@@ -378,7 +400,7 @@ namespace Hotline.Share.Dtos.Knowledge
 
     }
 
-	public class KnowledgeCollectGroupOutDto
+    public class KnowledgeCollectGroupOutDto
     {
         /// <summary>
         /// Id
@@ -392,7 +414,7 @@ namespace Hotline.Share.Dtos.Knowledge
     }
 
     public class KnowledgeCollectGroupInDto
-    { 
+    {
         /// <summary>
         /// 名字
         /// </summary>
@@ -476,7 +498,7 @@ namespace Hotline.Share.Dtos.Knowledge
     {
         public KnowledgeWordOutDto()
         {
-            
+
         }
         public KnowledgeWordOutDto(string keyId, string tag)
         {
@@ -524,7 +546,7 @@ namespace Hotline.Share.Dtos.Knowledge
     }
 
     public class UpdateKnowledgeHotWordInDto : AddKnowledgeHotWordInDto
-    { 
+    {
         /// <summary>
         /// Id
         /// </summary>

+ 18 - 18
src/Hotline/KnowledgeBase/KnowledgeDomainService.cs

@@ -94,8 +94,8 @@ namespace Hotline.KnowledgeBase
             double min = 0.10;
             double max = 0.29;
             randomInRange = min + (max - min) * random.NextDouble();
-            var browseTime = Convert.ToInt32((randomInRange * length)/60);
-            if (browseTime<=1)
+            var browseTime = Convert.ToInt32((randomInRange * length) / 60);
+            if (browseTime <= 1)
             {
                 browseTime = random.Next(2, 6);
             }
@@ -426,7 +426,7 @@ namespace Hotline.KnowledgeBase
             if (dto.KnowledgeOrg.Any())
             {
                 kn.KnowledgeOrganizes = dto.KnowledgeOrg.Select(x => new SystemOrganize { Id = x }).ToList();
-			}
+            }
 
             await _knowledgeRepository.AddNav(kn)
                 .Include(d => d.KnowledgeTypes)
@@ -471,7 +471,7 @@ namespace Hotline.KnowledgeBase
             if (any) throw UserFriendlyException.SameMessage("当前知识标题已存在!");
 
             _mapper.Map(dto, knowledge);
-            if (dto.Files.Any())
+            if (dto.Files != null && dto.Files.Any())
                 knowledge.FileJson = await _fileRepository.AddFileAsync(dto.Files, knowledge.Id, "", cancellation);
             else
                 knowledge.FileJson = new List<Share.Dtos.File.FileJson>();
@@ -490,20 +490,20 @@ namespace Hotline.KnowledgeBase
                 knowledge.CreatorOrgLevel = _sessionContext.OrgLevel;
             }
 
-           
-			if (dto.KnowledgeType.Any())
-			{
-				knowledge.KnowledgeTypes = dto.KnowledgeType.Select(x => new KnowledgeType { Id = x.KnowledgeTypeId }).ToList();
-			}
-			if (dto.KnowledgeOrg.Any())
-			{
-				knowledge.KnowledgeOrganizes = dto.KnowledgeOrg.Select(x => new SystemOrganize { Id = x }).ToList();
-			}
-
-			await _knowledgeRepository.UpdateNav(knowledge)
-				.Include(d => d.KnowledgeTypes, new UpdateNavOptions { ManyToManyIsUpdateA =true})
-				.Include(d => d.KnowledgeOrganizes, new UpdateNavOptions { ManyToManyIsUpdateA = true})
-				.ExecuteCommandAsync();
+
+            if (dto.KnowledgeType != null && dto.KnowledgeType.Any())
+            {
+                knowledge.KnowledgeTypes = dto.KnowledgeType.Select(x => new KnowledgeType { Id = x.KnowledgeTypeId }).ToList();
+            }
+            if (dto.KnowledgeOrg != null && dto.KnowledgeOrg.Any())
+            {
+                knowledge.KnowledgeOrganizes = dto.KnowledgeOrg.Select(x => new SystemOrganize { Id = x }).ToList();
+            }
+
+            await _knowledgeRepository.UpdateNav(knowledge)
+                .Include(d => d.KnowledgeTypes, new UpdateNavOptions { ManyToManyIsUpdateA = true })
+                .Include(d => d.KnowledgeOrganizes, new UpdateNavOptions { ManyToManyIsUpdateA = true })
+                .ExecuteCommandAsync();
             //if (dto.KnowledgeType.Any())
             //         {
             //             knowledge.KnowledgeTypes = dto.KnowledgeType.Select(d => new KnowledgeType