Ver código fonte

Merge branch 'dev' of http://git.12345lm.cn/Fengwo/hotline into dev

Dun.Jason 6 meses atrás
pai
commit
8721909c70

+ 3 - 2
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1,4 +1,5 @@
-using Hotline.Application.ExportExcel;
+using AngleSharp.Text;
+using Hotline.Application.ExportExcel;
 using Hotline.Application.FlowEngine;
 using Hotline.Application.Orders;
 using Hotline.Application.StatisticalReport;
@@ -1714,7 +1715,7 @@ namespace Hotline.Api.Controllers.Bi
                   Name = s.DicDataName,
                   CountNum = p.CountNum
               })
-              
+
               .ToListAsync();
 
             centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceData;

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

@@ -580,7 +580,7 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpGet("knowledge-status-data")]
-        public async Task<object> KnowledgeStatus()
+        public async Task<Dictionary<string, dynamic>> KnowledgeStatus()
         {
             var tabNames = new List<KeyValuePair<int, string>>
             {
@@ -591,7 +591,7 @@ namespace Hotline.Api.Controllers
             };
 
             return _baseDataApplication
-                .FileType(0)
+                .FileType(EFileType.excel | EFileType.pdf)
                 .Add("tabNames", tabNames)
                 .Build();
         }
@@ -640,6 +640,7 @@ namespace Hotline.Api.Controllers
                 var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == dto.HotspotId);
                 hotspotHotSpotFullName = hotspot?.HotSpotFullName;
             }
+
             var sugar = _knowledgeRepository
                 .Queryable(false, false, false)
                 .Includes(x => x.User)
@@ -672,6 +673,12 @@ namespace Hotline.Api.Controllers
                         exp.Or(m => m.Content.Contains(keyword));
                     if (dto.RetrievalType == EKnowledgeRetrievalType.Summary)
                         exp.Or(m => m.Summary != null && m.Summary.Contains(keyword));
+                    if (dto.RetrievalType == EKnowledgeRetrievalType.KeyWord)
+                    {
+                        var keywordEntity = await _knowledgeWordRepository.GetAsync(m => m.Tag == keyword && m.IsEnable == 0);
+                        if (keywordEntity is null) continue;
+                        exp.Or(m => SqlFunc.JsonArrayAny(m.Keywords, keywordEntity.Id));
+                    }
                 }
                 sugar.Where(exp.ToExpression());
             }
@@ -679,7 +686,7 @@ namespace Hotline.Api.Controllers
             switch (dto.Sort)
             {
                 case "2":
-                    sugar = sugar.OrderByDescending(p => p.Score);
+                    sugar = sugar.OrderByDescending(p => p.CollectCount);
                     break;
                 case "3":
                     sugar = sugar.OrderByDescending(p => p.CreationTime);
@@ -692,6 +699,18 @@ namespace Hotline.Api.Controllers
             return new PagedDto<KnowledgeRetrievalDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeRetrievalDataDto>>(temp));
         }
 
+        /// <summary>
+        /// 知识检索页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("knowretrieval/base_data")]
+        public async Task<Dictionary<string, dynamic>> GetKnowretrievalBaseData()
+        {
+            return _baseDataApplication
+                .KnowledgeRetrievalType(new[] { 3, 4})
+                .Build();
+        }
+
         /// <summary>
         /// 获取知识审批信息
         /// </summary>
@@ -1285,6 +1304,13 @@ namespace Hotline.Api.Controllers
                 var collectNew = _mapper.Map<KnowledgeCollect>(dto);
                 await _knowledgeCollectRepository.AddAsync(collectNew, HttpContext.RequestAborted);
             }
+            var count = await _knowledgeCollectRepository.Queryable()
+                .Where(m => m.KnowledgeId == dto.KnowledgeId && m.Collect == true).CountAsync();
+
+            await _knowledgeRepository.Updateable()
+                .Where(m => m.Id == dto.KnowledgeId)
+                .SetColumns(m => m.CollectCount == count)
+                .ExecuteCommandAsync();
         }
 
         /// <summary>
