Browse Source

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

tangjiang 8 months ago
parent
commit
035094c600

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

@@ -1212,7 +1212,8 @@ public class OrderController : BaseController
             FiledTypeOptions = EnumExts.GetDescriptions<FiledType>(),
             AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
             OrgsOptions = await _organizeRepository.GetOrgJson(),
-            CallForwardingOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource)
+            CallForwardingOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource),
+            JudgeStateOptions = EnumExts.GetDescriptions<EJudgeState>()
         };
     }
 

+ 10 - 52
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -292,7 +292,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// 工单退回(返回前一节点)
     /// </summary>
     public async Task<EFlowDirection> PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
-		ISessionContext current, CancellationToken cancellationToken)
+        ISessionContext current, CancellationToken cancellationToken)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
             withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -1168,19 +1168,17 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         {
             if (currentStep.IsCountersignEndStep)
             {
+                //汇总节点(非顶级)
                 if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
                 {
-                    //汇总节点(非顶级)
-                    //var csStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
-                    //if (csStartStep is null)
-                    //    throw new UserFriendlyException("未查询到会签开始节点");
-                    var csStartStep = GetCsLoopStartStep(workflow, currentStep);
-
-                    var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == csStartStep.PrevStepId);
-                    if (prevStep is null)
-                        throw new UserFriendlyException("未查询到目标节点的前一节点");
-
-                    return FlowAssignInfo.Create(prevStep.FlowAssignType.Value, prevStep.Handlers, isStartCountersign);
+                    if (dto.BackToCountersignEnd)
+                    {
+                        var csStartStep = GetCsLoopStartStep(workflow, currentStep);
+                        var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == csStartStep.PrevStepId);
+                        if (prevStep is null)
+                            throw new UserFriendlyException("未查询到目标节点的前一节点");
+                        return FlowAssignInfo.Create(prevStep.FlowAssignType.Value, prevStep.Handlers, isStartCountersign);
+                    }
                 }
             }
             else
@@ -1208,46 +1206,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             cancellationToken);
     }
 
-    //private async ValueTask<List<WorkflowStepHandler>> GetNextStepHandlersAsync(Workflow workflow,
-    //    StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
-    //{
-    //    var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
-    //    //var assignType = AssignInfo.GetAssignType(nextStepDefine.HandlerType, dto.NextHandlers.Any());
-    //    switch (assignType)
-    //    {
-    //        case EFlowAssignType.Org:
-    //            return dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-    //                assignType, orgId: d.Key, orgName: d.Value)).ToList();
-    //        case EFlowAssignType.User:
-    //            if (!dto.NextHandlers.Any() && dto.HandlerType is EHandlerType.Role)
-    //            {
-    //                var stepOption = await GetConfigStepAsync(EFlowType.Handle, nextStepDefine, cancellationToken);
-    //                var uIds = stepOption.Items.Select(d => d.Key).ToList();
-    //                var users1 = await _userRepository.Queryable()
-    //                    .Includes(d => d.Organization)
-    //                    .Where(d => uIds.Contains(d.Id))
-    //                    .ToListAsync(cancellationToken);
-    //                return users1.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-    //                        assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
-    //                    .ToList();
-    //            }
-    //            var userIds = dto.NextHandlers.Select(d => d.Key).ToList();
-    //            var users = await _userRepository.Queryable()
-    //                .Includes(d => d.Organization)
-    //                .Where(d => userIds.Contains(d.Id))
-    //                .ToListAsync(cancellationToken);
-    //            return users.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-    //                    assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
-    //                .ToList();
-    //        //case EFlowAssignType.Role:
-    //        //    handlers = dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-    //        //        assignType, roleId: d.Key, roleName: d.Value)).ToList();
-    //        //    break;
-    //        default:
-    //            throw new ArgumentOutOfRangeException();
-    //    }
-    //}
-
     /// <summary>
     /// 按流程模板配置创建下一步办理对象
     /// </summary>

+ 70 - 9
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -28,17 +28,22 @@ namespace Hotline.Repository.SqlSugar.Orders
         private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
         private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
+        private readonly ISessionContext _sessionContext;
+        private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
 
