Browse Source

Merge branch 'release' of http://110.188.24.182:10023/Fengwo/hotline into release

tangjiang 6 tháng trước cách đây
mục cha
commit
02c01afb04

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

@@ -2817,7 +2817,7 @@ public class OrderController : BaseController
     public async Task<IReadOnlyList<OrderDto>> QueryFixed([FromQuery] QueryOrderFixedDto dto)
     {
         var hasSetting = Int32.TryParse(
-            _systemSettingCacheManager.GetSetting(SettingConstants.FixedQueryCount)?.SettingValue[0], out var queryCount);
+         _systemSettingCacheManager.GetSetting(SettingConstants.FixedQueryCount)?.SettingValue[0], out var queryCount);
         var query = _orderApplication.QueryOrders(dto);
         var orders = await query.ToFixedListAsync(dto.QueryIndex, hasSetting ? queryCount : null, HttpContext.RequestAborted);
         return _mapper.Map<IReadOnlyList<OrderDto>>(orders);

+ 6 - 3
src/Hotline.Application/Jobs/XingTangCallsSyncJob.cs

@@ -51,12 +51,14 @@ namespace Hotline.Application.Jobs
         public async Task Execute(IJobExecutionContext context)
         {
             var xingtangCalls = await _db.Queryable<XingtangCall>()
-                .Where(d => (d.IsSync == null || !d.IsSync) && (d.Tries == null || d.Tries <= 50))
+                .Where(d => !string.IsNullOrEmpty(d.CallGuid) &&
+                                (d.IsSync == null || !d.IsSync) &&
+                                (d.Tries == null || d.Tries <= 50))
                 .OrderBy(d => d.Id)
                 .Take(10)
                 .ToListAsync(context.CancellationToken);
 
-            if(!xingtangCalls.Any()) return;
+            if (!xingtangCalls.Any()) return;
             var occupyCalls = new List<XingtangCall>();
             foreach (var call in xingtangCalls)
             {
@@ -69,7 +71,7 @@ namespace Hotline.Application.Jobs
                     occupyCalls.Add(call);
             }
 
-            if(!occupyCalls.Any()) return;
+            if (!occupyCalls.Any()) return;
             try
             {
                 var calls = _mapper.Map<List<CallNative>>(occupyCalls);
@@ -122,6 +124,7 @@ namespace Hotline.Application.Jobs
 
         private async Task<string> GetCallIdAsync(string callNo, CancellationToken cancellation)
         {
+            if (string.IsNullOrEmpty(callNo)) return string.Empty;
             var relation = await _callApplication.GetRelationAsync(callNo, cancellation);
             if (relation is null)
             {

+ 176 - 142
src/Hotline.Application/Orders/OrderApplication.cs

@@ -83,7 +83,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IOrderDomainService _orderDomainService;
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly ISessionContext _sessionContext;
-	private readonly IOrderRepository _orderRepository;
+    private readonly IOrderRepository _orderRepository;
 
     //private readonly ITimeLimitDomainService _timeLimitDomainService;
     private readonly IMapper _mapper;
@@ -111,7 +111,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IOrderTerminateRepository _orderTerminateRepository;
     private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
 
-	public OrderApplication(
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -185,7 +185,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _orderTerminateRepository = orderTerminateRepository;
         _orderPublishHistoryRepository = orderPublishHistoryRepository;
         _sessionContext = sessionContext;
-	}
+    }
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -961,6 +961,36 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
     }
 
+    //public async Task<List<OrderDto>> QueryOrdersAsync(QueryOrderDto dto, int queryIndex)
+    //{
+    //    var query = QueryOrders(dto);
+    //    var items = await query.ToFixedListAsync(queryIndex);
+
+    //    var dtoItems = new List<OrderDto>();
+    //    foreach (var item in items)
+    //    {
+    //        var orderDto = item.Adapt<OrderDto>();
+    //        var visitEntity = item.OrderVisits
+    //                        .OrderByDescending(m => m.CreationTime)
+    //                        .FirstOrDefault();
+    //        if (visitEntity != null)
+    //        {
+    //            var now = visitEntity?.NowEvaluate;
+    //            if (now != null) 
+    //            {
+    //                orderDto.OrgEvaluate = now;
+    //                orderDto.OrgEvaluateValue = now.Value;
+    //            }
+    //            orderDto.SeatEvaluate = visitEntity.OrderVisitDetails.Where(m => m.VisitTarget == EVisitTarget.Seat)
+    //                .FirstOrDefault()?.SeatEvaluate;
+    //        }
+
+    //        orderDto.OrderVisits = null;
+    //        dtoItems.Add(orderDto);
+    //    }
+    //    return dtoItems;
+    //}
+
     public ISugarQueryable<Order> QueryOrders(QueryOrderDto dto)
     {
         var isCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
@@ -978,75 +1008,78 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
 
         return query
-            .Includes(x => x.OrderScreens)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
-            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo == dto.ProvinceNo) //省本地编号
-            .WhereIF(!string.IsNullOrEmpty(dto.ReceiveProvinceNo), d => d.ReceiveProvinceNo == dto.ReceiveProvinceNo) //省编号
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) //工单编码
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
-                                                                                                     //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
-            .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
-            //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
-            //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
-            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
-            .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
-                                                                                                           //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
-                                                                                                           //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
-                                                                                                           //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == 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 == dto.FromPhone) //来电号码
-            .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact == dto.PhoneNo!) //联系电话
-                                                                                         //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
-            .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), x => x.OrderPushTypes.Any(opt => opt.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.Status.HasValue, d => d.Status == dto.Status) //工单状态
-                                                                       //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == 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.CurrentStepCode == 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 == dto.FromName) //来电人姓名
-                                                                                           //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
-                                                                                           //.WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") > 0,
-                d => d.AreaCode.StartsWith(SqlFunc.Substring(dto.AreaCode, 0, 4)))
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") <= 0, d => d.AreaCode.StartsWith(dto.AreaCode))
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
-            .WhereIF(!string.IsNullOrEmpty(dto.SensitiveWord), d => SqlFunc.JsonArrayAny(d.Sensitive, dto.SensitiveWord))
-            .WhereIF(dto.IsSensitiveWord.HasValue && dto.IsSensitiveWord == true,
-                d => d.Sensitive != null && SqlFunc.JsonArrayLength(d.Sensitive) > 0)
-            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
-            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "1", d => d.Source == ESource.ProvinceStraight &&
-                d.SourceChannelCode == "SZMHD" && d.IsProvince == false) //政民互动直派
-            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "2", d => d.Source == ESource.ProvinceStraight &&
-                d.SourceChannelCode == "SZMHD" && d.IsProvince == true) //政民互动
-            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Source == ESource.ProvinceStraight &&
-                d.SourceChannelCode == "S12345" && d.IsProvince == true) //省12345
-            .WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval),
-                d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
-            .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == true, d => d.CurrentStepAcceptTime!=null)
-            .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == false, d => d.CurrentStepAcceptTime == null)
-            .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
-            .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
-            .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode),d=>d.OrderTagCode == dto.OrderTagCode)
-            .OrderByDescending(d => d.CreationTime);
+             .Includes(x => x.OrderScreens)
+             .Includes(x => x.OrderVisits.Where(m => m.VisitState == EVisitState.Visited).ToList())
+             .Includes(x => x.OrderVisits.Where(m => m.VisitState == EVisitState.Visited).ToList(), ovd => ovd.OrderVisitDetails)
+             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
+             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo == dto.ProvinceNo) //省本地编号
+             .WhereIF(!string.IsNullOrEmpty(dto.ReceiveProvinceNo), d => d.ReceiveProvinceNo == dto.ReceiveProvinceNo) //省编号
+             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) //工单编码
+             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
+                                                                                                      //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
+             .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
+             //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
+             //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
+             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
+             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
+                                                                                                            //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
+                                                                                                            //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
+                                                                                                            //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
+             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
+             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == 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 == dto.FromPhone) //来电号码
+             .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact == dto.PhoneNo!) //联系电话
+                                                                                          //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
+             .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), x => x.OrderPushTypes.Any(opt => opt.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.Status.HasValue, d => d.Status == dto.Status) //工单状态
+                                                                        //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
+             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == 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.CurrentStepCode == 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 == dto.FromName) //来电人姓名
+                                                                                            //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
+                                                                                            //.WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
+             .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") > 0,
+                 d => d.AreaCode.StartsWith(SqlFunc.Substring(dto.AreaCode, 0, 4)))
+             .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") <= 0, d => d.AreaCode.StartsWith(dto.AreaCode))
+             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
+             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
+             .WhereIF(!string.IsNullOrEmpty(dto.SensitiveWord), d => SqlFunc.JsonArrayAny(d.Sensitive, dto.SensitiveWord))
+             .WhereIF(dto.IsSensitiveWord.HasValue && dto.IsSensitiveWord == true,
+                 d => d.Sensitive != null && SqlFunc.JsonArrayLength(d.Sensitive) > 0)
+             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
+             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "1", d => d.Source == ESource.ProvinceStraight &&
+                 d.SourceChannelCode == "SZMHD" && d.IsProvince == false) //政民互动直派
+             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "2", d => d.Source == ESource.ProvinceStraight &&
+                 d.SourceChannelCode == "SZMHD" && d.IsProvince == true) //政民互动
+             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Source == ESource.ProvinceStraight &&
+                 d.SourceChannelCode == "S12345" && d.IsProvince == true) //省12345
+             .WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval),
+                 d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
+             .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == true, d => d.CurrentStepAcceptTime != null)
+             .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == false, d => d.CurrentStepAcceptTime == null)
+             .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
+             .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
+             .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)
+             .OrderByDescending(d => d.CreationTime);
+
     }
 
     /// <summary>
