Browse Source

Merge branch 'master' of http://git.fwt.com/Hotline/hotline

xf 2 năm trước cách đây
mục cha
commit
a0ce88313f

+ 4 - 4
src/Hotline.Api/Controllers/KnowledgeApplyController.cs

@@ -106,7 +106,7 @@ namespace Hotline.Api.Controllers
             if (handle.Status != EKnowledgeApplyStatus.Handling)
                 throw UserFriendlyException.SameMessage("只能撤销办理中的申请");
             handle.Status = EKnowledgeApplyStatus.Revert;
-            handle.HandleTime = DateTime.Now;
+            handle.RevokeTime = DateTime.Now;
             await _knowledgeApplyRepository.UpdateAsync(handle, HttpContext.RequestAborted);
         }
 
@@ -197,9 +197,9 @@ namespace Hotline.Api.Controllers
         /// 我的知识申请--全部
         /// </summary>
         /// <returns></returns>
-        [Permission(EPermission.KnowledgeAllApply)]
+        //[Permission(EPermission.KnowledgeAllApply)]
         [HttpGet()]
-        public async Task<PagedDto<KnowledgeApply>> GetApplyList([FromQuery] KnowledgeApplyPagedDto dto)
+        public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList([FromQuery] KnowledgeApplyPagedDto dto)
         {
             return await _knowApplication.GetApplyList(dto, HttpContext.RequestAborted);
         }
@@ -212,7 +212,7 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpGet("handlelist")]
-        public async Task<PagedDto<KnowledgeApplyPageDto>> AllHandle([FromQuery] KnowledgeHandlePagedDto dto)
+        public async Task<PagedDto<KnowledgeApplyHandlePageDto>> AllHandle([FromQuery] KnowledgeHandlePagedDto dto)
         {
             return await _knowApplication.GetApplyHandleList(dto, HttpContext.RequestAborted);
         }

+ 158 - 62
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -1,5 +1,6 @@
 using Hotline.Application.FlowEngine;
 using Hotline.Application.Knowledge;
+using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.KnowledgeBase;
 using Hotline.KnowledgeBase.Notifies;
@@ -10,6 +11,7 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 using MapsterMapper;
 using MediatR;
@@ -35,6 +37,7 @@ namespace Hotline.Api.Controllers
         private readonly IWorkflowApplication _workflowApplication;
         private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
         private readonly IWorkflowDomainService _workflowDomainService;
+        private readonly IDefinitionDomainService _definitionDomainService;
 
         /// <summary>
         /// 
@@ -49,9 +52,11 @@ namespace Hotline.Api.Controllers
         /// <param name="workflowApplication"></param>
         /// <param name="knowledgeWorkFlowRepository"></param>
         /// <param name="workflowDomainService"></param>
+        /// <param name="definitionDomainService"></param>
         public KnowledgeController(IKnowledgeRepository knowledgeRepository, IKnowledgeTempRepository knowledgeTempRepository,
            ISessionContext sessionContext, IKnowledgeDomainService knowledgeDomainService, IMapper mapper, IKnowApplication knowApplication,
-           IMediator mediator, IWorkflowApplication workflowApplication, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository, IWorkflowDomainService workflowDomainService)
+           IMediator mediator, IWorkflowApplication workflowApplication, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository, IWorkflowDomainService workflowDomainService
+            , IDefinitionDomainService definitionDomainService)
         {
             _knowledgeRepository = knowledgeRepository;
             _knowledgeTempRepository = knowledgeTempRepository;
@@ -63,6 +68,7 @@ namespace Hotline.Api.Controllers
             _workflowApplication = workflowApplication;
             _knowledgeWorkFlowRepository = knowledgeWorkFlowRepository;
             _workflowDomainService = workflowDomainService;
+            _definitionDomainService = definitionDomainService;
         }
         #region 草稿箱
         /// <summary>
