xf 3 ay önce
ebeveyn
işleme
c6ae0a9051

+ 175 - 41
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -39,6 +39,8 @@ using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
+using System.Threading;
+using Hotline.Caching.Interfaces;
 
 namespace Hotline.Api.Controllers
 {
@@ -49,6 +51,7 @@ namespace Hotline.Api.Controllers
         private readonly IExportApplication _exportApplication;
         private readonly IRepository<KnowledgeHotWord> _knowledgeHotWordRepository;
         private readonly IRepository<KnowledgeApprove> _knowledgeApproRepository;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<KnowledgeWord> _knowledgeWordRepository;
         private readonly IWordHelperService _wordHelperService;
         private readonly BaseDataApplication _baseDataApplication;
@@ -82,29 +85,29 @@ namespace Hotline.Api.Controllers
 
 
         public KnowledgeController(
-           IKnowledgeRepository knowledgeRepository,
-           ISessionContext sessionContext,
-           IKnowledgeDomainService knowledgeDomainService,
-           IMapper mapper,
-           IKnowApplication knowApplication,
-           IMediator mediator,
-           IWorkflowApplication workflowApplication,
-           IWorkflowDomainService workflowDomainService,
-           IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository,
-           IRepository<User> userRepository,
-           IRepository<KnowledgeType> knowledgeTypeRepository,
-           IRepository<Hotspot> hotspotTypeRepository,
-           IRepositoryTextSearch<KnowledgeTs> repositoryts,
-           IRepository<KnowledgeWord> knowledgeWrodRepository,
-           IRepository<KnowledgeQuestions> knowledgeQuestionsRepository,
-           IRepository<KnowledgeCorrection> knowledgeCorrectionRepository,
-           IRepository<KnowledgeCollect> knowledgeCollectRepository,
-           ISystemDomainService systemDomainService,
-           IRepository<KnowledgeComment> knowledgeCommentRepository,
-           ISystemOrganizeRepository systemOrganizeRepository,
-           IFileRepository fileRepository,
-           ICapPublisher capPublisher,
-           IRepository<KnowledgeRelationType> knowledgeRelationTypeRepository,
+            IKnowledgeRepository knowledgeRepository,
+            ISessionContext sessionContext,
+            IKnowledgeDomainService knowledgeDomainService,
+            IMapper mapper,
+            IKnowApplication knowApplication,
+            IMediator mediator,
+            IWorkflowApplication workflowApplication,
+            IWorkflowDomainService workflowDomainService,
+            IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository,
+            IRepository<User> userRepository,
+            IRepository<KnowledgeType> knowledgeTypeRepository,
+            IRepository<Hotspot> hotspotTypeRepository,
+            IRepositoryTextSearch<KnowledgeTs> repositoryts,
+            IRepository<KnowledgeWord> knowledgeWrodRepository,
+            IRepository<KnowledgeQuestions> knowledgeQuestionsRepository,
+            IRepository<KnowledgeCorrection> knowledgeCorrectionRepository,
+            IRepository<KnowledgeCollect> knowledgeCollectRepository,
+            ISystemDomainService systemDomainService,
+            IRepository<KnowledgeComment> knowledgeCommentRepository,
+            ISystemOrganizeRepository systemOrganizeRepository,
+            IFileRepository fileRepository,
+            ICapPublisher capPublisher,
+            IRepository<KnowledgeRelationType> knowledgeRelationTypeRepository,
             IBulletinApplication bulletinApplication,
             IRepository<KnowledgeCollectGroup> knowledgeCollectGroupRepository,
             IExportApplication exportApplication,
@@ -113,9 +116,10 @@ namespace Hotline.Api.Controllers
             IRepository<KnowledgePv> knowledgePvepository,
             IRepository<KnowledgeWord> knowledgeWordRepository,
             IRepository<KnowledgeHotWord> knowledgeWordHotRepository,
-           IOptionsSnapshot<AppConfiguration> appOptions,
+            IOptionsSnapshot<AppConfiguration> appOptions,
             IRepository<KnowledgeHotWord> knowledgeHotWordRepository,
-           IRepository<KnowledgeApprove> knowledgeApproRepository)
+            IRepository<KnowledgeApprove> knowledgeApproRepository,
+            ISystemSettingCacheManager _systemSettingCacheManager)
         {
             _knowledgeRepository = knowledgeRepository;
             _sessionContext = sessionContext;
@@ -149,6 +153,7 @@ namespace Hotline.Api.Controllers
             _knowledgeWordRepository = knowledgeWordRepository;
             _knowledgeHotWordRepository = knowledgeHotWordRepository;
             _knowledgeApproRepository = knowledgeApproRepository;
+            this._systemSettingCacheManager = _systemSettingCacheManager;
             _appOptions = appOptions;
         }
 
