瀏覽代碼

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf 1 年之前
父節點
當前提交
39876facec

+ 2 - 3
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -326,7 +326,7 @@ namespace Hotline.Api.Controllers
 		/// <param name="pagedDto"></param>
 		/// <returns></returns>
 		[Permission(EPermission.KnowledgeAllList)]
-		[HttpGet()]
+		[HttpGet]
 		public async Task<PagedDto<KnowledgeDataDto>> GetKnowList([FromQuery] KnowPagedListDto pagedDto)
 		{
 			return await _knowApplication.GetKnowList(pagedDto);
@@ -644,7 +644,7 @@ namespace Hotline.Api.Controllers
 		[HttpDelete("knowledge_word")]
 		public async Task Delete([FromBody] KnowledgeWordDeleteDto dto)
 		{
-			await _knowledgeWrodRepository.RemoveAsync(x => x.Id == dto.Id);
+			await _knowledgeRepository.RemoveKnowledgeWrodBatchAsync(dto.Ids, HttpContext.RequestAborted);
 		}
 
 		/// <summary>
@@ -687,7 +687,6 @@ namespace Hotline.Api.Controllers
 		/// </summary>
 		/// <param name="id"></param>
 		/// <returns></returns>
-		[Permission(EPermission.KnowledgeWordEntity)]
 		[HttpGet("knowledge_word/{id}")]
 		public async Task<KnowledgeWord> WordEntity(string id)
 		{

+ 26 - 26
src/Hotline.Api/Controllers/OrderController.cs

@@ -563,29 +563,30 @@ public class OrderController : BaseController
         }
     }
 
-	/// <summary>
-	/// 批量分配回访人员
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	//[HttpPost("visit/distribution")]
-	//public async Task DistributionVisit([FromBody]DistributionVisitDto dto)
-	//{
-	//	foreach (var id in dto.Ids)
-	//	{
- //           var visit = await _orderVisitRepository.Queryable().FirstAsync(d => d.Id == dto.Id, HttpContext.RequestAborted);
- //           if (visit !=null && visit.VisitState != EVisitState.WaitForVisit)
-	//		{
-
-	//		}
-	//		else
-	//		{
-
-	//		}
- //       }
-		
-
-	//}
+    /// <summary>
+    /// 批量分配回访人员
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("visit/distribution")]
+    public async Task<DistributionVisitRspDto> DistributionVisit([FromBody] DistributionVisitDto dto)
+    {
+        int error = 0;
+        foreach (var id in dto.Ids)
+        {
+            var visit = await _orderVisitRepository.Queryable().FirstAsync(d => d.Id == id, HttpContext.RequestAborted);
+            if (visit != null && visit.VisitState != EVisitState.WaitForVisit)
+            {
+                visit.EmployeeId = dto.EmployeeId;
+                await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
+            }
+            else
+            {
+                error++;
+            }
+        }
+        return new DistributionVisitRspDto() { ErrorCount = error, SuccessCount = dto.Ids.Count - error };
+    }
 
 
     #endregion
@@ -1999,7 +2000,7 @@ public class OrderController : BaseController
 	[HttpDelete("order_word")]
 	public async Task Delete([FromBody] OrderWordDeleteDto dto)
 	{
-		await _orderWrodRepository.RemoveAsync(x => x.Id == dto.Id);
+        await _orderRepository.RemoveOrderWrodBatchAsync(dto.Ids, HttpContext.RequestAborted);
 	}
 
 	/// <summary>
