Browse Source

Merge branch 'test' into lib/test

libin 3 months ago
parent
commit
9c61312f9d
37 changed files with 964 additions and 124 deletions
  1. 26 4
      src/Hotline.Api/Controllers/Bi/BiCallController.cs
  2. 77 27
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  3. 1 1
      src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs
  4. 10 10
      src/Hotline.Api/Controllers/CommonPController.cs
  5. 4 2
      src/Hotline.Api/Controllers/OrderController.cs
  6. 9 0
      src/Hotline.Api/Controllers/Snapshot/IndustryController.cs
  7. 102 0
      src/Hotline.Api/Controllers/Snapshot/InviteCodeController.cs
  8. 50 0
      src/Hotline.Application.Tests/Application/InviteCodeApplicationTest.cs
  9. 7 0
      src/Hotline.Application.Tests/Application/RedPackApplicationTest.cs
  10. 2 0
      src/Hotline.Application.Tests/Application/SnapshotApplicationMockTest.cs
  11. 17 5
      src/Hotline.Application.Tests/Application/SnapshotApplicationTest.cs
  12. 0 1
      src/Hotline.Application.Tests/appsettings.Development.json
  13. 3 1
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  14. 1 1
      src/Hotline.Application/Orders/OrderApplication.cs
  15. 0 1
      src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs
  16. 7 0
      src/Hotline.Application/Snapshot/IIndustryApplication.cs
  17. 44 0
      src/Hotline.Application/Snapshot/IInviteCodeApplication.cs
  18. 19 0
      src/Hotline.Application/Snapshot/IndustryApplication.cs
  19. 115 0
      src/Hotline.Application/Snapshot/InviteCodeApplication.cs
  20. 6 1
      src/Hotline.Application/Snapshot/RedPackApplication.cs
  21. 30 1
      src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs
  22. 0 1
      src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs
  23. 2 0
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  24. 3 3
      src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs
  25. 18 0
      src/Hotline.Repository.SqlSugar/Snapshot/InviteCodeRecordRepository.cs
  26. 18 0
      src/Hotline.Repository.SqlSugar/Snapshot/InviteCodeRepository.cs
  27. 1 1
      src/Hotline.Share/Dtos/Bigscreen/BigscreenDto.cs
  28. 3 3
      src/Hotline.Share/Dtos/CallCenter/BiQueryCallsDto.cs
  29. 5 0
      src/Hotline.Share/Dtos/FlowEngine/NextStepsDto.cs
  30. 5 0
      src/Hotline.Share/Dtos/Order/OrderBiDto.cs
  31. 161 0
      src/Hotline.Share/Dtos/Snapshot/InviteCodeDto.cs
  32. 91 1
      src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs
  33. 13 0
      src/Hotline/Snapshot/Interfaces/IInviteCodeRepository.cs
  34. 11 0
      src/Hotline/Snapshot/Interfaces/InviteCodeRecord.cs
  35. 37 31
      src/Hotline/Snapshot/InviteCode.cs
  36. 35 29
      src/Hotline/Snapshot/InviteCodeRecord.cs
  37. 31 0
      src/Hotline/dataview.md

+ 26 - 4
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -576,7 +576,7 @@ public class BiCallController : BaseController
             Date = "合计",
             PersonCallInCount = list.Sum(x=>x.PersonCallInCount),
             PersonCallInPutthroughCount = list.Sum(x=>x.PersonCallInPutthroughCount),
-            PersonRingOffCount = list.Sum(x=>x.PersonRingOffCount),//个人服务挂断
+            //PersonRingOffCount = list.Sum(x=>x.PersonRingOffCount),//个人服务挂断
             PersonQueueOffCount = list.Sum(x=>x.PersonQueueOffCount),//个人服务队列挂断
             PersonWaitOffCount = list.Sum(x=>x.PersonWaitOffCount) //个人服务等待挂断
         };
@@ -609,7 +609,7 @@ public class BiCallController : BaseController
             Date = "合计",
             EnterpriseCallInCount = list.Sum(x=>x.EnterpriseCallInCount),
             EnterpriseCallInPutthroughCount = list.Sum(x=>x.EnterpriseCallInPutthroughCount),
-            EnterpriseRingOffCount = list.Sum(x=>x.EnterpriseRingOffCount), //企业挂断
+            //EnterpriseRingOffCount = list.Sum(x=>x.EnterpriseRingOffCount), //企业挂断
             EnterpriseQueueOffCount = list.Sum(x=>x.EnterpriseQueueOffCount),//个人服务队列挂断
             EnterpriseWaitOffCount = list.Sum(x=>x.EnterpriseWaitOffCount) //个人服务等待挂断
         };
@@ -743,10 +743,32 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-seat-monthcall-detail/export")]
-    public async Task<FileStreamResult> QuerySeatMonthCallDetailExport([FromBody]ExportExcelDto<QuerySeatMonthCallDetailRequest> dto)
+    public async Task<FileStreamResult> QuerySeatMonthCallDetailExport([FromBody] ExportExcelDto<QuerySeatMonthCallDetailRequest> dto)
     {
+        var query = _callReportApplication.QuerySeatMonthCallDetail(dto.QueryDto);
+        List<QuerySeatMonthCallDetailResp> data;
+        if (dto.IsExportAll)
+        {
+            data = await query.ToListAsync(HttpContext.RequestAborted);
+        }
+        else
+        {
+            var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+            data = items;
+        }
+
+        var dataDtos = _mapper.Map<ICollection<QuerySeatMonthCallDetailResp>>(data);
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = dataDtos
+            .Select(stu => _mapper.Map(stu, typeof(QuerySeatMonthCallDetailResp), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
 
-        return null;
+        return ExcelStreamResult(stream, "坐席月接通明细");
     }
 
     #endregion

+ 77 - 27
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -966,6 +966,83 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "部门延期统计明细数据");
         }
 