@@ -253,7 +258,7 @@ namespace Hotline.Api.Controllers
                 }
                 else
                 {
-                    know.Status = EKnowledgeStatus.OffShelfAudit;
+                    know.Status = EKnowledgeStatus.Auditing;
                     await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
 
                     var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
@@ -780,21 +785,24 @@ namespace Hotline.Api.Controllers
         [HttpGet("knowledge-status-data")]
         public Dictionary<string, dynamic> KnowledgeStatus()
         {
-            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>(8, "草稿"),
-                new KeyValuePair<int, string>(-1, "全部")
-            };
+            //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>(8, "草稿"),
+            //    new KeyValuePair<int, string>(-1, "全部")
+            //};
+            var tabNames = EnumExts.GetDescriptions<EKnowledgeStatusRequest>();
+
+            //var tabNewDraftsNames = new List<KeyValuePair<int, string>>
+            //{
+            //    new KeyValuePair<int, string>(-1, "全部"),
+            //    new KeyValuePair<int, string>(0, "待提交"),
+            //    new KeyValuePair<int, string>(5, "审核不通过"),
+            //};
+            var tabNewDraftsNames = EnumExts.GetDescriptions<EKnowledgeDraftTypeRequest>();
 
-            var tabNewDraftsNames = new List<KeyValuePair<int, string>>
-            {
-                new KeyValuePair<int, string>(-1, "全部"),
-                new KeyValuePair<int, string>(0, "待提交"),
-                new KeyValuePair<int, string>(5, "审核不通过"),
-            };
 
             var tabAuditingNames = new List<KeyValuePair<string, string>>
             {
@@ -1749,7 +1757,7 @@ namespace Hotline.Api.Controllers
         public async Task<PagedDto<KnowledgeApproveDto>> QueryKnowledgeApprovePaged([FromQuery] QueryKnowledgeApprovePagedRequest request)
         {
             var query = _knowledgeApproRepository.Queryable()
-                .Includes(d=>d.Knowledge)
+                .Includes(d => d.Knowledge)
                 .Includes(d => d.Creator);
             if (request.HasApproved)
             {
@@ -1787,6 +1795,132 @@ namespace Hotline.Api.Controllers
             return _mapper.Map<IReadOnlyList<KnowledgeApproveDto>>(approves);
         }
 
+        /// <summary>
+        /// 批量审核
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("approve-batch")]
+        public async Task ApproveBatch([FromBody] ApproveBatchRequest request)
+        {
+            var approves = await _knowledgeApproRepository.Queryable()
+                .Includes(d => d.Knowledge, x => x.KnowledgeTypes)
+                .Where(d => request.ApproveIds.Contains(d.Id))
+                .ToListAsync(HttpContext.RequestAborted);
+
+            foreach (var approve in approves)
+            {
+                var kn = approve.Knowledge;
+                switch (approve.KnowledgeApproveType)
+                {
+                    case EKnowledgeApproveType.Add:
+                    case EKnowledgeApproveType.Update:
+                        // t: 上架 f: 驳回
+                        if (request.IsSuccess)
+                        {
+                            kn.OnShelf();
+                            //todo 推送ds
+                        }
+                        else
+                        {
+                            kn.Status = EKnowledgeStatus.Revert;
+                        }
+                        break;
+                    case EKnowledgeApproveType.Delete:
+                        // t: 先下架,再删除 f: 驳回
+                        if (request.IsSuccess)
+                        {
+                            kn.OffShelf();
+                            kn.SoftDelete();
+                            //todo 推送ds
+                        }
+                        else
+                        {
+                            kn.Status = EKnowledgeStatus.Revert;
+                        }
+                        break;
+                    case EKnowledgeApproveType.OffShelf:
+                        // t: 下架 f: 上架
+                        if (request.IsSuccess)
+                        {
+                            kn.OffShelf();
+                        }
+                        else
+                        {
+                            kn.Status = EKnowledgeStatus.OnShelf;
+                        }
+                        break;
+                    default:
+                        throw new ArgumentOutOfRangeException();
+                }
+            }
+
+            var kns = approves.Select(d => d.Knowledge).ToList();
+            await _knowledgeRepository.UpdateRangeAsync(kns, HttpContext.RequestAborted);
+
+            //push to ds
+
+            //高效办成一件事配置
+
+            var pushApproves = approves.Where(d => d.KnowledgeApproveType != EKnowledgeApproveType.OffShelf)
+                  .ToList();
+            if (!pushApproves.Any()) return;
+            var cancelPublishOrderEnabled = _systemSettingCacheManager.GetSetting(SettingConstants.EfficientlyAccomplish)?.SettingValue[0];
+            foreach (var pushApprove in pushApproves)
+            {
+                var pushKnowledge = _mapper.Map<KnowledgeSendDto>(pushApprove.Knowledge);
+                pushKnowledge.CategoryCode = "01";
+                pushKnowledge.CategoryName = "公共服务";
+
+                //获取到配置,执行下面
+                if (!string.IsNullOrEmpty(cancelPublishOrderEnabled))
+                {
+                    var isEfficientlyAccomplish = false;
+                    //根据知识ID查询所有的知识分类
+                    var typeList = await _relationTypeRepository.Queryable().Where(p => p.KnowledgeId == knowledge.Id).ToListAsync(cancellationToken);
+                    if (typeList != null && typeList.Any())
+                    {
+                        //遍历知识分类
+                        foreach (var item in typeList)
+                        {
+                            //查询知识分类是否满足高效办成一件事
+                            if (await _knowledgeTypeRepository.AnyAsync(p => p.Id == item.KnowledgeTypeId && p.SpliceName.StartsWith(cancelPublishOrderEnabled), cancellationToken))
+                            {
+                                //满足,跳出遍历
+                                isEfficientlyAccomplish = true;
+                                break;
+                            }
+                        }
+                    }
+                    //是高效,处理默认值
+                    if (isEfficientlyAccomplish)
+                    {
+                        pushKnowledge.CategoryCode = "25";
+                        pushKnowledge.CategoryName = "高效办成一件事";
+                    }
+
+                    //
+
+                }
+
+                switch (pushApprove.KnowledgeApproveType)
+                {
+                    case EKnowledgeApproveType.Add:
+                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeAdd, pushKnowledge, cancellationToken: cancellationToken);
+                        break;
+                    case EKnowledgeApproveType.Update:
+                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeUpdate, pushKnowledge, cancellationToken: cancellationToken);
+                        break;
+                    case EKnowledgeApproveType.Delete:
+                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeRemove, pushKnowledge, cancellationToken: cancellationToken);
+                        break;
+                    case EKnowledgeApproveType.OffShelf:
+                    default:
+                        throw new ArgumentOutOfRangeException();
+                }
+            }
+        }
+
         #endregion
     }
 }

