Browse Source

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

xf 1 year ago
parent
commit
05576428d3

+ 48 - 44
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -53,55 +53,59 @@ public class BiCallController : BaseController
 
 
     [HttpGet("calls")]
     [HttpGet("calls")]
     [AllowAnonymous]
     [AllowAnonymous]
-    public async Task<IReadOnlyList<BiCallDto>> QueryCallsAsync([FromQuery] BiQueryCallsDto dto)
+    public async Task<List<BiCallDto>> QueryCallsAsync([FromQuery] BiQueryCallsDto dto)
     {
     {
-        dto.StartTime ??= DateTime.Today;
-        dto.EndTime ??= DateTime.Today.AddDays(1).AddSeconds(-1);
 
 
-        var items = await _trCallRecordRepository.Queryable()
-            .Where(d => d.CreatedTime >= dto.StartTime && d.CreatedTime <= dto.EndTime)
-            .Where(d => d.CallDirection == ECallDirection.In)
-            .WhereIF(!string.IsNullOrEmpty(dto.Line), d => d.Gateway == dto.Line)
-            .Select(d => new
-            {
-                d.CreatedTime.Year,
-                d.CreatedTime.Month,
-                d.CreatedTime.Day,
-                d.CreatedTime.Hour,
-                d.AnsweredTime,
-                d.EndBy
-            })
-            .MergeTable()
-            .GroupBy(d => new
-            {
-                d.Year,
-                d.Month,
-                d.Day,
-                d.Hour
-            })
-            .Select(d => new BiCallDto
-            {
-                Hour = d.Hour,
-                Total = SqlFunc.AggregateCount(d.Hour),
-                Answered = SqlFunc.AggregateSum(SqlFunc.IIF(d.AnsweredTime != null, 1, 0)),
-                Hanguped = SqlFunc.AggregateSum(SqlFunc.IIF(d.AnsweredTime == null && d.EndBy != null && d.EndBy.Value == EEndBy.To, 1, 0))
-            })
-            .OrderBy(d => d.Hour)
-            .ToListAsync(HttpContext.RequestAborted);
+        #region 注释
+        //var items = await _trCallRecordRepository.Queryable()
+        //    .Where(d => d.CreatedTime >= dto.StartTime && d.CreatedTime <= dto.EndTime)
+        //    .Where(d => d.CallDirection == ECallDirection.In)
+        //    .WhereIF(!string.IsNullOrEmpty(dto.Line), d => d.Gateway == dto.Line)
+        //    .Select(d => new
+        //    {
+        //        d.CreatedTime.Year,
+        //        d.CreatedTime.Month,
+        //        d.CreatedTime.Day,
+        //        d.CreatedTime.Hour,
+        //        d.AnsweredTime,
+        //        d.EndBy
+        //    })
+        //    .MergeTable()
+        //    .GroupBy(d => new
+        //    {
+        //        d.Year,
+        //        d.Month,
+        //        d.Day,
+        //        d.Hour
+        //    })
+        //    .Select(d => new BiCallDto
+        //    {
+        //        Hour = d.Hour,
+        //        Total = SqlFunc.AggregateCount(d.Hour),
+        //        Answered = SqlFunc.AggregateSum(SqlFunc.IIF(d.AnsweredTime != null, 1, 0)),
+        //        Hanguped = SqlFunc.AggregateSum(SqlFunc.IIF(d.AnsweredTime == null && d.EndBy != null && d.EndBy.Value == EEndBy.To, 1, 0))
+        //    })
+        //    .OrderBy(d => d.Hour)
+        //    .ToListAsync(HttpContext.RequestAborted);
+
+        //if (items.Count < 24)
+        //{
+        //    for (var i = 0; i < 24; i++)
+        //    {
+        //        var item = items.FirstOrDefault(d => d.Hour == i);
+        //        if (item is null)
+        //            items.Add(new BiCallDto { Hour = i });
+        //    }
+
+        //    items = items.OrderBy(d => d.Hour).ToList();
+        //}
+        #endregion
 
 
-        if (items.Count < 24)
-        {
-            for (var i = 0; i < 24; i++)
-            {
-                var item = items.FirstOrDefault(d => d.Hour == i);
-                if (item is null)
-                    items.Add(new BiCallDto { Hour = i });
-            }
+        dto.StartTime ??= DateTime.Today;
+        dto.EndTime ??= DateTime.Today.AddDays(1).AddSeconds(-1);
 
 
-            items = items.OrderBy(d => d.Hour).ToList();
-        }
+         return await _trCallRecordRepositoryEx.GetQueryCalls(dto.StartTime.Value, dto.EndTime.Value);
 
 
-        return items;
     }
     }
 
 
     [HttpGet("seats")]
     [HttpGet("seats")]