@@ -2030,7 +2031,7 @@ public class OrderController : BaseController
 	{
 		var (total, items) = await _orderWrodRepository.Queryable()
 			.WhereIF(!string.IsNullOrEmpty(dto.Tag), x => x.Tag == dto.Tag!)
-			.WhereIF(!string.IsNullOrEmpty(dto.Classify), x => x.Classify == dto.Classify!)
+			.WhereIF(!string.IsNullOrEmpty(dto.Classify), x => x.Classify.Contains(dto.Classify!))
 			.WhereIF(!string.IsNullOrEmpty(dto.Synonym), x => x.Synonym != null && x.Synonym.Contains(dto.Synonym!))
 			.OrderByDescending(x => x.CreationTime)
 			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
@@ -2042,7 +2043,6 @@ public class OrderController : BaseController
 	/// </summary>
 	/// <param name="id"></param>
 	/// <returns></returns>
-	[Permission(EPermission.OrderWordEntity)]
 	[HttpGet("order_word/{id}")]
 	public async Task<OrderWord> OrderWordEntity(string id)
 	{

+ 8 - 2
src/Hotline.Api/Controllers/SysController.cs

@@ -1,4 +1,5 @@
-using Hotline.Permissions;
+using Hotline.Caching.Interfaces;
+using Hotline.Permissions;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.System;
 using Hotline.Settings;
@@ -36,6 +37,7 @@ namespace Hotline.Api.Controllers
         private readonly ISystemCommonOpinionDomainService _commonOpinionDomainService;
         private readonly IRepository<SystemCommonOpinion> _commonOpinionRepository;
         private readonly ISessionContext _sessionContext;
+        private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
 
         /// <summary>
         /// 系统管理相关接口
@@ -60,7 +62,8 @@ namespace Hotline.Api.Controllers
             IRepository<SystemArea> systemAreaRepository,
             ISystemCommonOpinionDomainService commonOpinionDomainService,
             IRepository<SystemCommonOpinion> commonOpinionRepository,
-            ISessionContext sessionContext
+            ISessionContext sessionContext,
+            ISystemDicDataCacheManager systemDicDataCacheManager
             )
         {
             _mapper = mapper;
@@ -73,6 +76,7 @@ namespace Hotline.Api.Controllers
             _commonOpinionDomainService = commonOpinionDomainService;
             _commonOpinionRepository = commonOpinionRepository;
             _sessionContext = sessionContext;
+            _systemDicDataCacheManager = systemDicDataCacheManager;
         }
 
         #region 菜单管理
@@ -301,6 +305,7 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("无效字典类型");
             var dicData = _mapper.Map<SystemDicData>(dto);
             dicData.DicTypeCode = dicType.DicTypeCode;
+            _systemDicDataCacheManager.RemoveSysDicDataCache(dicType.DicTypeCode);
             await _sysDicDataRepository.AddAsync(dicData);
         }
 
@@ -321,6 +326,7 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("无效字典类型");
             _mapper.Map(dto, dicData);
             dicData.DicTypeCode = dicType.DicTypeCode;
+            _systemDicDataCacheManager.RemoveSysDicDataCache(dicType.DicTypeCode);
             await _sysDicDataRepository.UpdateAsync(dicData,HttpContext.RequestAborted);
         }
 

