xfe 3 ay önce
ebeveyn
işleme
1509d31490

+ 56 - 33
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -272,6 +272,42 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("知识下架失败");
         }
 
+        /// <summary>
+        /// 知识库-知识下架(new)
+        /// </summary>
+        [HttpPost("offshelf")]
+        [LogFilter("知识下架")]
+        public async Task OffShelf([FromBody] OffShelfKnowledgeDto dto)
+        {
+            var kn = await _knowledgeRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+            if (kn is null) throw new UserFriendlyException("无效知识id");
+            if (kn.Status == EKnowledgeStatus.OffShelf) return;
+            if (kn.Status != EKnowledgeStatus.OnShelf) throw new UserFriendlyException("知识下架失败");
+
+            if (_sessionContext.OrgIsCenter || !_appOptions.Value.IsYiBin)
+            {
+                kn.Status = EKnowledgeStatus.OffShelf;
+                kn.OnShelfTime = null;
+                kn.OffShelfTime = DateTime.Now;
+                await _knowledgeRepository.UpdateAsync(kn, HttpContext.RequestAborted);
+
+                var pushKnowledge = _mapper.Map<KnowledgeSendDto>(kn);
+                pushKnowledge.CategoryCode = "01";
+                pushKnowledge.CategoryName = "公共服务";
+                //推省上
+                await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeRemove, pushKnowledge, cancellationToken: HttpContext.RequestAborted);
+            }
+            else
+            {
+                kn.Status = EKnowledgeStatus.Auditing;
+                await _knowledgeRepository.UpdateAsync(kn, HttpContext.RequestAborted);
+
+                var approve = await _knowledgeDomainService.AddKnowledgeApproveAsync(EKnowledgeApproveType.OffShelf,
+                    kn.Id, null, HttpContext.RequestAborted);
+            }
+
+        }
+
         /// <summary>
         /// 知识库-知识上架
         /// </summary>
@@ -807,10 +843,10 @@ namespace Hotline.Api.Controllers
             var tabAuditingNames = new List<KeyValuePair<string, string>>
             {
                 new KeyValuePair<string, string>("", "全部"),
-                new KeyValuePair<string, string>("AddKnowledgeAsync", "新增审核"),
-                new KeyValuePair<string, string>("KnowledgeUpdate", "修改审核"),
-                new KeyValuePair<string, string>("KnowledgeDelete", "删除审核"),
-                new KeyValuePair<string, string>("KnowledgeOffshelf", "下架审核"),
+                new KeyValuePair<string, string>("add", "新增审核"),
+                new KeyValuePair<string, string>("update", "修改审核"),
+                new KeyValuePair<string, string>("delete", "删除审核"),
+                new KeyValuePair<string, string>("offshelf", "下架审核"),
             };
 
             //return _baseDataApplication
@@ -1796,13 +1832,15 @@ namespace Hotline.Api.Controllers
         }
 
         /// <summary>
-        /// 批量审核
+        /// 批量审核(new)
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
         [HttpPost("approve-batch")]
         public async Task ApproveBatch([FromBody] ApproveBatchRequest request)
         {
+            #region approve
+
             var approves = await _knowledgeApproRepository.Queryable()
                 .Includes(d => d.Knowledge, x => x.KnowledgeTypes)
                 .Where(d => request.ApproveIds.Contains(d.Id))
@@ -1819,7 +1857,6 @@ namespace Hotline.Api.Controllers
                         if (request.IsSuccess)
                         {
                             kn.OnShelf();
-                            //todo 推送ds
                         }
                         else
                         {
@@ -1832,7 +1869,6 @@ namespace Hotline.Api.Controllers
                         {
                             kn.OffShelf();
                             kn.SoftDelete();
-                            //todo 推送ds
                         }
                         else
                         {
@@ -1858,13 +1894,15 @@ namespace Hotline.Api.Controllers
             var kns = approves.Select(d => d.Knowledge).ToList();
             await _knowledgeRepository.UpdateRangeAsync(kns, HttpContext.RequestAborted);
 
-            //push to ds
+            #endregion
 
-            //高效办成一件事配置
+            #region 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)
             {
@@ -1872,53 +1910,38 @@ namespace Hotline.Api.Controllers
                 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;
-                            }
-                        }
-                    }
+                    var isEfficientlyAccomplish = pushApprove.Knowledge.KnowledgeTypes.Any(
+                            d => d.SpliceName.StartsWith(cancelPublishOrderEnabled));
                     //是高效,处理默认值
                     if (isEfficientlyAccomplish)
                     {
                         pushKnowledge.CategoryCode = "25";
                         pushKnowledge.CategoryName = "高效办成一件事";
                     }
-
-                    //
-
                 }
 
                 switch (pushApprove.KnowledgeApproveType)
                 {
                     case EKnowledgeApproveType.Add:
-                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeAdd, pushKnowledge, cancellationToken: cancellationToken);
+                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeAdd, pushKnowledge, cancellationToken: HttpContext.RequestAborted);
                         break;
                     case EKnowledgeApproveType.Update:
