Dun.Jason 1 vuosi sitten
vanhempi
commit
183c7f244f

+ 123 - 11
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -16,10 +16,9 @@ using Hotline.Share.Requests;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
-using SharpCompress.Archives;
 using SqlSugar;
-using System.Transactions;
 using XF.Domain.Authentications;
+using XF.Domain.Constants;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 
@@ -41,6 +40,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
         private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
         private readonly ISessionContext _sessionContext;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
 
 
         public BiOrderController(
@@ -57,7 +57,8 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderPublish> orderPublishRepository,
             IRepository<SystemOrganize> systemOrganizeRepository,
             IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
-            ISessionContext sessionContext
+            ISessionContext sessionContext,
+            ISystemSettingCacheManager systemSettingCacheManager
             )
         {
             _orderRepository = orderRepository;
@@ -74,6 +75,7 @@ namespace Hotline.Api.Controllers.Bi
             _systemOrganizeRepository = systemOrganizeRepository;
             _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
             _sessionContext = sessionContext;
+            _systemSettingCacheManager = systemSettingCacheManager;
         }
 
         /// <summary>
@@ -345,7 +347,7 @@ namespace Hotline.Api.Controllers.Bi
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.VisitOrgName.Contains(dto.OrgName))
                 .WhereIF(dto.StartTime.HasValue, x => x.OrderVisit.VisitTime >= dto.StartTime.Value)
                 .WhereIF(dto.EndTime.HasValue, x => x.OrderVisit.VisitTime <= dto.EndTime.Value)