+ 2 - 0
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -507,6 +507,8 @@ namespace Hotline.Api.Controllers
                     throw UserFriendlyException.SameMessage("通话记录已经关联工单");
                     throw UserFriendlyException.SameMessage("通话记录已经关联工单");
 
 
                 order.CallId = dto.CallId;
                 order.CallId = dto.CallId;
+                order.FromPhone = trRecord.CPN;
+                order.TransferPhone = trRecord.Gateway;
                 await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
                 await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
                 trRecord.CallOrderType = ECallOrderType.Order;
                 trRecord.CallOrderType = ECallOrderType.Order;
                 trRecord.ExternalId = order.Id;
                 trRecord.ExternalId = order.Id;

+ 20 - 1
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -222,7 +222,7 @@ namespace Hotline.Api.Controllers
 			var knowledge = await _knowledgeRepository.GetAsync(update.Id);
 			var knowledge = await _knowledgeRepository.GetAsync(update.Id);
 			if (knowledge == null)
 			if (knowledge == null)
 				throw UserFriendlyException.SameMessage("知识库数据错误");
 				throw UserFriendlyException.SameMessage("知识库数据错误");
-			if (knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing)
+			if ((knowledge.Status == EKnowledgeStatus.OnShelf || knowledge.Status == EKnowledgeStatus.Auditing) && (knowledge.ExpiredTime.HasValue && knowledge.ExpiredTime.Value > DateTime.Now))
 				throw UserFriendlyException.SameMessage("知识库数据不可修改");
 				throw UserFriendlyException.SameMessage("知识库数据不可修改");
 
 
 			var any = await _knowledgeRepository.Queryable().Where(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == update.Title &&  x.Id != update.Id).AnyAsync();
 			var any = await _knowledgeRepository.Queryable().Where(x => x.Status == EKnowledgeStatus.OnShelf && x.Title == update.Title &&  x.Id != update.Id).AnyAsync();
@@ -557,6 +557,25 @@ namespace Hotline.Api.Controllers
 			var (total, temp) = await sugar.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize);
 			var (total, temp) = await sugar.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize);
 			return new PagedDto<KnowledgeRetrievalDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeRetrievalDataDto>>(temp));
 			return new PagedDto<KnowledgeRetrievalDataDto>(total, _mapper.Map<IReadOnlyList<KnowledgeRetrievalDataDto>>(temp));
 		}
 		}
+
+		/// <summary>
+		/// 获取知识审批信息
+		/// </summary>
+		/// <param name="id"></param>
+		/// <returns></returns>
+		[HttpGet("audit_log")]
+		public async Task<PagedDto<KnowledgeWorkFlowDto>> KnowRetrieval([FromQuery] AuditLogListPagedDto pagedDto)
+		{
+			var (total, temp) =await _knowledgeWorkFlowRepository
+				.Queryable()
+				.Includes(x => x.User)
+				.Includes(x => x.SystemOrganize)
+				.Includes(x => x.Workflow)
+				.Where(x=>x.KnowledgeId == pagedDto.id)
+				.Where(x => x.IsDeleted == false)
+				.ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize);
+			return new PagedDto<KnowledgeWorkFlowDto>(total, _mapper.Map<IReadOnlyList<KnowledgeWorkFlowDto>>(temp));
+		}
 		#endregion
 		#endregion
 
 
 		#region 我的知识删除列表
 		#region 我的知识删除列表

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