@@ -2267,41 +2300,42 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     }
 
     #region 甄别
-    public ISugarQueryable<OrderScreen> OrderScreenList(ScreenListDto dto) {
-	    var handler = dto.TabStatus is EScreenStatus.Apply;
-	    var isAdmin = _orderDomainService.IsCheckAdmin();
-		ISugarQueryable<OrderScreen> query;
-
-		if (dto.source == 1)
-		{
-			query = _orderScreenRepository.Queryable(hasHandled: !handler, isAdmin: isAdmin);
-		}
-		else
-		{
-			query = _orderScreenRepository.Queryable(isAdmin: isAdmin)
-				.WhereIF(!isAdmin, x => x.CreatorOrgId.StartsWith(_sessionContext.RequiredOrgId));
-		}
-
-		query = query
-			.Includes(d => d.Order)
-			.Includes(d => d.VisitDetail)
-			.Includes(d => d.Visit, v => v.Order)
-			.Includes(d => d.Workflow)
-			.Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1)
-				.ToList())
-			.WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Visit.Order.Title.Contains(dto.Title!))
-			.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Visit.Order.No.Contains(dto.No!));
-		if (dto.TabStatus is EScreenStatus.Apply)
-		{
-			query.Where(d =>
-				(d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval ||
-				 (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)));
-		}
-
-		if (dto.TabStatus.HasValue && dto.Status == EScreenStatus.MyHandle)
-		{
-			query.Where(d => (d.Status != EScreenStatus.Apply));
-		}
+    public ISugarQueryable<OrderScreen> OrderScreenList(ScreenListDto dto)
+    {
+        var handler = dto.TabStatus is EScreenStatus.Apply;
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        ISugarQueryable<OrderScreen> query;
+
+        if (dto.source == 1)
+        {
+            query = _orderScreenRepository.Queryable(hasHandled: !handler, isAdmin: isAdmin);
+        }
+        else
+        {
+            query = _orderScreenRepository.Queryable(isAdmin: isAdmin)
+                .WhereIF(!isAdmin, x => x.CreatorOrgId.StartsWith(_sessionContext.RequiredOrgId));
+        }
+
+        query = query
+            .Includes(d => d.Order)
+            .Includes(d => d.VisitDetail)
+            .Includes(d => d.Visit, v => v.Order)
+            .Includes(d => d.Workflow)
+            .Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1)
+                .ToList())
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Visit.Order.Title.Contains(dto.Title!))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Visit.Order.No.Contains(dto.No!));
+        if (dto.TabStatus is EScreenStatus.Apply)
+        {
+            query.Where(d =>
+                (d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval ||
+                 (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)));
+        }
+
+        if (dto.TabStatus.HasValue && dto.Status == EScreenStatus.MyHandle)
+        {
+            query.Where(d => (d.Status != EScreenStatus.Apply));
+        }
         return query
             .WhereIF(dto.DataScope is 1, x => x.CreatorId == _sessionContext.RequiredUserId)
             .WhereIF(dto.Status.HasValue, x => x.Status == dto.Status)