+ 6 - 2
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -90,6 +90,8 @@ namespace Hotline.Application.Knowledge
                 var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
                 hotspotHotSpotFullName = hotspot?.HotSpotFullName;
             }
+
+
             var (total, temp) = await _knowledgeRepository.Queryable(false, false, false)
                 .Includes(x => x.User)
                 .Includes(x => x.SystemOrganize)
@@ -102,8 +104,10 @@ namespace Hotline.Application.Knowledge
                 .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 && pagedDto.Status != EKnowledgeStatus.NewDrafts && pagedDto.Status != EKnowledgeStatus.All, 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.Status.HasValue && pagedDto.Status != EKnowledgeStatus.OffShelf && pagedDto.Status != EKnowledgeStatus.NewDrafts && pagedDto.Status != EKnowledgeStatus.All,
+                    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 => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.StartsWith(typeSpliceName)))

+ 7 - 0
src/Hotline.Application/Mappers/KnowledgeMapperConfigs.cs

@@ -54,6 +54,13 @@ public class KnowledgeMapperConfigs : IRegister
             .Map(d => d.DisableDate, x => x.ExpiredTime)
             .Map(d => d.UID, x => x.Code)
             ;
+
+        config.ForType<KnowledgeRelationTypeDto, KnowledgeType>()
+            .Map(d => d.Name, s => s.KnowledgeTypeName)
+            .Map(d => d.SpliceName, s => s.KnowledgeTypeSpliceName)
+            .AfterMapping((s,d)=>d.Id = s.KnowledgeTypeId)
+            ;
+
         #endregion
     }
 }

+ 14 - 0
src/Hotline.Share/Dtos/Knowledge/ApproveBatchRequest.cs