@@ -646,9 +646,13 @@ public class OrderController : BaseController
         var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x=>x.DicDataValue!="-1");
         var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x=>x.DicDataValue!="-1");
         var callRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == orderVisit.CallId);
         var callRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == orderVisit.CallId);
         var recordingFileUrl = "";
         var recordingFileUrl = "";
+        var recordingBaseAddress = "";
+        var recordingAbsolutePath = "";
         if (callRecord != null)
         if (callRecord != null)
         {
         {
             recordingFileUrl = callRecord.RecordingFileUrl;
             recordingFileUrl = callRecord.RecordingFileUrl;
+            recordingBaseAddress = callRecord.RecordingBaseAddress;
+            recordingAbsolutePath = callRecord.RecordingAbsolutePath;
         }
         }
 
 
         return new
         return new
@@ -661,7 +665,9 @@ public class OrderController : BaseController
             VisitManner = visitManner,
             VisitManner = visitManner,
             ViceEvaluate = voiceEvaluate,
             ViceEvaluate = voiceEvaluate,
             SeatEvaluate = seatEvaluate,
             SeatEvaluate = seatEvaluate,
-            RecordingFileUrl = recordingFileUrl
+            RecordingFileUrl = recordingFileUrl,
+            RecordingBaseAddress = recordingBaseAddress,
+            RecordingAbsolutePath = recordingAbsolutePath
         };
         };
     }
     }
 
 

+ 40 - 1
src/Hotline.Api/Controllers/SchedulingController.cs

@@ -9,6 +9,12 @@ using XF.Domain.Repository;
 using Hotline.Share.Dtos.Schedulings;
 using Hotline.Share.Dtos.Schedulings;
 using MapsterMapper;
 using MapsterMapper;
 using Hotline.Users;
 using Hotline.Users;
+using System.Data;
+using Hotline.Repository.SqlSugar.TextSearch;
+using Microsoft.AspNetCore.Components;
+using System.Dynamic;
+using Microsoft.EntityFrameworkCore.Query.Internal;
+using NetTaste;
 
 
 namespace Hotline.Api.Controllers
 namespace Hotline.Api.Controllers
 {
 {
@@ -240,7 +246,7 @@ namespace Hotline.Api.Controllers
 								SchedulingUserId = user.UserId,
 								SchedulingUserId = user.UserId,
 								SchedulingUserName = user.UserName,
 								SchedulingUserName = user.UserName,
 								ShiftId = dtos.ShiftId,
 								ShiftId = dtos.ShiftId,
-								ShiftName = dtos.ShiftName,
+								ShiftName = shift.Name,
 								SchedulingTime = schedulingTime,
 								SchedulingTime = schedulingTime,
 								WorkingTime = shift.WorkingTime,
 								WorkingTime = shift.WorkingTime,
 								OffDutyTime = shift.OffDutyTime,
 								OffDutyTime = shift.OffDutyTime,
@@ -341,6 +347,39 @@ namespace Hotline.Api.Controllers
 			return new PagedDto<Scheduling>(total, items);
 			return new PagedDto<Scheduling>(total, items);
 		}
 		}
 
 