@@ -2332,17 +2366,17 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), x => x.Order!.FromPhone! == dto.FromPhone!)
             .OrderByIF(dto is { SortRule: 0, SortField: "creationTime" }, x => x.CreationTime, OrderByType.Asc)
             .OrderByIF(dto is { SortRule: 1, SortField: "creationTime" } || dto.SortRule is null, x => x.CreationTime, OrderByType.Desc);
-	}
-	#endregion
-
-	#region private
-	/// <summary>
-	/// 接受外部工单(除省平台)
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <param name="cancellationToken"></param>
-	/// <returns></returns>
-	private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files, CancellationToken cancellationToken)
+    }
+    #endregion
+
+    #region private
+    /// <summary>
+    /// 接受外部工单(除省平台)
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(dto.ExternalId))
             throw new UserFriendlyException("工单外部编号不能为空");
@@ -2448,7 +2482,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 }
                 await _orderRepository.UpdateAsync(order, cancellationToken);
                 //处理回访和发布信息
-              
+
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == order.Id);
                 if (publish != null)
                 {
@@ -2464,11 +2498,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
                 }
 
-                var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == order.Id&& x.VisitState != EVisitState.None);
+                var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == order.Id && x.VisitState != EVisitState.None);
                 if (visit != null)
                 {
                     visit.VisitState = EVisitState.None;
-                    await _orderVisitRepository.UpdateAsync(visit,cancellationToken);
+                    await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
                 }
 
             }
