3
1

7 Commity 2b60265631 ... 2bc5cb8223

Autor SHA1 Správa Dátum
  libin 2bc5cb8223 Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test 3 dní pred
  libin b336c95dc1 知识库查询新增查询条件 3 dní pred
  tangjiang bc97214b19 修改运营商为空判断 3 dní pred
  tangjiang 73b79edc11 自贡任务 524 调整【知识检索】页面的常用知识前十显示规则 3 dní pred
  tangjiang 938c84a875 Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test 3 dní pred
  tangjiang f4dc1eec7e 自贡任务 522 在【数据统计->知识库统计】目录下新增【超期未更新统计】菜单 3 dní pred
  libin 1ee1318cc8 常用意见导出 3 dní pred

+ 1 - 1
src/Hotline.Api/Controllers/FwThirdController.cs

@@ -533,7 +533,7 @@ namespace Hotline.Api.Controllers
                 .Where(p => p.IsPublic == true && p.Status == EKnowledgeStatus.OnShelf)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
                 .WhereIF(!string.IsNullOrEmpty(typeSpliceNameTags), p => SqlFunc.JsonArrayAny(p.Keywords, typeSpliceNameTags) == true)
-                .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith("营商环境")))
+                .WhereIF(dto.KnowledgeType == 1, x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.EndsWith("营商环境")))
                 .OrderByDescending(p => p.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 

+ 52 - 1
src/Hotline.Api/Controllers/KnowledgeApplyController.cs

@@ -1,10 +1,14 @@
 using Hotline.Application.Knowledge;
 using Hotline.KnowledgeBase;
-using Hotline.Permissions;
+using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Dtos.ObservationPiece;
+using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Share.Requests;
+using Hotline.Tools;
 using Hotline.Users;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
@@ -268,5 +272,52 @@ namespace Hotline.Api.Controllers
         }
 
         #endregion
+
+        #region 知识超期未更新统计
+        /// <summary>
+        /// 知识超期未更新统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get-know-overdue-statistics-list")]
+        public async Task<PagedDto<KnowedgeStatisticsDto>> GetKnowOverdueStatisticsList([FromQuery] PagedKeywordRequest dto)
+        {
+            var (total, items) = await _knowApplication.GetKnowedgeStatistics(dto)
+                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<KnowedgeStatisticsDto>(total, items);
+        }
+
+        /// <summary>
+        ///知识超期未更新统计导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get-know-overdue-statistics-list-export")]
+        public async Task<FileStreamResult> GetKnowOverdueStatisticsListExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+        {
+            var query = _knowApplication.GetKnowedgeStatistics(dto.QueryDto);
+            List<KnowedgeStatisticsDto> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<KnowedgeStatisticsDto>(dto.ColumnInfos);
+
+            var dtos = data
+                .Select(stu => _mapper.Map(stu, typeof(KnowedgeStatisticsDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "知识超期未更新统计");
+        } 
+        #endregion
     }
 }

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

@@ -459,32 +459,32 @@ namespace Hotline.Api.Controllers
             await _knowledgeRepository.Updateable(kns)
                 .UpdateColumns(d => d.IsPublic)
                 .Where(d => d.Status == EKnowledgeStatus.OnShelf)
