فهرست منبع

拆分控制器中的业务

TANG JIANG 2 سال پیش
والد
کامیت
fd9f1f8334

+ 6 - 90
src/Hotline.Api/Controllers/KnowledgeCommonController.cs

@@ -1,9 +1,7 @@
 using Hotline.KnowledgeBase;
 using Hotline.Permissions;
 using Hotline.Share.Dtos.Knowledge;
-using Hotline.Share.Enums.KnowledgeBase;
 using MapsterMapper;
-using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using XF.Domain.Exceptions;
 
@@ -50,12 +48,7 @@ namespace Hotline.Api.Controllers
         [HttpPost("type-add")]
         public async Task<string> TypeAdd([FromBody] AddKnowledgeTypeDto dto)
         {
-            var type = _mapper.Map<KnowledgeType>(dto);
-            type.CreationTime = DateTime.Now;
-            type.IsEnable = true;
-            string FullName = await _knowledgeTypeService.GetFullName(type.ParentId);
-            type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;
-            return await _knowledgeTypeRepository.AddAsync(type, HttpContext.RequestAborted);
+            return await _knowledgeTypeService.TypeAdd(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -71,24 +64,7 @@ namespace Hotline.Api.Controllers
             var type = await _knowledgeTypeRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
             if (type is null)
                 throw UserFriendlyException.SameMessage("编辑失败!");
-
-            bool result = false;
-            //是否更改分类名称
-            if (type.Name != dto.Name)
-                result = true;
-            //转换
-            _mapper.Map(dto, type);
-            //如果更改了名称,则修改全称,未更改不修改
-            if (result)
-            {
-                string FullName = await _knowledgeTypeService.GetFullName(type.ParentId);
-                type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;
-            }
-            //修改数据
-            await _knowledgeTypeRepository.UpdateAsync(type, HttpContext.RequestAborted);
-            //如果修改了名称,对应修改子分类全称
-            if (result)
-                await _knowledgeTypeService.UpdateChildNode(type.Id);
+            await _knowledgeTypeService.TypeUpdate(dto, type, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -100,22 +76,7 @@ namespace Hotline.Api.Controllers
         [HttpGet("type-init")]
         public async Task<KnowledgeTypeDto> TypeInit(string Id, string ParentId)
         {
-            KnowledgeTypeDto knowledgeTypeDto = new();
-            if (!string.IsNullOrEmpty(Id))
-            {
-                var type = await _knowledgeTypeRepository.GetAsync(p => p.Id == Id, HttpContext.RequestAborted);
-                _mapper.Map(type, knowledgeTypeDto);
-            }
-            var list = await _knowledgeTypeRepository.QueryAsync(p => p.IsEnable == true);
-            if (!string.IsNullOrEmpty(ParentId) && ParentId != Guid.Empty.ToString())
-            {
-                knowledgeTypeDto.TreeLists = _knowledgeTypeService.GetChildren(list, Guid.Empty.ToString(), ParentId);
-            }
-            else
-            {
-                knowledgeTypeDto.TreeLists = _knowledgeTypeService.GetChildren(list, Guid.Empty.ToString(), "");
-            }
-            return knowledgeTypeDto;
+            return await _knowledgeTypeService.TypeInit(Id, ParentId, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -176,24 +137,7 @@ namespace Hotline.Api.Controllers
             if (type is null)
                 throw UserFriendlyException.SameMessage("分类不存在!");
             if (type.IsEnable)//禁用
-            {
-                //查询子级数据
-                var getChild = await _knowledgeTypeRepository.GetChild(Id);
-                //禁用子级数据
-                if (getChild != null && getChild.Count > 0)
-                {
-                    foreach (var item in getChild)
-                    {
-                        item.IsEnable = false;
-                        await _knowledgeTypeRepository.UpdateAsync(item, HttpContext.RequestAborted);
-                    }
-                }
-                ////查询是否有子级,如果有子级启用,则不能禁用
-                //var checkChild = await _knowledgeTypeRepository.CountAsync(p => p.ParentId == Id && p.IsEnable == true);
-                //if (checkChild > 0)
-                //    throw UserFriendlyException.SameMessage("请先禁用子级分类!");
-                //type.IsEnable = false;
-            }
+                await _knowledgeTypeService.TypeChangeState(Id, HttpContext.RequestAborted);
             else //启用
             {
                 //查询上级是否是启用状态,如果是禁用状态不能修改
@@ -207,7 +151,6 @@ namespace Hotline.Api.Controllers
                 type.IsEnable = true;
                 await _knowledgeTypeRepository.UpdateAsync(type, HttpContext.RequestAborted);
             }
-
         }
 
         /// <summary>
@@ -224,36 +167,9 @@ namespace Hotline.Api.Controllers
             if (type is null)
                 throw UserFriendlyException.SameMessage("分类不存在!");
             if (type.IsEnable)//启用状态
-            {
-                //查询子级数据
-                var getChild = await _knowledgeTypeRepository.GetChild(Id);
-                //禁用子级数据
-                if (getChild != null && getChild.Count > 0)
-                {
-                    foreach (var item in getChild)
-                    {
-                        item.IsEnable = false;
-                        await _knowledgeTypeRepository.UpdateAsync(item, HttpContext.RequestAborted);
-                        //下架知识
-                        //查询当前分类下的知识(查询条件:此分类下/状态为成功/未删除/已上架)
-                        var knowList = _knowledgeRepository.Queryable().Where(p => p.KnowledgeTypeId == item.Id && p.Status == EKnowledgeStatus.Succeed && p.IsDeleted == false && p.IsOnShelf == true).ToList();
-                        if (knowList != null && knowList.Count > 0)
-                        {
-                            //修改知识为下架状态
-                            foreach (var itemKnow in knowList)
-                            {
-                                itemKnow.IsOnShelf = false;
-                                itemKnow.OffShelfTime = DateTime.Now;
-                                await _knowledgeRepository.UpdateAsync(itemKnow, HttpContext.RequestAborted);
-                            }
-                        }
-                    }
-                }
-            }
+                await _knowledgeTypeService.TypeChangeStateAndOffShelf(Id, HttpContext.RequestAborted);
             else
-            {
                 throw UserFriendlyException.SameMessage("禁用分类失败!");
-            }
         }
 
         /// <summary>
@@ -299,7 +215,7 @@ namespace Hotline.Api.Controllers
             if (string.IsNullOrEmpty(Id))
                 throw UserFriendlyException.SameMessage("ID不能为空!");
             //删除操作
-            await _knowledgeStandardRepository.RemoveAsync(Id, HttpContext.RequestAborted);
+            await _knowledgeStandardRepository.RemoveAsync(Id, false, HttpContext.RequestAborted);
 
         }
 

+ 11 - 90
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -61,7 +61,6 @@ namespace Hotline.Api.Controllers
             if (string.IsNullOrEmpty(dto.Code))
                 kn.Code = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();
             kn.PageView = 0;
-            kn.CreationTime = DateTime.Now;
             return await _knowledgeTempRepository.AddAsync(kn, HttpContext.RequestAborted);
         }
 
@@ -104,7 +103,7 @@ namespace Hotline.Api.Controllers
             if (string.IsNullOrEmpty(Id))
                 throw UserFriendlyException.SameMessage("Id不能为空!");
 
-            await _knowledgeTempRepository.RemoveAsync(p => p.Id == Id,false, HttpContext.RequestAborted);
+            await _knowledgeTempRepository.RemoveAsync(p => p.Id == Id, false, HttpContext.RequestAborted);
         }
 
         #endregion