+
+        /// <summary>
+        /// 部门延期统计明细-单独菜单
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("order_delay_detail")]
+        public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetailAsync([FromQuery] QueryOrderDelayDataDetailRequest dto)
+        {
+            var query = _orderDelayRepository.Queryable()
+                 .Includes(x => x.Order)
+                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(dto.TypeId != null && dto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
+                .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
+                 .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
+                 .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
+                 .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
+                 .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
+             .MergeTable();
+
+            if (_sessionContext.OrgIsCenter == false)
+                query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
+
+            var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
+        }
+
+        /// <summary>
+        /// 部门延期统计明细-单独菜单 导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("order-delay-detail/exprot")]
+        public async Task<FileStreamResult> ExportQueryOrderDelayDataDetailAsync([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
+        {
+            var query = _orderDelayRepository.Queryable()
+                 .Includes(x => x.Order)
+                 .WhereIF(dto.QueryDto.StartTime.HasValue, x => x.CreationTime >= dto.QueryDto.StartTime)
+                 .WhereIF(dto.QueryDto.EndTime.HasValue, x => x.CreationTime <= dto.QueryDto.EndTime)
+                .WhereIF(dto.QueryDto.TypeId != null && dto.QueryDto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
+                .WhereIF(dto.QueryDto.TypeId != null && dto.QueryDto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
+                 .WhereIF(dto.QueryDto.Type is 1, x => x.DelayState == EDelayState.Pass)
+                 .WhereIF(dto.QueryDto.Type is 2, x => x.DelayState == EDelayState.NoPass)
+                 .WhereIF(dto.QueryDto.Type is 3, x => x.DelayState == EDelayState.Examining)
+                 .WhereIF(dto.QueryDto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
+             .MergeTable();
+
+            if (_sessionContext.OrgIsCenter == false)
+                query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
+
+            List<OrderDelay> list;
+            if (dto.IsExportAll)
+            {
+                list = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                list = items;
+            }
+
+
+            var orderDtos = _mapper.Map<ICollection<OrderDelayDto>>(list);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "部门延期统计明细数据");
+
+        }
+
         /// <summary>
         /// 特提统计
         /// </summary>
@@ -5512,33 +5589,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "扭转信件统计");
         }
 
-        /// <summary>
-        /// 部门延期统计明细-单独菜单
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("order_delay_detail")]
-        public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetailAsync([FromQuery] QueryOrderDelayDataDetailRequest dto)
-        {
-            var query = _orderDelayRepository.Queryable()
-                 .Includes(x => x.Order)
-                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-                .WhereIF(dto.TypeId != null && dto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
-                .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
-                 .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
-                 .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
-                 .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
-                 .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
-             .MergeTable();
-
-            if (_sessionContext.OrgIsCenter == false)
-                query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
-
-            var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
-            return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
-        }
-
         /// <summary>
         /// 工单热词分析
         /// </summary>

+ 1 - 1
src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs

@@ -631,7 +631,7 @@ namespace Hotline.Api.Controllers.Bigscreen
                  .CountAsync()
             };
             var da = await _orderSecondaryHandlingRepository.Queryable()
-                .LeftJoin<OrderVisit>((os, ov) => os.VisitId == ov.Id)
+                .LeftJoin<OrderVisit>((os, ov) => os.OrderId == ov.OrderId)
                     .LeftJoin<OrderVisitDetail>((os, ov, od) => ov.Id == od.VisitId)
                     .Where((os, ov, od) => ov.VisitState == EVisitState.Visited && od.VisitTarget == EVisitTarget.Org && ov.VisitTime >= StartTime && ov.VisitTime <= EndTime
                     && os.State != ESecondaryHandlingState.NotApply

+ 10 - 10
src/Hotline.Api/Controllers/CommonPController.cs

@@ -432,20 +432,20 @@ namespace Hotline.Api.Controllers
 					.ToListAsync();
 				var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
 				 x.Time > DateTime.Now && x.Status < EOrderStatus.Filed && DateTime.Now < x.NearlyExpiredTime
-				).OrderBy(x=>x.Time).Take(40).ToList();
+				).OrderBy(x=>x.Time).ToList();
 				waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
 				//allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
 				//allList.AddRange(waitedList);
 				//已超期
 				var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
 				                                                      (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed))
-														  .OrderBy(x=> x.Time).Take(40).ToList();
+														  .OrderBy(x=> x.Time).ToList();
 				waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
 				waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
 				//allNum += waitedExpiredDataList.Count;
 				//allList.AddRange(waitedExpiredDataList);
 				//会签待办
-				var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
+				var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).ToList();
 				signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
 				signDataList.ForEach(x => x.Type = "Sign");
 				
@@ -467,7 +467,7 @@ namespace Hotline.Api.Controllers
 						Time = d.Order.ExpiredTime,
 						Status = d.Order.Status,
 						CounterSignType = d.Order.CounterSignType
-					}).Take(40)
+					})
 					.ToListAsync();
 				//allNum += screenDataList.Count;
 				//allList.AddRange(screenDataList);
@@ -487,7 +487,7 @@ namespace Hotline.Api.Controllers
 						Time = d.Order.ExpiredTime,
 						Status = d.Order.Status,
 						CounterSignType = d.Order.CounterSignType
-					}).Take(40)
+					})
 					.ToListAsync();
 				//allNum += delayDataList.Count;
 				//allList.AddRange(delayDataList);
@@ -518,7 +518,7 @@ namespace Hotline.Api.Controllers
 					Time = x.OrderVisit.Order.ExpiredTime,
 					Status = x.OrderVisit.Order.Status,
 					CounterSignType = x.OrderVisit.Order.CounterSignType
-				}).Take(40).ToListAsync();
+				}).ToListAsync();
 				//allNum += screenApplyDataList.Count;
 				//allList.AddRange(screenApplyDataList);
 				//退回待审批
@@ -538,7 +538,7 @@ namespace Hotline.Api.Controllers
 						Time = d.Order.ExpiredTime,
 						Status = d.Order.Status,
 						CounterSignType = d.Order.CounterSignType
-					}).Take(40)
+					})
 					.ToListAsync();
 				//allNum += sendBackAuditDataList.Count;
 				//allList.AddRange(sendBackAuditDataList);
@@ -564,14 +564,14 @@ namespace Hotline.Api.Controllers
 						Time = d.ExpiredTime,
 						Status = d.Status,
 						CounterSignType = d.CounterSignType
-					}).Take(40)
+					})
 					.ToListAsync();
 				return new
 				{
 					//AllNum = allNum,
 					//AllList = allList,
-					WaitedNum = waitedList.Count > 40 ? 40 : waitedList.Count,
-					WaitedList = waitedList.Take(40).ToList(),
+					WaitedNum = waitedList.Count,
+					WaitedList = waitedList.ToList(),
 					WaitedExpiredNum = waitedExpiredDataList.Count,
 					WaitedExpiredList = waitedExpiredDataList,
 					SignDataNum = signDataList.Count,

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

@@ -1985,11 +1985,11 @@ public class OrderController : BaseController
         if (int.Parse(setting?.SettingValue[0]) != 0 && !_sessionContext.OrgIsCenter)
         {
             int count = await _orderDelayRepository.CountAsync(x =>
-                x.OrderId == delaydto.OrderId && x.ApplyOrgCode == _sessionContext.RequiredOrgId && x.DelayState == EDelayState.Pass);
+                x.OrderId == delaydto.OrderId && x.ApplyOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == _sessionContext.RequiredOrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) && x.DelayState == EDelayState.Pass);
             if (_appOptions.Value.IsZiGong)
             {
                 count = await _orderDelayRepository.CountAsync(x =>
-                    x.OrderId == delaydto.OrderId && x.ApplyOrgCode == _sessionContext.RequiredOrgId &&
+                    x.OrderId == delaydto.OrderId &&  x.ApplyOrgCode == _sessionContext.RequiredOrgId &&
                     (x.DelayState == EDelayState.Pass || x.DelayState == EDelayState.NoPass));
             }
 
@@ -4036,6 +4036,7 @@ public class OrderController : BaseController
         if (orderId.NotNullOrEmpty())
         {
             outDto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
+            outDto.Content = (await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted))?.Content;
         }
 
         //随手拍
@@ -4365,6 +4366,7 @@ public class OrderController : BaseController
             throw UserFriendlyException.SameMessage("该工单未开启流程");
         var dto = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
         dto.ExpiredTime = order.ExpiredTime;