-		public OrderRepository(ISugarUnitOfWork<HotlineDbContext> uow,
+        public OrderRepository(ISugarUnitOfWork<HotlineDbContext> uow,
             IDataPermissionFilterBuilder dataPermissionFilterBuilder,
             IRepository<OrderSendBackAudit> orderSendBackAuditRepository,
-            IRepository<OrderVisit> orderVisitRepository
-			) : base(uow, dataPermissionFilterBuilder)
+            IRepository<OrderVisit> orderVisitRepository,
+            ISessionContext sessionContext,
+            IRepository<OrderVisitDetail> orderVisitDetailRepository) : base(uow, dataPermissionFilterBuilder)
         {
             _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
             _orderSendBackAuditRepository = orderSendBackAuditRepository;
             _orderVisitRepository = orderVisitRepository;
-		}
+            _sessionContext = sessionContext;
+            _orderVisitDetailRepository = orderVisitDetailRepository;
+        }
 
         public async Task<string> AddOrderNavAsync(Order order, CancellationToken cancellationToken)
         {
@@ -1078,7 +1083,7 @@ namespace Hotline.Repository.SqlSugar.Orders
 		        .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, d => d.CreationTime >= dto.StartTime && d.CreationTime <= dto.EndTime)
 		        .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, d => d.IdentityType == EIdentityType.Citizen)
 		        .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, d => d.IdentityType == EIdentityType.Enterprise)
-		        .GroupBy(d => d.CreationTime)
+		        .GroupBy(d => d.CreationTime.Hour.ToString())
 		        .Select((d, s) => new OrderCenterAcceptHourVo
 				{
 			        Hour = d.CreationTime.Hour.ToString(),
@@ -1088,8 +1093,9 @@ namespace Hotline.Repository.SqlSugar.Orders
 			        InvalidNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.AcceptType == "无效", 1, 0)),
 			        HandleNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status >= EOrderStatus.Filed, 1, 0)),
 			        NoHandleNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EOrderStatus.Filed, 1, 0)),
-			        BackNum = SqlFunc.AggregateSum(SqlFunc.IIF(s.OrderId != null && s.OrderId != "", 1, 0))
-		        });
+			        BackNum = SqlFunc.AggregateSum(SqlFunc.IIF(s.OrderId != null && s.OrderId != "", 1, 0)),
+			        DutyDeskNum = SqlFunc.AggregateDistinctCount(d.AcceptorId)
+				});
             var query = listHour.LeftJoin(data, (h, d) => h.ColumnName.ToString() == d.Hour)
                  .GroupBy((h,d)=> h.ColumnName)
                  .OrderBy((h, d) => h.ColumnName)
@@ -1102,8 +1108,9 @@ namespace Hotline.Repository.SqlSugar.Orders
                      InvalidNum = SqlFunc.AggregateSum(d.InvalidNum),
                      HandleNum = SqlFunc.AggregateSum(d.HandleNum),
                      NoHandleNum = SqlFunc.AggregateSum(d.NoHandleNum),
-                     BackNum = SqlFunc.AggregateSum(d.BackNum)
-                 });
+                     BackNum = SqlFunc.AggregateSum(d.BackNum),
+                     DutyDeskNum = SqlFunc.AggregateSum(d.DutyDeskNum)
+				 });
 			return query;
         }
 		public ISugarQueryable<SelectOrderId> OrderListUnionAll(ISugarQueryable<SelectOrderId> t1, ISugarQueryable<SelectOrderId> t2)
@@ -1238,6 +1245,60 @@ namespace Hotline.Repository.SqlSugar.Orders
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), x => x.Order.TransferPhone == dto.TransferPhone)
             .OrderByDescending(x => x.VisitTime);
         }