+		/// <summary>
+		/// 排班数据查询
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("data")]
+		public async Task<List<IDictionary<string, object>>> Data([FromQuery] DataDto dto) 
+		{
+			List<IDictionary<string, object>> res = new List<IDictionary<string, object>>();
+			var startTime = DateTime.Parse(dto.Time.ToString("yyyy-MM") + "-01");
+			var endTime =startTime.AddMonths(1).AddDays(-1);
+			DataTable data = await _schedulingRepository.Queryable().Where(x=>x.SchedulingTime >= startTime && x.SchedulingTime <= endTime).ToDataTableAsync();
+			if (data == null || data.Rows.Count <= 0) return res;
+			var names = data.AsEnumerable().Select(x=>x.Field<string>("SchedulingUserName")).Distinct().ToList();
+		
+			foreach (var item in names)
+			{
+				dynamic dynamicObj = new ExpandoObject();
+				var dict = (IDictionary<string, object>)dynamicObj;
+				var userName = "SchedulingUserName";
+				dict[userName] = item;
+				var scheduling = data.AsEnumerable().Where(x => x.Field<string>("SchedulingUserName") == item).OrderBy(x => x.Field<DateTime>("SchedulingTime")).ToList();
+				foreach (DataRow row in scheduling)
+				{
+					var obj = new { Name = row.Field<string>("ShiftName"), Id = row.Field<string>("Id") };
+					var tiem = row.Field<DateTime>("SchedulingTime").ToString("yyyy-MM-dd");
+					dict[tiem] = obj;
+				}
+				res.Add(dict);
+			}
+			return res;
+		}
+
 		/// <summary>
 		/// <summary>
 		/// 获取排班管理实体
 		/// 获取排班管理实体
 		/// </summary>
 		/// </summary>

+ 46 - 9
src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs

@@ -20,6 +20,45 @@ namespace Hotline.Repository.SqlSugar.CallCenter
         {
         {
         }
         }
 
 