+        dto.Content = order.Content;
         var rsp = _mapper.Map<NextStepsWithOpinionDto<RecommendStepOption>>(dto);
         foreach (var step in rsp.Steps)
         {

+ 9 - 0
src/Hotline.Api/Controllers/Snapshot/IndustryController.cs

@@ -176,6 +176,15 @@ public class IndustryController : BaseController
     [HttpGet("sms_template/{id}")]
     public async Task<SnapshotSMSTemplateItemsOutDto> GetSMSTemplateDetailAsync(string id)
         => await _industryApplication.GetSMSTemplateDetailAsync(id);
+
+    /// <summary>
+    /// 删除短信模板
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    [HttpDelete("sms_template")]
+    public async Task DeleteSmsTemplateAsync([FromBody] IList<string> ids)
+        => await _industryApplication.DeleteSMSTemplateAsync(ids);
     #endregion
 
     #region 区域从业人员

+ 102 - 0
src/Hotline.Api/Controllers/Snapshot/InviteCodeController.cs

@@ -0,0 +1,102 @@
+using Hotline.Application.Snapshot;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Share.Tools;
+using Hotline.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Microsoft.AspNetCore.Mvc;
+using System.ComponentModel;
+
+namespace Hotline.Api.Controllers.Snapshot;
+
+/// <summary>
+/// 邀请码管理
+/// </summary>
+[Description("邀请码管理")]
+public class InviteCodeController : BaseController
+{
+    private readonly IInviteCodeApplication _inviteCodeApplication;
+
+    public InviteCodeController(IInviteCodeApplication inviteCodeApplication)
+    {
+        _inviteCodeApplication = inviteCodeApplication;
+    }
+
+    /// <summary>
+    /// 获取添加邀请码基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("basedata")]
+    public async Task<Dictionary<string, object>> GetBasedataAsync()
+    {
+        return new Dictionary<string, object>
+        {
+            { "OrgName", await _inviteCodeApplication.GetInviteCodeItemsAsync().Where(m => m.ParentOrgId == null)
+            .Select(m => new Kv{ Key = m.Id, Value = m.OrgName}).ToListAsync() }
+        };
+    }
+
+    /// <summary>
+    /// 获取邀请码集合
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet]
+    public async Task<PagedDto<InviteCode>> GetInviteCodeItemsAsync([FromQuery] GetInviteCodeItemsInDto dto)
+        => (await _inviteCodeApplication.GetInviteCodeItemsAsync().ToPagedListAsync(dto)).ToPaged();
+
+
+    /// <summary>
+    /// 删除邀请码
+    /// </summary>
+    /// <returns></returns>
+    [HttpDelete]
+    public async Task DeleteInviteCodeAsync([FromBody] IList<string> ids)
+        => await _inviteCodeApplication.DeleteInviteCodeAsync(ids);
+
+    /// <summary>
+    /// 邀请码详情
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+
+    [HttpGet("{id}")]
+    public async Task<InviteCode> GetInviteCodeDetailAsync( string id)
+        => await _inviteCodeApplication.GetInviteCodeItemsAsync().Where(m => m.Id == id).FirstAsync();
+
+    /// <summary>
+    /// 修改邀请码
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPut]
+    public async Task UpdateInviteCodeAsync([FromBody] UpdateInviteCodeInDto dto)
+        => await _inviteCodeApplication.UpdateInviteCodeAsync(dto);
+
+    /// <summary>
+    /// 添加部门邀请码
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost]
+    public async Task AddInviteCodeAsync([FromBody] AddInviteCodeInDto dto)
+        => await _inviteCodeApplication.AddInviteCodeAsync(dto);
+
+    /// <summary>
+    /// 邀请码统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("statistic")]
+    public async Task<IList<InviteCodeStatisticOutDto>> GetInviteCodeStatisticAsync([FromQuery] GetInviteCodeStatisticInDto dto)
+        => await _inviteCodeApplication.GetInviteCodeStatisticAsync(dto);
+
+    /// <summary>
+    /// 邀请码统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("statistic/detail")]
+    public async Task<PagedDto<InviteCodeStatisticDetailOutDto>> GetInviteCodeStatisticDetailAsync([FromQuery] GetInviteCodeStatisticDetailInDto dto)
+        => (await _inviteCodeApplication.GetInviteCodeStatisticDetailAsync(dto).ToPagedListAsync(dto)).ToPaged();
+}

+ 50 - 0
src/Hotline.Application.Tests/Application/InviteCodeApplicationTest.cs

@@ -0,0 +1,50 @@
+using Hotline.Api.Controllers;
+using Hotline.Application.Snapshot;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Hotline.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Shouldly;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests.Application;
+public class InviteCodeApplicationTest : TestBase
+{
+    private readonly IInviteCodeApplication _inviteCodeApplication;
+
+    public InviteCodeApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdIdentiyService, IThirdAccountRepository thirdAccountRepository, IInviteCodeApplication inviteCodeApplication) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdIdentiyService, thirdAccountRepository)
+    {
+        _inviteCodeApplication = inviteCodeApplication;
+    }
+
+    [Fact]
+    public async Task InviteCode_Test()
+    {
+        var inDto = new AddInviteCodeInDto
+        {
+            OrgName = "测试部门" + DateTime.Now.ToString("ss"),
+            BeginCode = 100,
+            EndCode = 200,
+        };
+
+        await _inviteCodeApplication.AddInviteCodeAsync(inDto);
+
+        var items = _inviteCodeApplication.GetInviteCodeItemsAsync().ToList();
+        items.Count.ShouldNotBe(0);
+
+        var statics = await _inviteCodeApplication.GetInviteCodeStatisticAsync(new GetInviteCodeStatisticInDto 
+        {
+            StartTime = DateTime.Now.AddDays(-1),
+            EndTime = DateTime.Now
+        });
+        statics.Count.ShouldNotBe(0);
+    }
+}

+ 7 - 0
src/Hotline.Application.Tests/Application/RedPackApplicationTest.cs

@@ -61,6 +61,13 @@ public class RedPackApplicationTest : TestBase
         var recordItems = await _redPackApplication.GetRedPackRecordItemsAsync(new SnapshotRedPackRecordItemsInDto { Status =2}).ToListAsync();
         recordItems.Count.ShouldNotBe(0);
 
+        var redPackRecord = recordItems.First();
+        var redPackRecordEntity = await _redPackRecordRepository.GetAsync(redPackRecord.Id);
+        redPackRecordEntity.PickupStatus = ERedPackPickupStatus.Received;
+        redPackRecordEntity.DistributionState = EReadPackSendStatus.Successful;
+        redPackRecordEntity.ReceiveTime = DateTime.Now;
+        await _redPackRecordRepository.UpdateAsync(redPackRecordEntity);
+
         var sendRecordItems = await _redPackApplication.GetRedPackRecordDetailAsync(new SnapshotRedPackRecordSendInDto
         {
             IsReceive = true,

+ 2 - 0
src/Hotline.Application.Tests/Application/SnapshotApplicationMockTest.cs

@@ -108,6 +108,8 @@ namespace Hotline.Application.Tests.Snapshot
                 null,
                 null,
                 null,
+                null,
+                null,
                 null
             );
         }

+ 17 - 5
src/Hotline.Application.Tests/Application/SnapshotApplicationTest.cs