@@ -2673,18 +2707,18 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (dto.IsHandled.HasValue)
         {
             var hasHandled = dto.IsHandled.Value;
-            query = query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>() 
-            .Where(step => step.ExternalId == d.Id && 
-                (hasHandled || step.Status != EWorkflowStepStatus.Handled) && 
-                (!hasHandled || step.Status == EWorkflowStepStatus.Handled && 
-                step.TraceState != EWorkflowTraceState.StepRemoveByPrevious) && 
-                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && 
-                step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) || 
-                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && 
-                step.HandlerOrgId == _sessionContextProvider.SessionContext.RequiredOrgId) || 
+            query = query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
+            .Where(step => step.ExternalId == d.Id &&
+                (hasHandled || step.Status != EWorkflowStepStatus.Handled) &&
+                (!hasHandled || step.Status == EWorkflowStepStatus.Handled &&
+                step.TraceState != EWorkflowTraceState.StepRemoveByPrevious) &&
+                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
+                step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
+                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
+                step.HandlerOrgId == _sessionContextProvider.SessionContext.RequiredOrgId) ||
                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
-                _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId)))).Any() || 
-                (string.IsNullOrEmpty(d.WorkflowId) && 
+                _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId)))).Any() ||
+                (string.IsNullOrEmpty(d.WorkflowId) &&
                 (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContextProvider.SessionContext.RequiredUserId))
             );
         }
@@ -2693,14 +2727,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             // 交办件:已派单其他节点的工单,该选项卡下工单若办结就不显示
             .WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 1, d => d.ProcessType == EProcessType.Jiaoban && d.Status < EOrderStatus.Filed)
             // 办结件:当前登录坐席作为最初受理人已办结的工单
-            .WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 2, d=> d.Status >= EOrderStatus.Filed && d.AcceptorId == _sessionContextProvider.SessionContext.RequiredUserId)
-            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince) 
-            .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status)) 
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!)) 
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) 
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode) 
-            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue) 
-            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null) 
+            .WhereIF(dto.TypeCode.HasValue == true && dto.TypeCode == 2, d => d.Status >= EOrderStatus.Filed && d.AcceptorId == _sessionContextProvider.SessionContext.RequiredUserId)
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+            .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
+            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
+            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
+            .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
             .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,
                d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
                     (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
@@ -2708,8 +2742,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now) //即将超期 未办
             .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-           //.Where(d => (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