-                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeUpdate, pushKnowledge, cancellationToken: cancellationToken);
+                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeUpdate, pushKnowledge, cancellationToken: HttpContext.RequestAborted);
                         break;
                     case EKnowledgeApproveType.Delete:
-                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeRemove, pushKnowledge, cancellationToken: cancellationToken);
+                        await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeRemove, pushKnowledge, cancellationToken: HttpContext.RequestAborted);
                         break;
                     case EKnowledgeApproveType.OffShelf:
                     default:
                         throw new ArgumentOutOfRangeException();
                 }
             }
+
+            #endregion
+
+            //todo return $"总共: {dto.KnowledgeIds.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result.ToString()}";
         }
 
         #endregion

+ 103 - 49
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -38,15 +38,15 @@ namespace Hotline.Application.Knowledge
         private readonly IMapper _mapper;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
-		/// <summary>
-		/// 
-		/// </summary>
-		/// <param name="knowledgeRepository"></param>
-		/// <param name="knowledgeApplyRepository"></param>
-		/// <param name="sessionContext"></param>
-		/// <param name="knowledgeDomainService"></param>
-		/// <param name="mapper"></param>
-		public KnowApplication(IKnowledgeRepository knowledgeRepository, IOptionsSnapshot<AppConfiguration> appOptions, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository, IRepository<KnowledgeWord> knowledgeWordRepository, IRepository<KnowledgePv> knowledgePvepository, IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="knowledgeRepository"></param>
+        /// <param name="knowledgeApplyRepository"></param>
+        /// <param name="sessionContext"></param>
+        /// <param name="knowledgeDomainService"></param>
+        /// <param name="mapper"></param>
+        public KnowApplication(IKnowledgeRepository knowledgeRepository, IOptionsSnapshot<AppConfiguration> appOptions, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper, IRepository<KnowledgeType> knowledgeTypeRepository, IRepository<Hotspot> hotspotTypeRepository, IRepository<KnowledgeWord> knowledgeWordRepository, IRepository<KnowledgePv> knowledgePvepository, IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
         {
             _knowledgeRepository = knowledgeRepository;
             _knowledgeApplyRepository = knowledgeApplyRepository;
@@ -57,9 +57,9 @@ namespace Hotline.Application.Knowledge
             _knowledgeWordRepository = knowledgeWordRepository;
             _knowledgePvepository = knowledgePvepository;
             _knowledgeHotWordRepository = knowledgeHotWordRepository;
-			_appOptions  = appOptions;
+            _appOptions = appOptions;
 
-		}
+        }
 
         /// <summary>
         /// 知识库查询
@@ -68,17 +68,17 @@ namespace Hotline.Application.Knowledge
         /// <returns></returns>
         public async Task<(int, IList<KnowledgeDataDto>)> GetKnowList(KnowPagedListDto pagedDto, CancellationToken cancellationToken)
         {
-	        if (!_sessionContext.OrgIsCenter)
-	        {
-		        pagedDto.Attribution = "部门知识库";
-	        }
+            if (!_sessionContext.OrgIsCenter)
+            {
+                pagedDto.Attribution = "部门知识库";
+            }
 
-	        if (_appOptions.Value.IsZiGong || _appOptions.Value.IsLuZhou)
-	        {
-		        pagedDto.Attribution = string.Empty;
-	        }
+            if (_appOptions.Value.IsZiGong || _appOptions.Value.IsLuZhou)
+            {
+                pagedDto.Attribution = string.Empty;
+            }
 
-	        var typeSpliceName = string.Empty;
+            var typeSpliceName = string.Empty;
             var hotspotHotSpotFullName = string.Empty;
             if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
             {
@@ -91,8 +91,62 @@ namespace Hotline.Application.Knowledge
                 hotspotHotSpotFullName = hotspot?.HotSpotFullName;
             }
 
+            var query = _knowledgeRepository.Queryable();
+
+            switch (pagedDto.Status)
+            {
+                case EKnowledgeStatusRequest.OnShelf:
+                    query.Where(d => d.Status == EKnowledgeStatus.OnShelf
+                    || d.ExpiredTime == null
+                    || (d.ExpiredTime != null && d.ExpiredTime > DateTime.Now));
+                    break;
+                case EKnowledgeStatusRequest.OffShelf:
+                    query.Where(d => d.Status == EKnowledgeStatus.OffShelf
+                    || (d.ExpiredTime != null && d.ExpiredTime <= DateTime.Now && d.Status != EKnowledgeStatus.Drafts));
+                    break;
+                case EKnowledgeStatusRequest.Auditing:
+                    query.Where(d => d.Status == EKnowledgeStatus.Auditing);
+                    switch (pagedDto.ModuleCode)
+                    {
+                        case "add":
+                            query.Where(d => d.KnowledgeApproves.Any(x => x.KnowledgeApproveType == EKnowledgeApproveType.Add));
+                            break;
+                        case "update":
+                            query.Where(d => d.KnowledgeApproves.Any(x => x.KnowledgeApproveType == EKnowledgeApproveType.Update));
+                            break;
+                        case "delete":
+                            query.Where(d => d.KnowledgeApproves.Any(x => x.KnowledgeApproveType == EKnowledgeApproveType.Delete));
+                            break;
+                        case "offshelf":
+                            query.Where(d => d.KnowledgeApproves.Any(x => x.KnowledgeApproveType == EKnowledgeApproveType.OffShelf));
+                            break;
+                    }
+                    break;
+                case EKnowledgeStatusRequest.Drafts:
+                    switch (pagedDto.NewDraftsStatus)
+                    {
+                        case EKnowledgeDraftTypeRequest.All:
+                            query.Where(d => (d.Status == EKnowledgeStatus.Drafts && d.CreatorId == _sessionContext.UserId) 
+                                             || d.Status == EKnowledgeStatus.Revert);
+                            break;
+                        case EKnowledgeDraftTypeRequest.UnApproval:
+                            query.Where(d => (d.Status == EKnowledgeStatus.Drafts && d.CreatorId == _sessionContext.UserId));
+                            break;
+                        case EKnowledgeDraftTypeRequest.Failed:
+                            query.Where(d => d.Status == EKnowledgeStatus.Revert);
+                            break;
+                        default:
+                            throw new ArgumentOutOfRangeException();
+                    }
+                    break;
+                case EKnowledgeStatusRequest.All:
+                    break;
+                default:
+                    throw new ArgumentOutOfRangeException();
+            }
+
 
-            var (total, temp) = await _knowledgeRepository.Queryable(false, false, false)
+            var (total, temp) = await query
                 .Includes(x => x.User)
                 .Includes(x => x.SystemOrganize)
                 .Includes(x => x.SourceOrganize)
@@ -101,24 +155,24 @@ namespace Hotline.Application.Knowledge
                 .Includes(x => x.KnowledgeType)
                 .Where(x => x.IsDeleted == false)
                 .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
-                .Where(x => (x.Status == EKnowledgeStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EKnowledgeStatus.Drafts))
+                //.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)))
                 .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
                 .WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.StartsWith(pagedDto.CreateOrgId!))
                 .WhereIF(!string.IsNullOrEmpty(pagedDto.ModuleCode), x => x.Workflow.ModuleCode == pagedDto.ModuleCode)
-                .WhereIF(pagedDto.Status ==  EKnowledgeStatus.NewDrafts ,x=>x.Status == EKnowledgeStatus.Drafts || x.Status == EKnowledgeStatus.Revert)
-                .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Drafts , x=>x.Status == EKnowledgeStatus.Drafts)
-                .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Revert, x => x.Status == EKnowledgeStatus.Revert)
+                //.WhereIF(pagedDto.Status == EKnowledgeStatus.NewDrafts, x => x.Status == EKnowledgeStatus.Drafts || x.Status == EKnowledgeStatus.Revert)
+                //.WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Drafts, x => x.Status == EKnowledgeStatus.Drafts)
+                //.WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Revert, x => x.Status == EKnowledgeStatus.Revert)
 