@@ -78,7 +78,7 @@ public class SnapshotApplicationTest : TestBase
     {
         var items = await _orderSnapshotApplication.GetOrderSnapshotPublishItemsAsync(new GetOrderSnapshotPublishItemsInDto()).ToPageListAsync(0, 10);
         items.NotNullOrEmpty().ShouldBeTrue();
-        items = await _orderSnapshotApplication.GetOrderSnapshotPublishItemsAsync(new GetOrderSnapshotPublishItemsInDto 
+        items = await _orderSnapshotApplication.GetOrderSnapshotPublishItemsAsync(new GetOrderSnapshotPublishItemsInDto
         {
             OrderStatus = EOrderStatus.Filed
         }).ToPageListAsync(0, 10);
@@ -348,10 +348,22 @@ public class SnapshotApplicationTest : TestBase
     [Fact]
     public async Task SaveInvitationCode_Test()
     {
-        var code = DateTime.Now.ToShortTimeString();
-        await _snapshotApplication.SaveInvitationCodeAsync(new SaveInvitationCodeInDto { InvitationCode = code });
-        var third = await _thirdAccountRepository.GetByOpenIdAsync(_sessionContext.OpenId);
-        third.InvitationCode.ShouldBe(code);
+        var code = new Random().Next(100, 200).ToString();
+        try
+        {
+            await _thirdAccountRepository.Updateable()
+                .SetColumns(m => m.InvitationCode, null)
+                .Where(m => m.OpenId == _sessionContext.OpenId)
+                .ExecuteCommandAsync();
+            await _snapshotApplication.SaveInvitationCodeAsync(new SaveInvitationCodeInDto { InvitationCode = code });
+            var third = await _thirdAccountRepository.GetByOpenIdAsync(_sessionContext.OpenId);
+            third.InvitationCode.ShouldBe(code);
+        }
+        catch (Exception e)
+        {
+            var msg = e.Message;
+            throw;
+        }
     }
 
     /// <summary>

+ 0 - 1
src/Hotline.Application.Tests/appsettings.Development.json

@@ -70,7 +70,6 @@
     "ConnectionStrings": {
         "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
         "CAP": "PORT=5432;DATABASE=fwmq;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;Search Path=cap"
-        //"Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
     },
     "Cache": {
         "Host": "110.188.24.182",

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

@@ -861,7 +861,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             NextStepOption nextStepOption;
 
             //汇总节点只能选择对应节点办理对象
-            if (workflow.FlowType is EFlowType.Handle && stepDefine.StepType is EStepType.Summary)
+            if (workflow.FlowType is EFlowType.Handle 
+                && stepDefine.StepType is EStepType.Summary
+                && stepDefine.BusinessType is EBusinessType.Seat or EBusinessType.Send)
             {
                 var handler = _workflowDomainService.GetSummaryTargetFlowStepHandler(workflow, stepDefine.SummaryTargetCode);
 

+ 1 - 1
src/Hotline.Application/Orders/OrderApplication.cs

@@ -3250,7 +3250,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         query = query.WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough, d => d.IsPutThrough == false && d.VisitState != EVisitState.Visited)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough, d => d.IsPutThrough == false && d.VisitState != EVisitState.Visited && d.VisitState != EVisitState.None)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.ChipVoiceVisiting, d => d.VisitState == EVisitState.AiVisiting)//任务 162:回访状态快捷查询条件
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)

File diff suppressed because it is too large
+ 0 - 1
src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs


+ 7 - 0
src/Hotline.Application/Snapshot/IIndustryApplication.cs

@@ -177,4 +177,11 @@ public interface IIndustryApplication
     /// <param name="dto"></param>
     /// <returns></returns>
     ISugarQueryable<IndustryLogItemsOutDto> GetIndustryLogItemsAsync(IndustryLogItemsInDto dto);
+
+    /// <summary>
+    /// 删除行业短信模板
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    Task DeleteSMSTemplateAsync(IList<string> ids);
 }

+ 44 - 0
src/Hotline.Application/Snapshot/IInviteCodeApplication.cs

@@ -0,0 +1,44 @@
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Snapshot;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Snapshot;
+public interface IInviteCodeApplication
+{
+    Task AddInviteCodeAsync(AddInviteCodeInDto dto);
+
+    /// <summary>
+    /// 删除邀请码
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    Task DeleteInviteCodeAsync(IList<string> ids);
+    ISugarQueryable<InviteCode> GetInviteCodeItemsAsync();
+
+    /// <summary>
+    /// 邀请码统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    Task<IList<InviteCodeStatisticOutDto>> GetInviteCodeStatisticAsync(GetInviteCodeStatisticInDto dto);
+
+    /// <summary>
+    /// 邀请码统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<InviteCodeStatisticDetailOutDto> GetInviteCodeStatisticDetailAsync(GetInviteCodeStatisticDetailInDto dto);
+
+    /// <summary>
+    /// 修改邀请码
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    Task UpdateInviteCodeAsync(UpdateInviteCodeInDto dto);
+}

+ 19 - 0
src/Hotline.Application/Snapshot/IndustryApplication.cs

@@ -399,5 +399,24 @@ public class IndustryApplication : IIndustryApplication, IScopeDependency
         return query;
     }
 
+    /// <summary>
+    /// 删除行业短信模板
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    public async Task DeleteSMSTemplateAsync(IList<string> ids)
+    {
+        await _snapshotSMSTemplateRepository.Queryable()
+            .Where(m => ids.Contains(m.Id))
+            .ToListAsync()
+            .Then(async sms => {
+                for (int i = 0;i < sms.Count;i++)
+                {
+                    sms[i].IsDeleted = true;
+                    await _snapshotSMSTemplateRepository.UpdateAsync(sms[i]);
+                }
+            });
+    }
+
     #endregion
 }

+ 115 - 0
src/Hotline.Application/Snapshot/InviteCodeApplication.cs