+        public async Task<List<BiCallDto>?> GetQueryCalls(DateTime beginDate,DateTime endDate)
+        {
+            TimeSpan timeDifference = endDate.Subtract(beginDate).Duration();
+
+            int hourDiff = (int)(timeDifference.TotalHours);
+
+            //计算时间差
+            int hour = Convert.ToInt32((endDate - beginDate).TotalHours);
+
+            List<DateTime> dts = new List<DateTime>() { beginDate };
+            for (int i = 0; i < hour - 1; i++)
+            {
+                dts.Add(dts.Last().AddHours(1));
+            }
+
+            var list = await Db.Reportable(dts).ToQueryable<DateTime>()
+                .LeftJoin<TrCallRecord>((it, o) => o.CreatedTime >= it.ColumnName && o.CreatedTime < it.ColumnName.AddHours(1))
+                .Where((it,o)=> o.CallDirection == ECallDirection.In)
+                .GroupBy(it => it.ColumnName)
+                .OrderBy(it => it.ColumnName)
+                .Select((it, o) => new BiCallDto()
+                {
+                    Hour = it.ColumnName.Hour, //小时段
+                    Total = SqlFunc.AggregateCount(it.ColumnName),
+                    Answered = SqlFunc.AggregateSum(SqlFunc.IIF(o.AnsweredTime!=null,1,0)), //应答数
+                    Hanguped = SqlFunc.AggregateSum(SqlFunc.IIF(o.AnsweredTime==null && o.EndBy!=null && o.EndBy.Value == EEndBy.To,1,0)),//挂断数
+                }).ToListAsync();
+            var returnList = list.GroupBy(x => x.Hour)
+               .Select(x => new BiCallDto()
+               {
+                   Hour = x.Key,
+                   Total = x.Sum(d=>d.Total),
+                   Answered = x.Sum(d=>d.Answered),
+                   Hanguped = x.Sum(d=>d.Hanguped),
+                   HourRange = x.Key.ToString().PadLeft(2, '0') + ":00 - " + (x.Key + 1).ToString().PadLeft(2, '0') + ":00",
+               }).OrderBy(x=>x.Hour).ToList();
+            return returnList;
+        }
+
         public async Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate,DateTime? endDate,int noConnectByeTimes,int effectiveTimes,int connectByeTimes)
         public async Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate,DateTime? endDate,int noConnectByeTimes,int effectiveTimes,int connectByeTimes)
         {
         {
             //计算小时差
             //计算小时差
@@ -30,10 +69,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
             TimeSpan timeDifference = endDate.Value.Subtract(beginDate).Duration();
             TimeSpan timeDifference = endDate.Value.Subtract(beginDate).Duration();
 
 
             int hourDiff = (int)(timeDifference.TotalHours);
             int hourDiff = (int)(timeDifference.TotalHours);
-            if (!endDate.HasValue)
-            {
-                endDate = beginDate.Date.AddDays(1).AddSeconds(-1);
-            }
+           
             //计算时间差
             //计算时间差
             int hour = Convert.ToInt32((endDate - beginDate).Value.TotalHours);
             int hour = Convert.ToInt32((endDate - beginDate).Value.TotalHours);
 
 
@@ -45,16 +81,17 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 
 
             var list = await Db.Reportable(dts).ToQueryable<DateTime>()
             var list = await Db.Reportable(dts).ToQueryable<DateTime>()
                 .LeftJoin<TrCallRecord>((it, o) => o.CreatedTime >= it.ColumnName && o.CreatedTime < it.ColumnName.AddHours(1))
                 .LeftJoin<TrCallRecord>((it, o) => o.CreatedTime >= it.ColumnName && o.CreatedTime < it.ColumnName.AddHours(1))
+                .Where((it, o) => o.CallDirection == ECallDirection.In)
                 .GroupBy(it => it.ColumnName)
                 .GroupBy(it => it.ColumnName)
                 .OrderBy(it => it.ColumnName)
                 .OrderBy(it => it.ColumnName)
                 .Select((it, o) => new TrCallHourDto()
                 .Select((it, o) => new TrCallHourDto()
                 {
                 {
                     Hour = it.ColumnName.Hour, //小时段
                     Hour = it.ColumnName.Hour, //小时段
-                    EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.Duration >= effectiveTimes, 1, 0)),//有效接通
-                    ConnectByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.Duration > 0 && o.Duration <= connectByeTimes, 1, 0)), //接通秒挂
-                    NoConnectByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.Duration == 0 && o.RingTimes <= noConnectByeTimes && o.RingTimes>0, 1, 0)), //未接通秒挂
-                    QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0, 1, 0)), //队列挂断
-                    IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
+                    EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.Duration >= effectiveTimes, 1, 0)),//有效接通
+                    ConnectByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.Duration > 0 && o.Duration <= connectByeTimes, 1, 0)), //接通秒挂
+                    NoConnectByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.Duration == 0 && o.RingTimes <= noConnectByeTimes && o.RingTimes>0, 1, 0)), //未接通秒挂
+                    QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.QueueTims > 0 && o.RingTimes == 0, 1, 0)), //队列挂断
+                    IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
                 })
                 })
                 .ToListAsync();
                 .ToListAsync();
 
 

+ 1 - 1
src/Hotline.Share/Dtos/CallCenter/BiCallDto.cs

@@ -11,7 +11,7 @@ namespace Hotline.Share.Dtos.CallCenter
         /// <summary>
         /// <summary>
         /// 小时跨度
         /// 小时跨度
         /// </summary>
         /// </summary>
-        public string HourRange => Hour == 23 ? "23:00~24:00" : $"{Hour.ToString():00}~{(Hour + 1).ToString():00}";
+        public string HourRange { get; set; }
 
 
         public int Hour { get; set; }
         public int Hour { get; set; }
 
 

+ 5 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowDto.cs

@@ -102,6 +102,11 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         /// </summary>
         /// </summary>
 		public DateTime? CenterToOrgTime { get; set; }
 		public DateTime? CenterToOrgTime { get; set; }
 
 
+        /// <summary>
+        /// 实际办理时间
+        /// </summary>
+        public DateTime? ActualHandleTime { get; set; }
+
 	}
 	}
 
 
     public class WorkflowAssignDto
     public class WorkflowAssignDto

+ 10 - 4
src/Hotline.Share/Dtos/Knowledge/KnowledgePagedDto.cs