@@ -185,21 +191,7 @@ namespace Hotline.Api.Controllers
         public async Task<string> AddKnowledge([FromBody] AddKnowledgeDto dto)
         {
             //知识处理逻辑
-            var knowledgeId = await _knowledgeDomainService.KnowledgeAdd(dto, HttpContext.RequestAborted);
-            //处理流程
-            if (!string.IsNullOrEmpty(knowledgeId))
-            {
-                //调用流程创建
-                var workFlowId = await _workflowApplication.StartWorkflowAsync(dto.StartWorkflowDto, HttpContext.RequestAborted);
-
-                //知识审批主表
-                await _knowledgeDomainService.AddWorkFlow(knowledgeId, workFlowId, EKnowledgeApplyType.Add, HttpContext.RequestAborted);
-
-                //修改流程ID
-                await _knowledgeDomainService.UpdateWorkFlowId(knowledgeId, workFlowId, HttpContext.RequestAborted);
-
-            }
-            return knowledgeId;
+            return await _knowledgeDomainService.KnowledgeAdd(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -209,56 +201,44 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [Permission(EPermission.KnowledgeUpdate)]
         [HttpPut("update")]
-        public async Task UpdateKnowledge([FromBody] UpdateKnowledgeDto dto)
+        public async Task<string> UpdateKnowledge([FromBody] UpdateKnowledgeDto dto)
         {
             //知识更新流程业务
-            var knowId = await _knowledgeDomainService.KnowledgeUpdate(dto, HttpContext.RequestAborted);
-            if (!string.IsNullOrEmpty(knowId))
-            {
-                //调用流程创建
-                var workFlowId = await _workflowApplication.StartWorkflowAsync(dto.StartWorkflowDto, HttpContext.RequestAborted);
-
-                //知识审批主表
-                await _knowledgeDomainService.AddWorkFlow(knowId, workFlowId, EKnowledgeApplyType.Update, HttpContext.RequestAborted);
-
-                //修改流程ID
-                await _knowledgeDomainService.UpdateWorkFlowId(knowId, workFlowId, HttpContext.RequestAborted);
-
-            }
+           return await _knowledgeDomainService.KnowledgeUpdate(dto, HttpContext.RequestAborted);
+      
         }
 
-        /// <summary>
-        /// 知识库-删除
-        /// </summary>
-        /// <param name="Id"></param>
-        /// <param name="workDto"></param>
-        /// <returns></returns>
-        [Permission(EPermission.KnowledgeDelete)]
-        [HttpPost("remove")]
-        public async Task RemoveKnowledge(string Id, [FromBody] StartWorkflowDto workDto)
-        {
-            var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
-            if (know != null && know.IsDeleted == false)
-            {
-                //验证是否已经发起过知识删除流程
-                var exists = _knowledgeWorkFlowRepository.GetAsync(p => p.KnowledgeId == know.Id && p.WorkflowModuleStatus == EKnowledgeApplyType.Delete
-                && (p.WorkFlowApplyStatus != EKnowledgeWorkFlowStatus.Success || p.WorkFlowApplyStatus != EKnowledgeWorkFlowStatus.Failed));
-                if (exists != null)
-                    throw UserFriendlyException.SameMessage($"该知识已发起过{WorkflowModule.Modules[WorkflowModuleConsts.KnowledgeDelete]}流程");
-
-                //调用流程创建
-                var workFlowId = await _workflowApplication.StartWorkflowAsync(workDto, HttpContext.RequestAborted);
-
-                //知识审批主表
-                await _knowledgeDomainService.AddWorkFlow(know.Id, workFlowId, EKnowledgeApplyType.Delete, HttpContext.RequestAborted);
-
-                ////修改知识对应流程
-                //know.WorkflowId = workFlowId;
-                //await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
-            }
-            else
-                throw UserFriendlyException.SameMessage("知识删除失败");
-        }
+        ///// <summary>
+        ///// 知识库-删除
+        ///// </summary>
+        ///// <param name="Id"></param>
+        ///// <param name="workDto"></param>
+        ///// <returns></returns>
+        //[Permission(EPermission.KnowledgeDelete)]
+        //[HttpPost("remove")]
+        //public async Task RemoveKnowledge(string Id, [FromBody] StartWorkflowDto workDto)
+        //{
+        //    var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
+        //    if (know != null && know.IsDeleted == false)
+        //    {
+        //        //验证是否已经发起过知识删除流程
+        //        var exists = _knowledgeWorkFlowRepository.GetAsync(p => p.KnowledgeId == know.Id && p.WorkflowModuleStatus == EKnowledgeApplyType.Delete
+        //        && (p.WorkFlowApplyStatus != EKnowledgeWorkFlowStatus.Success || p.WorkFlowApplyStatus != EKnowledgeWorkFlowStatus.Failed));
+        //        if (exists != null)
+        //            throw UserFriendlyException.SameMessage($"该知识已发起过{WorkflowModule.Modules[WorkflowModuleConsts.KnowledgeDelete]}流程");
+
+        //        //调用流程创建
+        //        var workFlowId = await _workflowApplication.StartWorkflowAsync(workDto, HttpContext.RequestAborted);
+
+        //        //知识审批主表
+        //        await _knowledgeDomainService.AddWorkFlow(know.Id, workFlowId, EKnowledgeApplyType.Delete, HttpContext.RequestAborted);
+
+        //    }
+        //    else
+        //        throw UserFriendlyException.SameMessage("知识删除失败");
+        //}
+
+        
 
         /// <summary>
         /// 知识库-知识下架
@@ -535,5 +515,121 @@ namespace Hotline.Api.Controllers
         }
         #endregion
 
+        #region 流程相关
+        /// <summary>
+        /// 新增-开始流程
+        /// </summary>
+        /// <param name="id">知识id</param>
+        /// <param name="dto">流程开启参数</param>
+        /// <returns></returns>
+        [HttpPost("{id}/add-startflow")]
+        public async Task AddStartFlow(string id, [FromBody] StartWorkflowDto dto)
+        {
+            await StartFlow(id, WorkflowModuleConsts.KnowledgeAdd, EKnowledgeApplyType.Add, dto);
+        }
+
+        /// <summary>
+        /// 修改-开始流程
+        /// </summary>
+        /// <param name="id">知识id</param>
+        /// <param name="dto">流程开启参数</param>
+        /// <returns></returns>
+        [HttpPost("{id}/update-startflow")]
+        public async Task UpdateStartFlow(string id, [FromBody] StartWorkflowDto dto)
+        {
+            await StartFlow(id, WorkflowModuleConsts.KnowledgeUpdate, EKnowledgeApplyType.Update, dto);
+        }
+
+        /// <summary>
+        /// 删除-开始流程
+        /// </summary>
+        /// <param name="id">知识id</param>
+        /// <param name="dto">流程开启参数</param>
+        /// <returns></returns>
+        [HttpPost("{id}/remove-startflow")]
+        public async Task RemoveStartFlow(string id, [FromBody] StartWorkflowDto dto)
+        {
+            await StartFlow(id, WorkflowModuleConsts.KnowledgeDelete, EKnowledgeApplyType.Delete, dto);
+        }
+
+        /// <summary>
+        /// 查询知识库办理流程开启参数-新增
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("add-flow-start")]
+        public async Task<IReadOnlyList<NextStepOptions>> GetAddFlowStartOptionsAsync()
+        {
+            return await _workflowApplication.GetStartOptionsAsync(WorkflowModuleConsts.KnowledgeAdd, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 查询知识库办理流程开启参数-修改
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("update-flow-start")]
+        public async Task<IReadOnlyList<NextStepOptions>> GetUpdateFlowStartOptionsAsync()
+        {
+            return await _workflowApplication.GetStartOptionsAsync(WorkflowModuleConsts.KnowledgeUpdate, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 查询知识库办理流程开启参数-删除
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("remove-flow-start")]
+        public async Task<IReadOnlyList<NextStepOptions>> GetRemoveFlowStartOptionsAsync()
+        {
+            return await _workflowApplication.GetStartOptionsAsync(WorkflowModuleConsts.KnowledgeDelete, HttpContext.RequestAborted);
+        }
+        #endregion
+
+        #region 私有方法-开始流程
+        /// <summary>
+        /// 开始流程
+        /// </summary>
+        /// <param name="id">知识ID</param>
+        /// <param name="moduleCode">知识模板编号</param>
+        /// <param name="eKnowledgeApplyType">申请类型</param>
+        /// <param name="dto">流程开启参数</param>
+        /// <returns></returns>
+        private async Task StartFlow(string id, string moduleCode, EKnowledgeApplyType eKnowledgeApplyType, StartWorkflowDto dto)
+        {
+            var knowledge = await _knowledgeRepository.GetAsync(id, HttpContext.RequestAborted);
+            if (knowledge == null)
+                throw UserFriendlyException.SameMessage("无效知识编号");
+
+            if (eKnowledgeApplyType == EKnowledgeApplyType.Delete)
+            {
+                if (knowledge.IsDeleted==true)
+                    throw UserFriendlyException.SameMessage("知识删除失败");
+
+                //验证是否已经发起过知识删除流程
+                var exists = _knowledgeWorkFlowRepository.GetAsync(p => p.KnowledgeId == knowledge.Id && p.WorkflowModuleStatus == EKnowledgeApplyType.Delete
+                && (p.WorkFlowApplyStatus == EKnowledgeWorkFlowStatus.Success || p.WorkFlowApplyStatus == EKnowledgeWorkFlowStatus.Auditing));
+                if (exists != null)
+                    throw UserFriendlyException.SameMessage($"该知识已发起过{WorkflowModule.Modules[WorkflowModuleConsts.KnowledgeDelete]}流程");
+            }
+
+            if (!string.IsNullOrEmpty(knowledge.WorkflowId) && eKnowledgeApplyType != EKnowledgeApplyType.Delete)
+                throw UserFriendlyException.SameMessage("知识已发起流程");
+
+            var definition = await _definitionDomainService.GetLastEnableByModuleCodeAsync(
+                moduleCode, HttpContext.RequestAborted);
+            if (definition is null)
+                throw UserFriendlyException.SameMessage("未配置流程模板");
+
+            dto.DefinitionCode = definition.Code;
+            dto.Title = knowledge.Title;
+            var workflowId = await _workflowApplication.StartWorkflowAsync(dto, HttpContext.RequestAborted);
+
+            //知识审批主表
+            await _knowledgeDomainService.AddWorkFlow(id, workflowId, eKnowledgeApplyType, HttpContext.RequestAborted);
+
+            if (eKnowledgeApplyType != EKnowledgeApplyType.Delete)
+                //修改流程ID
+                await _knowledgeDomainService.UpdateWorkFlowId(id, workflowId, HttpContext.RequestAborted);
+        } 
+        #endregion
+
     }
 }

