xf 3 months ago
parent
commit
d239053b4f

+ 122 - 40
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -33,6 +33,7 @@ using Microsoft.AspNetCore.Mvc;
 using SqlSugar;
 using System.Text;
 using Hotline.Configurations;
+using Hotline.Share.Requests;
 using Microsoft.Extensions.Options;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
@@ -207,42 +208,22 @@ namespace Hotline.Api.Controllers
         [HttpPost]
         public async Task<string> Add([FromBody] AddKnowledgeDto dto)
         {
-            //add kn
-            var kn = _mapper.Map<Knowledge>(dto);
-            kn.SourceOrganizeId = _sessionContext.RequiredOrgId;
-            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.Status = EKnowledgeStatus.Drafts;
-            kn.InitId();
-            if (dto.Files.NotNullOrEmpty()) kn.FileJson = await _fileRepository.AddFileAsync(dto.Files, kn.Id, "", HttpContext.RequestAborted);
-            //await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
-
-            if (dto.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);
-            }
+            var kn = await _knowledgeDomainService.AddKnowledgeAsync(dto, HttpContext.RequestAborted);
+            return kn.Id;
+        }
 
+        /// <summary>
+        /// 知识库-新增并发起审批(new)
+        /// </summary>
+        [HttpPost("add-and-approve")]
+        public async Task<string> AddAndApprove([FromBody] AddKnowledgeDto dto)
+        {
+            var kn = await _knowledgeDomainService.AddKnowledgeAsync(dto, HttpContext.RequestAborted);
 
-            //发起新增审批
-            var approveAdd = new KnowledgeApprove
-            {
-                KnowledgeId = kn.Id,
-                KnowledgeApproveType = EKnowledgeApproveType.Add,
-                KnowledgeApproveStatus = EKnowledgeApproveStatus.Unhandle,
-                Knowledge = kn
-            };
-            await _knowledgeApproRepository.AddNav(approveAdd)
-                .Include(d => d.Knowledge)
-                .ExecuteCommandAsync();
+            var approve = await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.Add, kn.Id, null,
+                HttpContext.RequestAborted);
 
-            return kn.Id;
+            return approve.Id;
         }
 
         /// <summary>
@@ -404,15 +385,43 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [HttpPut]
         [LogFilter("知识修改")]
-        public async Task UpdateKnowledge([FromBody] UpdateKnowledgeDto dto)
+        public Task Update([FromBody] UpdateKnowledgeDto dto) =>
+            _knowledgeDomainService.UpdateKnowledgeAsync(dto, HttpContext.RequestAborted);
+
+        /// <summary>
+        /// 知识库-修改(new)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("update-and-approve")]
+        [LogFilter("知识修改")]
+        public async Task UpdateAndApprove([FromBody] UpdateKnowledgeAndApproveDto dto)
         {
+            var kn = await _knowledgeDomainService.UpdateKnowledgeAsync(dto, HttpContext.RequestAborted);
+
+            var exists = await _knowledgeApproRepository.Queryable()
+                .AnyAsync(d => d.KnowledgeId == dto.Id && d.KnowledgeApproveStatus == EKnowledgeApproveStatus.Unhandle,
+                    HttpContext.RequestAborted);
+            if (exists)
+                throw new UserFriendlyException($"该知识存在待审批申请, knId: {dto.Id}", "该知识存在待审批申请, 请先审批");
+
+            if (kn.Status == EKnowledgeStatus.Drafts)
+            {
+                await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.Add, kn.Id, null,
+                    HttpContext.RequestAborted);
+            }
+            else
+            {
+                await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.Update, kn.Id, dto.Opinion,
+                    HttpContext.RequestAborted);
+            }
         }
 
         /// <summary>
-            /// 批量审核
-            /// </summary>
-            /// <returns></returns>
-            [HttpPost("batch_audit")]
+        /// 批量审核
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("batch_audit")]
         public async Task<string> KnowledgeBatchAuditAsync([FromBody] KnowledgeBatchAuditInDto dto)
         {
             var result = new StringBuilder();
@@ -510,6 +519,36 @@ namespace Hotline.Api.Controllers
             }
         }
 