@@ -0,0 +1,115 @@
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Share.Tools;
+using Hotline.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Hotline.Tools;
+using Mapster;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
+
+namespace Hotline.Application.Snapshot;
+public class InviteCodeApplication : IInviteCodeApplication, IScopeDependency
+{
+    private readonly IInviteCodeRepository _inviteCodeRepository;
+    private readonly IInviteCodeRecordRepository _inviteCodeRecordRepository;
+
+    public InviteCodeApplication(IInviteCodeRepository inviteCodeRepository, IInviteCodeRecordRepository inviteCodeRecordRepository)
+    {
+        _inviteCodeRepository = inviteCodeRepository;
+        _inviteCodeRecordRepository = inviteCodeRecordRepository;
+    }
+
+    public async Task AddInviteCodeAsync(AddInviteCodeInDto dto)
+    {
+        if (_inviteCodeRepository.Queryable().Where(m => m.OrgName == dto.OrgName).Any())
+        {
+            throw UserFriendlyException.SameMessage("部门名称已存在");
+        }
+        var entity = dto.Adapt<InviteCode>();
+        if (dto.BeginCode >= dto.EndCode)
+        {
+            throw UserFriendlyException.SameMessage("开始邀请码不能大于结束邀请码");
+        }
+        await _inviteCodeRepository.AddAsync(entity);
+    }
+
+    /// <summary>
+    /// 删除邀请码
+    /// </summary>
+    /// <param name="ids"></param>
+    /// <returns></returns>
+    public async Task DeleteInviteCodeAsync(IList<string> ids)
+    {
+        await _inviteCodeRepository.Queryable()
+            .Where(m => ids.Contains(m.Id))
+            .ToListAsync()
+            .Then(async invite =>
+            {
+                for (int i = 0;i < invite.Count;i++)
+                {
+                    invite[i].IsDeleted = true;
+                    await _inviteCodeRepository.UpdateAsync(invite[i]);
+                }
+            });
+    }
+
+    public ISugarQueryable<InviteCode> GetInviteCodeItemsAsync()
+    {
+        return _inviteCodeRepository.Queryable();
+    }
+
+    public async Task<IList<InviteCodeStatisticOutDto>> GetInviteCodeStatisticAsync(GetInviteCodeStatisticInDto dto)
+    {
+        dto.ValidateObject();
+        var items = await _inviteCodeRecordRepository.Queryable()
+            .Where(m => m.CreationTime >= dto.StartTime && m.CreationTime <= dto.EndTime)
+            .GroupBy(m => new { m.Id, m.OrgName })
+            .Select(m => new InviteCodeStatisticOutDto
+            { 
+                Id = m.Id, 
+                OrgName = m.OrgName,
+                Count = SqlFunc.AggregateCount(m.OrgName)
+            })
+            .ToListAsync();
+        return items;
+    }
+
+    /// <summary>
+    /// 邀请码统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<InviteCodeStatisticDetailOutDto> GetInviteCodeStatisticDetailAsync(GetInviteCodeStatisticDetailInDto dto)
+    {
+        dto.ValidateObject();
+        var query = _inviteCodeRecordRepository.Queryable()
+            .Where(m => m.CreationTime >= dto.StartTime && m.CreationTime <= dto.EndTime && m.OrgId == dto.OrgId)
+            .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name))
+            .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber))
+            .WhereIF(dto.InviteCode.NotNullOrEmpty(), m => m.InviteCode.Contains(dto.InviteCode))
+            .Select(m => new InviteCodeStatisticDetailOutDto
+            { 
+                OpenId = m.WXOpenId
+            }, true);
+        return query;
+    }
+
+    public async Task UpdateInviteCodeAsync(UpdateInviteCodeInDto dto)
+    {
+        var entity = await _inviteCodeRepository.GetAsync(dto.Id)
+            ?? throw UserFriendlyException.SameMessage("邀请码不存在");
+
+        dto.Adapt(entity);
+        if (dto.BeginCode >= dto.EndCode)
+        {
+            throw UserFriendlyException.SameMessage("开始邀请码不能大于结束邀请码");
+        }
+        await _inviteCodeRepository.UpdateAsync(entity);
+    }
+}

+ 6 - 1
src/Hotline.Application/Snapshot/RedPackApplication.cs

@@ -481,7 +481,12 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
             .WhereIF(dto.SendStatus.HasValue, m => m.DistributionState == dto.SendStatus)
             .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == true, m => m.PickupStatus == ERedPackPickupStatus.Received)
             .WhereIF(dto.IsReceive.HasValue && dto.IsReceive == false, m => m.PickupStatus == ERedPackPickupStatus.Unreceived)
-            .Select(m => new SnapshotRedPackRecordSendOutDto());
+            .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, m => m.CreationTime >= dto.BeginCreationTime && m.CreationTime <= dto.EndCreationTime)
+            .Select(m => new SnapshotRedPackRecordSendOutDto
+            { 
+                OrderId = m.OrderId,
+                UserType = m.PeopleType
+            }, true);
         return query;
     }
 

+ 30 - 1
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -77,8 +77,10 @@ public abstract class SnapshotApplicationBase
     private readonly IRedPackGuiderAuditRepository _redPackGuiderAuditRepository;
     private readonly IOrderVisitRepository _orderVisitRepository;
     private readonly IOrderVisitDetailRepository _orderVisitDetailRepository;
+    private readonly IInviteCodeRecordRepository _inviteCodeRecordRepository;
+    private readonly IInviteCodeRepository _inviteCodeRepository;
 
-    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository)
+    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IGuiderInfoRepository guiderInfoRepository, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository, IInviteCodeRecordRepository inviteCodeRecordRepository, IInviteCodeRepository inviteCodeRepository)
     {
         _thirdLoginService = thirdLoginService;
         _industryRepository = industryRepository;
@@ -109,6 +111,8 @@ public abstract class SnapshotApplicationBase
         _orderVisitRepository = orderVisitRepository;
         _orderVisitDetailRepository = orderVisitDetailRepository;
         _redPackGuiderAuditRepository = redPackGuiderAuditRepository;
+        _inviteCodeRecordRepository = inviteCodeRecordRepository;
+        _inviteCodeRepository = inviteCodeRepository;
     }
 
     #region 小程序
@@ -514,10 +518,35 @@ public abstract class SnapshotApplicationBase
     public async Task SaveInvitationCodeAsync(SaveInvitationCodeInDto dto)
     {
         dto.ValidateObject();
+        if (int.TryParse(dto.InvitationCode, out var invitationCode) == false)
+        { 
+            throw UserFriendlyException.SameMessage("邀请码格式错误");
+        }
         var third = await _thirdAccountRepository.GetByOpenIdAsync(_sessionContext.OpenId)
             ?? throw UserFriendlyException.SameMessage("用户不存在");
+        if (third.InvitationCode.NotNullOrEmpty())
+        {
+            throw UserFriendlyException.SameMessage("邀请码已存在");
+        }
+        if (_inviteCodeRecordRepository.Queryable().Where(m => m.InviteCode == dto.InvitationCode).Any())
+        {
+            throw UserFriendlyException.SameMessage("邀请码已经被使用");
+        }
         third.InvitationCode = dto.InvitationCode;
+        var invite = await _inviteCodeRepository.Queryable()
+            .Where(m => invitationCode >= m.BeginCode && invitationCode <= m.EndCode)
+            .FirstAsync() ?? throw UserFriendlyException.SameMessage("邀请码无效");
+        var entity = new InviteCodeRecord
+        {
+            OrgId = invite.Id,
+            OrgName = invite.OrgName,
+            InviteCode = dto.InvitationCode,
+            WXOpenId = third.OpenId,
+            PhoneNumber = third.PhoneNumber,
+            Name = third.UserName,
+        };
         await _thirdAccountRepository.UpdateAsync(third);
+        await _inviteCodeRecordRepository.AddAsync(entity);
     }
 
     #endregion

File diff suppressed because it is too large
+ 0 - 1
src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs


+ 2 - 0
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -1612,6 +1612,7 @@ namespace Hotline.Application.StatisticalReport
                     PassTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)),
                     NoPassTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.NoPass, 1, 0)),
                     ExaminingTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Examining, 1, 0)),
+                    WithdrawTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Withdraw,1,0)),
                     AllTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)) + SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.NoPass, 1, 0)) + SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Examining, 1, 0))
 
                 }).MergeTable();
@@ -1717,6 +1718,7 @@ namespace Hotline.Application.StatisticalReport
                     YjAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "1" && it.AllTime != null, it.AllTime, 0)),
                     YjAcceptanceTypeCode = "1"
                 }).MergeTable();
+            Console.Write(orderData.ToSqlString());
             return orderData;
         }
 

+ 3 - 3
src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs

@@ -323,7 +323,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                     Date = x.CreatedTime.ToString("yyyy-MM-dd"),
                     PersonCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1", 1, 0)),
                     PersonCallInPutthroughCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1" && x.OnState == EOnState.On, 1, 0)),