@@ -118,16 +117,9 @@ namespace Hotline.Api.Controllers
         [HttpGet("knowledge-updateinfo")]
         public async Task<Knowledge> KnowledgeUpdateInfo(string Id)
         {
-            var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
+            var know = await _knowledgeService.KnowledgeUpdateInfo(Id, HttpContext.RequestAborted);
             if (know is null)
-            {
-                //再次查询草稿箱数据
-                var tempKnow = await _knowledgeTempRepository.GetAsync(Id, HttpContext.RequestAborted);
-                if (tempKnow is null)
-                    throw UserFriendlyException.SameMessage("知识查询失败!");
-                know = new Knowledge();
-                _mapper.Map(tempKnow, know);
-            }
+                throw UserFriendlyException.SameMessage("知识查询失败!");
             return know;
         }
 
@@ -142,18 +134,8 @@ namespace Hotline.Api.Controllers
             var know = await _knowledgeRepository.GetAsync(Id, HttpContext.RequestAborted);
             if (know is null)
                 throw UserFriendlyException.SameMessage("知识查询失败!");
-            //写入浏览记录
-            KnowledgePv knowledgePv = new()
-            {
-                CreationTime = DateTime.Now,
-                KnowledgeId = know.Id
-            };
-            await _knowledgePVRepository.AddAsync(knowledgePv, HttpContext.RequestAborted);
-
-            //修改浏览量
-            know.PageView++;
-            await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
-            return know;
+
+            return await _knowledgeService.KnowledgeInfo(know, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -165,26 +147,7 @@ namespace Hotline.Api.Controllers
         [HttpPost("knowledge-add")]
         public async Task<string> KnowledgeAdd([FromBody] AddKnowledgeDto dto)
         {
-            var kn = _mapper.Map<Knowledge>(dto);
-            //知识草稿ID如果不为空,则表示是草稿箱的数据
-            if (!string.IsNullOrEmpty(dto.Code))
-            {
-                //移除草稿箱数据
-                await _knowledgeTempRepository.RemoveAsync(p => p.Code == dto.Code);
-            }
-            //如果草稿箱不存在数据,也就是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.PageView = 0;
-            kn.CreationTime = DateTime.Now;
-            kn.Status = EKnowledgeStatus.Auditing;
-
-            return await _knowledgeRepository.AddAsync(kn, HttpContext.RequestAborted);
-            //调用流程创建
-
-
-            //如果流程创建失败需要删除此条数据
-            //await _knowledgeRepository.RemoveAsync(knowledge);
+            return await _knowledgeService.KnowledgeAdd(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -196,30 +159,8 @@ namespace Hotline.Api.Controllers
         [HttpPost("knowledge-update")]
         public async Task KnowledgeUpdate([FromBody] UpdateKnowledgeDto dto)
         {
-            //知识修改逻辑
-            //如果可以修改,此条数据不动,重新写入一条新数据,知识编号不变,版本号+1
-
-            var know = await _knowledgeRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
-            if (know is null || know.IsDeleted)
-                throw UserFriendlyException.SameMessage("无效知识");
-            if (know.Status == EKnowledgeStatus.Auditing)
-                throw UserFriendlyException.SameMessage("审批中数据不能修改");
-            var knowledge = _mapper.Map<Knowledge>(dto);
-            knowledge.Code = know.Code;
-            knowledge.PageView = 0;
-            knowledge.CreationTime = DateTime.Now;
-            knowledge.Status = EKnowledgeStatus.Auditing;
-            knowledge.Id = "";
-            knowledge.Version = know.Version + 1;
             //新增一条数据
-
-            await _knowledgeRepository.AddAsync(knowledge, HttpContext.RequestAborted);
-
-            //调用流程创建
-
-
-            //如果流程创建失败需要删除此条数据
-            //await _knowledgeRepository.RemoveAsync(knowledge);
+            await _knowledgeService.KnowledgeUpdate(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -238,9 +179,8 @@ namespace Hotline.Api.Controllers
                 await _knowledgeRepository.RemoveAsync(know, false, HttpContext.RequestAborted);
             }
             else
-            {
                 throw UserFriendlyException.SameMessage("知识删除失败");
-            }
+
         }
 
         /// <summary>
@@ -255,29 +195,10 @@ namespace Hotline.Api.Controllers
         {
             if (Ids is null || Ids.Count == 0)
                 throw UserFriendlyException.SameMessage("数据不能为空");
+            if(ApprovalStatus=="1"&&string.IsNullOrEmpty(HandleOpinions))
+                throw UserFriendlyException.SameMessage("办理意见不能为空");
             //审批操作
-            foreach (var item in Ids)
-            {
-                var know = await _knowledgeRepository.GetAsync(item, HttpContext.RequestAborted);
-                if (know != null)
-                {
-                    //调用流程审批接口
-                    //流程调用成功以后在处理以下业务
-
-                    //处理数据
-                    if (ApprovalStatus == "0")
-                    {
-                        know.Status = EKnowledgeStatus.Succeed;
-                        know.IsOnShelf = true;
-                        know.OnShelfTime = DateTime.Now;
-                    }
-                    else
-                    {
-                        know.Status = EKnowledgeStatus.Failed;
-                    }
-                    await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
-                }
-            }
+            await _knowledgeService.ApprovalHandle(Ids, ApprovalStatus, HandleOpinions, HttpContext.RequestAborted);
         }
 
         /// <summary>

+ 0 - 2
src/Hotline.Repository.SqlSugar/Knowledge/KnowledgeTypeRepository.cs

@@ -1,8 +1,6 @@
 using Hotline.KnowledgeBase;
 using Hotline.Repository.SqlSugar.DataPermissions;
-using Hotline.Settings;
 using SqlSugar;
-using System.Data;
 using XF.Domain.Dependency;
 
 namespace Hotline.Repository.SqlSugar.Knowledge

+ 39 - 1
src/Hotline/KnowledgeBase/IKnowledgeService.cs

@@ -1,4 +1,5 @@
-using XF.Domain.Repository;
+using Hotline.Share.Dtos.Knowledge;
+using XF.Domain.Repository;
 
 namespace Hotline.KnowledgeBase
 {
@@ -10,5 +11,42 @@ namespace Hotline.KnowledgeBase
         /// <param name="userId"></param>
         /// <returns></returns>
         Task<List<string>> GetChildBMId(string? userId);
+
+        /// <summary>
+        /// 知识库-知识修改-查询详情
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        Task<Knowledge> KnowledgeUpdateInfo(string Id, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 知识库-查询详情-增加浏览量
+        /// </summary>
+        /// <param name="know"></param>
+        /// <returns></returns>
+        Task<Knowledge> KnowledgeInfo(Knowledge know, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 知识库-新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<string> KnowledgeAdd(AddKnowledgeDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 知识库-修改
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task KnowledgeUpdate(UpdateKnowledgeDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 审批操作
+        /// </summary>
+        /// <param name="Ids">需要审批的数据ID</param>
+        /// <param name="ApprovalStatus">审核状态:0:通过;1:不通过</param>
+        /// <param name="HandleOpinions">办理意见</param>
+        /// <returns></returns>
+        Task ApprovalHandle(List<string> Ids, string ApprovalStatus, string HandleOpinions, CancellationToken cancellationToken);
     }
 }

+ 26 - 4
src/Hotline/KnowledgeBase/IKnowledgeTypeService.cs

@@ -14,17 +14,39 @@ namespace Hotline.KnowledgeBase
         List<TreeListDto> GetChildren(List<KnowledgeType> treeDatas, string ID, string checkId);
 
         /// <summary>
-        /// 获取全称
+        ///知识分类- 新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<string> TypeAdd(AddKnowledgeTypeDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        ///知识分类- 编辑
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task TypeUpdate(UpdateKnowledgeTypeDto dto, KnowledgeType type, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 知识分类-新增、编辑初始化
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <param name="ParentId"></param>
+        /// <returns></returns>
+        Task<KnowledgeTypeDto> TypeInit(string Id, string ParentId, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 知识分类-启用、禁用切换
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        Task<string> GetFullName(string Id);
+        Task TypeChangeState(string Id, CancellationToken cancellationToken);
 
         /// <summary>
-        /// 修改子级分类全称
+        /// 知识分类-禁用,并且下架知识
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        Task UpdateChildNode(string Id);
+        Task TypeChangeStateAndOffShelf(string Id, CancellationToken cancellationToken);
     }
 }

+ 147 - 2
src/Hotline/KnowledgeBase/KnowledgeService.cs

@@ -1,5 +1,9 @@
-using Hotline.Users;
+using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Users;
+using MapsterMapper;
 using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
 
 namespace Hotline.KnowledgeBase
 {
@@ -7,16 +11,25 @@ namespace Hotline.KnowledgeBase
     {
         private readonly IUserRepository _userRepository;
         private readonly IKnowledgeRepository _knowledgeRepository;
+        private readonly IKnowledgeTempRepository _knowledgeTempRepository;
+        private readonly IMapper _mapper;
+        private readonly IKnowledgePVRepository _knowledgePVRepository;
 
         /// <summary>
         /// 
         /// </summary>
         /// <param name="userRepository"></param>
         /// <param name="knowledgeRepository"></param>
-        public KnowledgeService(IUserRepository userRepository, IKnowledgeRepository knowledgeRepository)
+        /// <param name="knowledgeTempRepository"></param>
+        /// <param name="mapper"></param>
+        /// <param name="knowledgePVRepository"></param>
+        public KnowledgeService(IUserRepository userRepository, IKnowledgeRepository knowledgeRepository, IKnowledgeTempRepository knowledgeTempRepository, IMapper mapper, IKnowledgePVRepository knowledgePVRepository)
         {
             _userRepository = userRepository;
             _knowledgeRepository = knowledgeRepository;
+            _mapper = mapper;
+            _knowledgeTempRepository = knowledgeTempRepository;
+            _knowledgePVRepository = knowledgePVRepository;
         }
 
         /// <summary>
@@ -36,6 +49,138 @@ namespace Hotline.KnowledgeBase
             return list;
         }
 
+        /// <summary>
+        /// 知识库-知识修改-查询详情
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        public async Task<Knowledge> KnowledgeUpdateInfo(string Id, CancellationToken cancellationToken)
+        {
+            var know = await _knowledgeRepository.GetAsync(Id, cancellationToken);
+            if (know is null)
+            {
+                //再次查询草稿箱数据
+                var tempKnow = await _knowledgeTempRepository.GetAsync(Id, cancellationToken);
+                if (tempKnow != null)
+                {
+                    know = new Knowledge();
+                    _mapper.Map(tempKnow, know);
+                }
+            }
+            return know;
+        }
+
+        /// <summary>
+        /// 知识库-查询详情-增加浏览量
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        public async Task<Knowledge> KnowledgeInfo(Knowledge know, CancellationToken cancellationToken)
+        {
+            //写入浏览记录
+            KnowledgePv knowledgePv = new()
+            {
+                CreationTime = DateTime.Now,
+                KnowledgeId = know.Id
+            };
+            await _knowledgePVRepository.AddAsync(knowledgePv, cancellationToken);
+
+            //修改浏览量
+            know.PageView++;
+            await _knowledgeRepository.UpdateAsync(know, cancellationToken);
+            return know;
+        }
+
+        /// <summary>
+        /// 知识库-新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<string> KnowledgeAdd(AddKnowledgeDto dto, CancellationToken cancellationToken)
+        {
+            var kn = _mapper.Map<Knowledge>(dto);
+            //知识草稿ID如果不为空,则表示是草稿箱的数据
+            if (!string.IsNullOrEmpty(dto.Code))
+            {
+                //移除草稿箱数据
+                await _knowledgeTempRepository.RemoveAsync(p => p.Code == dto.Code);
+            }
+            //如果草稿箱不存在数据,也就是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.PageView = 0;
+            kn.Status = EKnowledgeStatus.Auditing;
+
+            return await _knowledgeRepository.AddAsync(kn, cancellationToken);
+            //调用流程创建
+
+            //如果流程创建失败需要删除此条数据
+            //await _knowledgeRepository.RemoveAsync(knowledge);
+        }
+
+        /// <summary>
+        /// 知识库-修改
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task KnowledgeUpdate(UpdateKnowledgeDto dto, CancellationToken cancellationToken)
+        {
+            //知识修改逻辑
+            //如果可以修改,此条数据不动,重新写入一条新数据,知识编号不变,版本号+1
+
+            var know = await _knowledgeRepository.GetAsync(dto.Id, cancellationToken);
+            if (know is null || know.IsDeleted)
+                throw UserFriendlyException.SameMessage("无效知识");
+            if (know.Status == EKnowledgeStatus.Auditing)
+                throw UserFriendlyException.SameMessage("审批中数据不能修改");
+            var knowledge = _mapper.Map<Knowledge>(dto);
+            knowledge.Code = know.Code;
+            knowledge.PageView = 0;
+            knowledge.Status = EKnowledgeStatus.Auditing;
+            knowledge.Id = "";
+            knowledge.Version = know.Version + 1;
+            //新增一条数据
+            await _knowledgeRepository.AddAsync(knowledge, cancellationToken);
+
+            //调用流程创建
+
+            //如果流程创建失败需要删除此条数据
+            //await _knowledgeRepository.RemoveAsync(knowledge);
+        }
+
+        /// <summary>
+        /// 审批操作
+        /// </summary>
+        /// <param name="Ids">需要审批的数据ID</param>
+        /// <param name="ApprovalStatus">审核状态:0:通过;1:不通过</param>
+        /// <param name="HandleOpinions">办理意见</param>
+        /// <returns></returns>
+        public async Task ApprovalHandle(List<string> Ids, string ApprovalStatus, string HandleOpinions, CancellationToken cancellationToken)
+        {
+            //审批操作
+            foreach (var item in Ids)
+            {
+                var know = await _knowledgeRepository.GetAsync(item, cancellationToken);
+                if (know != null)
+                {
+                    //调用流程审批接口
+                    //流程调用成功以后在处理以下业务
+
+                    //处理数据
+                    if (ApprovalStatus == "0")
+                    {
+                        know.Status = EKnowledgeStatus.Succeed;
+                        know.IsOnShelf = true;
+                        know.OnShelfTime = DateTime.Now;
+                    }
+                    else
+                    {
+                        know.Status = EKnowledgeStatus.Failed;
+                    }
+                    await _knowledgeRepository.UpdateAsync(know, cancellationToken);
+                }
+            }
+        }
     }
 }
 

+ 174 - 37
src/Hotline/KnowledgeBase/KnowledgeTypeService.cs

@@ -1,5 +1,11 @@
 using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Enums.KnowledgeBase;
+using MapsterMapper;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System.Security.Permissions;
 using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
 
 namespace Hotline.KnowledgeBase
 {
@@ -9,14 +15,19 @@ namespace Hotline.KnowledgeBase
         /// 
         /// </summary>
         private readonly IKnowledgeTypeRepository _knowledgeTypeRepository;
+        private readonly IKnowledgeRepository _knowledgeRepository;
+        private readonly IMapper _mapper;
 
         /// <summary>
         /// 
         /// </summary>
         /// <param name="knowledgeTypeRepository"></param>
-        public KnowledgeTypeService(IKnowledgeTypeRepository knowledgeTypeRepository)
+        /// <param name="mapper"></param>
+        public KnowledgeTypeService(IKnowledgeTypeRepository knowledgeTypeRepository, IMapper mapper, IKnowledgeRepository knowledgeRepository)
         {
             _knowledgeTypeRepository = knowledgeTypeRepository;
+            _mapper = mapper;
+            _knowledgeRepository = knowledgeRepository;
         }
         /// <summary>
         /// 查询所有子级
@@ -49,78 +60,204 @@ namespace Hotline.KnowledgeBase
         }
 
         /// <summary>
-        /// 获取全称
+        /// 查询父级节点
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        public async Task<string> GetFullName(string Id)
+        private async Task<List<string>> GetParentNode(string Id)
         {
-            //获取全部父级名称
-            var list = await GetParentNode(Id);
-            //倒叙
-            list.Reverse();
-            //拆分
-            return string.Join("-", list.ToArray());
+            List<string> list = new();
+            var type = await _knowledgeTypeRepository.GetAsync(p => p.Id == Id);
+            if (type != null)
+            {
+                list.Add(type.Name);
+                list.AddRange(await GetParentNode(type.ParentId));
+            }
+            return list;
         }
 
         /// <summary>
-        /// 修改子级分类全称
+        /// 查询子级节点
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        public async Task UpdateChildNode(string Id)
+        private async Task<List<KnowledgeType>> GetChildNode(string Id)
         {
-            //查询子分类
-            var list = await GetChildNode(Id);
-            if (list is not null && list.Count > 0)
+            List<KnowledgeType> list = new();
+            var typelist = await _knowledgeTypeRepository.QueryAsync(p => p.ParentId == Id);
+            if (typelist != null)
             {
-                foreach (var item in list)
+                foreach (var item in typelist)
                 {
-                    //获取全称
-                    string FullName = await GetFullName(item.ParentId);
-                    item.SpliceName = string.IsNullOrEmpty(FullName) ? item.Name : FullName + "-" + item.Name;
-                    //修改全称
-                    await _knowledgeTypeRepository.UpdateAsync(item);
+                    list.Add(item);
+                    list.AddRange(await GetChildNode(item.Id));
                 }
             }
+            return list;
         }
 
         /// <summary>
-        /// 查询父级节点
+        ///知识分类- 新增
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<string> TypeAdd(AddKnowledgeTypeDto dto, CancellationToken cancellationToken)
+        {
+            var type = _mapper.Map<KnowledgeType>(dto);
+            type.IsEnable = true;
+            string FullName = await GetFullName(type.ParentId);
+            type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;
+            return await _knowledgeTypeRepository.AddAsync(type, cancellationToken);
+        }
+
+        /// <summary>
+        ///知识分类- 编辑
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task TypeUpdate(UpdateKnowledgeTypeDto dto, KnowledgeType type, CancellationToken cancellationToken)
+        {
+            bool result = false;
+            //是否更改分类名称
+            if (type.Name != dto.Name)
+                result = true;
+            //转换
+            _mapper.Map(dto, type);
+            //如果更改了名称,则修改全称,未更改不修改
+            if (result)
+            {
+                string FullName = await GetFullName(type.ParentId);
+                type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;
+            }
+            //修改数据
+            await _knowledgeTypeRepository.UpdateAsync(type, cancellationToken);
+            //如果修改了名称,对应修改子分类全称
+            if (result)
+                await UpdateChildNode(type.Id);
+        }
+
+        /// <summary>
+        /// 知识分类-新增、编辑初始化
         /// </summary>
         /// <param name="Id"></param>
+        /// <param name="ParentId"></param>
         /// <returns></returns>
-        private async Task<List<string>> GetParentNode(string Id)
+        public async Task<KnowledgeTypeDto> TypeInit(string Id, string ParentId, CancellationToken cancellationToken)
         {
-            List<string> list = new();
-            var type = await _knowledgeTypeRepository.GetAsync(p => p.Id == Id);
-            if (type != null)
+            KnowledgeTypeDto knowledgeTypeDto = new();
+            if (!string.IsNullOrEmpty(Id))
             {
-                list.Add(type.Name);
-                list.AddRange(await GetParentNode(type.ParentId));
+                var type = await _knowledgeTypeRepository.GetAsync(p => p.Id == Id, cancellationToken);
+                _mapper.Map(type, knowledgeTypeDto);
             }
-            return list;
+            var list = await _knowledgeTypeRepository.QueryAsync(p => p.IsEnable == true);
+            if (!string.IsNullOrEmpty(ParentId) && ParentId != Guid.Empty.ToString())
+            {
+                knowledgeTypeDto.TreeLists = GetChildren(list, Guid.Empty.ToString(), ParentId);
+            }
+            else
+            {
+                knowledgeTypeDto.TreeLists = GetChildren(list, Guid.Empty.ToString(), "");
+            }
+            return knowledgeTypeDto;
         }
 
         /// <summary>
-        /// 查询子级节点
+        /// 知识分类-启用、禁用切换
         /// </summary>
         /// <param name="Id"></param>
         /// <returns></returns>
-        private async Task<List<KnowledgeType>> GetChildNode(string Id)
+        public async Task TypeChangeState(string Id, CancellationToken cancellationToken)
         {
-            List<KnowledgeType> list = new();
-            var typelist = await _knowledgeTypeRepository.QueryAsync(p => p.ParentId == Id);
-            if (typelist != null)
+            //查询子级数据
+            var getChild = await _knowledgeTypeRepository.GetChild(Id);
+            //禁用子级数据
+            if (getChild != null && getChild.Count > 0)
             {
-                foreach (var item in typelist)
+                foreach (var item in getChild)
                 {
-                    list.Add(item);
-                    list.AddRange(await GetChildNode(item.Id));
+                    item.IsEnable = false;
+                    await _knowledgeTypeRepository.UpdateAsync(item, cancellationToken);
+                }
+            }
+            ////查询是否有子级,如果有子级启用,则不能禁用
+            //var checkChild = await _knowledgeTypeRepository.CountAsync(p => p.ParentId == Id && p.IsEnable == true);
+            //if (checkChild > 0)
+            //    throw UserFriendlyException.SameMessage("请先禁用子级分类!");
+            //type.IsEnable = false;
+        }
+
+        /// <summary>
+        /// 知识分类-禁用,并且下架知识
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        public async Task TypeChangeStateAndOffShelf(string Id, CancellationToken cancellationToken)
+        {
+            //查询子级数据
+            var getChild = await _knowledgeTypeRepository.GetChild(Id);
+            //禁用子级数据
+            if (getChild != null && getChild.Count > 0)
+            {
+                foreach (var item in getChild)
+                {
+                    item.IsEnable = false;
+                    await _knowledgeTypeRepository.UpdateAsync(item, cancellationToken);
+                    //下架知识
+                    //查询当前分类下的知识(查询条件:此分类下/状态为成功/未删除/已上架)
+                    var knowList = _knowledgeRepository.Queryable().Where(p => p.KnowledgeTypeId == item.Id && p.Status == EKnowledgeStatus.Succeed && p.IsDeleted == false && p.IsOnShelf == true).ToList();
+                    if (knowList != null && knowList.Count > 0)
+                    {
+                        //修改知识为下架状态
+                        foreach (var itemKnow in knowList)
+                        {
+                            itemKnow.IsOnShelf = false;
+                            itemKnow.OffShelfTime = DateTime.Now;
+                            await _knowledgeRepository.UpdateAsync(itemKnow, cancellationToken);
+                        }
+                    }
+                }
+            }
+        }
+
+        #region 私有方法
+        /// <summary>
+        /// 获取全称
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        private async Task<string> GetFullName(string Id)
+        {
+            //获取全部父级名称
+            var list = await GetParentNode(Id);
+            //倒叙
+            list.Reverse();
+            //拆分
+            return string.Join("-", list.ToArray());
+        }
+
+        /// <summary>
+        /// 修改子级分类全称
+        /// </summary>
+        /// <param name="Id"></param>
+        /// <returns></returns>
+        private async Task UpdateChildNode(string Id)
+        {
+            //查询子分类
+            var list = await GetChildNode(Id);
+            if (list is not null && list.Count > 0)
+            {
+                foreach (var item in list)
+                {
+                    //获取全称
+                    string FullName = await GetFullName(item.ParentId);
+                    item.SpliceName = string.IsNullOrEmpty(FullName) ? item.Name : FullName + "-" + item.Name;
+                    //修改全称
+                    await _knowledgeTypeRepository.UpdateAsync(item);
                 }
             }
-            return list;
         }
+        #endregion
 
     }
 }