-				.ExecuteCommandAsync(HttpContext.RequestAborted);
-        }
-
-		/// <summary>
-		/// 批量下架
-		/// </summary>
-		/// <returns></returns>
-		[HttpPost("unshelve-batch")]
-		public async Task UnshelveBatch([FromBody] UnshelveBatchRequest request)
-		{
-			var kns = request.KnowledgeIds.Select(d => new Knowledge
-			{
-				Id = d,
-				Status = EKnowledgeStatus.OffShelf
-			}).ToList();
-			await _knowledgeRepository.Updateable(kns)
-				.UpdateColumns(d => d.Status)
-				.ExecuteCommandAsync(HttpContext.RequestAborted);
-		}
-
-
-		/// <summary>
-		/// 批量审核
-		/// </summary>
-		/// <returns></returns>
-		[HttpPost("batch_audit")]
+                .ExecuteCommandAsync(HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 批量下架
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("unshelve-batch")]
+        public async Task UnshelveBatch([FromBody] UnshelveBatchRequest request)
+        {
+            var kns = request.KnowledgeIds.Select(d => new Knowledge
+            {
+                Id = d,
+                Status = EKnowledgeStatus.OffShelf
+            }).ToList();
+            await _knowledgeRepository.Updateable(kns)
+                .UpdateColumns(d => d.Status)
+                .ExecuteCommandAsync(HttpContext.RequestAborted);
+        }
+
+
+        /// <summary>
+        /// 批量审核
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("batch_audit")]
         public async Task<string> KnowledgeBatchAuditAsync([FromBody] KnowledgeBatchAuditInDto dto)
         {
             var result = new StringBuilder();
@@ -566,7 +566,7 @@ namespace Hotline.Api.Controllers
             var knowledge = await _knowledgeRepository.GetAsync(dto.Data.Id, HttpContext.RequestAborted);
             if (knowledge == null)
                 throw UserFriendlyException.SameMessage("无效知识库数据");
-            if ((knowledge.Status == EKnowledgeStatus.OnShelf  && knowledge.ExpiredTime >= DateTime.Now) || knowledge.Status == EKnowledgeStatus.Auditing)
+            if ((knowledge.Status == EKnowledgeStatus.OnShelf && knowledge.ExpiredTime >= DateTime.Now) || knowledge.Status == EKnowledgeStatus.Auditing)
                 throw UserFriendlyException.SameMessage("知识库数据不可删除");
             if (knowledge.Status == EKnowledgeStatus.Drafts || knowledge.Status == EKnowledgeStatus.Revert)
             {
@@ -640,7 +640,8 @@ namespace Hotline.Api.Controllers
             var query = _knowledgeRepository.Queryable()
                 .Where(x => x.Status == EKnowledgeStatus.OnShelf)
                 .Where(x => (x.ExpiredTime != null && x.ExpiredTime >= DateTime.Now) || x.ExpiredTime == null)
-                .OrderByDescending(x => x.SearchNum);
+                .OrderByIF(_appOptions.Value.IsZiGong == true, p => p.PageView, OrderByType.Desc)
+                .OrderByIF(_appOptions.Value.IsZiGong == false, p => p.SearchNum, OrderByType.Desc);
 
             if (_sessionContext.OrgIsCenter == false)
             {
@@ -698,7 +699,7 @@ namespace Hotline.Api.Controllers
             var knowledge = await _knowledgeRepository.Queryable()
                 .Includes(x => x.SourceOrganize)
                 .Includes(x => x.KnowledgeTypes)
-                .Includes(x=>x.KnowledgeOrganizes)
+                .Includes(x => x.KnowledgeOrganizes)
                 .Includes(x => x.HotspotType)
                 .FirstAsync(p => p.Id == Id, HttpContext.RequestAborted);
             if (knowledge is null)
@@ -752,8 +753,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("info/export")]
-		[LogFilterAlpha("导出日志")]
-		public async Task<IActionResult> KnowledgeInfoExport([FromBody] KnowledgeInfoExportInDto dto)
+        [LogFilterAlpha("导出日志")]
+        public async Task<IActionResult> KnowledgeInfoExport([FromBody] KnowledgeInfoExportInDto dto)
         {
             if (dto.Ids.Length > 1)
             {
@@ -1838,8 +1839,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("pageview/export")]
-		[LogFilterAlpha("导出日志")]
-		public async Task<FileStreamResult> GetPageViewListAsync([FromBody] ExportExcelDto<PageViewInDto> dto)
+        [LogFilterAlpha("导出日志")]
+        public async Task<FileStreamResult> GetPageViewListAsync([FromBody] ExportExcelDto<PageViewInDto> dto)
         {
             var items = (await _knowApplication.GetPageViewListAsync(dto.QueryDto, HttpContext.RequestAborted))
                 .Item2;

+ 1 - 11
src/Hotline.Api/Controllers/SysController.cs

@@ -635,19 +635,9 @@ namespace Hotline.Api.Controllers
                 (total, items) = await query.ToPagedListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, HttpContext.RequestAborted);
             }
 
-            var itemsResult = _mapper.Map<List<SystemCommonOpinionDto>>(items);
-
-            itemsResult.ForEach(x =>
-            {
-                if (x.IsOpen == true)
-                    x.IsOpenText = "公开常用意见";
-                else
-                    x.IsOpenText = "个人常用意见";
-            });
-
             dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SystemCommonOpinionDto>(dto.ColumnInfos);
 
-            var dtos = _mapper.Map<ICollection<SystemCommonOpinionDto>>(itemsResult)
+            var dtos = _mapper.Map<ICollection<SystemCommonOpinionDto>>(items)
                               .Select(stu => _mapper.Map(stu, typeof(SystemCommonOpinionDto), dynamicClass))
                               .Cast<object>()
                               .ToList();

+ 10 - 10
src/Hotline.Api/Controllers/SystemMobilAreaController.cs

@@ -57,15 +57,15 @@ namespace Hotline.Api.Controllers
         [HttpPost("add-system-mobil-area")]
         public async Task AddSystemMobilArea([FromBody] AddSystemMobilAreaDto dto)
         {
-            if (!string.IsNullOrEmpty(dto.TelCode))
+            if (string.IsNullOrEmpty(dto.TelCode))
                 throw UserFriendlyException.SameMessage("座机编号不能为空!");
-            if (!string.IsNullOrEmpty(dto.MobileCode))
+            if (string.IsNullOrEmpty(dto.MobileCode))
                 throw UserFriendlyException.SameMessage("手机编号不能为空!");
-            if (!string.IsNullOrEmpty(dto.MobileAreaName))
+            if (string.IsNullOrEmpty(dto.MobileAreaName))
                 throw UserFriendlyException.SameMessage("归属地不能为空!");
-            if (!string.IsNullOrEmpty(dto.OFlag))
+            if (string.IsNullOrEmpty(dto.OFlag))
                 throw UserFriendlyException.SameMessage("运营商不能为空!");
-            if (!string.IsNullOrEmpty(dto.OperatorName))
+            if (string.IsNullOrEmpty(dto.OperatorName))
                 throw UserFriendlyException.SameMessage("卡类型不能为空!");
 
             var data = await _systemMobilAreaRepository.AnyAsync(p => p.TelCode == dto.TelCode && p.MobileCode == dto.MobileCode && p.OFlag == p.OFlag, HttpContext.RequestAborted);
@@ -106,15 +106,15 @@ namespace Hotline.Api.Controllers
         [HttpPost("update-system-mobil-area")]
         public async Task UpdateSystemMobilAreaDetail([FromBody] UpdateSystemMobilAreaDto dto)
         {
-            if (!string.IsNullOrEmpty(dto.TelCode))
+            if (string.IsNullOrEmpty(dto.TelCode))
                 throw UserFriendlyException.SameMessage("座机编号不能为空!");
-            if (!string.IsNullOrEmpty(dto.MobileCode))
+            if (string.IsNullOrEmpty(dto.MobileCode))
                 throw UserFriendlyException.SameMessage("手机编号不能为空!");
-            if (!string.IsNullOrEmpty(dto.MobileAreaName))
+            if (string.IsNullOrEmpty(dto.MobileAreaName))
                 throw UserFriendlyException.SameMessage("归属地不能为空!");
-            if (!string.IsNullOrEmpty(dto.OFlag))
+            if (string.IsNullOrEmpty(dto.OFlag))
                 throw UserFriendlyException.SameMessage("运营商不能为空!");
-            if (!string.IsNullOrEmpty(dto.OperatorName))
+            if (string.IsNullOrEmpty(dto.OperatorName))
                 throw UserFriendlyException.SameMessage("卡类型不能为空!");
             var isCheack = await _systemMobilAreaRepository.AnyAsync(p => p.Id != dto.Id && p.TelCode == dto.TelCode
             && p.MobileCode == dto.MobileCode && p.OFlag == p.OFlag, HttpContext.RequestAborted);

+ 9 - 0
src/Hotline.Application/Knowledge/IKnowApplication.cs

@@ -1,7 +1,9 @@
 using Hotline.KnowledgeBase;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Requests;
 using Microsoft.AspNetCore.Mvc;
+using SqlSugar;
 
 namespace Hotline.Application.Knowledge
 {
@@ -77,5 +79,12 @@ namespace Hotline.Application.Knowledge
         /// <param name="dto"></param>
         /// <returns></returns>
         Task<(int, List<KnowledgeRetrievalDataDto>)> KnowRetrievalAsync(KnowledgeRetrievalPagedListDto dto);
+
+        /// <summary>
+        /// 知识超期未更新统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<KnowedgeStatisticsDto> GetKnowedgeStatistics(PagedKeywordRequest dto);
     }
 }

+ 17 - 8
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -1,23 +1,17 @@
-using DocumentFormat.OpenXml.EMMA;
-using Hotline.Application.Tools;
+using Hotline.Application.Tools;
 using Hotline.Configurations;
 using Hotline.KnowledgeBase;
 using Hotline.Pdf;
 using Hotline.Repository.SqlSugar.Extensions;
-using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Knowledge;
-using Hotline.Share.Enums.Article;
 using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Share.Requests;
 using Hotline.Share.Tools;
-using Hotline.Users;
 using Mapster;
 using MapsterMapper;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
-using Org.BouncyCastle.Utilities.IO;
 using PanGu;
 using SqlSugar;
 using XF.Domain.Authentications;
@@ -521,5 +515,20 @@ namespace Hotline.Application.Knowledge
             }
             return await sugar.Select<KnowledgeRetrievalDataDto>().ToPagedListAsync(dto.PageIndex, dto.PageSize);
         }
+
+        public ISugarQueryable<KnowedgeStatisticsDto> GetKnowedgeStatistics(PagedKeywordRequest dto)
+        {
+            return _knowledgeRepository.Queryable()
+                    .Includes(p => p.SourceOrganize)
+                    .WhereIF(dto.StartTime.HasValue, p => p.LastModificationTime >= dto.StartTime)
+                    .WhereIF(dto.EndTime.HasValue, p => p.LastModificationTime <= dto.EndTime)
+                    .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.SourceOrganize.Name.Contains(dto.Keyword))
+                    .Select(p => new KnowedgeStatisticsDto
+                    {
+                        LastModificationTime = p.LastModificationTime,
+                        OrgName = p.SourceOrganize.Name
+                    })
+                    .OrderByDescending(p => p.LastModificationTime);
+        }
     }
 }