+ 2 - 2
src/Hotline.Application/Knowledge/IKnowApplication.cs

@@ -19,7 +19,7 @@ namespace Hotline.Application.Knowledge
         /// <param name="pagedDto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task<PagedDto<KnowledgeApply>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken);
+        Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken);
 
         /// <summary>
         /// 申请处理查询
@@ -27,6 +27,6 @@ namespace Hotline.Application.Knowledge
         /// <param name="pagedDto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task<PagedDto<KnowledgeApplyPageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken);
+        Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken);
     }
 }

+ 19 - 12
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -4,6 +4,7 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Users;
 using MapsterMapper;
 using SqlSugar;
@@ -48,7 +49,7 @@ namespace Hotline.Application.Knowledge
                .LeftJoin<User>((o, cus) => o.CreatorId == cus.Id)
                .LeftJoin<SystemOrganize>((o, cus, sys) => o.CreatorOrgId == sys.Id)
                .LeftJoin<KnowledgeType>((o, cus, sys, kn) => o.KnowledgeTypeId == kn.Id)
-               .LeftJoin<HotSpotType>((o, cus, sys, kn,hst) => o.HotspotId == hst.Id)
+               .LeftJoin<HotSpotType>((o, cus, sys, kn, hst) => o.HotspotId == hst.Id)
                .Where((o, cus, sys, kn, hst) => o.IsDeleted == false)
                //关键词查询标题、创建人、创建部门
                .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), (o, cus, sys, kn, hst) => o.Title.Contains(pagedDto.Keyword!) || cus.Name.Contains(pagedDto.Keyword!) || sys.OrgName.Contains(pagedDto.Keyword!))