+        /// <summary>
+        /// 删除知识(new)
+        /// </summary>
+        [HttpDelete("remove")]
+        [LogFilter("删除知识")]
+        public async Task Remove([FromBody] DeleteKnowledgeDto dto)
+        {
+            var knowledge = await _knowledgeRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+            if (knowledge == null)
+                throw UserFriendlyException.SameMessage("无效知识库数据");
+            if (knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing)
+                throw UserFriendlyException.SameMessage("知识库数据不可删除");
+
+            if (knowledge.Status == EKnowledgeStatus.Drafts || knowledge.Status == EKnowledgeStatus.Revert)
+            {
+                await _knowledgeRepository.RemoveAsync(knowledge, false, HttpContext.RequestAborted);
+            }
+            else
+            {
+                var exists = await _knowledgeApproRepository.Queryable()
+                    .AnyAsync(d => d.KnowledgeId == dto.Id && d.KnowledgeApproveStatus == EKnowledgeApproveStatus.Unhandle,
+                        HttpContext.RequestAborted);
+                if (exists)
+                    throw new UserFriendlyException($"该知识存在待审批申请, knId: {dto.Id}", "该知识存在待审批申请, 请先审批");
+
+                await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.Delete, knowledge.Id, dto.Opinion,
+                    HttpContext.RequestAborted);
+            }
+        }
+
         /// <summary>
         /// 增加搜索量
         /// </summary>
@@ -743,7 +782,7 @@ namespace Hotline.Api.Controllers
             var tabAuditingNames = new List<KeyValuePair<string, string>>
             {
                 new KeyValuePair<string, string>("", "全部"),
-                new KeyValuePair<string, string>("KnowledgeAdd", "新增审核"),
+                new KeyValuePair<string, string>("AddKnowledgeAsync", "新增审核"),
                 new KeyValuePair<string, string>("KnowledgeUpdate", "修改审核"),
                 new KeyValuePair<string, string>("KnowledgeDelete", "删除审核"),
                 new KeyValuePair<string, string>("KnowledgeOffshelf", "下架审核"),
@@ -999,7 +1038,7 @@ namespace Hotline.Api.Controllers
         //[HttpPost("{id}/add-startflow")]
         //public async Task AddStartFlow(string id, [FromBody] StartWorkflowDto dto)
         //{
-        //	await StartFlow(id, WorkflowModuleConsts.KnowledgeAdd, EKnowledgeApplyType.Add, dto);
+        //	await StartFlow(id, WorkflowModuleConsts.AddKnowledgeAsync, EKnowledgeApplyType.Add, dto);
         //}
 
         ///// <summary>
@@ -1686,6 +1725,49 @@ namespace Hotline.Api.Controllers
 
         #region 知识审批
 
+        /// <summary>
+        /// 查询待审批列表(new)
+        /// </summary>
+        [HttpGet("approve-paged")]
+        public async Task<PagedDto<KnowledgeApproveDto>> QueryKnowledgeApprovePaged([FromQuery] QueryKnowledgeApprovePagedRequest request)
+        {
+            var query = _knowledgeApproRepository.Queryable()
+                .Includes(d => d.Creator);
+            if (request.HasApproved)
+            {
+                //已审批
+                query.Includes(d => d.Approver)
+                    .Where(d =>
+                    d.ApproverId == _sessionContext.RequiredUserId
+                    && d.KnowledgeApproveStatus != EKnowledgeApproveStatus.Unhandle);
+            }
+            else
+            {
+                //待审批
+                query.Where(d => d.KnowledgeApproveStatus == EKnowledgeApproveStatus.Unhandle);
+            }
+
+            var (total, items) = await query.ToPagedListAsync(request, HttpContext.RequestAborted);
+
+            return new PagedDto<KnowledgeApproveDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApproveDto>>(items));
+        }
+
+        /// <summary>
+        /// 查询审核历史(new)
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("approve-history/{knowledgeId}")]
+        public async Task<IReadOnlyList<KnowledgeApproveDto>> QueryKnowledgeApproveByKnId(string knowledgeId)
+        {
+            var approves = await _knowledgeApproRepository.Queryable()
+                .Includes(d => d.Creator)
+                .Includes(d=>d.Approver)
+                .Where(d=>d.KnowledgeId == knowledgeId)
+                .ToListAsync(HttpContext.RequestAborted);
+
+            return _mapper.Map<IReadOnlyList<KnowledgeApproveDto>>(approves);
+        }
+
         #endregion
     }
 }

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