-                    PersonRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1" && x.QueueTims > 0  && x.OnState == EOnState.NoOn, 1, 0)),//个人服务挂断
+                    //PersonRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1" && x.OnState == EOnState.NoOn, 1, 0)),//个人服务挂断
                     PersonQueueOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1" && x.QueueTims > 0 && x.RingTimes == 0 && x.OnState == EOnState.NoOn, 1, 0)),//个人服务队列挂断
                     PersonWaitOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length -1,1) =="1" && x.RingTimes>0 && x.OnState == EOnState.NoOn,1,0)) //个人服务等待挂断
                 })
@@ -341,7 +341,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                     Date = x.CreatedTime.ToString("yyyy-MM-dd"),
                     EnterpriseCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "2", 1, 0)),
                     EnterpriseCallInPutthroughCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "2" && x.OnState == EOnState.On, 1, 0)),
-                    EnterpriseRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "2" && x.QueueTims > 0 && x.RingTimes == 0 && x.OnState == EOnState.NoOn, 1, 0)), //企业挂断
+                    //EnterpriseRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "2" && x.QueueTims > 0 && x.RingTimes == 0 && x.OnState == EOnState.NoOn, 1, 0)), //企业挂断
                     EnterpriseQueueOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1" && x.QueueTims > 0 && x.RingTimes == 0 && x.OnState == EOnState.NoOn, 1, 0)),//个人服务队列挂断
                     EnterpriseWaitOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1" && x.RingTimes > 0 && x.OnState == EOnState.NoOn, 1, 0)) //个人服务等待挂断
                 })
@@ -385,7 +385,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                     EnterpriseCallOutPutthroughCount = a.EnterpriseCallOutPutthroughCount,
                     AiVisitCallOutPutthroughCount = b.AiVisitCallOutPutthroughCount,
                     AiCallOutPutthroughCount = 0,
-                }).ToListAsync();
+                }).OrderBy(x=>x.Date).ToListAsync();
             return list;
         }
 

+ 18 - 0
src/Hotline.Repository.SqlSugar/Snapshot/InviteCodeRecordRepository.cs

@@ -0,0 +1,18 @@
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+
+namespace Hotline.Repository.SqlSugar.Snapshot;
+public class InviteCodeRecordRepository : BaseRepository<InviteCodeRecord>, IInviteCodeRecordRepository, IScopeDependency
+{
+    public InviteCodeRecordRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
+    {
+    }
+}

+ 18 - 0
src/Hotline.Repository.SqlSugar/Snapshot/InviteCodeRepository.cs

@@ -0,0 +1,18 @@
+using Hotline.Snapshot.Interfaces;
+using Hotline.Snapshot;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+using SqlSugar;
+using Hotline.Repository.SqlSugar.DataPermissions;
+
+namespace Hotline.Repository.SqlSugar.Snapshot;
+public class InviteCodeRepository : BaseRepository<InviteCode>, IInviteCodeRepository, IScopeDependency
+{
+    public InviteCodeRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
+    {
+    }
+}

+ 1 - 1
src/Hotline.Share/Dtos/Bigscreen/BigscreenDto.cs

@@ -263,7 +263,7 @@ namespace Hotline.Share.Dtos.Bigscreen
 
         public string CalcSatisfiedRate()
         {
-            if (Count == 0 || NoSatisfiedCount == 0)
+            if (Count == 0)
             {
                 return "0.000%";
             }

+ 3 - 3
src/Hotline.Share/Dtos/CallCenter/BiQueryCallsDto.cs

@@ -289,7 +289,7 @@ public class QueryCallDateStatisticsDetailResp
     /// <summary>
     /// 服务接通率
     /// </summary>
-    public double ServicePutthorughRate => PutthroughCount == 0 ? 0 : Math.Round(((double)PutthroughCount / CallInTotal) * 100, 2);
+    public double ServicePutthorughRate => (PersonCallInPutthroughCount + EnterpriseCallInPutthroughCount + AiCallInPutthroughCount) == 0 ? 0 : Math.Round(((double)PutthroughCount / (PersonCallInPutthroughCount + EnterpriseCallInPutthroughCount + AiCallInPutthroughCount)) * 100, 2);
 
     /// <summary>
     /// 服务接通率(文本)
@@ -328,7 +328,7 @@ public class QueryPersonCallDateStatisticsDetailResp
     /// <summary>
     /// 个人服务挂断总量
     /// </summary>
-    public int PersonRingOffCount { get; set; }
+    public int PersonRingOffCount => PersonQueueOffCount + PersonWaitOffCount;
 
     /// <summary>
     /// 个人服务队列挂断
@@ -372,7 +372,7 @@ public class QueryEnterpriseCallDateStatisticsDetailResp
     /// <summary>
     /// 企业服务挂断总量
     /// </summary>
-    public int EnterpriseRingOffCount { get; set; }
+    public int EnterpriseRingOffCount => EnterpriseQueueOffCount + EnterpriseWaitOffCount;
 
     /// <summary>
     /// 企业服务队列挂断

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

@@ -63,6 +63,11 @@ public class NextStepsDto
     /// 临时保存的办理意见
     /// </summary>
     public string? Opinion { get; set; }
+
+    /// <summary>
+    /// 受理类容
+    /// </summary>
+    public string? Content { get; set; }
 }
 
 public class NextStepsDto<TSteps> : NextStepsDto

+ 5 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -213,6 +213,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int ExaminingTotal { get; set; }
 
+        /// <summary>
+        /// 撤销次数
+        /// </summary>
+        public int WithdrawTotal { get; set; }
+
     }
 
 

+ 161 - 0
src/Hotline.Share/Dtos/Snapshot/InviteCodeDto.cs

@@ -0,0 +1,161 @@
+using Hotline.Share.Requests;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Snapshot;
+public class InviteCodeDto
+{
+}
+
+public record GetInviteCodeItemsInDto : PagedRequest;
+
+public class UpdateInviteCodeInDto : AddInviteCodeInDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+}
+public class AddInviteCodeInDto
+{
+    /// <summary>
+    /// 邀请码开始
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [Required]
+    public int BeginCode { get; set; }
+
+    /// <summary>
+    /// 邀请码结束
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [Required]
+    public int EndCode { get; set; }
+
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    [Required]
+    public string OrgName { get; set; }
+
+    /// <summary>
+    /// 上级部门ID
+    /// </summary>
+    public string? ParentOrgId { get; set; }
+
+    /// <summary>
+    /// 邀请码Url
+    /// </summary>
+    public string? QRCodeUrl { get; set; }
+}
+
+public class InviteCodeStatisticOutDto
+{
+    /// <summary>
+    /// OrgId
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    public string OrgName { get; set; }
+
+    /// <summary>
+    /// 总量
+    /// </summary>
+    public int Count { get; set; }
+}
+
+public class GetInviteCodeStatisticInDto
+{
+    /// <summary>
+    /// 统计开始时间
+    /// </summary>
+    [Required]
+    public DateTime StartTime { get; set; }
+
+    /// <summary>
+    /// 统计结束书剑
+    /// </summary>
+    [Required]
+    public DateTime EndTime { get; set; }
+}
+
+public record GetInviteCodeStatisticDetailInDto : PagedRequest
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    [Required]
+    public string OrgId { get; set; }
+
+    /// <summary>
+    /// 统计开始时间
+    /// </summary>
+    [Required]
+    public DateTime StartTime { get; set; }
+
+    /// <summary>
+    /// 统计结束时间
+    /// </summary>
+    [Required]
+    public DateTime EndTime { get; set; }
+
+    /// <summary>
+    /// 姓名
+    /// </summary>
+    public string? Name { get; set; }
+
+    /// <summary>
+    /// 电话
+    /// </summary>
+    public string? PhoneNumber { get; set; }
+
+    /// <summary>
+    /// 邀请码
+    /// </summary>
+    public string? InviteCode { get; set; }
+}
+
+public class InviteCodeStatisticDetailOutDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 姓名
+    /// </summary>
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 电话
+    /// </summary>
+    public string PhoneNumber { get; set; }
+
+    /// <summary>
+    /// 微信OpenId
+    /// </summary>
+    public string OpenId { get; set; }
+
+    /// <summary>
+    /// 邀请时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 邀请码
+    /// </summary>
+    public string InviteCode { get; set; }
+
+    /// <summary>
+    /// 部门
+    /// </summary>
+    public string OrgName { get; set; }
+}