+ 9 - 0
src/Hotline.Share/Dtos/Knowledge/KnowedgeStatisticsDto.cs

@@ -0,0 +1,9 @@
+namespace Hotline.Share.Dtos.Knowledge
+{
+    public class KnowedgeStatisticsDto
+    {
+        public string? OrgName { get; set; }
+
+        public DateTime? LastModificationTime { get; set; }
+    }
+}

+ 1 - 1
src/Hotline.Share/Dtos/Settings/SystemCommonOpinionDto.cs

@@ -8,7 +8,7 @@ namespace Hotline.Share.Dtos.Settings
         public ECommonType? CommonType { get; set; }
         public string? CommonTypeText { get; set; }
         public bool? IsOpen { get; set; }
-        public string? IsOpenText { get; set; }
+        public string? IsOpenText => IsOpen == true ? "公开常用意见" : "个人常用意见";
         public string? CreatorName { get; set; }
         public string? CreatorOrgName { get; set; }
 

+ 5 - 0
src/Hotline.Share/Dtos/WebPortal/QueryKnowledgeList.cs

@@ -29,6 +29,11 @@ namespace Hotline.Share.Dtos.WebPortal
         /// 知识标签
         /// </summary>
         public string? KnowledgeBaseTags { get; set; }
+
+        /// <summary>
+        /// 是否企业
+        /// </summary>
+        public int? KnowledgeType { get; set; }
     }
 
     public class QueryKnowledgeInfo