@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.KnowledgeBase;
+using Hotline.Share.Dtos.Users;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.Knowledge
+{
+    public class KnowledgeApproveDto
+    {
+        /// <summary>
+        /// 知识Id
+        /// </summary>
+        public string KnowledgeId { get; set; }
+
+        /// <summary>
+        /// 审核类型
+        /// </summary>
+        public EKnowledgeApproveType KnowledgeApproveType { get; set; }
+
+        public string KnowledgeApproveTypeText => KnowledgeApproveType.GetDescription();
+
+        /// <summary>
+        /// 审核状态
+        /// </summary>
+        public EKnowledgeApproveStatus KnowledgeApproveStatus { get; set; }
+        public string KnowledgeApproveStatusText => KnowledgeApproveStatus.GetDescription();
+
+        /// <summary>
+        /// 审批发起意见
+        /// </summary>
+        public string? CreateOpinion { get; set; }
+
+        /// <summary>
+        /// 审批人Id
+        /// </summary>
+        public string? ApproverId { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? ApproveOpinion { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? ApproveTime { get; set; }
+
+        public KnowledgeDto Knowledge { get; set; }
+
+        /// <summary>
+        /// 发起人
+        /// </summary>
+        public UserDto Creator { get; set; }
+
+        /// <summary>
+        /// 审批人
+        /// </summary>
+        public UserDto Approver { get; set; }
+    }
+}

+ 94 - 71
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -12,6 +12,14 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Knowledge
 {
+    public class UpdateKnowledgeAndApproveDto : UpdateKnowledgeDto
+    {
+        /// <summary>
+        /// 更新意见
+        /// </summary>
+        public string Opinion { get; set; }
+    }
+
     /// <summary>
     /// 编辑
     /// </summary>
@@ -21,28 +29,17 @@ namespace Hotline.Share.Dtos.Knowledge
         /// ID
         /// </summary>
         public string Id { get; set; }
-
-        /// <summary>
-        /// 标签名称
-        /// </summary>
-        public List<string> Tags { get; set; } = new();
 	}
 
     /// <summary>
     /// 新增知识
     /// </summary>
-    public class AddKnowledgeDto : KnowledgeDto
+    public class AddKnowledgeDto
     {
-
-		/// <summary>
-		/// 知识Code
-		/// </summary>
-		public string Code { get; set; }
-
         /// <summary>
-        /// 标签名称
+        /// 知识Code
         /// </summary>
-        public List<string> Tags { get; set; } = new();
+        public string Code { get; set; }
 
         /// <summary>
         /// 知识归属
@@ -50,10 +47,47 @@ namespace Hotline.Share.Dtos.Knowledge
         public string? Attribution { get; set; }
 
         /// <summary>
-        /// 来源部门
+        /// 知识分类
         /// </summary>
-        public string? SourceOrganizeId { get; set; }
+        public List<KnowledgeRelationTypeDto> KnowledgeType { get; set; }
+
+        /// <summary>
+        /// 到期时间
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
+
+        /// <summary>
+        /// 是否公开
+        /// </summary>
+        public bool IsPublic { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string HotspotId { get; set; }
 
+        /// <summary>
+        /// 外部数据(为前端提供级联功能)
+        /// </summary>
+        public string HotspotExternal { get; set; }
+        
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 关键词
+        /// </summary>
+        public List<string> Keywords { get; set; }
+
+        /// <summary>
+        /// 内容
+        /// </summary>
+        public string Content { get; set; }
+
+        public List<FileDto> Files { get; set; }
+        
 	}
 
     public class OffShelfKnowledgeDto
@@ -136,18 +170,17 @@ namespace Hotline.Share.Dtos.Knowledge
 	/// <summary>
 	/// 基础
 	/// </summary>
-	public class KnowledgeDto : KnowledgeBaseDto
+	public class KnowledgeDto : UpdateKnowledgeDto
 	{
+        /// <summary>
+        /// 来源部门
+        /// </summary>
+        public string? SourceOrganizeId { get; set; }
 
-		/// <summary>
-		/// 知识来源
-		/// </summary>
-		public string? Source { get; set; }
-
-		/// <summary>
-		/// 知识分类
-		/// </summary>
-		public List<KnowledgeRelationTypeDto> KnowledgeType { get; set; }
+        /// <summary>
+        /// 知识来源
+        /// </summary>
+        public string? Source { get; set; }
 
         /// <summary>
         /// 知识分类名称
@@ -168,58 +201,24 @@ namespace Hotline.Share.Dtos.Knowledge
 			}
 	        return "";
         }
-		/// <summary>
-		/// 热点
-		/// </summary>
-		public string HotspotId { get; set; }
 
         /// <summary>
-        /// 标
+        /// 标签名称
         /// </summary>
-        public string Title { get; set; }
+        public List<string> Tags { get; set; } = new();
 
         /// <summary>
         /// 摘要
         /// </summary>
         public string Summary { get; set; }
 
-        /// <summary>
-        /// 内容
-        /// </summary>
-        public string Content { get; set; }
-
-        /// <summary>
-        /// 是否公开
-        /// </summary>
-        public bool IsPublic { get; set; }
-
         /// <summary>
         /// 文档状态,默认草稿
         /// </summary>
         public EKnowledgeStatus Status { get; set; } = EKnowledgeStatus.Drafts;
 
         public string StatusText => Status.GetDescription();
-
-		/// <summary>
-		/// 到期时间
-		/// </summary>
-		public DateTime? ExpiredTime { get; set; }
-
-        /// <summary>
-        /// 关键词
-        /// </summary>
-        public List<string> Keywords { get; set; }
-
-        /// <summary>
-        /// 附件
-        /// </summary>
-        public List<string> Additions { get; set; }
-
-        /// <summary>
-        /// 外部数据(为前端提供级联功能)
-        /// </summary>
-        public string HotspotExternal { get; set; }
-
+        
         /// <summary>
         /// 知识归属
         /// </summary>
@@ -245,15 +244,40 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public int? CommentNum { get; set; } = 0;
 
+        public DateTime? LastModificationTime { get; set; }
+
+        public bool IsDeleted { get; set; }
+
         /// <summary>
-        /// 来源部门
+        /// 删除时间
         /// </summary>
-        public string? SourceOrganizeId { get; set; }
+        public DateTime? DeletionTime { get; set; }
 
-		/// <summary>
-		/// 来源部门
-		/// </summary>
-		public OrgDto? SourceOrganize { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 组织Id
+        /// </summary>
+        public string? CreatorOrgId { get; set; }
+
+
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string? CreatorId { get; set; }
+
+        public string? CreatorName { get; set; }
+
+        /// <summary>
+        /// 来源部门
+        /// </summary>
+        public OrgDto? SourceOrganize { get; set; }
 
         public KnowledgeCollectDto Collect { get; set; }
 
@@ -261,6 +285,7 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 关联知识
         /// </summary>
         public List<string> Knowledges { get; set; }
+
 		/// <summary>
 		/// 关联知识对象
 		/// </summary>
@@ -271,8 +296,6 @@ namespace Hotline.Share.Dtos.Knowledge
 		/// </summary>
 		public List<KnowledgeWordDto> KeywordsDto { get; set; }
 
-        public List<FileDto> Files { get; set; }
-
         public List<FileJson>? FileJson { get; set; }
 
 	}

+ 17 - 0
src/Hotline.Share/Dtos/Knowledge/QueryKnowledgeApprovePagedRequest.cs

@@ -0,0 +1,17 @@
+using Hotline.Share.Requests;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Knowledge
+{
+    public record QueryKnowledgeApprovePagedRequest : PagedRequest
+    {
+        /// <summary>
+        /// 已审批
+        /// </summary>
+        public bool HasApproved { get; set; }
+    }
+}

+ 18 - 0
src/Hotline.Share/Enums/KnowledgeBase/EKnowledgeApproveStatus.cs

@@ -0,0 +1,18 @@
+using System.ComponentModel;
+
+namespace Hotline.KnowledgeBase;
+
+/// <summary>
+/// 审核状态
+/// </summary>
+public enum EKnowledgeApproveStatus
+{
+    [Description("待审批")]
+    Unhandle = 0,
+
+    [Description("通过")]
+    Successed = 1,
+
+    [Description("不通过")]
+    Failed = 2,
+}

+ 18 - 0
src/Hotline.Share/Enums/KnowledgeBase/EKnowledgeApproveType.cs

@@ -0,0 +1,18 @@
+using System.ComponentModel;
+
+namespace Hotline.KnowledgeBase;
+
+/// <summary>
+/// 审核类型
+/// </summary>
+public enum EKnowledgeApproveType
+{
+    [Description("新增知识")]
+    Add = 0,
+
+    [Description("更新知识")]
+    Update = 1,
+
+    [Description("删除知识")]
+    Delete = 2,
+}

+ 1 - 1
src/Hotline/FlowEngine/WorkflowModules/WorkflowModuleConsts.cs

@@ -27,7 +27,7 @@ public class WorkflowModuleConsts
     /// <summary>
     /// 新增知识审批
     /// </summary>
-    public const string KnowledgeAdd = "KnowledgeAdd";
+    public const string KnowledgeAdd = "AddKnowledgeAsync";
 
     /// <summary>
     /// 知识更新

+ 18 - 7
src/Hotline/KnowledgeBase/IKnowledgeDomainService.cs

@@ -15,13 +15,6 @@ namespace Hotline.KnowledgeBase
         /// <returns></returns>
         Task<Knowledge> KnowledgeInfo(string Id, CancellationToken cancellationToken);
 
-        /// <summary>
-        /// 知识库-新增
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        Task<string> KnowledgeAdd(AddKnowledgeDto dto, CancellationToken cancellationToken);
-
         /// <summary>
         /// 知识库-修改
         /// </summary>
@@ -76,5 +69,23 @@ namespace Hotline.KnowledgeBase
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         Task EndWorkKnowledge(Workflow workflow, CancellationToken cancellationToken);
+
+        /////
+
+        /// <summary>
+        /// 知识库-新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task<Knowledge> AddKnowledgeAsync(AddKnowledgeDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 插入知识审批数据
+        /// </summary>
+        Task<KnowledgeApprove> AddKnowledgeApproveAsync(EKnowledgeApproveType knowledgeApproveType, string knowledgeId, string? createOpinion,
+            CancellationToken cancellation);
+
+        Task<Knowledge> UpdateKnowledgeAsync(UpdateKnowledgeDto dto, CancellationToken cancellation);
     }
 }