-                .WhereIF(IsCenter==false,x=>x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
                 .GroupBy(x => new { x.VisitOrgName, x.VisitOrgCode })
                 .Select(x => new BiVisitNoSatisfiedDto
                 {
@@ -413,7 +415,7 @@ namespace Hotline.Api.Controllers.Bi
                 .WhereIF(dto.StartTime.HasValue, (x, o) => x.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, (x, o) => x.CreationTime <= dto.EndTime)
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Contains(dto.OrgName))
-                .WhereIF(IsCenter==false,x=>x.ApplyOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(IsCenter == false, x => x.ApplyOrgCode.StartsWith(_sessionContext.RequiredOrgId))
                 .GroupBy(x => new { x.ApplyOrgCode, x.ApplyOrgName })
                 .Select(x => new BiOrderDelayDataDto
                 {
@@ -446,7 +448,7 @@ namespace Hotline.Api.Controllers.Bi
             var query = _orderSpecialRepository.Queryable()
                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-                .WhereIF(IsCenter==false,x=>x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
                 .GroupBy(x => new { x.Cause })
                 .Select(x => new OrderBiSpecialListVo
                 {
@@ -492,7 +494,7 @@ namespace Hotline.Api.Controllers.Bi
                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
                 .WhereIF(dto.State.HasValue, x => x.State == dto.State)
-                .WhereIF(IsCenter==false,x=> x.OrgId.StartsWith(_sessionContext.OrgId))
+                .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.OrgId))
                 .OrderByDescending(x => x.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<OrderSpecialDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDto>>(items));
@@ -584,7 +586,7 @@ namespace Hotline.Api.Controllers.Bi
         {
             dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
             var IsCenter = _sessionContext.OrgIsCenter;
-            return await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime, dto.EndTime,IsCenter,_sessionContext.OrgId);
+            return await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime, dto.EndTime, IsCenter, _sessionContext.OrgId);
         }
 
         /// <summary>
@@ -720,7 +722,7 @@ namespace Hotline.Api.Controllers.Bi
                 .Where(x => x.OrderVisit.VisitTime >= StartDate && x.OrderVisit.VisitTime <= EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
                 .WhereIF(!string.IsNullOrEmpty(OrgName), x => x.VisitOrgName.Contains(OrgName))
                 .WhereIF(!string.IsNullOrEmpty(LineNum), x => x.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
-                .WhereIF(IsCenter==false,x=>x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+                .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
                 .GroupBy(x => new
                 {
                     VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
@@ -820,7 +822,7 @@ namespace Hotline.Api.Controllers.Bi
                 .LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
                 .Where((x, it) => it.OrderVisit.VisitTime >= StartDate && it.OrderVisit.VisitTime <= EndDate && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
                 .WhereIF(!string.IsNullOrEmpty(LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
-                .WhereIF(IsCenter == false, (x,it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+                .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
                  .GroupBy((x, it) => new
                  {
                      VisitOrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))
@@ -1166,7 +1168,7 @@ namespace Hotline.Api.Controllers.Bi
               .Where((it, o) => it.CreationTime >= StartDate && it.CreationTime <= EndDate && (int)it.Status >= 300)
                 .WhereIF(TypeCode == 1, (it, o) => it.OrgLevelOneCode == "001")
                 .WhereIF(TypeCode == 2, (it, o) => it.OrgLevelOneCode != "001")
-                .WhereIF(IsCenter==false,(it,o)=> it.OrgLevelOneCode.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(IsCenter == false, (it, o) => it.OrgLevelOneCode.StartsWith(_sessionContext.RequiredOrgId))
                .GroupBy((it, o) => new
                {
                    it.OrgLevelOneCode,
@@ -1344,6 +1346,49 @@ namespace Hotline.Api.Controllers.Bi
                       }).ToListAsync();
         }
 
+        /// <summary>
+        /// 高频来电统计
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <param name="PhoneNum"></param>
+        /// <returns></returns>
+        [HttpGet("high_frequency_call_statistics")]
+        public async Task<object> HighFrequencyCallStatistics(DateTime? StartDate, DateTime? EndDate, string PhoneNum)
+        {
+            if (!StartDate.HasValue || !EndDate.HasValue)
+                throw UserFriendlyException.SameMessage("请选择时间!");
+
+            int CallCount = 2;
+            var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
+            if (HighFrequencyCallStatistics != null)
+                CallCount = int.Parse(HighFrequencyCallStatistics);
+
+            EndDate = EndDate.Value.AddDays(1).AddSeconds(-1);
+            var data = await _trCallRecordRepository.Queryable()
+                     .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
+                   .Where((p, o) => p.OverTime >= StartDate && p.OverTime <= EndDate)
+                   .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
+                   .Where((p, o) => p.ExternalId != null && o.Id != null)
+                    .WhereIF(!string.IsNullOrEmpty(PhoneNum), (p, o) => p.CPN == PhoneNum)
+                   .Select((p, o) => new
+                   {
+                       p.CPN,
+                       p.ExternalId
+                   })
+                   .MergeTable()
+                   .GroupBy(p => p.CPN)
+                   .Select(p => new
+                   {
+                       Callnum = p.CPN,
+                       OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
+                   })
+                 .MergeTable()
+                 .Where(p => p.OrderCountNum >= CallCount)
+                 .ToListAsync();
+
+            return data;
+        }
         /// <summary>
         /// 高频事项预警
         /// </summary>
@@ -1418,6 +1463,73 @@ namespace Hotline.Api.Controllers.Bi
             .OrderByDescending(d => d.CreationTime)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
+        /// <summary>
+        /// 高频来电统计列表详情
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("high_frequency_call_statistics_order_list")]
+        public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsRequest dto)
+        {
+            if (!dto.StartDate.HasValue || !dto.EndDate.HasValue)
+                throw UserFriendlyException.SameMessage("请选择时间!");
+            if (string.IsNullOrEmpty(dto.FromPhone))
+                throw UserFriendlyException.SameMessage("号码不能为空!");
+
+            dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+            var data = await _trCallRecordRepository.Queryable()
+                    .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
+                   .Where((p, o) => p.OverTime >= dto.StartDate && p.OverTime <= dto.EndDate)
+                   .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
+                   .Where((p, o) => p.ExternalId != null && o.Id != null)
+                    .Where((p, o) => p.CPN == dto.FromPhone)
+                   .Select((p, o) =>
+                       p.ExternalId
+                   )
+                  .ToListAsync();
+
+
+            var (total, items) = await _orderRepository.Queryable()
+           .Includes(x => x.OrderScreens)
+           .Where(p => data.Contains(p.Id))
+           .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
+           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
+           .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
+           .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
+           .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
+           .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
+           .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!)) //转接号码
+           .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
+           .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
+           .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
+           .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+           .WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
+                                                                                                     //  .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone.Contains(dto.FromPhone)) //来电号码
+           .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact.Contains(dto.PhoneNo!)) //联系电话
+           .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
+           .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
+           .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
+           .WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))  //工单状态
+           .WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
+           .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName.Contains(dto.ActualHandlerName)) //接办人
+            .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
+            .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点
+            .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
+            .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
+            .WhereIF(dto.IsOverTime == true, d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
+            .WhereIF(dto.IsOverTime == false, d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
+            .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
+            .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName.Contains(dto.FromName)) //来电人姓名
+            .WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.IsProvince == true)
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.IsProvince == false)
+           .OrderByDescending(d => d.CreationTime)
+           .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+
+        }
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
     }

+ 5 - 9
src/Hotline.Api/Controllers/OrderController.cs

@@ -1,5 +1,4 @@
 using DotNetCore.CAP;
-using DotNetCore.CAP.Monitoring;
 using Hotline.Api.Filter;
 using Hotline.Application.ExportExcel;
 using Hotline.Application.FlowEngine;
@@ -27,7 +26,6 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Enterprise;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
-using Hotline.Share.Dtos.Push;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
@@ -43,13 +41,10 @@ using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using MiniExcelLibs;
-using MongoDB.Driver.Linq;
 using SqlSugar;
-using System.Xml.Linq;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
 using XF.Domain.Constants;
-using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
@@ -2558,10 +2553,11 @@ public class OrderController : BaseController
         _mapper.Map(expiredTimeConfig, order);
         await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
         // 平均派单
-   //     if (dto.BusinessType == EBusinessType.Send)
-   //     {;
-			//dto.NextHandlers = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-   //     }
+        if (dto.BusinessType == EBusinessType.Send)
+        {
+            ;
+            dto.NextHandlers = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+        }
 
         await _workflowApplication.NextAsync(dto, order.ExpiredTime, HttpContext.RequestAborted);
 

+ 8 - 6
src/Hotline.Api/Controllers/SchedulingController.cs

@@ -243,7 +243,7 @@ namespace Hotline.Api.Controllers
 						{
 							var scheduling = new Scheduling
 							{
-								SchedulingUserId = user.UserId,
+								SchedulingUserId = user.Id,
 								SchedulingUserName = user.UserName,
 								ShiftId = dtos.ShiftId,
 								ShiftName = shift.Name,
@@ -262,10 +262,10 @@ namespace Hotline.Api.Controllers
 					{
 						var scheduling = new Scheduling
 						{
-							SchedulingUserId = user.UserId,
+							SchedulingUserId = user.Id,
 							SchedulingUserName = user.UserName,
 							ShiftId = dtos.ShiftId,
-							ShiftName = dtos.ShiftName,
+							ShiftName = shift.Name,
 							SchedulingTime = dtos.SchedulingTime,
 							WorkingTime = shift.WorkingTime,
 							OffDutyTime = shift.OffDutyTime,
@@ -364,15 +364,17 @@ namespace Hotline.Api.Controllers
 			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();
+			var names = data.AsEnumerable().Select(x=>new { SchedulingUserName = x.Field<string>("SchedulingUserName") , SchedulingUserId  = x.Field<string>("SchedulingUserId") }).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();
+				dict[userName] = item.SchedulingUserName!;
+				var scheduling = data.AsEnumerable().Where(x => x.Field<string>("SchedulingUserName") == item.SchedulingUserName).OrderBy(x => x.Field<DateTime>("SchedulingTime")).ToList();
+				var userId = "UserId";
+				dict[userId] =item.SchedulingUserId!;
 				foreach (DataRow row in scheduling)
 				{
 					var obj = new { Name = row.Field<string>("ShiftName"), Id = row.Field<string>("Id") };

+ 2 - 2
src/Hotline.Application/Identity/IdentityAppService.cs

@@ -98,9 +98,9 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
         if (user == null)
             throw UserFriendlyException.SameMessage("未查询到用户数据");
         //平均派单
-        //await AverageOrderScheduling(account.Id,cancellationToken);
+        await AverageOrderScheduling(account.Id, cancellationToken);
 
-		var jwtOptions = _identityOptionsAccessor.Value.Jwt;
+        var jwtOptions = _identityOptionsAccessor.Value.Jwt;
         var claims = new List<Claim>
         {
             //new(JwtClaimTypes.Id, account.Id),

+ 7 - 12
src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs

@@ -64,16 +64,6 @@ public class WorkflowMapperConfigs : IRegister
             //.Ignore(d => d.Traces)
             ;
 
-        //config.ForType<BasicWorkflowDto, WorkflowStep>()
-        //    .Map(d => d.NextHandlers, s => s.NextHandlers)
-        //    .Map(d => d.NextMainHandler, s => s.NextMainHandler)
-        //    .Map(d => d.NextStepCode, s => s.NextStepCode)
-        //    .Map(d => d.IsSms, s => s.IsSms)
-        //    .Map(d => d.Opinion, s => s.Opinion)
-        //    .Map(d => d.Additions, s => s.Additions)
-        //    .IgnoreNonMapped(true)
-        //    ;
-
         config.ForType<NextWorkflowDto, Workflow>()
             .Map(d => d.RealHandlerPhone, s => s.RealHandlerPhone)
             .Map(d => d.RealHandlerName, s => s.RealHandlerName)
@@ -84,8 +74,13 @@ public class WorkflowMapperConfigs : IRegister
             .Map(d => d.RealContactLocale, s => s.RealContactLocale)
             .IgnoreNonMapped(true);
 
-        //config.ForType<WorkflowDefinition, WorkflowStep>()
-        //    .Ignore(d => d.Steps);
+        config.ForType<Workflow, WorkflowStep>()
+            .Map(d=>d.WorkflowId, s=>s.Id)
+            .Map(d=>d.ModuleId,s=>s.ModuleId)
+            .Map(d=>d.ModuleCode,s=>s.ModuleCode)
+            .Map(d=>d.ModuleName,s=>s.ModuleName)
+            .IgnoreNonMapped(true)
+            ;
 
     }
 }

+ 1 - 0
src/Hotline.Share/Enums/FlowEngine/ECountersignPosition.cs

@@ -17,6 +17,7 @@ public enum ECountersignPosition
 
     /// <summary>
     /// 本身不直接处于会签流程中,但外层有会签流程嵌套(非上级节点开启会签,当前节点会签并未结束)
+    /// 会签汇总节点
     /// </summary>
     Outer = 2
 }

+ 17 - 0
src/Hotline.Share/Requests/HighFrequencyCallStatisticsRequest.cs

@@ -0,0 +1,17 @@
+using Hotline.Share.Dtos.Order;
+
+namespace Hotline.Share.Requests
+{
+    public record HighFrequencyCallStatisticsRequest : QueryOrderDto
+    {
+        /// <summary>
+        /// 查询时间段--开始
+        /// </summary>
+        public DateTime? StartDate { get; set; }
+
+        /// <summary>
+        /// 查询时间段--结束
+        /// </summary>
+        public DateTime? EndDate { get; set; }
+    }
+}

+ 6 - 6
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1071,7 +1071,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var startStep = _mapper.Map<WorkflowStep>(startStepDefine);
             _mapper.Map(dto, startStep);
-            startStep.WorkflowId = workflow.Id;
+            _mapper.Map(workflow, startStep);
             startStep.Handlers = handles;
             startStep.NextSteps = nextSteps;
             startStep.IsMain = true;
@@ -1793,7 +1793,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var handler = new Kv { Key = _sessionContext.RequiredUserId, Value = _sessionContext.UserName };
 
-            var step = CreateStep(endStepDefine, prevStep, workflow.Id, null, new List<Kv> { handler },
+            var step = CreateStep(workflow, endStepDefine, prevStep, null, new List<Kv> { handler },
                 null, null, null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, DateTime.Now,
                 endStepDefine.Name, true);
 
@@ -1871,7 +1871,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 foreach (var handler in handlers)
                 {
-                    var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, new List<Kv> { handler },
+                    var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType, new List<Kv> { handler },
                         dto.NextStepCode, dto.NextMainHandler, countersignId,
                         stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType);
 
@@ -1880,7 +1880,7 @@ namespace Hotline.FlowEngine.Workflows
             }
             else
             {
-                var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, handlers,
+                var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType, handlers,
                     dto.NextStepCode, dto.NextMainHandler, countersignId,
                     stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, handlerType);
 
@@ -2135,9 +2135,9 @@ namespace Hotline.FlowEngine.Workflows
                 predicate(d.Status) && d.Handlers.Any(x => x.Key == orgCode || x.Key == userId));
 
         private WorkflowStep CreateStep(
+            Workflow workflow,
             StepDefine stepDefine,
             WorkflowStep prevStep,
-            string workflowId,
             EFlowAssignType? flowAssignType,
             List<Kv> handlers,
             string nextStepCode,
@@ -2154,10 +2154,10 @@ namespace Hotline.FlowEngine.Workflows
             if (!handlers.Any())
                 throw new UserFriendlyException($"非法参数, handlers为空, method: {nameof(CreateStep)}");
             var step = _mapper.Map<WorkflowStep>(stepDefine);
+            _mapper.Map(workflow, step);
             var handlerIds = handlers.Select(d => d.Key).ToList();
             var isMain = handlers.Count == 1 || (handlers.Count > 1 || handlerIds.First() == nextMainHandler);
 
-            step.WorkflowId = workflowId;
             step.FlowAssignType = flowAssignType;
             step.Handlers = handlers;
             step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;

+ 6 - 1
src/XF.Domain/Constants/SettingConstants.cs

@@ -172,5 +172,10 @@ namespace XF.Domain.Constants
         /// </summary>
         public const string DefaultDispatchClerk = "DefaultDispatchClerk";
 
-	}
+        /// <summary>
+        /// 高频来电统计-来电次数
+        /// </summary>
+        public const string HighFrequencyCallStatistics = "HighFrequencyCallStatistics";
+
+    }
 }

+ 1 - 0
src/XF.Domain/Extensions/DataMaskExtensions.cs

@@ -23,6 +23,7 @@ public static class DataMaskExtensions
 
     public static string MaskPhoneNumber(this string original)
     {
+        if (original.Length != 11) return string.Empty;
         return original.Mask(3, 4);
     }