@@ -0,0 +1,14 @@
+namespace Hotline.Share.Dtos.Knowledge;
+
+public class ApproveBatchRequest
+{
+    /// <summary>
+    /// 待审核记录id
+    /// </summary>
+    public List<string> ApproveIds { get; set; }
+
+    /// <summary>
+    /// 是否通过
+    /// </summary>
+    public bool IsSuccess { get; set; }
+}

+ 14 - 0
src/Hotline.Share/Dtos/Knowledge/DeleteKnowledgeDto.cs

@@ -0,0 +1,14 @@
+namespace Hotline.Share.Dtos.Knowledge;
+
+public class DeleteKnowledgeDto
+{
+    /// <summary>
+    /// ID
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 删除原因
+    /// </summary>
+    public string Opinion { get; set; }
+}

+ 12 - 44
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -87,65 +87,33 @@ namespace Hotline.Share.Dtos.Knowledge
         public string Content { get; set; }
 
         public List<FileDto> Files { get; set; }
-        
-	}
-
-    public class OffShelfKnowledgeDto
-	{
-		/// <summary>
-		/// ID
-		/// </summary>
-		public string Id { get; set; }
 
-		/// <summary>
-		/// 下架原因
-		/// </summary>
-		public string Opinion { get; set; }
-	}
-
-    public class DeleteKnowledgeDto
-    {
-	    /// <summary>
-	    /// ID
-	    /// </summary>
-	    public string Id { get; set; }
-
-	    /// <summary>
-	    /// 删除原因
-	    /// </summary>
-	    public string Opinion { get; set; }
-    }
-
-	/// <summary>
-	/// 查询详情
-	/// </summary>
-	public class KnowledgeInfoDto : KnowledgeDto
-    {
         /// <summary>
-        /// ID
+        /// 文档号
         /// </summary>
-        public string Id { get; set; }
+        public string? DocumentNo { get; set; }
 
         /// <summary>
-        /// 知识Code
+        /// 版本说明
         /// </summary>
-        public string Code { get; set; }
+        public string? VersionDescription { get; set; }
 
         /// <summary>
-        /// 热点名称
+        /// 索引号
         /// </summary>
-        public string HotspotName { get; set; }
+        public string? IndexNo { get; set; }
 
         /// <summary>
-        /// 流程Id
+        /// 文号
         /// </summary>
-        public string? WorkflowId { get; set; }
+        public string? FileNo { get; set; }
 
         /// <summary>
-        /// 是否可办理
+        /// 预案分类id
         /// </summary>
-        public bool? IsCanHandle { get; set; }
-	}
+        public string PlanTypeId { get; set; }
+
+    }
 
     public record KnowledgeRelationTypeDto {
 

+ 32 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeInfoDto.cs

@@ -0,0 +1,32 @@
+namespace Hotline.Share.Dtos.Knowledge;
+
+/// <summary>
+/// 查询详情
+/// </summary>
+public class KnowledgeInfoDto : KnowledgeDto
+{
+    /// <summary>
+    /// ID
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 知识Code
+    /// </summary>
+    public string Code { get; set; }
+
+    /// <summary>
+    /// 热点名称
+    /// </summary>
+    public string HotspotName { get; set; }
+
+    /// <summary>
+    /// 流程Id
+    /// </summary>
+    public string? WorkflowId { get; set; }
+
+    /// <summary>
+    /// 是否可办理
+    /// </summary>
+    public bool? IsCanHandle { get; set; }
+}

+ 1 - 1
src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs

@@ -115,7 +115,7 @@ namespace Hotline.Share.Dtos.Knowledge
         /// <summary>
         /// 状态
         /// </summary>
-        public EKnowledgeStatus? Status { get; set; }
+        public EKnowledgeStatusRequest? Status { get; set; }
 
         /// <summary>
         /// 草稿状态下的查询条件

+ 14 - 0
src/Hotline.Share/Dtos/Knowledge/OffShelfKnowledgeDto.cs

@@ -0,0 +1,14 @@
+namespace Hotline.Share.Dtos.Knowledge;
+
+public class OffShelfKnowledgeDto
+{
+    /// <summary>
+    /// ID
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 下架原因
+    /// </summary>
+    public string Opinion { get; set; }
+}

+ 11 - 0
src/Hotline.Share/Dtos/Knowledge/PublishBatchRequest.cs

@@ -0,0 +1,11 @@
+namespace Hotline.Share.Dtos.Knowledge;
+
+/// <summary>
+/// 批量更新公开状态
+/// </summary>
+public record PublishBatchRequest
+{
+    public List<string> KnowledgeIds { get; set; }
+
+    public bool IsPublic { get; set; }
+}

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

@@ -14,14 +14,4 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public bool HasApproved { get; set; }
     }