+ 98 - 144
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -14,156 +14,110 @@ using XF.Domain.Repository;
 
 namespace Hotline.Application.Knowledge
 {
-    public class KnowApplication : IKnowApplication, IScopeDependency
-    {
-        private readonly IKnowledgeRepository _knowledgeRepository;
-        private readonly IRepository<KnowledgeApply> _knowledgeApplyRepository;
-        private readonly ISessionContext _sessionContext;
-        private readonly IMapper _mapper;
+	public class KnowApplication : IKnowApplication, IScopeDependency
+	{
+		private readonly IKnowledgeRepository _knowledgeRepository;
+		private readonly IRepository<KnowledgeApply> _knowledgeApplyRepository;
+		private readonly ISessionContext _sessionContext;
+		private readonly IMapper _mapper;
 
-        /// <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, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper)
-        {
-            _knowledgeRepository = knowledgeRepository;
-            _knowledgeApplyRepository = knowledgeApplyRepository;
-            _sessionContext = sessionContext;
-            _mapper = mapper;
-        }
+		/// <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, IRepository<KnowledgeApply> knowledgeApplyRepository, ISessionContext sessionContext, IMapper mapper)
+		{
+			_knowledgeRepository = knowledgeRepository;
+			_knowledgeApplyRepository = knowledgeApplyRepository;
+			_sessionContext = sessionContext;
+			_mapper = mapper;
+		}
 
-        /// <summary>
-        /// 知识库查询
-        /// </summary>
-        /// <param name="pagedDto"></param>
-        /// <returns></returns>
-        public async Task<PagedDto<KnowledgeDataDto>> GetKnowList(KnowPagedListDto pagedDto)
-        {
-            RefAsync<int> total = 0;
-            var temp = await _knowledgeRepository
-               .Queryable()
-               .InnerJoin<User>((o, cus) => o.CreatorId == cus.Id)
-               .InnerJoin<SystemOrganize>((o, cus, sys) => o.CreatorOrgId == sys.Id)
-               .InnerJoin<KnowledgeType>((o, cus, sys, kn) => o.KnowledgeTypeId == kn.Id)
-               .LeftJoin<Hotspot>((o, cus, sys, kn, hst) => o.HotspotId == hst.Id)
-               .Where((o, cus, sys, kn, hst) => o.IsDeleted == false && o.Status != EKnowledgeStatus.Revert && o.Status != EKnowledgeStatus.Drafts)
-               //关键词查询标题、创建人、创建部门
-               .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), (o, cus, sys, kn, hst) => o.Title.Contains(pagedDto.Keyword!) || cus.Name.Contains(pagedDto.Keyword!) || sys.Name.Contains(pagedDto.Keyword!))
-               //分类
-               .WhereIF(!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId), (o, cus, sys, kn, hst) => o.KnowledgeTypeId == pagedDto.KnowledgeTypeId)
-               //热点
-               .WhereIF(!string.IsNullOrEmpty(pagedDto.HotspotId), (o, cus, sys, kn, hst) => o.HotspotId == pagedDto.HotspotId)
-               //部门
-               .WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), (o, cus, sys, kn, hst) => o.CreatorOrgId == pagedDto.CreateOrgId)
-              //状态
-              // .WhereIF(pagedDto.Status.HasValue, (o, cus, sys, kn, hst) => o.Status == pagedDto.Status)
-              //创建时间
-              .WhereIF(pagedDto.CreationStartTime.HasValue, (o, cus, sys, kn, hst) => o.CreationTime >= pagedDto.CreationStartTime)
-              .WhereIF(pagedDto.CreationEndTime.HasValue, (o, cus, sys, kn, hst) => o.CreationTime <= pagedDto.CreationEndTime)
-               //上架时间
-               .WhereIF(pagedDto.StartOnShelfTime.HasValue, (o, cus, sys, kn, hst) => o.OnShelfTime >= pagedDto.StartOnShelfTime)
-              .WhereIF(pagedDto.EndOnShelfTime.HasValue, (o, cus, sys, kn, hst) => o.OnShelfTime <= pagedDto.EndOnShelfTime)
-               //下架时间
-               .WhereIF(pagedDto.StartOffShelfTime.HasValue, (o, cus, sys, kn, hst) => o.OffShelfTime >= pagedDto.StartOffShelfTime)
-              .WhereIF(pagedDto.EndOffShelfTime.HasValue, (o, cus, sys, kn, hst) => o.OffShelfTime <= pagedDto.EndOffShelfTime)
-               //重新构建数据
-               .Select((o, cus, sys, kn, hst) => new
-               {
-                   index = SqlFunc.RowNumber($"{o.Version} desc ", $"{o.Code}"),
-                   CreationName = cus.Name,
-                   CreationBMName = sys.Name,
-                   KnowledgeTypeName = kn.SpliceName,
-                   HotspotName = hst.HotSpotFullName,
-                   o.Id,
-                   o.Code,
-                   o.Title,
-                   o.Version,
-                   o.KnowledgeTypeId,
-                   o.IsDeleted,
-                   o.HotspotId,
-                   o.OnShelfTime,
-                   o.CreationTime,
-                   o.PageView,
-                   o.Status,
-                   o.OffShelfTime,
-                   o.LastModificationTime,
-                   o.WorkflowId,
-                   o.ExpiredTime,
-                   CreatorOrgId = o.CreatorOrgId,
+		/// <summary>
+		/// 知识库查询
+		/// </summary>
+		/// <param name="pagedDto"></param>
+		/// <returns></returns>
+		public async Task<PagedDto<KnowledgeDataDto>> GetKnowList(KnowPagedListDto pagedDto)
+		{
+			RefAsync<int> total = 0;
+			var temp = await _knowledgeRepository
+			   .Queryable()
+			   .Includes(x => x.User)
+			   .Includes(x => x.SystemOrganize)
+			   .Includes(x => x.KnowledgeType)
+			   .Includes(x => x.HotspotType)
+			   .Where(o => o.IsDeleted == false)
+			   .WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!))
+			   .WhereIF(pagedDto.Status.HasValue, x => x.Status == pagedDto.Status)
+			   .WhereIF(pagedDto.IsPublic.HasValue, x => x.IsPublic == pagedDto.IsPublic)
+			   .WhereIF(!string.IsNullOrEmpty(pagedDto.Summary), x => x.Summary != null && x.Summary.Contains(pagedDto.Summary!))
+			   .OrderByDescending(d => d.CreationTime)
+			  //转分页数据
+			  .ToPageListAsync(pagedDto.PageIndex, pagedDto.PageSize, total);
+			//返回数据
+			return new PagedDto<KnowledgeDataDto>(total.Value, _mapper.Map<IReadOnlyList<KnowledgeDataDto>>(temp));
+		}
 