@@ -1493,6 +1519,19 @@ namespace Hotline.Api.Controllers
             await _knowApplication.AddKnowledgeHotWordAsync(dto, HttpContext.RequestAborted);
         }
 
+        /// <summary>
+        /// 新增热词页面基础数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("hotword/basedata")]
+        public async Task<Dictionary<string, dynamic>> AddKnowledgeHotWordBaseDataAsync()
+        {
+            return _baseDataApplication
+                .KnowledgeHotWordType()
+                .Build();
+        }
+
         /// <summary>
         /// 热词集合
         /// </summary>

+ 1 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -908,6 +908,7 @@ public class OrderController : BaseController
             .VisitSatisfaction()
             .VisitManner()
             .VisitStateQuery()
+            .SourceChannel()
             .Build();
 
     /// <summary>

+ 15 - 5
src/Hotline.Application/Knowledge/KnowApplication.cs

@@ -184,7 +184,7 @@ namespace Hotline.Application.Knowledge
 
                 var tag = splitWords.ElementAt(i).Word;
                 var entity = await _knowledgeWordRepository.Queryable().Where(m => m.Tag == tag).FirstAsync();
-                if (entity is not null) 
+                if (entity is not null)
                 {
                     keywords.Add(new KnowledgeWordOutDto(entity.Id, entity.Tag));
                     continue;
@@ -206,13 +206,13 @@ namespace Hotline.Application.Knowledge
 
         public async Task<(int, IList<PageViewOutDto>)> GetPageViewListAsync(PageViewInDto dto, CancellationToken requestAborted = default)
         {
-            var query = _knowledgePvepository.Queryable()
+            var query = _knowledgePvepository.Queryable(includeDeleted: true)
                 .LeftJoin<KnowledgeBase.Knowledge>((p, k) => p.KnowledgeCode == k.Code)
                 .LeftJoin<KnowledgeRelationType>((p, k, r) => r.KnowledgeId == k.Id)
                 .WhereIF(dto.Title.NotNullOrEmpty(), (p, k, r) => k.Title.Contains(dto.Title))
                 .WhereIF(dto.CreatorName.NotNullOrEmpty(), (p, k, r) => p.CreatorName.Contains(dto.CreatorName))
                 .WhereIF(dto.KnowledgeTypeId.NotNullOrEmpty(), (p, k, r) => r.KnowledgeTypeId == dto.KnowledgeTypeId)
-                .Where(m => m.CreationTime >= dto.StartTime && m.CreationTime <= dto.EndTime)
+                .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, (p, k, r) => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
                 .OrderByDescending((p, k, r) => p.CreationTime);
 
             if (_sessionContext.OrgIsCenter == false)
@@ -226,8 +226,18 @@ namespace Hotline.Application.Knowledge
             var query = _knowledgeHotWordRepository.Queryable()
                 .WhereIF(dto.IsEnable != null, m => m.IsEnable == dto.IsEnable)
                 .WhereIF(dto.KeyWord.NotNullOrEmpty(), m => m.KeyWord.Contains(dto.KeyWord))
-                .OrderByDescending(m => m.Sort)
-                .OrderByDescending(m => m.CreationTime);
+                .WhereIF(dto.Type != null, m => m.Type == dto.Type)
+                // .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, m => m.CreationTime >= dto.StartTime && m.CreationTime <= dto.EndTime)
+                ;
+
+            if (dto.SortField.NotNullOrEmpty())
+                query = query.OrderByPropertyName(dto.SortField, (OrderByType)dto.OrderByType);
+            else
+            {
+                query = query.OrderByDescending(m => m.Sort);
+                query = query.OrderByDescending(m => m.CreationTime);
+            }
+
             return await query.Select<KnowledgeHotWordOutDto>().ToPagedListAsync(dto.PageIndex, dto.PageSize, requestAborted);
         }
 

+ 34 - 3
src/Hotline.Application/Systems/BaseDataApplication.cs

@@ -5,12 +5,14 @@ using Hotline.Settings;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Article;
 using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Share.Enums.Order;
 using J2N.Collections.ObjectModel;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Diagnostics;
+using System.Globalization;
 using System.Linq;
 using System.Reflection;
 using System.Text;
@@ -72,7 +74,12 @@ public class BaseDataApplication : IScopeDependency
 
     public Dictionary<string, dynamic> Build()
     {
-        return new Dictionary<string, dynamic>(_baseData);
+        var newDict = _baseData.ToDictionary(
+            entry => char.ToLower(entry.Key[0], CultureInfo.InvariantCulture) + entry.Key.Substring(1),
+            entry => entry.Value
+        );
+
+        return newDict;
     }
 
     public BaseDataApplication VoiceEvaluate()
@@ -145,10 +152,15 @@ public class BaseDataApplication : IScopeDependency
         return this;
     }
 