+ 91 - 1
src/Hotline.Share/Dtos/Snapshot/RedPackRecordDto.cs

@@ -13,7 +13,87 @@ internal class RedPackRecordDto
 }
 
 public class SnapshotRedPackRecordSendOutDto
-{ }
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 工单Id
+    /// </summary>
+    public string OrderId { get; set; }
+
+    /// <summary>
+    /// No
+    /// </summary>
+    public string No { get; set; }
+
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public EReadPackUserType UserType { get; set; }
+
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public string UserTypeTxt => UserType.GetDescription();
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string IndustryName { get; set; }
+
+    /// <summary>
+    /// OpenId
+    /// </summary>
+    public string WXOpenId { get; set; }
+
+    /// <summary>
+    /// 商户订单号
+    /// </summary>
+    public string MerchantCode { get; set; }
+
+    /// <summary>
+    /// 金额
+    /// </summary>
+    public double Amount { get; set; }
+
+    /// <summary>
+    /// 发放时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 发放状态
+    /// </summary>
+    public EReadPackSendStatus DistributionState { get; set; }
+
+    /// <summary>
+    /// 发放状态
+    /// </summary>
+    public string DistributionStateTxt => DistributionState.GetDescription();
+
+    /// <summary>
+    /// 领取状态
+    /// </summary>
+    public ERedPackPickupStatus PickupStatus { get; set; }
+
+    /// <summary>
+    /// 领取状态
+    /// </summary>
+    public string PickupStatusTxt => PickupStatus.GetDescription();
+
+    /// <summary>
+    /// 领取操作时间
+    /// </summary>
+    public DateTime? ReceiveTime { get; set; }
+
+    /// <summary>
+    /// 备注
+    /// </summary>
+    public string? Remark { get; set; }
+}
 
 public record SnapshotRedPackRecordSendInDto : PagedRequest
 {
@@ -61,6 +141,16 @@ public record SnapshotRedPackRecordSendInDto : PagedRequest
     /// 是否补领
     /// </summary>
     public bool? IsReplace { get; set; }
+
+    /// <summary>
+    /// 发放时间开始
+    /// </summary>
+    public DateTime? BeginCreationTime { get; set; }
+
+    /// <summary>
+    /// 发放时间结束
+    /// </summary>
+    public DateTime? EndCreationTime { get; set; }
 }
 
 public record SnapshotRedPackRecordItemsGuiderInDto : SnapshotRedPackRecordItemsInDto

+ 13 - 0
src/Hotline/Snapshot/Interfaces/IInviteCodeRepository.cs

@@ -0,0 +1,13 @@
+using Microsoft.EntityFrameworkCore.Metadata;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Snapshot.Interfaces;
+public interface IInviteCodeRepository : IRepository<InviteCode>
+{
+}

+ 11 - 0
src/Hotline/Snapshot/Interfaces/InviteCodeRecord.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Snapshot.Interfaces;
+public interface IInviteCodeRecordRepository : IRepository<InviteCodeRecord>
+{
+}

+ 37 - 31
src/Hotline/Snapshot/InviteCode.cs

@@ -12,38 +12,44 @@ namespace Hotline.Snapshot;
 /// <summary>
 /// 邀请码
 /// </summary>
-//[Description("邀请码")]
-//public class InviteCode : CreationSoftDeleteEntity
-//{
-//    /// <summary>
-//    /// 邀请码开始
-//    /// 邀请码开始 -> 结束 范围内的邀请码都有效
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码开始")]
-//    public string BeginCode { get; set; }
+[Description("邀请码")]
+public class InviteCode : CreationSoftDeleteEntity
+{
+    /// <summary>
+    /// 邀请码开始
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码开始")]
+    public int BeginCode { get; set; }
 
-//    /// <summary>
-//    /// 邀请码结束
-//    /// 邀请码开始 -> 结束 范围内的邀请码都有效
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码结束")]
-//    public string EndCode { get; set; }
+    /// <summary>
+    /// 邀请码结束
+    /// 邀请码开始 -> 结束 范围内的邀请码都有效
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码结束")]
+    public int EndCode { get; set; }
 
-//    /// <summary>
-//    /// 部门名称
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "部门名称")]
-//    public string OrgName { get; set; }
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    [SugarColumn(ColumnDescription = "部门名称")]
+    public string OrgName { get; set; }
 
-//    /// <summary>
-//    /// 上级部门ID
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "上级部门ID")]
-//    public string ParentOrgId { get; set; }
+    /// <summary>
+    /// 上级部门ID
+    /// </summary>
+    [SugarColumn(ColumnDescription = "上级部门ID")]
+    public string? ParentOrgId { get; set; }
 
-//    /// <summary>
-//    /// 邀请码Url
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码Url")]
-//    public string QRCodeUrl { get; set; }
-//}
+    /// <summary>
+    /// 邀请码Url
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码Url")]
+    public string? QRCodeUrl { get; set; }
+
+    /// <summary>
+    /// 上传附件Id
+    /// </summary>
+    [SugarColumn(ColumnDescription ="上传附件Id")]
+    public string? Additions { get; set; }
+}

+ 35 - 29
src/Hotline/Snapshot/InviteCodeRecord.cs

@@ -12,36 +12,42 @@ namespace Hotline.Snapshot;
 /// <summary>
 /// 邀请记录
 /// </summary>
-//[Description("邀请记录")]
-//public class InviteCodeRecord : CreationSoftDeleteEntity
-//{
-//    /// <summary>
-//    /// 部门名称
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "部门名称")]
-//    public string OrgName { get; set; }
+[Description("邀请记录")]
+public class InviteCodeRecord : CreationSoftDeleteEntity
+{
+    /// <summary>
+    /// 部门Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "部门Id")]
+    public string OrgId { get; set; }
 
-//    /// <summary>
-//    /// 邀请码
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "邀请码")]
-//    public string InviteCode { get; set; }
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    [SugarColumn(ColumnDescription = "部门名称")]
+    public string OrgName { get; set; }
 
-//    /// <summary>
-//    /// 微信OpenId
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "微信OpenId")]
-//    public string WXOpenId { get; set; }
+    /// <summary>
+    /// 邀请码
+    /// </summary>
+    [SugarColumn(ColumnDescription = "邀请码")]
+    public string InviteCode { get; set; }
 