-               })
-           //将结果合并成一个表
-           .MergeTable()
-           //取第一条数据
-           .Where(d => d.index == 1)
-            .WhereIF(pagedDto.Status.HasValue, o => o.Status == pagedDto.Status)
-           .OrderByDescending(d => d.CreationTime)
-          //转分页数据
-          .ToPageListAsync(pagedDto.PageIndex, pagedDto.PageSize, total);
-            //返回数据
-            return new PagedDto<KnowledgeDataDto>(total.Value, _mapper.Map<IReadOnlyList<KnowledgeDataDto>>(temp));
-        }
+		/// <summary>
+		/// 知识申请查询
+		/// </summary>
+		/// <param name="pagedDto"></param>
+		/// <param name="cancellationToken"></param>
+		/// <returns></returns>
+		public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken)
+		{
+			var (total, items) = await _knowledgeApplyRepository
+			   .Queryable()
+			   .Includes(it => it.User)
+			   .Includes(it => it.SystemOrganize)
+			   .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.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);
 
-        /// <summary>
-        /// 知识申请查询
-        /// </summary>
-        /// <param name="pagedDto"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyList(KnowledgeApplyPagedDto pagedDto, CancellationToken cancellationToken)
-        {
-            var (total, items) = await _knowledgeApplyRepository
-               .Queryable()
-               .Includes(it => it.User)
-               .Includes(it => it.SystemOrganize)
-               .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.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<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
+		}
 
-            return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
-        }
+		/// <summary>
+		/// 申请处理查询
+		/// </summary>
+		/// <param name="pagedDto"></param>
+		/// <param name="cancellationToken"></param>
+		/// <returns></returns>
+		public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken)
+		{
+			var (total, items) = await _knowledgeApplyRepository
+				 .Queryable()
+				 .Includes(it => it.User)
+				 .Includes(it => it.SystemOrganize)
+				 .Where(p => p.DepartmentId == _sessionContext.RequiredOrgId)
+				 .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
+				 .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.User.Name.Contains(pagedDto.Keyword!) || d.SystemOrganize.Name.Contains(pagedDto.Keyword!))
+				 .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)
+				 .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "0", d => d.IsOvertime == true)
+				 .WhereIF(!string.IsNullOrEmpty(pagedDto.IsOvertime) && pagedDto.IsOvertime == "1", d => d.IsOvertime == false)
 