-
-    /// <summary>
-    /// 批量更新公开状态
-    /// </summary>
-    public record PublishBatchRequest
-    {
-        public List<string> KnowledgeIds { get; set; }
-
-        public bool IsPublic { get; set; }
-    }
 }

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

@@ -15,4 +15,7 @@ public enum EKnowledgeApproveType
 
     [Description("删除知识")]
     Delete = 2,
+
+    [Description("下架知识")]
+    OffShelf = 3,
 }

+ 88 - 25
src/Hotline.Share/Enums/KnowledgeBase/EKnowledgeStatus.cs

@@ -7,11 +7,11 @@ namespace Hotline.Share.Enums.KnowledgeBase;
 /// </summary>
 public enum EKnowledgeStatus
 {
-	/// <summary>
-	/// 全部
-	/// </summary>
-	[Description("全部")]
-	All = -1,
+	///// <summary>
+	///// 全部
+	///// </summary>
+	//[Description("全部")]
+	//All = -1,
 
 	/// <summary>
 	/// 待提交
@@ -25,11 +25,11 @@ public enum EKnowledgeStatus
     [Description("审批中")]
     Auditing = 1,
 
-    /// <summary>
-    /// 失败
-    /// </summary>
-    [Description("失败")]
-    Failed = 2,
+    ///// <summary>
+    ///// 失败
+    ///// </summary>
+    //[Description("失败")]
+    //Failed = 2,
 
     /// <summary>
     /// 已上架
@@ -49,21 +49,84 @@ public enum EKnowledgeStatus
 	[Description("已驳回")]
     Revert = 5,
 
-	/// <summary>
-	/// 已过期
-	/// </summary>
-	[Description("已过期")]
-	Overdue = 6,
+	///// <summary>
+	///// 已过期
+	///// </summary>
+	//[Description("已过期")]
+	//Overdue = 6,
 
-	/// <summary>
-	/// 下架审批中
-	/// </summary>
-	[Description("下架审批中")]
-	OffShelfAudit = 7,
+	///// <summary>
+	///// 下架审批中
+	///// </summary>
+	//[Description("下架审批中")]
+	//OffShelfAudit = 7,
 
-	/// <summary>
-	/// 草稿
-	/// </summary>
-	[Description("草稿")]
-	NewDrafts = 8,
+	///// <summary>
+	///// 草稿
+	///// </summary>
+	//[Description("草稿")]
+	//NewDrafts = 8,
+}
+
+/// <summary>
+/// 知识列表查询状态(兼容以前实现方案提供给前端入参)
+/// </summary>
+public enum EKnowledgeStatusRequest
+{
+    /// <summary>
+    /// 已上架
+    /// </summary>
+    [Description("已上架")]
+    OnShelf = 3,
+
+    /// <summary>
+    /// 已下架
+    /// </summary>
+    [Description("已下架")]
+    OffShelf = 4,
+
+    /// <summary>
+    /// 审批中
+    /// </summary>
+    [Description("审核中")]
+    Auditing = 1,
+
+    /// <summary>
+    /// 待提交
+    /// </summary>
+    [Description("草稿")]
+    Drafts = 0,
+
+    /// <summary>
+    /// 全部
+    /// </summary>
+    [Description("全部")]
+    All = -1,
+}
+
+/// <summary>
+/// 草稿状态查询(兼容以前实现方案提供给前端入参)
+/// </summary>
+public enum EKnowledgeDraftTypeRequest
+{
+    /* new KeyValuePair<int, string>(-1, "全部"),
+       new KeyValuePair<int, string>(0, "待提交"),
+       new KeyValuePair<int, string>(5, "审核不通过"),*/
+    /// <summary>
+    /// 全部
+    /// </summary>
+    [Description("全部")]
+    All = -1,
+
+    /// <summary>
+    /// 待提交
+    /// </summary>
+    [Description("待提交")]
+    UnApproval = 0,
+
+    /// <summary>
+    /// 审核不通过
+    /// </summary>
+    [Description("审核不通过")]
+    Failed = 5
 }

+ 191 - 148
src/Hotline/KnowledgeBase/Knowledge.cs

@@ -9,6 +9,7 @@ using Hotline.Share.Dtos.File;
 using XF.Domain.Repository;
 using Hotline.Share.Dtos;
 using Hotline.Orders;