-    public BaseDataApplication FileType(int ignoreKey)
+    public BaseDataApplication FileType(EFileType ignoreFileType = EFileType.None)
     {
         var items = EnumExts.GetDescriptions<EFileType>();
-        _baseData.TryAdd("FileType", items.Where(m => m.Key != ignoreKey).ToList());
+        var filteredDictionary = items
+             .Where(kvp => (ignoreFileType & (EFileType)kvp.Key) == 0)
+             .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
+             .ToList();
+        _baseData.TryAdd("FileType", filteredDictionary);
+
         return this;
     }
 
@@ -157,4 +169,23 @@ public class BaseDataApplication : IScopeDependency
         _baseData.TryAdd(name, items);
         return this;
     }
+
+    public BaseDataApplication SourceChannel()
+    {
+        Add(SysDicTypeConsts.SourceChannel);
+        return this;
+    }
+
+    public BaseDataApplication KnowledgeRetrievalType(int[] ignoreFileType)
+    {
+        var items = EnumExts.GetDescriptions<EKnowledgeRetrievalType>();
+        _baseData.TryAdd("KnowledgeRetrievalType", items.Where(m => !ignoreFileType.Contains(m.Key)).ToList());
+        return this;
+    }
+
+    public BaseDataApplication KnowledgeHotWordType()
+    {
+        Add(typeof(EKnowledgeHotWordType));
+        return this;
+    }
 }

+ 6 - 1
src/Hotline.Share/Dtos/CallCenter/CenterReportStatisticsDto.cs

@@ -11,7 +11,7 @@ namespace Hotline.Share.Dtos.CallCenter
         /// <summary>
         /// 电话
         /// </summary>
-        public CenterReportCallInfoDto CenterReportCallInfoDto {  get; set; }
+        public CenterReportCallInfoDto CenterReportCallInfoDto { get; set; }
 
         /// <summary>
         /// 电话
@@ -38,6 +38,11 @@ namespace Hotline.Share.Dtos.CallCenter
         /// </summary>
         public List<CenterReportOrderSourceChannelDto> CenterReportOrderAcceptTypes { get; set; }
 
+        /// <summary>
+        /// 专线统计
+        /// </summary>
+        public List<CenterReportOrderSourceChannelDto>  CenterReportOrderDedicatedLine{get;set ;}
+
         /// <summary>
         /// 市直部门
         /// </summary>

+ 37 - 2
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -377,7 +377,7 @@ namespace Hotline.Share.Dtos.Knowledge
         public EFileType FileType { get; set; }
     }
 
-    public record PageViewInDto : PagedStartEndTimeDto
+    public record PageViewInDto : PagedRequest
     {
         /// <summary>
         /// 标题
@@ -393,6 +393,16 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 知识分类Id
         /// </summary>
         public string? KnowledgeTypeId { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
     }
 
     public class PageViewOutDto
@@ -436,7 +446,7 @@ namespace Hotline.Share.Dtos.Knowledge
         public string Tag { get; set; }
     }
 