+
+        /// <summary>
+        /// 满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrgVisitDetailListResp> OrgVisitDetailList(OrgVisitDetailListReq dto)
+        {
+            var IsCenter = _sessionContext.OrgIsCenter;
+
+            return _orderVisitDetailRepository.Queryable()
+                .Includes(x => x.OrderVisit, x => x.Order)
+                .Includes(x => x.OrderVisit, x => x.Employee)
+                .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.VisitTarget == EVisitTarget.Org)
+                .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(dto.OrgVisitStatisticsType.HasValue, x => x.OrderVisit.Order.ProcessType == (EProcessType)((int)dto.OrgVisitStatisticsType))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
+                .WhereIF(!string.IsNullOrEmpty(dto.VisitUser), x => x.OrderVisit.Employee.Name.Contains(dto.VisitUser))
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order.Title.Contains(dto.Title))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgId), x => x.VisitOrgCode == dto.OrgId)//接办部门
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.OrderVisit.Order.HotspotSpliceName != null && x.OrderVisit.Order.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.OrderVisit.Order.SourceChannelCode == dto.Channel)//受理类型
+                .WhereIF(dto.CreationTimeStart.HasValue, x => x.OrderVisit.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始
+                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.OrderVisit.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+                .WhereIF(dto.ActualHandleTimeStart.HasValue, x => x.OrderVisit.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
+                .WhereIF(dto.ActualHandleTimeEnd.HasValue, x => x.OrderVisit.Order.ActualHandleTime <= dto.ActualHandleTimeEnd)//办结时间结束
+                .WhereIF(dto.VisitTimeStart.HasValue, x => x.OrderVisit.VisitTime >= dto.VisitTimeStart) //回访时间
+                .WhereIF(dto.VisitTimeEnd.HasValue, x => x.OrderVisit.VisitTime < dto.VisitTimeEnd) //回访时间
+                .OrderByDescending(x => x.OrderVisit.VisitTime)
+                .Select(x => new OrgVisitDetailListResp()
+                {
+                    Id = x.OrderVisit.Order.Id,
+                    VisitId = x.OrderVisit.Id,
+                    No = x.OrderVisit.No,
+                    ReTransactNum = x.OrderVisit.Order.ReTransactNum,
+                    OrderScreenStatus = SqlFunc.Subqueryable<OrderScreen>().Where(q => q.OrderId == x.OrderVisit.OrderId).OrderByDesc(q => q.CreationTime).Select(q => q.Status),
+                    VisitContent = x.VisitContent,
+                    HotspotSpliceName = x.OrderVisit.Order.HotspotSpliceName,
+                    OrgLevelOneName = x.OrderVisit.Order.OrgLevelOneName,
+                    ActualHandleOrgName = x.OrderVisit.Order.ActualHandleOrgName,
+                    CreationTime = x.CreationTime,
+                    Title = x.OrderVisit.Order.Title,
+                    VisitUser = x.OrderVisit.Employee.Name,
+                    VisitType = x.OrderVisit.VisitType,
+                    VisitTime = x.OrderVisit.VisitTime,
+                    OrgProcessingResults = SqlFunc.JsonField(x.OrgProcessingResults, "Value"),
+                    Content = x.OrderVisit.Order.Content,
+                    FileOpinion = x.OrderVisit.Order.FileOpinion,
+                    FiledTime = x.OrderVisit.Order.FiledTime,
+                    VisitOrgName = x.VisitOrgName
+                });
+
+        }
     }
 
     public class OrderScreenRepository : BaseRepositoryWorkflow<OrderScreen>, IOrderScreenRepository, IScopeDependency

+ 2 - 2
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -290,7 +290,7 @@ namespace Hotline.Share.Dtos.Order
 		/// <summary>
 		/// 重办次数
 		/// </summary>
-		public string ReTransactNum { get; set; }
+		public int? ReTransactNum { get; set; }
 
 		/// <summary>
 		/// 甄别状态
@@ -348,7 +348,7 @@ namespace Hotline.Share.Dtos.Order
 		/// <summary>
 		/// 回访时间
 		/// </summary>
-		public DateTime VisitTime { get; set; }
+		public DateTime? VisitTime { get; set; }
 
 		/// <summary>
 		/// 满意度

+ 7 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -424,6 +424,13 @@ public record OrgVisitDetailListReq: PagedKeywordRequest
     /// </summary>
     public DateTime? ActualHandleTimeStart { get; set; }
     public DateTime? ActualHandleTimeEnd { get; set; }
+
+    /// <summary>
+    /// 回访时间
+    /// </summary>
+    public DateTime? VisitTimeStart { get; set; }
+
+    public DateTime? VisitTimeEnd { get; set; }
 }
 
 

+ 6 - 1
src/Hotline/Orders/IOrderRepository.cs

@@ -164,7 +164,12 @@ namespace Hotline.Orders
         /// <returns></returns>
         ISugarQueryable<OrderVisit> VisitJudgeQuery(VisitJudgeQueryReq dto);
 
-
+        /// <summary>
+        /// 满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrgVisitDetailListResp> OrgVisitDetailList(OrgVisitDetailListReq dto);
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>