@@ -95,7 +96,7 @@ namespace Hotline.Application.Knowledge
            .MergeTable()
            //取第一条数据
            .Where(d => d.index == 1)
-           .OrderByDescending(d=>d.CreationTime)
+           .OrderByDescending(d => d.CreationTime)
           //转分页数据
           .ToPageListAsync(pagedDto.PageIndex, pagedDto.PageSize, total);
             //返回数据
@@ -108,7 +109,7 @@ namespace Hotline.Application.Knowledge
         /// <param name="pagedDto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<PagedDto<KnowledgeApply>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken)
+        public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken)
         {
             var (total, items) = await _knowledgeApplyRepository
                .Queryable()
@@ -117,14 +118,14 @@ namespace Hotline.Application.Knowledge
                .Where(d => d.CreatorId == _sessionContext.RequiredUserId)
                .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
                .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)
-               .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.ExpiredTime <= DateTime.Now)
-               .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.ExpiredTime > DateTime.Now)
+               .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.IsOvertime == true)
+               .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.IsOvertime == false)
                .WhereIF(pagedDto.StartTime.HasValue, d => d.CreationTime >= pagedDto.StartTime)
                .WhereIF(pagedDto.EndTime.HasValue, d => d.CreationTime <= pagedDto.EndTime)
                .OrderByDescending(p => p.CreationTime)
                .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
 