-    public record KnowledgeHotWordInDto : PagedStartEndTimeDto
+    public record KnowledgeHotWordInDto : PagedRequest
     {
         /// <summary>
         /// 热词
@@ -447,6 +457,21 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 是否启用
         /// </summary>
         public bool? IsEnable { get; set; }
+
+        /// <summary>
+        /// 排序(需要被排序的字段名)
+        /// </summary>
+        public string? SortField { get; set; }
+
+        /// <summary>
+        /// 排序方向 (0: 升序Asc; 1: 降序Desc)
+        /// </summary>
+        public int OrderByType { get; set; } = 1;
+
+        /// <summary>
+        /// 热词类型
+        /// </summary>
+        public EKnowledgeHotWordType? Type { get; set; }
     }
 
     public class UpdateKnowledgeHotWordInDto : AddKnowledgeHotWordInDto
@@ -479,6 +504,11 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 排序
         /// </summary>
         public int? Sort { get; set; }
+
+        /// <summary>
+        /// 热词类型
+        /// </summary>
+        public EKnowledgeHotWordType? Type { get; set; }
     }
 
     public class KnowledgeHotWordOutDto : UpdateKnowledgeHotWordInDto
@@ -487,5 +517,10 @@ namespace Hotline.Share.Dtos.Knowledge
         /// 创建时间
         /// </summary>
         public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 热词类型
+        /// </summary>
+        public string TypeTxt => Type?.GetDescription();
     }
 }

+ 7 - 4
src/Hotline.Share/Enums/Article/EFileType.cs

@@ -2,15 +2,19 @@
 using System.ComponentModel;
 
 namespace Hotline.Share.Enums.Article;
+
+[Flags]
 public enum EFileType
 {
+    None = 0, 
+
     /// <summary>
     /// Excel文件
     /// </summary>
     [Description("导出Excel")]
     [FileExtension(".xlsx")]
     [ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")]
-    excel,
+    excel = 1,
 
     /// <summary>
     /// Word文件
@@ -18,8 +22,7 @@ public enum EFileType
     [Description("导出Word")]
     [FileExtension(".docx")]
     [ContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document")]
-    word,
-
+    word = 2,
 
     /// <summary>
     /// PDF文件
@@ -27,5 +30,5 @@ public enum EFileType
     [Description("导出PDF")]
     [FileExtension(".pdf")]
     [ContentType("application/pdf")]
-    pdf,
+    pdf = 4,
 }

+ 25 - 0
src/Hotline.Share/Enums/KnowledgeBase/EKnowledgeHotWordType.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.KnowledgeBase;
+public enum EKnowledgeHotWordType
+{
+    /// <summary>
+    /// 知识库
+    /// </summary>
+    [Description("知识库")]
+    KnowledgeBase = 0,
+
+    /// <summary>
+    /// 预案库
+    /// </summary>
+    [Description("预案库")]
+    PrePlanBase = 1,
+
+    [Description("案例库")]
+    CaseBase = 2,
+}

+ 7 - 1
src/Hotline.Share/Enums/KnowledgeBase/EKnowledgeRetrievalType.cs

@@ -22,7 +22,7 @@ public enum EKnowledgeRetrievalType
     /// <summary>
     /// 正文
     /// </summary>
-    [Description("正文")]
+    [Description("知识内容")]
     Content = 2,
 
     /// <summary>
@@ -36,4 +36,10 @@ public enum EKnowledgeRetrievalType
     /// </summary>
     [Description("所属部门")]
     Org = 4,
+
+    /// <summary>
+    /// 关键词
+    /// </summary>
+    [Description("关键词")]
+    KeyWord = 5,
 }

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

@@ -211,6 +211,9 @@ public class Knowledge : WorkflowEntity//   WorkflowEntity  FullStateEntity
 	[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
 	public List<FileJson>? FileJson { get; set; }
 
-
-
+	/// <summary>
+	/// 收藏数量
+	/// </summary>
+	[SugarColumn(ColumnDescription = "收藏数量")]
+	public int? CollectCount { get; set; } = 0;
 }

+ 9 - 1
src/Hotline/KnowledgeBase/KnowledgeHotWord.cs

@@ -1,4 +1,5 @@
-using SqlSugar;
+using Hotline.Share.Enums.KnowledgeBase;
+using SqlSugar;
 using System.ComponentModel;
 using XF.Domain.Repository;
 
@@ -25,6 +26,13 @@ public class KnowledgeHotWord : CreationEntity
     [SugarColumn(ColumnDescription = "搜索次数")]
     public int SearchCount { get; set; }
 
+    
+    /// <summary>
+    /// 类型
+    /// </summary>
+    [SugarColumn(ColumnDescription = "类型")]
+    public EKnowledgeHotWordType? Type { get; set; }
+
     /// <summary>
     /// 是否启用
     /// </summary>

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

@@ -47,7 +47,5 @@ namespace Hotline.KnowledgeBase
 		/// </summary>
 		[SugarColumn(ColumnDescription = "启禁用  0  启用  1 禁用")]
 		public int IsEnable { get; set; }
-
- 
 	}
 }