-                .WhereIF(pagedDto.CreationStartTime.HasValue,x=>x.CreationTime>= pagedDto.CreationStartTime)
+                .WhereIF(pagedDto.CreationStartTime.HasValue, x => x.CreationTime >= pagedDto.CreationStartTime)
                 .WhereIF(pagedDto.CreationEndTime.HasValue, x => x.CreationTime <= pagedDto.CreationEndTime)
 
                   .WhereIF(pagedDto.StartOnShelfTime.HasValue, x => x.OnShelfTime >= pagedDto.StartOnShelfTime)
@@ -129,8 +183,8 @@ namespace Hotline.Application.Knowledge
 
                   .WhereIF(pagedDto.StartUpdateTime.HasValue, x => x.LastModificationTime >= pagedDto.StartUpdateTime)
                   .WhereIF(pagedDto.EndUpdateTime.HasValue, x => x.LastModificationTime <= pagedDto.EndUpdateTime)
-                .WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution),x=>x.Attribution == pagedDto.Attribution)
-				.OrderByDescending(d => d.CreationTime)
+                .WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution), x => x.Attribution == pagedDto.Attribution)
+                .OrderByDescending(d => d.CreationTime)
                 .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
             //返回数据
             return (total, _mapper.Map<IList<KnowledgeDataDto>>(temp));