@@ -9,11 +9,17 @@ namespace Hotline.Share.Dtos.Knowledge
     public record MyDraftsListPagedDto(string? KnowledgeTypeId, DateTime? StartTime, DateTime? EndTime) : PagedKeywordRequest;
     public record MyDraftsListPagedDto(string? KnowledgeTypeId, DateTime? StartTime, DateTime? EndTime) : PagedKeywordRequest;
 
 
     /// <summary>
     /// <summary>
-    /// 审核管理
+    /// 审核记录
     /// </summary>
     /// </summary>
-    /// <param name="EKnowledgeApplyType">申请类型</param>
-    /// <param name="EKnowledgeWorkFlowStatus">审核状态</param>
-    public record KnowledgeApprovalPagedListDto(EKnowledgeApplyType? EKnowledgeApplyType, EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus) : PagedKeywordRequest;
+    /// <param name="id"></param>
+    public record AuditLogListPagedDto(string? id) : PagedKeywordRequest;
+
+	/// <summary>
+	/// 审核管理
+	/// </summary>
+	/// <param name="EKnowledgeApplyType">申请类型</param>
+	/// <param name="EKnowledgeWorkFlowStatus">审核状态</param>
+	public record KnowledgeApprovalPagedListDto(EKnowledgeApplyType? EKnowledgeApplyType, EKnowledgeWorkFlowStatus? EKnowledgeWorkFlowStatus) : PagedKeywordRequest;
 
 
 	/// <summary>
 	/// <summary>
 	/// 知识检索
 	/// 知识检索

+ 100 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeWorkFlowDto.cs

@@ -0,0 +1,100 @@
+using Hotline.Share.Enums.KnowledgeBase;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+using Hotline.Share.Dtos.Users;
+using Hotline.Share.Dtos.Org;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.Knowledge
+{
+	public class KnowledgeWorkFlowDto: BaseDto
+	{
+		/// <summary>
+		/// 知识ID
+		/// </summary>
+		public string KnowledgeId { get; set; }
+
+		/// <summary>
+		/// 操作类型,新增、删除、编辑
+		/// </summary>
+		public EKnowledgeApplyType WorkflowModuleStatus { get; set; }
+
+		public string WorkflowModuleStatusText => WorkflowModuleStatus.GetDescription();
+
+		/// <summary>
+		/// 审批状态
+		/// </summary>
+		public EKnowledgeWorkFlowStatus WorkFlowApplyStatus { get; set; }
+
+		public string WorkFlowApplyStatusText => WorkFlowApplyStatus.GetDescription();
+
+		/// <summary>
+		/// 审核时间
+		/// </summary>
+		public DateTime? HandleTime { get; set; }
+
+		/// <summary>
+		/// 实际办理意见(办理中...or 最终办理意见)
+		/// </summary>
+		public string ActualOpinion { get; set; } 
+
+		/// <summary>
+		/// 知识信息
+		/// </summary>
+		public KnowledgeDto Knowledge { get; set; }
+
+		/// <summary>
+		/// 流程信息
+		/// </summary>
+		public WorkflowDto Workflow { get; set; }
+
+		/// <summary>
+		/// 部门
+		/// </summary>
+		public OrgDto SystemOrganize { get; set; }
+
+		/// <summary>
+		/// 用户
+		/// </summary>
+		public UserDto User { get; set; }
+	}
+
+	public class BaseDto
+	{
+		public DateTime? LastModificationTime { get; set; }
+
+		public bool IsDeleted { get; set; }
+
+		/// <summary>
+		/// 删除时间
+		/// </summary>
+		public DateTime? DeletionTime { get; set; }
+
+
+		/// <summary>
+		/// 创建时间
+		/// </summary>
+		public DateTime CreationTime { get; set; }
+
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 组织Id
+		/// </summary>
+		public string? CreatorOrgId { get; set; }
+
+
+		public string? CreatorOrgName { get; set; }
+
+		/// <summary>
+		/// 创建人
+		/// </summary>
+		public string? CreatorId { get; set; }
+
+		public string? CreatorName { get; set; }
+	}
+}