+ 0 - 30
src/Hotline/KnowledgeBase/KnowledgeApprove.cs

@@ -66,34 +66,4 @@ namespace Hotline.KnowledgeBase
         [Navigate(NavigateType.OneToOne, nameof(ApproverId))]
         public User Approver { get; set; }
     }
-
-    /// <summary>
-    /// 审核状态
-    /// </summary>
-    public enum EKnowledgeApproveStatus
-    {
-        [Description("待审批")]
-        Unhandle = 0,
-
-        [Description("通过")]
-        Successed = 1,
-
-        [Description("不通过")]
-        Failed = 2,
-    }
-
-    /// <summary>
-    /// 审核类型
-    /// </summary>
-    public enum EKnowledgeApproveType
-    {
-        [Description("新增知识")]
-        Add = 0,
-
-        [Description("更新知识")]
-        Update = 1,
-
-        [Description("删除知识")]
-        Delete = 2,
-    }
 }

+ 112 - 31
src/Hotline/KnowledgeBase/KnowledgeDomainService.cs

@@ -1,5 +1,7 @@
 using DotNetCore.CAP;
 using Hotline.Caching.Interfaces;
+using Hotline.Configurations;
+using Hotline.File;
 using Hotline.FlowEngine;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
@@ -7,8 +9,13 @@ using Hotline.Settings;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Share.Mq;
+using Hotline.Share.Tools;
 using MapsterMapper;