-        /// <summary>
-        /// 申请处理查询
-        /// </summary>
-        /// <param name="pagedDto"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public async Task<PagedDto<KnowledgeApplyHandlePageDto>> GetApplyHandleList(KnowledgeHandlePagedDto pagedDto, CancellationToken cancellationToken)
-        {
-            var (total, items) = await _knowledgeApplyRepository
-                 .Queryable()
-                 .Includes(it => it.User)
-                 .Includes(it => it.SystemOrganize)
-                 .Where(p => p.DepartmentId == _sessionContext.RequiredOrgId)
-                 .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
-                 .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.User.Name.Contains(pagedDto.Keyword!) || d.SystemOrganize.Name.Contains(pagedDto.Keyword!))
-                 .WhereIF(pagedDto.ApplyType.HasValue, d => d.KnowledgeApplyType == pagedDto.ApplyType)
-                 .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)
 
-                 .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);
 
-                 .OrderByDescending(p => p.CreationTime)
-                 .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
-
-            return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
-        }
-    }
+			return new PagedDto<KnowledgeApplyHandlePageDto>(total, _mapper.Map<IReadOnlyList<KnowledgeApplyHandlePageDto>>(items));
+		}
+	}
 }

+ 4 - 4
src/Hotline.Application/Mappers/KnowledgeMapperConfigs.cs

@@ -14,18 +14,18 @@ public class KnowledgeMapperConfigs : IRegister
             .Map(d => d.CreationOrgName, x => x.SystemOrganize.Name);
 
         config.NewConfig<Hotline.KnowledgeBase.Knowledge, KnowledgeDataDto>()
-            .Map(d => d.CreationName, x => x.User.Name)
+            //.Map(d => d.CreationName, x => x.User.Name)
             .Map(d => d.KnowledgeTypeName, x => x.KnowledgeType.SpliceName)
             .Map(d => d.HotspotName, x => x.HotspotType.HotSpotFullName)
             ;
 
         config.NewConfig<Hotline.KnowledgeBase.Knowledge, KnowledgeApprovalDataDto>()
-            .Map(d => d.CreationName, x => x.User.Name)
+            //.Map(d => d.CreationName, x => x.User.Name)
             .Map(d => d.KnowledgeTypeName, x => x.KnowledgeType.SpliceName)
             .Map(d => d.CreateBMName, x => x.SystemOrganize.Name);
 
         config.NewConfig<KnowledgeWorkFlow, KnowledgeApprovalDataDto>()
-            .Map(d => d.CreationName, x => x.User.Name)
+            //.Map(d => d.CreationName, x => x.User.Name)
             .Map(d => d.KnowledgeTypeName, x => x.Knowledge.KnowledgeType.SpliceName)
             .Map(d => d.CreateBMName, x => x.SystemOrganize.Name)
             .Map(d => d.Id, x => x.Knowledge.Id)
@@ -40,7 +40,7 @@ public class KnowledgeMapperConfigs : IRegister
             .Map(d => d.Title, x => x.Knowledge.Title)
             .Map(d => d.KnowledgeTypeName, x => x.Knowledge.KnowledgeType.SpliceName)
             .Map(d => d.HotspotName, x => x.Knowledge.HotspotType.HotSpotFullName)
-            .Map(d => d.CreationName, x => x.User.Name)
+            //.Map(d => d.CreationName, x => x.User.Name)
             .Map(d => d.CreationBMName, x => x.SystemOrganize.Name)
             .Map(d => d.PageView, x => x.Knowledge.PageView)
             .Map(d => d.Status, x => x.Knowledge.Status)

+ 12 - 2
src/Hotline.Repository.SqlSugar/Knowledge/KnowledgeRepository.cs

@@ -1,4 +1,5 @@
 using Hotline.KnowledgeBase;
+using Hotline.Orders;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Settings;
 using SqlSugar;
@@ -12,6 +13,15 @@ namespace Hotline.Repository.SqlSugar.Knowledge
         {
 
         }