+ 129 - 0
src/Hotline/WebPortal/OldPublicData.cs

@@ -0,0 +1,129 @@
+using Hotline.Share.Enums.Order;
+using SqlSugar;
+using System.ComponentModel;
+using XF.Domain.Repository;
+
+namespace Hotline.WebPortal
+{
+    /// <summary>
+    /// 旧系统已发布公开数据
+    /// </summary>
+    [Description("旧系统已发布公开数据")]
+    public class OldPublicData : CreationEntity
+    {
+        /// <summary>
+        /// 工单id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单id")]
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 来电/信人姓名
+        /// </summary>
+        [SugarColumn(ColumnDescription = "来电姓名")]
+        public string? FromName { get; set; }
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        [SugarColumn(ColumnDescription = "联系电话")]
+        public string? Contact { get; set; }
+
+        /// <summary>
+        /// 来电/信人身份
+        /// </summary>
+        [SugarColumn(ColumnDescription = "来电身份")]
+        public EIdentityType? IdentityType { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单编号")]
+        public string OrderNo { get; set; }
+
+        /// <summary>
+        /// 工单密码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单密码")]
+        public string OrderPwd { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单标题")]
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 来源渠道(电话、网站、APP等)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "来源渠道(电话、网站、APP等)")]
+        public string? SourceChannel { get; set; }
+
+        [SugarColumn(ColumnDescription = "来源渠道代码")]
+        public string? SourceChannelCode { get; set; }
+
+        /// <summary>
+        /// 受理类型(咨询、投诉等)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "受理类型受理类型(咨询、投诉等)")]
+        public string? AcceptType { get; set; }
+
+        /// <summary>
+        /// 受理类型代码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "受理类型代码")]
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        [SugarColumn(ColumnDescription = "热点ID")]
+        public string? HotspotId { get; set; }
+
+        /// <summary>
+        /// 热点名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "热点名称")]
+        public string? HotspotName { get; set; }
+
+        /// <summary>
+        /// 诉求内容
+        /// </summary>
+        [SugarColumn(ColumnDataType = "varchar(8000)", ColumnDescription = "诉求内容")]
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 工单状态 0:办理中;1办理完成
+        /// </summary>
+        public string State { get; set; }
+
+        /// <summary>
+        /// 实际办理部门名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "实际办理部门名称")]
+        public string? ActualHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 实际办理意见(办理中...or 最终办理意见)
+        /// </summary>
+        [SugarColumn(Length = 8000, ColumnDescription = "实际办理意见")]
+        public string ActualOpinion { get; set; } = "办理中...";
+
+        /// <summary>
+        /// 工单创建时间
+        /// </summary>
+        public DateTime? AcceptTime { get; set; }
+
+        /// <summary>
+        /// 发布时间
+        /// </summary>
+        public DateTime? PubDate { get; set; }
+
+        /// <summary>
+        /// 归档时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "归档时间")]
+        public DateTime? FiledTime { get; set; }
+    }
+}
+