+ 2 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -342,6 +342,8 @@ namespace Hotline.Share.Dtos.Order
         public string? CallId { get; set; }
         public string? CallId { get; set; }
 
 
         public Kv? NowEvaluate { get; set; }
         public Kv? NowEvaluate { get; set; }
+
+
     }
     }
 
 
     public class OrderVisitDetailDto
     public class OrderVisitDetailDto

+ 8 - 0
src/Hotline.Share/Dtos/Schedulings/SchedulingDto.cs

@@ -140,4 +140,12 @@ namespace Hotline.Share.Dtos.Schedulings
 		/// </summary>
 		/// </summary>
 		public DateTime? EndTime { get; set; }
 		public DateTime? EndTime { get; set; }
 	}
 	}
+
+	public record DataDto { 
+	
+		/// <summary>
+		/// 时间
+		/// </summary>
+		public DateTime Time { get; set; }
+	}
 }
 }

+ 1 - 0
src/Hotline/CallCenter/Calls/ITrCallRecordRepository.cs

@@ -6,6 +6,7 @@ namespace Hotline.CallCenter.Calls
     public interface ITrCallRecordRepository
     public interface ITrCallRecordRepository
     {
     {
 
 
+        Task<List<BiCallDto>?> GetQueryCalls(DateTime beginDate, DateTime endDate);
         Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes,int connectByeTimes);
         Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes,int connectByeTimes);
 
 
 
 

+ 3 - 1
src/Hotline/KnowledgeBase/KnowledgeDomainService.cs

@@ -212,6 +212,7 @@ namespace Hotline.KnowledgeBase
 
 
             //修改业务数据状态
             //修改业务数据状态
             workFlow.WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Revoke;
             workFlow.WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Revoke;
+            workFlow.ActualOpinion = workflow.ActualOpinion;
             await _knowledgeWorkFlowRepository.UpdateAsync(workFlow);
             await _knowledgeWorkFlowRepository.UpdateAsync(workFlow);
 
 
             //现有知识状态更改为已撤回
             //现有知识状态更改为已撤回
@@ -264,7 +265,8 @@ namespace Hotline.KnowledgeBase
 
 
             workFlow.HandleTime = DateTime.Now;
             workFlow.HandleTime = DateTime.Now;
             workFlow.WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Success;
             workFlow.WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Success;
-            await _knowledgeWorkFlowRepository.UpdateAsync(workFlow, cancellationToken);
+            workFlow.ActualOpinion = workflow.ActualOpinion;
+			await _knowledgeWorkFlowRepository.UpdateAsync(workFlow, cancellationToken);
 
 
             string isSendType = "";//推送类别:新增0,修改1,删除2
             string isSendType = "";//推送类别:新增0,修改1,删除2
 
 

+ 8 - 2
src/Hotline/KnowledgeBase/KnowledgeWorkFlow.cs

@@ -35,9 +35,15 @@ namespace Hotline.KnowledgeBase
         public DateTime? HandleTime { get; set; }
         public DateTime? HandleTime { get; set; }
 
 
         /// <summary>
         /// <summary>
-        /// 知识信息
+        /// 实际办理意见(办理中...or 最终办理意见)
         /// </summary>
         /// </summary>
-        [Navigate(NavigateType.OneToOne, nameof(KnowledgeId))]//一对一 
+        [SugarColumn(Length = 2000)]
+        public string? ActualOpinion { get; set; } 
+
+		/// <summary>
+		/// 知识信息
+		/// </summary>
+		[Navigate(NavigateType.OneToOne, nameof(KnowledgeId))]//一对一 
         public Knowledge Knowledge { get; set; }
         public Knowledge Knowledge { get; set; }
 
 
         /// <summary>
         /// <summary>