-//    /// <summary>
-//    /// 电话
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "电话")]
-//    public string PhoneNumber { get; set; }
+    /// <summary>
+    /// 微信OpenId
+    /// </summary>
+    [SugarColumn(ColumnDescription = "微信OpenId")]
+    public string WXOpenId { get; set; }
 
-//    /// <summary>
-//    /// 姓名
-//    /// </summary>
-//    [SugarColumn(ColumnDescription = "姓名")]
-//    public string Name { get; set; }
-//}
+    /// <summary>
+    /// 电话
+    /// </summary>
+    [SugarColumn(ColumnDescription = "电话")]
+    public string PhoneNumber { get; set; }
+
+    /// <summary>
+    /// 姓名
+    /// </summary>
+    [SugarColumn(ColumnDescription = "姓名")]
+    public string? Name { get; set; }
+}

+ 31 - 0
src/Hotline/dataview.md

@@ -518,3 +518,34 @@ group by "OrderId") and "VisitState" not in(50,30)) and "VisitTarget"=20
 
 
 
+### 部门受理类型统计周期
+select 
+部门名称,部门类别,
+总件数,总时长, CAST(总时长/总件数/3600 as NUMERIC(10,2)) as 总平均,
+咨询件数,咨询时长,CASE 咨询件数 WHEN 0 THEN	0	ELSE CAST(咨询时长/咨询件数/3600 as NUMERIC(10,2)) END as 咨询平均,
+建议件数,建议时长,CASE 建议件数 WHEN 0 THEN 0 ELSE CAST(建议时长/建议件数/3600 as NUMERIC(10,2)) END as 建议平均,
+求助件数,求助时长,CASE 求助件数 WHEN 0 THEN 0 ELSE CAST(求助时长/求助件数/3600 as NUMERIC(10,2)) END as 求助平均,
+表扬件数,表扬时长,CASE 表扬件数 WHEN 0 THEN 0 ELSE CAST(表扬时长/表扬件数/3600 as NUMERIC(10,2)) END as 表扬平均,
+举报件数,举报时长,CASE 举报件数 WHEN 0 THEN 0 ELSE CAST(举报时长/举报件数/3600 as NUMERIC(10,2)) END as 举报平均,
+投诉件数,投诉时长,CASE 投诉件数 WHEN 0 THEN 0 ELSE CAST(投诉时长/投诉件数/3600 as NUMERIC(10,2)) END as 投诉平均,
+其他件数,其他时长,CASE 其他件数 WHEN 0 THEN 0 ELSE CAST(其他时长/其他件数/3600 as NUMERIC(10,2)) END as 其他平均 from (
+select "OrgName" as 部门名称,"OrgType" as  部门类别,("ZxAllCount" + "JyAllCount" + "QzAllCount" + "ByAllCount" + "JbAllCount" + "TsAllCount" + "QtAllCount")as 总件数,
+("ZxAllTimes" + "JyAllTimes" + "QzAllTimes" + "ByAllTimes" + "JbAllTimes" + "TsAllTimes" + "QtAllTimes") as 总时长,"ZxAllCount" as 咨询件数,"ZxAllTimes" as 咨询时长,"JyAllCount" as 建议件数,
+"JyAllTimes" as 建议时长,"QzAllCount" as 求助件数,"QzAllTimes" as 求助时长,"ByAllCount" as 表扬件数,"ByAllTimes" as 表扬时长,"JbAllCount" as 举报件数,"JbAllTimes" as 举报时长,"TsAllCount" as 投诉件数,
+"TsAllTimes" as 投诉时长,"QtAllCount" as 其他件数,"QtAllTimes" as 其他时长  from (
+SELECT * FROM  (SELECT  ( CASE  WHEN ( "it"."OrgCode" = N'001' ) THEN N'热线中心'  ELSE "o"."Name" END ) AS "OrgName" , "it"."OrgCode" AS "OrgCode" , ( CASE  WHEN ( "o"."OrgType" = 2 ) THEN N'区县部门'  ELSE N'市直部门' END ) AS "OrgType" ,
+SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'10' ) THEN 1  ELSE 0 END )) AS "ZxAllCount" , SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'10' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "ZxAllTimes" ,
+N'10' AS "ZxAcceptanceTypeCode" , SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'15' ) THEN 1  ELSE 0 END )) AS "JyAllCount" ,
+SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'15' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "JyAllTimes" , N'15' AS "JyAcceptanceTypeCode" , 
+SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'20' ) THEN 1  ELSE 0 END )) AS "QzAllCount" , SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'20' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "QzAllTimes" ,
+N'20' AS "QzAcceptanceTypeCode" , SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'25' ) THEN 1  ELSE 0 END )) AS "ByAllCount" , SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'25' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END ))
+AS "ByAllTimes" , N'25' AS "ByAcceptanceTypeCode" , SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'30' ) THEN 1  ELSE 0 END )) AS "JbAllCount" , SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'30' ) AND 
+( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "JbAllTimes" , N'30' AS "JbAcceptanceTypeCode" , SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'35' ) THEN 1  ELSE 0 END )) AS "TsAllCount" , 
+SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'35' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "TsAllTimes" , N'35' AS "TsAcceptanceTypeCode" , 
+SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'40' ) THEN 1  ELSE 0 END )) AS "QtAllCount" , SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'40' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "QtAllTimes" ,
+N'40' AS "QtAcceptanceTypeCode" , SUM(( CASE  WHEN ( "it"."AcceptTypeCode" = N'1' ) THEN 1  ELSE 0 END )) AS "YjAllCount" , 
+SUM(( CASE  WHEN (( "it"."AcceptTypeCode" = N'1' ) AND ( "it"."AllTime" IS NOT NULL )) THEN "it"."AllTime"  ELSE 0 END )) AS "YjAllTimes" , N'1' AS "YjAcceptanceTypeCode"  FROM  
+(SELECT * FROM  (SELECT  ( CASE  WHEN ( true = true ) THEN SUBSTRING("ActualHandleOrgCode",1 + 0,6)  ELSE SUBSTRING("ActualHandleOrgCode",1 + 0,(LENGTH(N'001')+ 3 )) END ) AS "OrgCode" , "AcceptTypeCode" AS "AcceptTypeCode" ,
+( CASE  WHEN ( "FileOrgIsCenter" = true ) THEN 10  ELSE 20 END ) AS "ProcessType" , ( CASE  WHEN ( "FileOrgIsCenter" = true ) THEN "CreationTimeHandleDurationWorkday"  ELSE "CenterToOrgHandleDurationWorkday" END ) AS "AllTime" ,
+"FileOrgIsCenter" AS "FileOrgIsCenter"  FROM "order"  WHERE ((( "FiledTime" >= '2024-12-01 00:00:00.000' ) AND ( "FiledTime" <= '2024-12-31 23:59:59.000' )) AND ( "Status" >= 300 ))  AND ( "IsDeleted" = false ) ) MergeTable ) "it"
+Left JOIN "system_organize" "o" ON ( "it"."OrgCode" = "o"."Id" )   WHERE ( "o"."IsDeleted" = false )GROUP BY "it"."OrgCode","o"."Name","o"."OrgType"  )))

Some files were not shown because too many files changed in this diff