Pārlūkot izejas kodu

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

田爽 1 gadu atpakaļ
vecāks
revīzija
1e2eff522f

+ 56 - 12
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -782,30 +782,74 @@ namespace Hotline.Api.Controllers.Bi
 
             //部门
             var listOrg = await _orderVisitDetailRepository.Queryable()
-                .Includes(x => x.OrderVisit)
-                .Where(x => x.OrderVisit.VisitTime >= StartDate && x.OrderVisit.VisitTime <= EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
-                .Select(x => new Satisfaction
-                {
-                    Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(x.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(x.OrgProcessingResults, "key", "2"), 1, 0)),
-                    Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(x.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(x.OrgProcessingResults, "key", "2"), 0, 1)),
-                }).ToListAsync();
+                .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
+                .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartDate && o.VisitTime <= EndDate && o.VisitState == EVisitState.Visited)
+                 .Select((it, o) => new Satisfaction
+                 {
+                     Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
+                     Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
+                 })
+                .ToListAsync();
 
             if (centerReportVisitd.Visitd > 0 && listOrg != null && listOrg.Count > 0 && listOrg[0].Satisfied > 0)
                 centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
 
             //坐席
             var listSet = await _orderVisitDetailRepository.Queryable()
-                .Includes(x => x.OrderVisit)
-                .Where(x => x.OrderVisit.VisitTime >= StartDate && x.OrderVisit.VisitTime <= EndDate && x.VisitTarget == EVisitTarget.Seat && x.OrderVisit.VisitState == EVisitState.Visited)
-                .Select(x => new Satisfaction
+                .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
+                .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartDate && o.VisitTime <= EndDate && o.VisitState == EVisitState.Visited)
+                .Select((it, o) => new Satisfaction
                 {
-                    Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
-                    Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && x.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
+                    Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
+                    Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
                 }).ToListAsync();
 
             if (centerReportVisitd.Visitd > 0 && listSet != null && listSet.Count > 0 && listSet[0].Satisfied > 0)
                 centerReportVisitd.SeatsRate = Math.Round((listSet[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
 
+            centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
+            #endregion
+
+            #region 信件分布情况
+            //市直部门
+            var listOrgStatisticsCityAll = await _orderRepository.Queryable()
+              .LeftJoin<SystemOrganize>((it, o) => it.CurrentHandleOrgCode == o.Id)
+              .Where((it, o) => (o.OrgType == EOrgType.City || o.OrgType == EOrgType.Province) && it.CreationTime >= StartDate && it.CreationTime <= EndDate)
+             .GroupBy((it, o) => new
+             {
+                 it.CurrentHandleOrgCode,
+                 o.Name
+             })
+              .Select((it, o) => new OrgStatistics
+              {
+                  CountNum = SqlFunc.AggregateCount(it.CurrentHandleOrgCode),
+                  OrgName = o.Name
+              }).ToListAsync();
+
+            centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
+            {
+                OrgStatistics = listOrgStatisticsCityAll
+            };
+
+            //区县部门
+            var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
+             .LeftJoin<SystemOrganize>((it, o) => it.CurrentHandleOrgCode == o.Id)
+             .Where((it, o) => o.OrgType == EOrgType.County && it.CreationTime >= StartDate && it.CreationTime <= EndDate)
+            .GroupBy((it, o) => new
+            {
+                it.CurrentHandleOrgCode,
+                o.Name
+            })
+             .Select((it, o) => new OrgStatistics
+             {
+                 CountNum = SqlFunc.AggregateCount(it.CurrentHandleOrgCode),
+                 OrgName = o.Name
+             }).ToListAsync();
+
+            centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
+            {
+                OrgStatistics = listOrgStatisticsAreaAll
+            }; 
             #endregion
 
             return centerReportStatisticsDto;

+ 7 - 3
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -1126,8 +1126,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var handlers = dto.NextHandlers;
 
         if (isStartCountersign)
+        {
+            var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
             //按会签策略判断,目前所有策略为org
-            return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+            return FlowAssignInfo.Create(assignType, handlers, isStartCountersign);
+        }
 
         //if (currentStep.IsInCountersign() && !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
         //    return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
@@ -1161,8 +1164,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 }
                 else
                 {
+                    var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
                     //按会签策略判断,目前所有策略为org
-                    return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+                    return FlowAssignInfo.Create(assignType, handlers, isStartCountersign);
                 }
             }
         }