-            return new PagedDto<KnowledgeApply>(total, _mapper.Map<IReadOnlyList<KnowledgeApply>>(items));
+            return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
         }
 
         /// <summary>
@@ -133,7 +134,7 @@ namespace Hotline.Application.Knowledge
         /// <param name="pagedDto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<PagedDto<KnowledgeApplyPageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken)
+        public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken)
         {
             var (total, items) = await _knowledgeApplyRepository
                  .Queryable()
@@ -143,14 +144,20 @@ namespace Hotline.Application.Knowledge
                  .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
                  .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.User.Name.Contains(pagedDto.Keyword!) || d.SystemOrganize.OrgName.Contains(pagedDto.Keyword!))
                  .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)
-                 .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.ExpiredTime <= DateTime.Now)
-                 .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.ExpiredTime > DateTime.Now)
-                 .WhereIF(pagedDto.StartTime.HasValue, d => d.CreationTime >= pagedDto.StartTime)
-                 .WhereIF(pagedDto.EndTime.HasValue, d => d.CreationTime <= pagedDto.EndTime)
+                 .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.IsOvertime == true)
+                 .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.IsOvertime == false)
+
+                 .WhereIF(pagedDto.StartTime.HasValue && pagedDto.Status != EKnowledgeApplyStatus.Failed && pagedDto.Status != EKnowledgeApplyStatus.Succeed, d => d.CreationTime >= pagedDto.StartTime)
+                 .WhereIF(pagedDto.EndTime.HasValue && pagedDto.Status != EKnowledgeApplyStatus.Failed && pagedDto.Status != EKnowledgeApplyStatus.Succeed, d => d.CreationTime <= pagedDto.EndTime)
+                 .WhereIF(pagedDto.StartTime.HasValue && pagedDto.Status == EKnowledgeApplyStatus.Failed , d => d.ReturnTime >= pagedDto.StartTime)
+                 .WhereIF(pagedDto.EndTime.HasValue && pagedDto.Status == EKnowledgeApplyStatus.Failed , d => d.ReturnTime <= pagedDto.EndTime)
+                  .WhereIF(pagedDto.StartTime.HasValue &&  pagedDto.Status == EKnowledgeApplyStatus.Succeed, d => d.HandleTime >= pagedDto.StartTime)
+                 .WhereIF(pagedDto.EndTime.HasValue &&  pagedDto.Status == EKnowledgeApplyStatus.Succeed, d => d.HandleTime <= pagedDto.EndTime)
+
                  .OrderByDescending(p => p.CreationTime)
                  .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
 
-            return new PagedDto<KnowledgeApplyPageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyPageDto>>(items));
+            return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
         }
     }
 }

+ 1 - 1
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -84,7 +84,7 @@ namespace Hotline.Application.Mappers
             #endregion
 
             #region Knowledge