+using Microsoft.AspNetCore.Builder.Extensions;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Options;
 using SqlSugar;
+using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
@@ -26,26 +33,22 @@ namespace Hotline.KnowledgeBase
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<KnowledgeRelationType> _relationTypeRepository;
         private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
+        private readonly ISessionContext _sessionContext;
+        private readonly IFileRepository _fileRepository;
+        private readonly IRepository<KnowledgeApprove> _knowledgeApproveRepository;
+        private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="knowledgeRepository"></param>
-        /// <param name="mapper"></param>
-        /// <param name="knowledgePVRepository"></param>
-        /// <param name="knowledgeWorkFlowRepository"></param>
-        /// <param name="capPublisher"></param>
-        /// <param name="systemSettingCacheManager"></param>
-        /// <param name="relationTypeRepository"></param>
-        /// <param name="knowledgeTypeRepository"></param>
         public KnowledgeDomainService(IKnowledgeRepository knowledgeRepository,
             IMapper mapper,
             IRepository<KnowledgePv> knowledgePVRepository,
             IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository,
             ICapPublisher capPublisher, ISystemSettingCacheManager systemSettingCacheManager,
             IRepository<KnowledgeRelationType> relationTypeRepository,
-            IRepository<KnowledgeType> knowledgeTypeRepository
-            )
+            IRepository<KnowledgeType> knowledgeTypeRepository,
+            ISessionContext sessionContext,
+            IFileRepository fileRepository,
+            IRepository<KnowledgeApprove> knowledgeApproveRepository,
+            IOptionsSnapshot<AppConfiguration> appOptions)
         {
             _knowledgeRepository = knowledgeRepository;
             _mapper = mapper;
@@ -55,6 +58,10 @@ namespace Hotline.KnowledgeBase
             _systemSettingCacheManager = systemSettingCacheManager;
             _relationTypeRepository = relationTypeRepository;
             _knowledgeTypeRepository = knowledgeTypeRepository;
+            _sessionContext = sessionContext;
+            _fileRepository = fileRepository;
+            _knowledgeApproveRepository = knowledgeApproveRepository;
+            _appOptions = appOptions;
         }
 
         /// <summary>