@@ -1188,7 +1192,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 {
                     var roles = await _roleRepository.Queryable()
                         .Includes(d => d.Accounts, x => x.User)
-                        .Where(d => nextStepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Name))
+                        .Where(d => nextStepDefine.HandlerTypeItems.Select(x => x.Key).Contains(d.Name))
                         .ToListAsync(cancellationToken);
                     handlers = roles.SelectMany(d => d.Accounts).Distinct()
                         .Select(d => new Kv(d.Id, d.User.Name))

+ 2 - 2
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -207,8 +207,8 @@ namespace Hotline.Repository.SqlSugar.Extensions
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
-                //Log.Information("Sql: {0}", sql);
-                //Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
+                Log.Information("Sql: {0}", sql);
+                Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

+ 49 - 0
src/Hotline.Share/Dtos/CallCenter/CenterReportStatisticsDto.cs

@@ -18,6 +18,11 @@ namespace Hotline.Share.Dtos.CallCenter
         /// </summary>
         public CenterReportOrderDto CenterReportOrder { get; set; }
 
+        /// <summary>
+        /// 信件回访量
+        /// </summary>
+        public CenterReportVisitdDto CenterReportVisitd { get; set; }
+
         /// <summary>
         /// 来源
         /// </summary>
@@ -27,6 +32,16 @@ namespace Hotline.Share.Dtos.CallCenter
         /// 信件分类
         /// </summary>
         public List<CenterReportOrderSourceChannelDto> CenterReportOrderAcceptTypes { get; set; }
+
+        /// <summary>
+        /// 市直部门
+        /// </summary>
+        public OrgStatisticsAll OrgStatisticsCityAll { get; set; }
+
+        /// <summary>
+        /// 区县部门
+        /// </summary>
+        public OrgStatisticsAll OrgStatisticsAreaAll { get; set; }
     }
 
     /// <summary>
@@ -174,4 +189,38 @@ namespace Hotline.Share.Dtos.CallCenter
         /// </summary>
         public int Dissatisfied { get; set; }
     }
+
+    /// <summary>
+    /// 信件分布
+    /// </summary>
+    public class OrgStatisticsAll
+    {
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int OrgStatisticsCountAll => Totalize();
+
+        /// <summary>
+        /// 明细
+        /// </summary>
+        public List<OrgStatistics> OrgStatistics { get; set; }
+
+        public int Totalize()
+        {
+            int SunNum = 0;
+            foreach (var item in OrgStatistics)
+            {
+                SunNum += item.CountNum;
+            }
+
+            return SunNum;
+        }
+    }
+
+    public class OrgStatistics
+    {
+        public string OrgName { get; set; }
+
+        public int CountNum { get; set; }
+    }
 }

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

@@ -21,6 +21,11 @@ public class BasicWorkflowDto : EndWorkflowDto
 
     public EFlowDirection? FlowDirection { get; set; }
 
+    /// <summary>
+    /// 办理对象类型
+    /// </summary>
+    public EHandlerType HandlerType { get; set; }
+
     /// <summary>
     /// 根据办理者类型不同,此字段为不同内容
     /// <example>

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/Definition/StepDefineBasic.cs

@@ -30,7 +30,7 @@ namespace Hotline.Share.Dtos.FlowEngine.Definition
         public EBusinessType BusinessType { get; set; }
 
         /// <summary>
-        /// 办理类型
+        /// 办理对象类型
         /// </summary>
         public EHandlerType HandlerType { get; set; }
 

+ 13 - 0
src/Hotline/FlowEngine/FlowAssignInfo.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos;
+using Hotline.Share.Enums.FlowEngine;
 using XF.Domain.Entities;
 
 namespace Hotline.FlowEngine;
@@ -63,4 +64,16 @@ public class FlowAssignInfo
         HandlerObjects.Select(d => new Kv(d.Key, d.Value))
             .Distinct()
             .ToList();
+
+    public static EFlowAssignType GetAssignType(EHandlerType handlerType) =>
+        handlerType switch
+        {
+            EHandlerType.Role => EFlowAssignType.User,
+            EHandlerType.OrgLevel => EFlowAssignType.Org,
+            EHandlerType.OrgType => EFlowAssignType.Org,
+            EHandlerType.AssignedUser => EFlowAssignType.User,
+            EHandlerType.AssignedOrg => EFlowAssignType.Org,
+            _ => throw new ArgumentOutOfRangeException(nameof(handlerType), handlerType, null)
+        };
+
 }