-           //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
+            //.Where(d => (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
+            //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)

+ 77 - 21
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -5,6 +5,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
+using Novacode;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order
@@ -86,12 +87,12 @@ namespace Hotline.Share.Dtos.Order
 
         public string? OrderTagCode { get; set; }
 
-		#region 流程信息
+        #region 流程信息
 
-		/// <summary>
-		/// 工单开始时间(受理/接办时间=流程开启时间)
-		/// </summary>
-		public DateTime? StartTime { get; set; }
+        /// <summary>
+        /// 工单开始时间(受理/接办时间=流程开启时间)
+        /// </summary>
+        public DateTime? StartTime { get; set; }
 
         /// <summary>
         /// 交办时间(中心交部门办理时间)
@@ -130,19 +131,20 @@ namespace Hotline.Share.Dtos.Order
         public string AllDurationHour => GetAllDurationHour();
 
 
-		public string GetAllDurationHour() {
+        public string GetAllDurationHour()
+        {
 
-			if (Status >= EOrderStatus.Filed)
-			{
-                return  Math.Round(Math.Round((FiledTime - CreationTime).Value.TotalSeconds) / 60 / 60, 2).ToString() + "小时";
-			}
+            if (Status >= EOrderStatus.Filed)
+            {
+                return Math.Round(Math.Round((FiledTime - CreationTime).Value.TotalSeconds) / 60 / 60, 2).ToString() + "小时";
+            }
             return "-";
         }
 
-		/// <summary>
-		/// 办结时长(秒) 归档时间-受理时间(工单创建时间)
-		/// </summary>
-		public double? CreationTimeHandleDuration { get; set; }
+        /// <summary>
+        /// 办结时长(秒) 归档时间-受理时间(工单创建时间)
+        /// </summary>
+        public double? CreationTimeHandleDuration { get; set; }
 
         /// <summary>
         /// 办结工作日时长(秒)归档时间-受理时间(工单创建时间)
@@ -765,17 +767,71 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public bool? ProvinceSendBack { get; set; }
 
-		/// <summary>
-		/// 终止
-		/// </summary>
-		public List<OrderTerminateDto> OrderTerminates { get; set; }
+        /// <summary>
+        /// 终止
+        /// </summary>
+        public List<OrderTerminateDto> OrderTerminates { get; set; }
 
         /// <summary>
         /// 终止状态
         /// </summary>
         public string? OrderTerminateStatus { get; set; }
 
-	}
+        #region 回访信息
+
+        /// <summary>
+        /// 部门满意度
+        /// </summary>
+        public Kv? OrgEvaluate
+        {
+            get
+            {
+                var visitEntity = this.OrderVisits
+                            .OrderByDescending(m => m.CreationTime)
+                            .FirstOrDefault();
+                if (visitEntity == null) return null;
+                return visitEntity.NowEvaluate;
+            }
+        }
+
+
+        /// <summary>
+        /// 部门满意度
+        /// </summary>
+        public string? OrgEvaluateValue
+        {
+            get
+            {
+                var visitEntity = this.OrderVisits
+                           .OrderByDescending(m => m.CreationTime)
+                           .FirstOrDefault();
+                if (visitEntity == null) return null;
+                var now = visitEntity.NowEvaluate;
+                if (now == null) return null;
+
+                return now.Value;
+            }
+        }
+
+        /// <summary>
+        /// 坐席满意度
+        /// </summary>
+        public ESeatEvaluate? SeatEvaluate
+        {
+            get
+            {
+                var visitEntity = this.OrderVisits
+                          .OrderByDescending(m => m.CreationTime)
+                          .FirstOrDefault();
+                if (visitEntity == null) return null;
+                return visitEntity.OrderVisitDetails.Where(m => m.VisitTarget == EVisitTarget.Seat)
+                    .FirstOrDefault()?.SeatEvaluate;
+            }
+        }
+
+        public string? SeatEvaluateTxt => SeatEvaluate?.GetDescription();
+        #endregion
+    }
 
     public class UpdateOrderDto : AddOrderDto
     {
@@ -1212,8 +1268,8 @@ namespace Hotline.Share.Dtos.Order
         public int ExpiredTimeOrderCount { get; set; }
     }
     public class PublishAutomaticDelayDto