-      
-    }
+		/// <summary>
+		/// 批量删除知识库词库
+		/// </summary>
+		/// <param name="ids"></param>
+		/// <param name="cancellationToken"></param>
+		/// <returns></returns>
+		public async Task RemoveKnowledgeWrodBatchAsync(List<string> ids, CancellationToken cancellationToken)
+		{
+			await Db.Deleteable<KnowledgeWord>().In(x => x.Id, ids).ExecuteCommandAsync(cancellationToken);
+		}
+	}
 }

+ 12 - 1
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -139,5 +139,16 @@ namespace Hotline.Repository.SqlSugar.Orders
 	        return oders;
         }
 
-	}
+        /// <summary>
+        /// 工单词库批量删除
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task RemoveOrderWrodBatchAsync(List<string> ids, CancellationToken cancellationToken) { 
+           await  Db.Deleteable<OrderWord>().In(x=>x.Id,ids).ExecuteCommandAsync(cancellationToken);
+        }
+
+
+    }
 }

+ 14 - 8
src/Hotline.Share/Dtos/Knowledge/KnowledgeDataDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Share.Dtos.Hotspots;
+using Hotline.Share.Enums.KnowledgeBase;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Knowledge
@@ -15,20 +16,25 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public string Title { get; set; }
 
+        public KnowledgeTypeDto KnowledgeType { get; set; }
+
         /// <summary>
         /// 知识分类
         /// </summary>
-        public string KnowledgeTypeName { get; set; }
+        public string KnowledgeTypeName  => KnowledgeType !=null ? KnowledgeType.SpliceName : string.Empty;
+
+
+        public HotspotDto Hotspot {  get; set; }
 
         /// <summary>
         /// 热点
         /// </summary>
-        public string HotspotName { get; set; }
+        public string HotspotName => Hotspot != null ? Hotspot.HotSpotFullName : string.Empty;
 
-        /// <summary>
-        /// 申请人
-        /// </summary>
-        public string CreationName { get; set; }
+		/// <summary>
+		/// 申请人
+		/// </summary>
+		public string CreatorName { get; set; }
 
         /// <summary>
         /// 浏览量
@@ -59,7 +65,7 @@ namespace Hotline.Share.Dtos.Knowledge
         /// <summary>
         /// 申请部门
         /// </summary>
-        public string CreationBMName { get; set; }
+        public string CreatorOrgName { get; set; }
 
         /// <summary>
         /// 申请部门ID

+ 26 - 2
src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs

@@ -48,6 +48,30 @@ namespace Hotline.Share.Dtos.Knowledge
     /// <param name="EndOnShelfTime">上架时间-结束</param>
     /// <param name="StartOffShelfTime">下架时间-开始</param>
     /// <param name="EndOffShelfTime">下架时间-结束</param>
-    public record KnowPagedListDto(string? CreateOrgId, string? HotspotId, string? KnowledgeTypeId, EKnowledgeStatus? Status, DateTime? CreationStartTime, DateTime? CreationEndTime,
-      DateTime? StartOnShelfTime, DateTime? EndOnShelfTime, DateTime? StartOffShelfTime, DateTime? EndOffShelfTime) : PagedKeywordRequest;
+    //public record KnowPagedListDto(string? CreateOrgId, string? HotspotId, string? KnowledgeTypeId, EKnowledgeStatus? Status, DateTime? CreationStartTime, DateTime? CreationEndTime,
+    //  DateTime? StartOnShelfTime, DateTime? EndOnShelfTime, DateTime? StartOffShelfTime, DateTime? EndOffShelfTime) : PagedKeywordRequest;
+
+    public record KnowPagedListDto : PagedKeywordRequest 
+    {
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }  
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public EKnowledgeStatus? Status { get; set; }    
+
+        /// <summary>
+        /// 是否公开
+        /// </summary>
+        public bool? IsPublic { get; set; }
+
+		/// <summary>
+		/// 摘要
+		/// </summary>
+		public string? Summary { get; set; }
+
+	}
 }