@@ -165,24 +172,6 @@ namespace Hotline.KnowledgeBase
             }
         }
 
-        /// <summary>
-        /// 知识库-新增
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        public async Task<string> KnowledgeAdd(AddKnowledgeDto dto, CancellationToken cancellationToken)
-        {
-            var kn = _mapper.Map<Knowledge>(dto);
-
-            //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.Auditing;
-            return await _knowledgeRepository.AddAsync(kn, cancellationToken);
-
-        }
-
         /// <summary>
         /// 知识库-修改
         /// </summary>
@@ -394,5 +383,97 @@ namespace Hotline.KnowledgeBase
                 await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeRemove, pushKnowledge, cancellationToken: cancellationToken);
             #endregion
         }
+
+        /// <summary>
+        /// 知识库-新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<Knowledge> AddKnowledgeAsync(AddKnowledgeDto dto, CancellationToken cancellationToken)
+        {
+            //add kn
+            var kn = _mapper.Map<Knowledge>(dto);
+            kn.SourceOrganizeId = _sessionContext.RequiredOrgId;
+            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.Status = EKnowledgeStatus.Drafts;
+            kn.InitId();
+            if (dto.Files.NotNullOrEmpty()) kn.FileJson = await _fileRepository.AddFileAsync(dto.Files, kn.Id, "", cancellationToken);
+
+            if (dto.KnowledgeType.Any())
+            {
+                var knTypes = _mapper.Map<List<KnowledgeRelationType>>(dto.KnowledgeType);
+                kn.KnowledgeType = knTypes;
+            }
+
+            await _knowledgeRepository.AddNav(kn)
+                .Include(d => d.KnowledgeType)
+                .ExecuteCommandAsync();
+
+            return kn;
+        }
+
+        /// <summary>
+        /// 插入知识审批数据
+        /// </summary>
+        public async Task<KnowledgeApprove> AddKnowledgeApproveAsync(EKnowledgeApproveType knowledgeApproveType, string knowledgeId, string? createOpinion,
+            CancellationToken cancellation)
+        {
+            var approveAdd = new KnowledgeApprove
+            {
+                KnowledgeId = knowledgeId,
+                KnowledgeApproveType = knowledgeApproveType,
+                KnowledgeApproveStatus = EKnowledgeApproveStatus.Unhandle,
+                CreateOpinion = createOpinion,
+            };
+
+            await _knowledgeApproveRepository.AddAsync(approveAdd, cancellation);
+
+            return approveAdd;
+        }
+
+        public async Task<Knowledge> UpdateKnowledgeAsync(UpdateKnowledgeDto dto, CancellationToken cancellation)
+        {
+            var knowledge = _mapper.Map<Knowledge>(dto);
+            var any = await _knowledgeRepository.Queryable()
+                .AnyAsync(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == dto.Title && x.Id != dto.Id, cancellation);
+            if (any) throw UserFriendlyException.SameMessage("当前知识标题已存在!");
+
+            if (dto.Files.Any())
+                knowledge.FileJson = await _fileRepository.AddFileAsync(dto.Files, knowledge.Id, "", cancellation);
+            else
+                knowledge.FileJson = new List<Share.Dtos.File.FileJson>();
+            knowledge.Renewaln = knowledge.Status != EKnowledgeStatus.Drafts;
+            if (_appOptions.Value.IsYiBin)
+            {
+                //临时处理 修改后提交修改基本信息
+                if (!_sessionContext.OrgIsCenter)
+                {
+                    knowledge.Attribution = "部门知识库";
+                }
+                knowledge.CreatorId = _sessionContext.UserId;
+                knowledge.CreatorName = _sessionContext.UserName;
+                knowledge.CreatorOrgId = _sessionContext.OrgId;
+                knowledge.CreatorOrgName = _sessionContext.OrgName;
+                knowledge.CreatorOrgLevel = _sessionContext.OrgLevel;
+            }
+
+            if (dto.KnowledgeType.Any())
+            {
+                var knTypes = _mapper.Map<List<KnowledgeRelationType>>(dto.KnowledgeType);
+                knowledge.KnowledgeType = knTypes;
+            }
+
+            await _knowledgeRepository.UpdateNav(knowledge)
+                .Include(d => d.KnowledgeType)
+                .ExecuteCommandAsync();
+
+            return knowledge;
+        }
     }
 }