+using Hotline.Identity.Accounts;
 
 namespace Hotline.KnowledgeBase;
 
@@ -21,31 +22,31 @@ namespace Hotline.KnowledgeBase;
 [SugarIndex("index_knowledge_creatorOrgId", nameof(Knowledge.CreatorOrgId), OrderByType.Desc)]
 public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
 {
-	///// <summary>
-	///// 知识分类
-	///// </summary>
-	//[SugarColumn(ColumnDescription = "知识分类")]
-	//public string KnowledgeTypeId { get; set; }
+    ///// <summary>
+    ///// 知识分类
+    ///// </summary>
+    //[SugarColumn(ColumnDescription = "知识分类")]
+    //public string KnowledgeTypeId { get; set; }
 
 
 
-	/// <summary>
-	/// 热点
-	/// </summary>
-	[SugarColumn(ColumnDescription = "热点")]
-	public string? HotspotId { get; set; }
+    /// <summary>
+    /// 热点
+    /// </summary>
+    [SugarColumn(ColumnDescription = "热点")]
+    public string? HotspotId { get; set; }
 
-	/// <summary>
-	/// 知识编号
-	/// </summary>
-	[SugarColumn(ColumnDescription = "知识编号")]
-	public string? Code { get; set; }
+    /// <summary>
+    /// 知识编号
+    /// </summary>
+    [SugarColumn(ColumnDescription = "知识编号")]
+    public string? Code { get; set; }
 
-	/// <summary>
-	/// 标题
-	/// </summary>
-	[SugarColumn(ColumnDescription = "标题")]
-	public string Title { get; set; }
+    /// <summary>
+    /// 标题
+    /// </summary>
+    [SugarColumn(ColumnDescription = "标题")]
+    public string Title { get; set; }
 
     /// <summary>
     /// 摘要
@@ -59,41 +60,41 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     [SugarColumn(ColumnDataType = "text", ColumnDescription = "内容")]
     public string Content { get; set; }
 
-	/// <summary>
-	/// 浏览量
-	/// </summary>
-	[SugarColumn(ColumnDescription = "浏览量")]
-	public int PageView { get; set; } = 0;
-
-	/// <summary>
-	/// 是否公开
-	/// </summary>
-	[SugarColumn(ColumnDescription = "是否公开")]
-	public bool? IsPublic { get; set; }
-
-	/// <summary>
-	/// 文档状态
-	/// </summary>
-	[SugarColumn(ColumnDescription = "文档状态")]
-	public EKnowledgeStatus Status { get; set; }
-
-	/// <summary>
-	/// 上架时间
-	/// </summary>
-	[SugarColumn(ColumnDescription = "上架时间")]
-	public DateTime? OnShelfTime { get; set; }
-
-	/// <summary>
-	/// 下架时间
-	/// </summary>
-	[SugarColumn(ColumnDescription = "下架时间")]
-	public DateTime? OffShelfTime { get; set; }
-
-	/// <summary>
-	/// 过期时间
-	/// </summary>
-	[SugarColumn(ColumnDescription = "过期时间")]
-	public DateTime? ExpiredTime { get; set; }
+    /// <summary>
+    /// 浏览量
+    /// </summary>
+    [SugarColumn(ColumnDescription = "浏览量")]
+    public int PageView { get; set; } = 0;
+
+    /// <summary>
+    /// 是否公开
+    /// </summary>
+    [SugarColumn(ColumnDescription = "是否公开")]
+    public bool? IsPublic { get; set; }
+
+    /// <summary>
+    /// 文档状态
+    /// </summary>
+    [SugarColumn(ColumnDescription = "文档状态")]
+    public EKnowledgeStatus Status { get; set; }
+
+    /// <summary>
+    /// 上架时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "上架时间")]
+    public DateTime? OnShelfTime { get; set; }
+
+    /// <summary>
+    /// 下架时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "下架时间")]
+    public DateTime? OffShelfTime { get; set; }
+
+    /// <summary>
+    /// 过期时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "过期时间")]
+    public DateTime? ExpiredTime { get; set; }
 
     /// <summary>
     /// 关键词
@@ -101,11 +102,11 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "关键词")]
     public List<string>? Keywords { get; set; }
 
-	/// <summary>
-	/// 版本号
-	/// </summary>
-	[SugarColumn(ColumnDescription = "版本号")]
-	public int? Version { get; set; } = 0;
+    /// <summary>
+    /// 版本号
+    /// </summary>
+    [SugarColumn(ColumnDescription = "版本号")]
+    public int? Version { get; set; } = 0;
 
     /// <summary>
     /// 外部数据(为前端提供级联功能)