@@ -242,7 +296,7 @@ namespace Hotline.Application.Knowledge
         {
             var keywords = new List<KnowledgeWordOutDto>();
             var splitWords = new Segment().DoSegment(title);
-            for (int i = 0;i < splitWords.Count;i++)
+            for (int i = 0; i < splitWords.Count; i++)
             {
                 var word = splitWords.ElementAt(i);
                 if (word is not { WordType: WordType.SimplifiedChinese, Word.Length: > 1 }) continue;
@@ -271,14 +325,14 @@ namespace Hotline.Application.Knowledge
 
         public async Task<(int, IList<PageViewOutDto>)> GetPageViewListAsync(PageViewInDto dto, CancellationToken requestAborted = default)
         {
-	        var typeSpliceName = string.Empty;
-	        if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
-	        {
-		        var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
-		        typeSpliceName = type?.SpliceName;
-			}
-
-			var query = _knowledgePvepository.Queryable(includeDeleted: true)
+            var typeSpliceName = string.Empty;
+            if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
+            {
+                var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
+                typeSpliceName = type?.SpliceName;
+            }
+
+            var query = _knowledgePvepository.Queryable(includeDeleted: true)
                 .LeftJoin<KnowledgeBase.Knowledge>((p, k) => p.KnowledgeCode == k.Code)
                 .LeftJoin<KnowledgeRelationType>((p, k, r) => r.KnowledgeId == k.Id)
                 .WhereIF(dto.Title.NotNullOrEmpty(), (p, k, r) => k.Title.Contains(dto.Title))
@@ -347,7 +401,7 @@ namespace Hotline.Application.Knowledge
 
             if (!_sessionContext.OrgIsCenter)
             {
-	            dto.Attribution = "部门知识库";
+                dto.Attribution = "部门知识库";
             }
 
             var sugar = _knowledgeRepository
@@ -390,13 +444,13 @@ namespace Hotline.Application.Knowledge
             {
                 var keywords = dto.Content!.GetSegment();
                 var exp = Expressionable.Create<KnowledgeBase.Knowledge>();
-                 _knowledgeWordRepository.Queryable()
-                    .Where(m => keywords.Contains(m.Tag) && m.IsEnable == 0)
-                    .Select(m => m.Id)
-                    .ToList()
-                    .ForEach(m => 
-                        exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, m))
-                    );
+                _knowledgeWordRepository.Queryable()
+                   .Where(m => keywords.Contains(m.Tag) && m.IsEnable == 0)
+                   .Select(m => m.Id)
+                   .ToList()
+                   .ForEach(m =>
+                       exp.Or(x => SqlFunc.JsonArrayAny(x.Keywords, m))
+                   );
                 sugar = sugar.Where(exp.ToExpression());
             }
 

+ 4 - 3
src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.KnowledgeBase;
+using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Share.Requests;
 
 namespace Hotline.Share.Dtos.Knowledge
@@ -115,12 +116,12 @@ namespace Hotline.Share.Dtos.Knowledge
         /// <summary>
         /// 状态
         /// </summary>
-        public EKnowledgeStatusRequest? Status { get; set; }
+        public EKnowledgeStatusRequest Status { get; set; }
 
         /// <summary>
         /// 草稿状态下的查询条件
         /// </summary>
-        public EKnowledgeStatus? NewDraftsStatus { get; set; }
+        public EKnowledgeDraftTypeRequest NewDraftsStatus { get; set; }
 
         /// <summary>
         /// 是否公开

+ 4 - 4
src/Hotline.Share/Enums/KnowledgeBase/EKnowledgeApproveType.cs

@@ -7,15 +7,15 @@ namespace Hotline.KnowledgeBase;
 /// </summary>
 public enum EKnowledgeApproveType
 {
-    [Description("新增知识")]
+    [Description("新增审核")]
     Add = 0,
 
-    [Description("更新知识")]
+    [Description("更新审核")]
     Update = 1,
 
-    [Description("删除知识")]
+    [Description("删除审核")]
     Delete = 2,
 
-    [Description("下架知识")]
+    [Description("下架审核")]
     OffShelf = 3,
 }

+ 6 - 0
src/Hotline/KnowledgeBase/Knowledge.cs

@@ -248,6 +248,12 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     [SugarColumn(ColumnDescription = "知识来源")]
     public string? Source { get; set; }
 
+    /// <summary>
+    /// 知识库类型关联ID
+    /// </summary>
+    [Navigate(NavigateType.OneToMany, nameof(KnowledgeApprove.KnowledgeId))]
+    public List<KnowledgeApprove> KnowledgeApproves { get; set; }
+
     #region method
 
     /// <summary>