+ 10 - 2
src/Hotline.Share/Dtos/Knowledge/KnowledgeTypeDto.cs

@@ -43,9 +43,17 @@
         public string Id { get; set; }
 
         /// <summary>
-        /// 类型名称
+        /// 类型名称拼接(所有父级分类名称)
+        /// <example>
+        /// A类型/A.1类型/A.1.1类型
+        /// </example>
         /// </summary>
-        public string Name { get; set; }
+        public string SpliceName { get; set; }
+
+		/// <summary>
+		/// 类型名称
+		/// </summary>
+		public string Name { get; set; }
 
         /// <summary>
         /// 是否启用

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

@@ -70,7 +70,7 @@ namespace Hotline.Share.Dtos.Knowledge
 
 	public class KnowledgeWordDeleteDto
 	{
-		public string Id { get; set; }
+		public List<string> Ids { get; set; }
 	}
 
 	public class KnowledgeWordUpdateDto : KnowledgeWordAddDto

+ 8 - 1
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -877,7 +877,14 @@ namespace Hotline.Share.Dtos.Order
 		public EVisitTarget VisitTarget { get; set; }
 	}
 
-	public class PublishVisitDto
+	public class DistributionVisitRspDto
+	{
+		public int SuccessCount { get; set; }
+
+		public int ErrorCount { get; set; }
+	}
+
+    public class PublishVisitDto
 	{
 		/// <summary>
 		/// 工单对象

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderWordDto.cs

@@ -70,7 +70,7 @@ namespace Hotline.Share.Dtos.Order
 
 	public class OrderWordDeleteDto 
 	{
-		public string Id { get; set; }
+		public List<string> Ids { get; set; }
 	}
 
 	public class OrderWordUpdateDto : OrderWordAddDto

+ 2 - 0
src/Hotline/Caching/Interfaces/ISysDicDataCacheManager.cs

@@ -10,5 +10,7 @@ namespace Hotline.Caching.Interfaces
     public interface ISystemDicDataCacheManager
     {
         IReadOnlyList<SystemDicData> GetSysDicDataCache(string code);
+
+        void RemoveSysDicDataCache(string code);
     }
 }

+ 5 - 0
src/Hotline/Caching/Services/SysDicDataCacheManager.cs

@@ -25,5 +25,10 @@ namespace Hotline.Caching.Services
             });
             return sysDicDataList;
         }
+
+        public void RemoveSysDicDataCache(string code)
+        {
+            _cacheSysDicData.Remove(code);
+        }
     }
 }

+ 3 - 2
src/Hotline/KnowledgeBase/IKnowledgeRepository.cs

@@ -5,6 +5,7 @@ namespace Hotline.KnowledgeBase
 {
     public interface IKnowledgeRepository : IRepositoryWorkflow<KnowledgeBase.Knowledge>
     {
-   
-    }
+		Task RemoveKnowledgeWrodBatchAsync(List<string> ids, CancellationToken cancellationToken);
+
+	}
 }

+ 81 - 58
src/Hotline/KnowledgeBase/Knowledge.cs