@@ -122,31 +123,25 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     /// <summary>
     /// 关联知识
     /// </summary>
-    [SugarColumn(ColumnDataType = "json", ColumnDescription = "关联知识", IsJson = true,IsNullable =true)]
+    [SugarColumn(ColumnDataType = "json", ColumnDescription = "关联知识", IsJson = true, IsNullable = true)]
     public List<string> Knowledges { get; set; }
 
-	///// <summary>
-	///// 分类
-	///// </summary>
-	//[Navigate(NavigateType.OneToOne, nameof(KnowledgeTypeId))]//一对一 
-	//public KnowledgeType KnowledgeType { get; set; }
-
-	///// <summary>
-	///// 知识分类
-	///// </summary>
-	//[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "知识分类")]
-	//public List<Kvs>? KnowledgeType { get; set; }
-
-	/// <summary>
-	/// 知识库类型关联ID
-	/// </summary>
-	[Navigate(NavigateType.OneToMany, nameof(KnowledgeRelationType.KnowledgeId))]
-	public List<KnowledgeRelationType> KnowledgeType { get; set; }
-
-	/// <summary>
-	/// 部门
-	/// </summary>
-	[Navigate(NavigateType.OneToOne, nameof(CreatorOrgId))]//一对一 
+    /// <summary>
+    /// 知识库类型关联ID
+    /// </summary>
+    [Navigate(NavigateType.OneToMany, nameof(KnowledgeRelationType.KnowledgeId))]
+    public List<KnowledgeRelationType> KnowledgeType { get; set; }
+
+    /// <summary>
+    /// 知识库分类
+    /// </summary>
+    [Navigate(typeof(KnowledgeRelationType), nameof(KnowledgeRelationType.KnowledgeId), nameof(KnowledgeRelationType.KnowledgeTypeId))]
+    public List<KnowledgeType> KnowledgeTypes { get; set; }
+
+    /// <summary>
+    /// 部门
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(CreatorOrgId))]//一对一 
     public SystemOrganize SystemOrganize { get; set; }
 
     /// <summary>
@@ -161,69 +156,117 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     [Navigate(NavigateType.OneToOne, nameof(HotspotId))]//一对一 
     public Hotspot HotspotType { get; set; }
 