+ 10 - 8
src/Hotline/KnowledgeBase/KnowledgeRelationType.cs

@@ -18,15 +18,17 @@ namespace Hotline.KnowledgeBase
 	[SugarIndex("index_knowledgeRelationType_spliceName", nameof(KnowledgeRelationType.KnowledgeTypeSpliceName), OrderByType.Desc)]
 	public class KnowledgeRelationType : FullStateEntity
 	{
-		/// <summary>
-		/// 知识库ID
-		/// </summary>
-		public string KnowledgeId { get; set; }
+        /// <summary>
+        /// 知识库ID
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string KnowledgeId { get; set; }
 
-		/// <summary>
-		/// 知识库类型ID
-		/// </summary>
-		public string KnowledgeTypeId { get; set; }
+        /// <summary>
+        /// 知识库类型ID
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string KnowledgeTypeId { get; set; }
 
 		/// <summary>
 		/// 知识库类型名称

+ 1 - 1
src/Hotline/Settings/TimeLimits/TimeLimit.cs

@@ -75,7 +75,7 @@ namespace Hotline.Settings.TimeLimits
                 new TimeLimitBaseDataModel("d6100e08-b1ab-11ed-ad8e-005056a2d053", "工单类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.OrderType),
                 new TimeLimitBaseDataModel("f21424ff-b1ab-11ed-ad8e-005056a2d053", "证件类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.LicenceType),
                 new TimeLimitBaseDataModel("bda69be9-b1b2-11ed-ad8e-005056a2d053", "紧急程度", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.EmergencyLevel),
-                new TimeLimitBaseDataModel("cd3b29dd-b1bf-11ed-ad8e-005056a2d053","默认参数","ZengBie,KnowledgeAdd",ETimeLimitType.DefaultTime,TimeLimitBaseDataConsts.DefaultTime)
+                new TimeLimitBaseDataModel("cd3b29dd-b1bf-11ed-ad8e-005056a2d053","默认参数","ZengBie,AddKnowledgeAsync",ETimeLimitType.DefaultTime,TimeLimitBaseDataConsts.DefaultTime)
             };
         }
     }