@@ -14,83 +14,94 @@ namespace Hotline.KnowledgeBase;
 [Description("知识库文档")]
 public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
 {
-    /// <summary>
-    /// 知识分类
-    /// </summary>
-    public string KnowledgeTypeId { get; set; }
-
-    /// <summary>
-    /// 热点
-    /// </summary>
-    public string HotspotId { get; set; }
-
-    /// <summary>
-    /// 知识编号
-    /// </summary>
-    public string Code { get; set; }
-
-    /// <summary>
-    /// 标题
-    /// </summary>
-    public string Title { 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 Code { get; set; }
+
+	/// <summary>
+	/// 标题
+	/// </summary>
+	[SugarColumn(ColumnDescription = "标题")]
+	public string Title { get; set; }
 
     /// <summary>
     /// 摘要
     /// </summary>
-    [SugarColumn(ColumnDataType = "varchar(1000)", IsNullable = true)]
-    public string Summary { get; set; }
+    [SugarColumn(ColumnDataType = "varchar(1000)", IsNullable = true, ColumnDescription = "摘要")]
+    public string? Summary { get; set; }
 
     /// <summary>
     /// 内容
     /// </summary>
-    [SugarColumn(ColumnDataType = "text")]
+    [SugarColumn(ColumnDataType = "text", ColumnDescription = "内容")]
     public string Content { get; set; }
 
-    /// <summary>
-    /// 浏览量
-    /// </summary>
-    public int PageView { get; set; } = 0;
-
-    /// <summary>
-    /// 是否公开
-    /// </summary>
-    public bool IsPublic { get; set; }
-
-    /// <summary>
-    /// 文档状态
-    /// </summary>
-    public EKnowledgeStatus Status { get; set; }
-
-    /// <summary>
-    /// 上架时间
-    /// </summary>
-    public DateTime? OnShelfTime { get; set; }
-
-    /// <summary>
-    /// 下架时间
-    /// </summary>
-    public DateTime? OffShelfTime { get; set; }
-
-    /// <summary>
-    /// 过期时间
-    /// </summary>
-    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>
     /// 关键词
     /// </summary>
-    [SugarColumn(IsNullable = true)]
+    [SugarColumn(IsNullable = true, ColumnDescription = "关键词")]
     public string Keywords { get; set; }
 
-    /// <summary>
-    /// 版本号
-    /// </summary>
-    public int Version { get; set; } = 0;
+	/// <summary>
+	/// 版本号
+	/// </summary>
+	[SugarColumn(ColumnDescription = "版本号")]
+	public int Version { get; set; } = 0;
 
     /// <summary>
     /// 外部数据(为前端提供级联功能)
     /// </summary>
-    [SugarColumn(IsNullable = true)]
+    [SugarColumn(IsNullable = true, ColumnDescription = "外部数据(为前端提供级联功能)")]
     public string? HotspotExternal { get; set; }
 
     /// <summary>
@@ -102,7 +113,7 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     /// <summary>
     /// 关联知识
     /// </summary>
-    [SugarColumn(ColumnDataType = "json", IsJson = true,IsNullable =true)]
+    [SugarColumn(ColumnDataType = "json", ColumnDescription = "关联知识", IsJson = true,IsNullable =true)]
     public List<string> Knowledges { get; set; }
 
     /// <summary>
@@ -128,4 +139,16 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
     /// </summary>
     [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;
 }

+ 3 - 1
src/Hotline/Orders/IOrderRepository.cs

@@ -14,5 +14,7 @@ namespace Hotline.Orders
 
         Task RemoveOrderComplainAsync(OrderComplain orderComplain, CancellationToken cancellationToken);
         Task RemoveOrderReportAsync(OrderReport orderReport, CancellationToken cancellationToken);
-    }
+        Task RemoveOrderWrodBatchAsync(List<string> ids, CancellationToken cancellationToken);
+
+	}
 }

+ 0 - 10
src/Hotline/Permissions/EPermission.cs

@@ -859,11 +859,6 @@ namespace Hotline.Permissions
 		[Display(GroupName = "OrderWord", Name = "修改知识库词库", Description = "修改知识库词库")]
 		UpdateKnowledgeWord = 400603,
 
-		/// <summary>
-		/// 知识库词库实体
-		/// </summary>
-		[Display(GroupName = "OrderWord", Name = "知识库词库实体", Description = "知识库词库实体")]
-		KnowledgeWordEntity = 400605,
 		#endregion
 
 		#region 知识纠错
@@ -1430,11 +1425,6 @@ namespace Hotline.Permissions
 		[Display(GroupName = "OrderWord", Name = "修改工单词库", Description = "修改工单词库")]
 		UpdateOrderWord = 501503,
 
-		/// <summary>
-		/// 工单词库实体
-		/// </summary>
-		[Display(GroupName = "OrderWord", Name = "工单词库实体", Description = "工单词库实体")]
-		OrderWordEntity = 501505,
 		#endregion
 
 		#endregion