-	/// <summary>
-	/// 知识归属
-	/// </summary>
-	[SugarColumn(ColumnDescription = "知识归属")]
-	public string? Attribution { get; set; }
-
-	/// <summary>
-	/// 搜索量
-	/// </summary>
-	[SugarColumn(ColumnDescription = "搜索量")]
-	public int? SearchNum { get; set; } = 0;
-
-	/// <summary>
-	/// 评分
-	/// </summary>
-	[SugarColumn(ColumnDescription = "评分")]
-	public decimal? Score { get; set; } = decimal.Zero;
-
-	/// <summary>
-	/// 评论数
-	/// </summary>
-	[SugarColumn(ColumnDescription = "评论数")]
-	public int? CommentNum { get; set; } = 0;
-
-	/// <summary>
-	/// 来源部门
-	/// </summary>
-	[SugarColumn(ColumnDescription = "来源部门")]
-	public string? SourceOrganizeId { get; set; }
-
-	/// <summary>
-	/// 是否更新
-	/// </summary>
-	[SugarColumn(ColumnDescription = "是否更新")]
-	public bool? Renewaln { get; set; } = false;
-
-	/// <summary>
-	/// 来源部门
-	/// </summary>
-	[Navigate(NavigateType.OneToOne, nameof(SourceOrganizeId))]//一对一 
-	public SystemOrganize SourceOrganize { get; set; }
-
-	[Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
-	public Workflow Workflow { get; set; }
-
-	/// <summary>
-	/// 是否可办理
-	/// </summary>
-	[SugarColumn(IsIgnore = true)]
-	public bool? IsCanHandle { get; set; }
-
-	[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-	public List<FileJson>? FileJson { get; set; }
-
-	/// <summary>
-	/// 收藏数量
-	/// </summary>
-	[SugarColumn(ColumnDescription = "收藏数量")]
-	public int? CollectCount { get; set; } = 0;
-
-	/// <summary>
-	/// 知识来源
-	/// </summary>
-	[SugarColumn(ColumnDescription = "知识来源")]
-	public string? Source { get; set; }
+    /// <summary>
+    /// 知识归属
+    /// </summary>
+    [SugarColumn(ColumnDescription = "知识归属")]
+    public string? Attribution { get; set; }
+
+    /// <summary>
+    /// 搜索量
+    /// </summary>
+    [SugarColumn(ColumnDescription = "搜索量")]
+    public int? SearchNum { get; set; } = 0;
+
+    /// <summary>
+    /// 评分
+    /// </summary>
+    [SugarColumn(ColumnDescription = "评分")]
+    public decimal? Score { get; set; } = decimal.Zero;
+
+    /// <summary>
+    /// 评论数
+    /// </summary>
+    [SugarColumn(ColumnDescription = "评论数")]
+    public int? CommentNum { get; set; } = 0;
+
+    /// <summary>
+    /// 来源部门
+    /// </summary>
+    [SugarColumn(ColumnDescription = "来源部门")]
+    public string? SourceOrganizeId { get; set; }
+
+    /// <summary>
+    /// 是否更新
+    /// </summary>
+    [SugarColumn(ColumnDescription = "是否更新")]
+    public bool? Renewaln { get; set; } = false;
+
+    /// <summary>
+    /// 文档号
+    /// </summary>
+    public string? DocumentNo { get; set; }
+
+    /// <summary>
+    /// 版本说明
+    /// </summary>
+    public string? VersionDescription { get; set; }
+
+    /// <summary>
+    /// 索引号
+    /// </summary>
+    public string? IndexNo { get; set; }
+
+    /// <summary>
+    /// 文号
+    /// </summary>
+    public string? FileNo { get; set; }
+
+    /// <summary>
+    /// 预案分类id
+    /// </summary>
+    public string PlanTypeId { get; set; }
+
+
+    /// <summary>
+    /// 来源部门
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(SourceOrganizeId))]//一对一 
+    public SystemOrganize SourceOrganize { get; set; }
+
+    [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
+    public Workflow Workflow { get; set; }
+
+    /// <summary>
+    /// 是否可办理
+    /// </summary>
+    [SugarColumn(IsIgnore = true)]
+    public bool? IsCanHandle { get; set; }
+
+    [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+    public List<FileJson>? FileJson { get; set; }
+
+    /// <summary>
+    /// 收藏数量
+    /// </summary>
+    [SugarColumn(ColumnDescription = "收藏数量")]
+    public int? CollectCount { get; set; } = 0;
+
+    /// <summary>
+    /// 知识来源
+    /// </summary>
+    [SugarColumn(ColumnDescription = "知识来源")]
+    public string? Source { get; set; }
+
+    #region method
+
+    /// <summary>
+    /// 上架
+    /// </summary>
+    public void OnShelf()
+    {
+        Status = EKnowledgeStatus.OnShelf;
+        OnShelfTime = System.DateTime.Now;
+    }
+
+    /// <summary>
+    /// 下架
+    /// </summary>
+    public void OffShelf()
+    {
+        Status = EKnowledgeStatus.OffShelf;
+        OffShelfTime = System.DateTime.Now;
+    }
+
+    #endregion
 }

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

@@ -406,12 +406,12 @@ namespace Hotline.KnowledgeBase
 
             if (dto.KnowledgeType.Any())
             {
-                var knTypes = _mapper.Map<List<KnowledgeRelationType>>(dto.KnowledgeType);
-                kn.KnowledgeType = knTypes;
+                var knTypes = _mapper.Map<List<KnowledgeType>>(dto.KnowledgeType);
+                kn.KnowledgeTypes = knTypes;
             }
 
             await _knowledgeRepository.AddNav(kn)
-                .Include(d => d.KnowledgeType)
+                .Include(d => d.KnowledgeTypes)
                 .ExecuteCommandAsync();
 
             return kn;
@@ -464,12 +464,12 @@ namespace Hotline.KnowledgeBase
 
             if (dto.KnowledgeType.Any())
             {
-                var knTypes = _mapper.Map<List<KnowledgeRelationType>>(dto.KnowledgeType);
-                knowledge.KnowledgeType = knTypes;
+                var knTypes = _mapper.Map<List<KnowledgeType>>(dto.KnowledgeType);
+                knowledge.KnowledgeTypes = knTypes;
             }
 
             await _knowledgeRepository.UpdateNav(knowledge)
-                .Include(d => d.KnowledgeType)
+                .Include(d => d.KnowledgeTypes)
                 .ExecuteCommandAsync();
 
             return knowledge;