-	{
-	    public string OrderId { get; set; }
+    {
+        public string OrderId { get; set; }
     }
 
 

+ 33 - 27
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1942,20 +1942,23 @@ namespace Hotline.FlowEngine.Workflows
             if (dto.IsStartCountersign) return;
             if (workflow.IsInCountersign) return;
 
-            if (workflow.FlowType is EFlowType.Handle && nextStepDefine.BusinessType is EBusinessType.Seat or EBusinessType.Send)
+            if (workflow.FlowType is EFlowType.Handle)
             {
-                //坐席->派单不选办理对象时
-                workflow.UpdateCurrentStepWhenAssign(nextSteps.First(),
-                    new FlowStepHandler
-                    {
-                        OrgId = OrgSeedData.CenterId,
-                        OrgName = OrgSeedData.CenterName
-                    });
-            }
-            else
-            {
-                var nextHandler = dto.NextHandlers.First();
-                workflow.UpdateCurrentStepWhenAssign(nextSteps.First(), nextHandler);
+                if (nextStepDefine.BusinessType is EBusinessType.Seat or EBusinessType.Send)
+                {
+                    //坐席->派单不选办理对象时
+                    workflow.UpdateCurrentStepWhenAssign(nextSteps.First(),
+                        new FlowStepHandler
+                        {
+                            OrgId = OrgSeedData.CenterId,
+                            OrgName = OrgSeedData.CenterName
+                        });
+                }
+                else
+                {
+                    var nextHandler = dto.NextHandlers.First();
+                    workflow.UpdateCurrentStepWhenAssign(nextSteps.First(), nextHandler);
+                }
             }
         }
 
@@ -1966,20 +1969,23 @@ namespace Hotline.FlowEngine.Workflows
             if (workflow.IsInCountersign) return;
             if (nextStepDefine.StepType is EStepType.Summary or EStepType.End) return;
 
-            if (workflow.FlowType is EFlowType.Handle && nextStepDefine.BusinessType is EBusinessType.Seat or EBusinessType.Send)
+            if (workflow.FlowType is EFlowType.Handle)
             {
-                //坐席->派单不选办理对象时
-                workflow.UpdateActualStepWhenAssign(nextSteps.First(),
-                    new FlowStepHandler
-                    {
-                        OrgId = OrgSeedData.CenterId,
-                        OrgName = OrgSeedData.CenterName
-                    });
-            }
-            else
-            {
-                var nextHandler = dto.NextHandlers.First();
-                workflow.UpdateActualStepWhenAssign(nextSteps.First(), nextHandler);
+                if (nextStepDefine.BusinessType is EBusinessType.Seat or EBusinessType.Send)
+                {
+                    //坐席->派单不选办理对象时
+                    workflow.UpdateActualStepWhenAssign(nextSteps.First(),
+                        new FlowStepHandler
+                        {
+                            OrgId = OrgSeedData.CenterId,
+                            OrgName = OrgSeedData.CenterName
+                        });
+                }
+                else
+                {
+                    var nextHandler = dto.NextHandlers.First();
+                    workflow.UpdateActualStepWhenAssign(nextSteps.First(), nextHandler);
+                }
             }
 
             //if ( /*workflow.FlowType is EFlowType.Handle &&*/
@@ -2920,7 +2926,7 @@ namespace Hotline.FlowEngine.Workflows
                             $"TerminalDynamicMark parse to int failed, tMark: {currentStepDefine.TerminalDynamicMark}");
                     var leadRoleCode = _systemSettingCacheManager.GetSetting(SettingConstants.RoleLingDao)?.SettingValue[0];
                     var isLead = _sessionContextProvider.SessionContext.Roles.Any(x => x == leadRoleCode);
-                    return (currentOrgLevel <= tMark2) && (isLead  || _sessionContextProvider.SessionContext.OrgIsCenter);
+                    return (currentOrgLevel <= tMark2) && (isLead || _sessionContextProvider.SessionContext.OrgIsCenter);
                 case EDynamicPolicy.OrgDownCenterTop:
                 case EDynamicPolicy.OrgDown:
                     if (!int.TryParse(currentStepDefine.TerminalDynamicMark, out var tMark1))