-            config.NewConfig<KnowledgeApply, KnowledgeApplyPageDto>()
+            config.NewConfig<KnowledgeApply, KnowledgeApplyHandlePageDto>()
                  .Map(d => d.CreationName, x => x.User.Name)
                    .Map(d => d.CreationOrgName, x => x.SystemOrganize.OrgName);
 

+ 13 - 1
src/Hotline.Share/Dtos/Knowledge/KnowledgeApplyPageDto.cs

@@ -2,7 +2,7 @@
 
 namespace Hotline.Share.Dtos.Knowledge
 {
-    public record KnowledgeApplyPageDto
+    public record KnowledgeApplyHandlePageDto
     {
         /// <summary>
         /// ID
@@ -39,6 +39,11 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public DateTime? ExpiredTime { get; set; }
 
+        /// <summary>
+        /// 是否已经超期
+        /// </summary>
+        public bool IsOvertime { get; set; }
+
         /// <summary>
         /// 创建
         /// </summary>
@@ -53,5 +58,12 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 退回时间
         /// </summary>
         public DateTime? ReturnTime { get; set; }
+
+        /// <summary>
+        /// 撤销时间
+        /// </summary>
+        public DateTime? RevokeTime { get; set; }
     }
+
+  
 }

+ 2 - 2
src/Hotline.Share/Dtos/Knowledge/KnowledgeApplyPagedDto.cs

@@ -8,7 +8,7 @@ namespace Hotline.Share.Dtos.Knowledge
     /// </summary>
     ///  <param name="Status"></param>
     /// <param name="ApplyType"></param>
-    /// <param name="IsOvertime"></param>
+    /// <param name="IsOvertime">0:已超期;1:未超期</param>
     /// <param name="StartTime"></param>
     /// <param name="EndTime"></param>
     public record KnowledgeApplyPagedDto(EKnowledgeApplyStatus? Status, EKnowledgeApplyType? ApplyType, string? IsOvertime, DateTime? StartTime, DateTime? EndTime) : PagedRequest;
@@ -18,7 +18,7 @@ namespace Hotline.Share.Dtos.Knowledge
     /// </summary>
     /// <param name="Status"></param>
     /// <param name="ApplyType"></param>
-    /// <param name="IsOvertime"></param>
+    /// <param name="IsOvertime">0:已超期;1:未超期</param>
     /// <param name="StartTime"></param>
     /// <param name="EndTime"></param>
     public record KnowledgeHandlePagedDto(EKnowledgeApplyStatus? Status, EKnowledgeApplyType? ApplyType, string? IsOvertime, DateTime? StartTime, DateTime? EndTime) : PagedKeywordRequest;

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

@@ -77,6 +77,7 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     /// <summary>
     /// 关键词
     /// </summary>
+    [SugarColumn(IsNullable = true)]
     public string Keywords { get; set; }
 
     /// <summary>
@@ -95,6 +96,7 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     /// </summary>
     //[SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
     //public List<string> Applies { get; set; }
+    [SugarColumn(IsNullable = true)]
     public string Applies { get; set; }
 
     /// <summary>

+ 12 - 0
src/Hotline/KnowledgeBase/KnowledgeApply.cs

@@ -14,6 +14,7 @@ public class KnowledgeApply : FullStateEntity
     /// <summary>
     /// 知识ID
     /// </summary>
+    [SugarColumn(IsNullable = true)]
     public string KnowledgeId { get; set; }
 
     /// <summary>
@@ -46,6 +47,11 @@ public class KnowledgeApply : FullStateEntity
     /// </summary>
     public DateTime? ExpiredTime { get; set; }
 
+    /// <summary>
+    /// 是否已经超期
+    /// </summary>
+    public bool IsOvertime { get; set; } = false;
+
     /// <summary>
     /// 处理完成时间
     /// </summary>
@@ -56,9 +62,15 @@ public class KnowledgeApply : FullStateEntity
     /// </summary>
     public DateTime? ReturnTime { get; set; }
 
+    /// <summary>
+    /// 撤销时间
+    /// </summary>
+    public DateTime? RevokeTime { get; set; }
+
     /// <summary>
     /// 办理或者退回意见
     /// </summary>
+    [SugarColumn(IsNullable = true)]
     public string Opinion { get; set; }
 
     /// <summary>