Эх сурвалжийг харах

Merge branch 'release' into dev

tangjiang 9 сар өмнө
parent
commit
49f5ebc14a

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

@@ -3327,7 +3327,7 @@ public class OrderController : BaseController
         var (total, items) = await _orderRepository
             .Queryable(hasHandled: isHandled)
             .Includes(d => d.OrderSpecials)
-            .Where(d=>d.Status != EOrderStatus.WaitForAccept || d.Status != EOrderStatus.BackToUnAccept || d.Status != EOrderStatus.SpecialToUnAccept)
+            .Where(d=>d.Status != EOrderStatus.WaitForAccept && d.Status != EOrderStatus.BackToUnAccept && d.Status != EOrderStatus.SpecialToUnAccept)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)

+ 161 - 4
src/Hotline.Api/Controllers/ProvinceStatisticsController.cs

@@ -22,19 +22,31 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<OrderSendBack> _orderSendBackRepository;
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IRepository<OrderScreen> _orderScreenRepository;
+        private readonly IRepository<OrderRevoke> _orderRevokeRepository;
+        private readonly IRepository<OrderWarning> _orderWarningRepository;
+        private readonly IRepository<OrderUrge> _orderUrgeRepository;
+        private readonly IRepository<OrderComplement> _orderComplementRepository;
 
 
         public ProvinceStatisticsController(IMapper mapper,
            ISessionContext sessionContext,
             IRepository<OrderSendBack> orderSendBackRepository,
             IRepository<OrderDelay> orderDelayRepository,
-            IRepository<OrderScreen> orderScreenRepository)
+            IRepository<OrderScreen> orderScreenRepository,
+            IRepository<OrderRevoke> orderRevokeRepository,
+            IRepository<OrderWarning> orderWarningRepository,
+            IRepository<OrderUrge> orderUrgeRepository,
+            IRepository<OrderComplement> orderComplementRepository)
         {
             _mapper = mapper;
             _sessionContext = sessionContext;
             _orderSendBackRepository = orderSendBackRepository;
             _orderDelayRepository = orderDelayRepository;
             _orderScreenRepository = orderScreenRepository;
+            _orderRevokeRepository = orderRevokeRepository;
+            _orderWarningRepository = orderWarningRepository;
+            _orderUrgeRepository = orderUrgeRepository;
+            _orderComplementRepository = orderComplementRepository;
         }
 
         /// <summary>
@@ -53,7 +65,7 @@ namespace Hotline.Api.Controllers
                            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
                            .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.CreatorName == dto.ApplyUserName)
                            .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime >= dto.ApplyStartTime.Value)
-                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime <= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.CreationTime <= dto.ApplyEndTime.Value)
                            .OrderByDescending(x => x.CreationTime)
                            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -110,7 +122,7 @@ namespace Hotline.Api.Controllers
                            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
                            .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.EmployeeName == dto.ApplyUserName)
                            .WhereIF(dto.ApplyStartTime.HasValue, p => p.ApplyDelayTime >= dto.ApplyStartTime.Value)
-                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.ApplyDelayTime <= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.ApplyDelayTime <= dto.ApplyEndTime.Value)
                            .OrderByDescending(x => x.ApplyDelayTime)
                            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -175,7 +187,7 @@ namespace Hotline.Api.Controllers
                            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
                            .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.CreatorName == dto.ApplyUserName)
                            .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime >= dto.ApplyStartTime.Value)
-                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime <= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.CreationTime <= dto.ApplyEndTime.Value)
                            .OrderByDescending(x => x.CreationTime)
                            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -214,5 +226,150 @@ namespace Hotline.Api.Controllers
                 applyDetailDto.AuditState = "申请中";
             return applyDetailDto;
         }
+
+        /// <summary>
+        /// 省撤单查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_order_revoke_list")]
+        public async Task<PagedDto<ProvinceOrderRevokeListDto>> GetProvinceOrderRevokeList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            var (total, items) = await _orderRevokeRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.IsProRevoke == true)
+                          .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.RevokeTime >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.RevokeTime <= dto.ApplyEndTime.Value)
+                           .OrderByDescending(x => x.RevokeTime)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceOrderRevokeListDto>(total, _mapper.Map<IReadOnlyList<ProvinceOrderRevokeListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获取撤单详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_revoke_detail")]
+        public async Task<OrderRevoke> GetOrderRevokeDetail(string id)
+        {
+            var data = await _orderRevokeRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("撤单查询失败");
+            return data;
+        }
+
+        /// <summary>
+        /// 省预警查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_order_warning_list")]
+        public async Task<PagedDto<ProvinceOrderWarningListDto>> GetProvinceOrderWarningList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            var (total, items) = await _orderWarningRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.IsProWarn == true)
+                          .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.WarnDate >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.WarnDate <= dto.ApplyEndTime.Value)
+                           .OrderByDescending(x => x.WarnDate)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceOrderWarningListDto>(total, _mapper.Map<IReadOnlyList<ProvinceOrderWarningListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获取预警详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_warning_detail")]
+        public async Task<OrderWarningDto> GetOrderWarningDetail(string id)
+        {
+            var data = await _orderWarningRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("预警查询失败");
+            return _mapper.Map<OrderWarningDto>(data);
+        }
+
+        /// <summary>
+        /// 省催办查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_order_urge_list")]
+        public async Task<PagedDto<ProvinceOrderUrgeListDto>> GetProvinceOrderUrgeList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            var (total, items) = await _orderUrgeRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.IsProRemind == true)
+                          .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.RemindTime >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.RemindTime <= dto.ApplyEndTime.Value)
+                           .OrderByDescending(x => x.RemindTime)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceOrderUrgeListDto>(total, _mapper.Map<IReadOnlyList<ProvinceOrderUrgeListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获催办详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_urge_detail")]
+        public async Task<ProvinceOrderUrgeDto> GetOrderUrgeDetail(string id)
+        {
+            var data = await _orderUrgeRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("预警查询失败");
+            return _mapper.Map<ProvinceOrderUrgeDto>(data);
+        }
+
+        /// <summary>
+        /// 省补充查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_order_complement_list")]
+        public async Task<PagedDto<ProvinceOrderComplementListDto>> GetProvinceOrderComplementList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            var (total, items) = await _orderComplementRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.IsProComplement == true)
+                          .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.SupplyTime >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyEndTime.HasValue, p => p.SupplyTime <= dto.ApplyEndTime.Value)
+                           .OrderByDescending(x => x.SupplyTime)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceOrderComplementListDto>(total, _mapper.Map<IReadOnlyList<ProvinceOrderComplementListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获补充详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_complement_detail")]
+        public async Task<OrderComplement> GetOrderComplementDetail(string id)
+        {
+            var data = await _orderComplementRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("补充查询失败");
+            return data;
+        }
+
     }
 }

+ 348 - 339
src/Hotline.Application/Orders/OrderApplication.cs

@@ -66,10 +66,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<SystemArea> _systemAreaRepository;
     private readonly IRepository<Hotspot> _hotspotRepository;
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
-    
 
 
-	public OrderApplication(
+
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -90,7 +90,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<SystemArea> systemAreaRepository,
         IRepository<Hotspot> hotspotRepository,
         IRepository<WorkflowStep> workflowStepRepository
-		)
+        )
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -106,20 +106,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _orderVisitDetailRepository = orderVisitDetailRepository;
         _qualityApplication = qualityApplication;
         _capPublisher = capPublisher;
-		_systemOrganizeRepository = systemOrganizeRepository;
-		_workflowCountersignRepository = workflowCountersignRepository;
+        _systemOrganizeRepository = systemOrganizeRepository;
+        _workflowCountersignRepository = workflowCountersignRepository;
         _orderSpecialDetailRepository = orderSpecialDetailRepository;
         _systemAreaRepository = systemAreaRepository;
         _hotspotRepository = hotspotRepository;
         _workflowStepRepository = workflowStepRepository;
-	}
+    }
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
     /// 1.更新工单 2.更新流程 3.推送省平台
     /// </summary>
     /// <returns></returns>
-    public async Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType,bool IsProDelay, CancellationToken cancellationToken)
+    public async Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType, bool IsProDelay, CancellationToken cancellationToken)
     {
         var order = await _orderDomainService.GetOrderAsync(orderId, cancellationToken: cancellationToken);
         var expiredTimeConfig =
@@ -213,25 +213,25 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <returns></returns>
     public ISugarQueryable<Order> GetAboutToExpireAsync(AboutToExpireListDto dto)
     {
-		//var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
-		//var value = setting?.SettingValue[0];
-		//value = string.IsNullOrEmpty(value) ? "0" : value;
-		//DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
-		//stTime = _timeLimitDomainService.WorkDay(stTime);
-		//DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
-		DateTime? dateTime = DateTime.Now;
-		var IsCenter = _sessionContext.OrgIsCenter;
-
-		return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
+        //var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
+        //var value = setting?.SettingValue[0];
+        //value = string.IsNullOrEmpty(value) ? "0" : value;
+        //DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
+        //stTime = _timeLimitDomainService.WorkDay(stTime);
+        //DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
+        DateTime? dateTime = DateTime.Now;
+        var IsCenter = _sessionContext.OrgIsCenter;
+
+        return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!))
             .WhereIF(dto.Delay.HasValue && dto.Delay == 1, d => d.OrderDelays.Any() == true)
             .WhereIF(dto.Delay.HasValue && dto.Delay == 2, d => d.OrderDelays.Any() == false)
-               //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
-			//.Where(d => d.ExpiredTime != null &&
-   //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
-            .Where(d=>d.Status < EOrderStatus.Filed && (dateTime > d.NearlyExpiredTimeOne  || dateTime > d.NearlyExpiredTime) && dateTime < d.ExpiredTime)
+            //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
+            //.Where(d => d.ExpiredTime != null &&
+            //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
+            .Where(d => d.Status < EOrderStatus.Filed && (dateTime > d.NearlyExpiredTimeOne || dateTime > d.NearlyExpiredTime) && dateTime < d.ExpiredTime)
             .OrderByDescending(d => d.CreationTime);
     }
 
@@ -273,7 +273,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
         var IsCenter = _sessionContext.OrgIsCenter;
 
-		return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
+        return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             //.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No))
@@ -313,23 +313,23 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// </summary>
     /// <param name="inputStr"></param>
     /// <returns></returns>
-    public async Task OrderParticiple(string inputStr, string orderId,DateTime time, CancellationToken cancellationToken)
+    public async Task OrderParticiple(string inputStr, string orderId, DateTime time, CancellationToken cancellationToken)
     {
         var seg = new Segment();
-		ICollection<WordInfo> splitWords = seg.DoSegment(inputStr);
+        ICollection<WordInfo> splitWords = seg.DoSegment(inputStr);
         var words = new List<string>();
         for (int i = 0; i < splitWords.Count; i++)
         {
             var word = splitWords.ElementAt(i);
-            if (word is { WordType: WordType.SimplifiedChinese, Word.Length: > 1 } )
-	            words.Add(splitWords.ElementAt(i).Word);
-		}
+            if (word is { WordType: WordType.SimplifiedChinese, Word.Length: > 1 })
+                words.Add(splitWords.ElementAt(i).Word);
+        }
         if (words.Any())
         {
-			var vector = await _repositoryts.SearchAsync(orderId, cancellationToken);
-			if (vector != null && vector.Any()) await _repositoryts.UpdateVectorAsync(orderId, words, cancellationToken);
-			else await _repositoryts.AddVectorAsync(orderId, time, words, cancellationToken);
-		}
+            var vector = await _repositoryts.SearchAsync(orderId, cancellationToken);
+            if (vector != null && vector.Any()) await _repositoryts.UpdateVectorAsync(orderId, words, cancellationToken);
+            else await _repositoryts.AddVectorAsync(orderId, time, words, cancellationToken);
+        }
         //var words = await _orderWrodRepository.Queryable().Where(x => x.IsEnable == 1 && x.Classify.Contains("普通标签")).Select(x => x.Tag).ToListAsync(cancellationToken);
         //var res = new List<string>();
         //if (words.Any()) res = ParticipleTool.SegMMDouble(inputStr, ref words);
@@ -523,11 +523,17 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
             .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
             .WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.IsProvince == true)
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.IsProvince == false)
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
             .WhereIF(!string.IsNullOrEmpty(dto.SensitiveWord), d => SqlFunc.JsonArrayAny(d.Sensitive, dto.SensitiveWord))
             .WhereIF(dto.IsSensitiveWord.HasValue && dto.IsSensitiveWord == true, d => d.Sensitive != null && SqlFunc.JsonArrayLength(d.Sensitive) > 0)
-            .WhereIF(dto.IsUrgent.HasValue , d=>d.IsUrgent == dto.IsUrgent.Value)
+            .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
+            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "1", d => d.Source == ESource.ProvinceStraight &&
+            d.SourceChannelCode == "SZMHD" && d.IsProvince == false)//政民互动直派
+            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "2", d => d.Source == ESource.ProvinceStraight &&
+            d.SourceChannelCode == "SZMHD" && d.IsProvince == true)//政民互动
+            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Source == ESource.ProvinceStraight &&
+            d.SourceChannelCode == "S12345" && d.IsProvince == true)//省12345
             .OrderByDescending(d => d.CreationTime);
     }
 
@@ -570,12 +576,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(d => d.SourceChannel != null && d.SourceChannel != "");
     }
 
-	/// <summary>
-	/// 信件来源统计明细
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	public ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto)
+    /// <summary>
+    /// 信件来源统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto)
     {
 
         return _orderRepository.Queryable()
@@ -585,78 +591,78 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(d => d.SourceChannel != null && d.SourceChannel != "");
     }
 
-	/// <summary>
-	/// 部门超期统计
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	public ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto)
+    /// <summary>
+    /// 部门超期统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto)
     {
-		if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 
-		dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+        var IsCenter = _sessionContext.OrgIsCenter;
+
+
+        var queryOrder = _systemOrganizeRepository.Queryable()
+            .LeftJoin<Order>((x, o) => x.Id == o.ActualHandleOrgCode)
+            .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
+            .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
+            .GroupBy((x, o) => new { x.Id, x.Name })
+            .Select((x, o) => new OrderBiOrgDataListVo
+            {
+                OrgName = x.Name,
+                OrgId = x.Id,
+                HandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status >= EOrderStatus.Filed && o.ExpiredTime < o.FiledTime, 1, 0)),
+                NoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status < EOrderStatus.Filed && o.ExpiredTime < SqlFunc.GetDate(), 1, 0)),
+            }).MergeTable();
+
+        var queryCountersign = _workflowStepRepository.Queryable()
+            .Where(x => x.CountersignPosition != ECountersignPosition.None)
+            .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+            .GroupBy(x => x.HandlerOrgId)
+            .Select(x => new OrderBiOrgDataListVo
+            {
+                OrgId = x.HandlerOrgId,
+                CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status == Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < x.HandleTime, 1, 0)),
+                CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status != Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < SqlFunc.GetDate(), 1, 0)),
+            }).MergeTable();
+
+        var query = queryOrder.LeftJoin(queryCountersign, (or, co) => or.OrgId == co.OrgId)
+            //.LeftJoin<SystemOrganize>((or, co, so) => or.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == so.Id)
+            .LeftJoin<SystemOrganize>((or, co, so) => or.OrgId == so.Id && so.Level == 1)
+            .GroupBy((or, co, so) => new { so.Id, so.Name })
+            .Select((or, co, so) => new OrderBiOrgDataListVo
+            {
+                OrgName = so.Name,
+                OrgId = so.Id,
+                HandlerExtendedNum = SqlFunc.AggregateSum(or.HandlerExtendedNum),
+                NoHandlerExtendedNum = SqlFunc.AggregateSum(or.NoHandlerExtendedNum),
+                CounterHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterHandlerExtendedNum),
+                CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
+            }).MergeTable();
 
-		var IsCenter = _sessionContext.OrgIsCenter;
-
-
-		var queryOrder = _systemOrganizeRepository.Queryable()
-			.LeftJoin<Order>((x, o) => x.Id == o.ActualHandleOrgCode)
-			.WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
-			.WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
-			.WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
-			.GroupBy((x, o) => new { x.Id, x.Name })
-			.Select((x, o) => new OrderBiOrgDataListVo
-			{
-				OrgName = x.Name,
-				OrgId = x.Id,
-				HandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status >= EOrderStatus.Filed && o.ExpiredTime < o.FiledTime, 1, 0)),
-				NoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status < EOrderStatus.Filed && o.ExpiredTime < SqlFunc.GetDate(), 1, 0)),
-			}).MergeTable();
-
-		var queryCountersign = _workflowStepRepository.Queryable()
-            .Where(x=>x.CountersignPosition != ECountersignPosition.None)
-			.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-			.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-			.GroupBy(x => x.HandlerOrgId)
-			.Select(x => new OrderBiOrgDataListVo
-			{
-				OrgId = x.HandlerOrgId,
-				CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status == Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < x.HandleTime, 1, 0)),
-				CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status != Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < SqlFunc.GetDate(), 1, 0)),
-			}).MergeTable();
-
-		var query = queryOrder.LeftJoin(queryCountersign, (or, co) => or.OrgId == co.OrgId)
-			//.LeftJoin<SystemOrganize>((or, co, so) => or.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == so.Id)
-			.LeftJoin<SystemOrganize>((or, co, so) => or.OrgId == so.Id && so.Level == 1)
-			.GroupBy((or, co, so) => new { so.Id, so.Name })
-			.Select((or, co, so) => new OrderBiOrgDataListVo
-			{
-				OrgName = so.Name,
-				OrgId = so.Id,
-				HandlerExtendedNum = SqlFunc.AggregateSum(or.HandlerExtendedNum),
-				NoHandlerExtendedNum = SqlFunc.AggregateSum(or.NoHandlerExtendedNum),
-				CounterHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterHandlerExtendedNum),
-				CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
-			}).MergeTable();
-
-		query = query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrgName.Contains(dto.Keyword!)).Where(x => x.HandlerExtendedNum > 0 || x.NoHandlerExtendedNum > 0 || x.CounterHandlerExtendedNum > 0 || x.CounterNoHandlerExtendedNum > 0);
-		switch (dto.SortField)
-		{
-			case "handlerExtendedNum":
-				query = dto.SortRule is 0 ? query.OrderBy(x => x.HandlerExtendedNum) : query.OrderByDescending(x => x.HandlerExtendedNum);
-				break;
-			case "counterHandlerExtendedNum":
-				query = dto.SortRule is 0 ? query.OrderBy(x => x.CounterHandlerExtendedNum) : query.OrderByDescending(x => x.CounterHandlerExtendedNum);
-				break;
-			case "noHandlerExtendedNum":
-				query = dto.SortRule is 0 ? query.OrderBy(x => x.NoHandlerExtendedNum) : query.OrderByDescending(x => x.NoHandlerExtendedNum);
-				break;
-			case "counterNoHandlerExtendedNum":
-				query = dto.SortRule is 0 ? query.OrderBy(x => x.CounterNoHandlerExtendedNum) : query.OrderByDescending(x => x.CounterNoHandlerExtendedNum);
-				break;
-		}
+        query = query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrgName.Contains(dto.Keyword!)).Where(x => x.HandlerExtendedNum > 0 || x.NoHandlerExtendedNum > 0 || x.CounterHandlerExtendedNum > 0 || x.CounterNoHandlerExtendedNum > 0);
+        switch (dto.SortField)
+        {
+            case "handlerExtendedNum":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.HandlerExtendedNum) : query.OrderByDescending(x => x.HandlerExtendedNum);
+                break;
+            case "counterHandlerExtendedNum":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CounterHandlerExtendedNum) : query.OrderByDescending(x => x.CounterHandlerExtendedNum);
+                break;
+            case "noHandlerExtendedNum":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.NoHandlerExtendedNum) : query.OrderByDescending(x => x.NoHandlerExtendedNum);
+                break;
+            case "counterNoHandlerExtendedNum":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CounterNoHandlerExtendedNum) : query.OrderByDescending(x => x.CounterNoHandlerExtendedNum);
+                break;
+        }
         return query;
-	}
+    }
 
     /// <summary>
     /// 部门超期统计明细
@@ -664,100 +670,100 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <param name="dto"></param>
     /// <returns></returns>
 	public ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListDetailRequest dto)
-	{
-		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+    {
+        dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
 
         var quer = _orderRepository.Queryable()
-	        .InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id &&  so.Level == 1)
-			.Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
+            .InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id && so.Level == 1)
+            .Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
             //.WhereIF(dto.Statuses.Any(), x => dto.Statuses.Contains(x.Status))  //工单状态
             .WhereIF(dto.QueryType == 1, (x, so) => x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) //业务已办超期
             .WhereIF(dto.QueryType == 3, (x, so) => x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()) //业务待办超期
             .WhereIF(dto.QueryType == 5, (x, so) =>
                 (x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) , (x, so) => x.ActualHandleOrgCode == dto.OrgCode)
-			.Select(x => new Order { DaysOverdueOrgName = x.ActualHandleOrgName, Id = x.Id.SelectAll() });
-		if (dto.QueryType is 2 or 4 )
-		{
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), (x, so) => x.ActualHandleOrgCode == dto.OrgCode)
+            .Select(x => new Order { DaysOverdueOrgName = x.ActualHandleOrgName, Id = x.Id.SelectAll() });
+        if (dto.QueryType is 2 or 4)
+        {
             var queryCountersign = _workflowStepRepository.Queryable()
                 .Includes(x => x.Workflow)
                 .InnerJoin<SystemOrganize>((x, so) => x.HandlerOrgId == so.Id && so.Level == 1)
-				.Where((x, so) => x.CountersignPosition != ECountersignPosition.None && x.Workflow.ModuleCode == "OrderHandle")
+                .Where((x, so) => x.CountersignPosition != ECountersignPosition.None && x.Workflow.ModuleCode == "OrderHandle")
                 .Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
                 .WhereIF(dto.QueryType == 2, (x, so) => x.Status == Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < x.HandleTime) //会签已办超期
                 .WhereIF(dto.QueryType == 4, (x, so) => x.Status != Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < SqlFunc.GetDate())//会签待办超期
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) , (x, so) => x.HandlerOrgId == dto.OrgCode)
-				.GroupBy(x => new { x.ExternalId, x.HandlerOrgName })
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), (x, so) => x.HandlerOrgId == dto.OrgCode)
+                .GroupBy(x => new { x.ExternalId, x.HandlerOrgName })
                 .Select(x => new { Id = x.ExternalId, WorkflowId = x.ExternalId, HandlerOrgName = x.HandlerOrgName });
 
-             quer = _orderRepository.Queryable().InnerJoin(queryCountersign, (o, w) => o.Id == w.Id)
-				 .Select((o, w) => new Order { DaysOverdueOrgName = w.HandlerOrgName, Id = o.Id.SelectAll() });
-			//quer = _orderRepository.UnionAll(quer, queryCountersignOrder);
-		}
+            quer = _orderRepository.Queryable().InnerJoin(queryCountersign, (o, w) => o.Id == w.Id)
+                .Select((o, w) => new Order { DaysOverdueOrgName = w.HandlerOrgName, Id = o.Id.SelectAll() });
+            //quer = _orderRepository.UnionAll(quer, queryCountersignOrder);
+        }
         return quer;
-	}
+    }
 
-	/// <summary>
-	/// 部门超期统计明细
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	public ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListAllDetailRequest dto)
-	{
-		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
-		bool IsCenter = _sessionContext.OrgIsCenter;
+    /// <summary>
+    /// 部门超期统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListAllDetailRequest dto)
+    {
+        dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+        bool IsCenter = _sessionContext.OrgIsCenter;
 
-		var quer = _orderRepository.Queryable()
-			.InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id && so.Level == 1)
-			.Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
+        var quer = _orderRepository.Queryable()
+            .InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id && so.Level == 1)
+            .Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
             .WhereIF(dto.Statuses.Any(), (x, so) => dto.Statuses.Contains(x.Status))  //工单状态
-            .WhereIF( dto.ExpiredType is  2, (x, so) => x.OrderDelays.Any(x=>  x.DelayState == EDelayState.Pass))
+            .WhereIF(dto.ExpiredType is 2, (x, so) => x.OrderDelays.Any(x => x.DelayState == EDelayState.Pass))
             .Where((x, so) =>
-				(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
+                (x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
             .WhereIF(IsCenter == false, (x, so) => x.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
-			.WhereIF(!string.IsNullOrEmpty(dto.OrgName)  , (x, so) => x.AcceptorOrgName == dto.OrgName)
-			.Select( x => new Order { DaysOverdueOrgName = x.ActualHandleOrgName, Id = x.Id.SelectAll() });
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgName), (x, so) => x.AcceptorOrgName == dto.OrgName)
+            .Select(x => new Order { DaysOverdueOrgName = x.ActualHandleOrgName, Id = x.Id.SelectAll() });
 
         var queryCountersign = _workflowStepRepository.Queryable()
-	        .Includes(x => x.Workflow)
+            .Includes(x => x.Workflow)
             .InnerJoin<SystemOrganize>((x, so) => x.HandlerOrgId == so.Id && so.Level == 1)
-			.Where((x, so) => x.CountersignPosition != ECountersignPosition.None && x.Workflow.ModuleCode == "OrderHandle")
-	        .Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-            .Where((x, so) => (x.Status == Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < x.HandleTime)||(x.Status != Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < SqlFunc.GetDate()))
-		    .WhereIF(IsCenter == false, (x, so) => x.HandlerOrgId == _sessionContext.RequiredOrgId)
-	        .GroupBy(x => new { x.ExternalId, x.HandlerOrgName })
-	        .Select(x => new { Id = x.ExternalId, WorkflowId = x.ExternalId, HandlerOrgName = x.HandlerOrgName });
+            .Where((x, so) => x.CountersignPosition != ECountersignPosition.None && x.Workflow.ModuleCode == "OrderHandle")
+            .Where((x, so) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
+            .Where((x, so) => (x.Status == Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < x.HandleTime) || (x.Status != Share.Enums.FlowEngine.EWorkflowStepStatus.Handled && x.StepExpiredTime < SqlFunc.GetDate()))
+            .WhereIF(IsCenter == false, (x, so) => x.HandlerOrgId == _sessionContext.RequiredOrgId)
+            .GroupBy(x => new { x.ExternalId, x.HandlerOrgName })
+            .Select(x => new { Id = x.ExternalId, WorkflowId = x.ExternalId, HandlerOrgName = x.HandlerOrgName });
 
         var queryCountersignOrder = _orderRepository.Queryable().InnerJoin(queryCountersign, (o, w) => o.Id == w.Id)
-            .Select((o,w)=> new Order { DaysOverdueOrgName = w.HandlerOrgName, Id = o.Id.SelectAll() });
-		quer = _orderRepository.UnionAll(quer, queryCountersignOrder).MergeTable().InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id);
-		return quer;
-	}
+            .Select((o, w) => new Order { DaysOverdueOrgName = w.HandlerOrgName, Id = o.Id.SelectAll() });
+        quer = _orderRepository.UnionAll(quer, queryCountersignOrder).MergeTable().InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id);
+        return quer;
+    }
 
-	/// <summary>
-	/// 回退错件统计
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	public ISugarQueryable<OrderReTransactVo> OrderReTransact(QueryOrderReTransactRequest dto)
+    /// <summary>
+    /// 回退错件统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderReTransactVo> OrderReTransact(QueryOrderReTransactRequest dto)
     {
 
-		return _orderSpecialDetailRepository.Queryable()
-			.Includes(x => x.OrderSpecial)
-			.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
-			.Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
-			.Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
-			.Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
-			.GroupBy(x => new { Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"), x.OrgId, x.OrgName })
-			.Select(x => new OrderReTransactVo
-			{
-				Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"),
-				OrgId = x.OrgId,
-				OrgName = x.OrgName,
-				Num = SqlFunc.AggregateCount(1)
-			}).MergeTable()
-			.OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
-			.OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc); ;
+        return _orderSpecialDetailRepository.Queryable()
+            .Includes(x => x.OrderSpecial)
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
+            .Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
+            .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
+            .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
+            .GroupBy(x => new { Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"), x.OrgId, x.OrgName })
+            .Select(x => new OrderReTransactVo
+            {
+                Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"),
+                OrgId = x.OrgId,
+                OrgName = x.OrgName,
+                Num = SqlFunc.AggregateCount(1)
+            }).MergeTable()
+            .OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
+            .OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc); ;
     }
     /// <summary>
     /// 回退错件明细统计
@@ -767,169 +773,170 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     public ISugarQueryable<OrderSpecialDetail> QueryOrderSourceDetail(QueryOrderReTransactDetailRequest dto)
     {
 
-	    return  _orderSpecialDetailRepository.Queryable()
-		    .Includes(x => x.OrderSpecial, s => s.Order)
-		    .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
-		    .WhereIF(!string.IsNullOrEmpty(dto.ErrorName), x => x.ErrorName.Contains(dto.ErrorName!))
-		    .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderSpecial!.Order!.No!.Contains(dto.No!))
-		    .Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
-		    .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
-		    .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime);
-	}
-	/// <summary>
-	/// 部门满意度统计
-	/// </summary>
-	/// <returns></returns>
-	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto) {
-	    dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+        return _orderSpecialDetailRepository.Queryable()
+            .Includes(x => x.OrderSpecial, s => s.Order)
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
+            .WhereIF(!string.IsNullOrEmpty(dto.ErrorName), x => x.ErrorName.Contains(dto.ErrorName!))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderSpecial!.Order!.No!.Contains(dto.No!))
+            .Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
+            .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
+            .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime);
+    }
+    /// <summary>
+    /// 部门满意度统计
+    /// </summary>
+    /// <returns></returns>
+    public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto)
+    {
+        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
-		bool IsCenter = _sessionContext.OrgIsCenter;
+        bool IsCenter = _sessionContext.OrgIsCenter;
 
-		var list = _orderVisitDetailRepository.Queryable()
-			.Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
-			.WhereIF(string.IsNullOrEmpty(dto.OrgName) == false, x => x.VisitOrgName.Contains(dto.OrgName))
-			.WhereIF(string.IsNullOrEmpty(dto.LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
-			.WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
+        var list = _orderVisitDetailRepository.Queryable()
+            .Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
+            .WhereIF(string.IsNullOrEmpty(dto.OrgName) == false, x => x.VisitOrgName.Contains(dto.OrgName))
+            .WhereIF(string.IsNullOrEmpty(dto.LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+            .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
 
-		var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
+        var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
 
-		if (IsCenter && list != null)
-		{
-			data = await list.GroupBy(x => new
-			{
-				VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-			})
-			.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-				TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-				VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-				SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-				RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-				DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-				NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-				NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-				NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
-			})
-			.MergeTable()
-			.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-			.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgName = o.Name,
-				OrgCode = it.OrgCode,
-				OrgType = o.OrgType,
-				TotalSumCount = it.TotalSumCount,
-				VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
-				SatisfiedCount = it.SatisfiedCount, //满意数
-				RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
-				DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
-				NoSatisfiedCount = it.NoSatisfiedCount,//不满意
-				NoEvaluateCount = it.NoEvaluateCount,//未做评价
-				NoPutThroughCount = it.NoPutThroughCount,//未接通
-			})
-			.ToListAsync();
-		}
-		else
-		{
-			data = await list.GroupBy(x => new
-			{
-				x.VisitOrgCode
-			})
-			.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgCode = x.VisitOrgCode,
-				TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-				VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-				SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-				RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-				DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-				NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-				NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-				NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
-			})
-			.MergeTable()
-			.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-			.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgName = o.Name,
-				OrgCode = it.OrgCode,
-				OrgType = o.OrgType,
-				TotalSumCount = it.TotalSumCount,
-				VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
-				SatisfiedCount = it.SatisfiedCount, //满意数
-				RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
-				DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
-				NoSatisfiedCount = it.NoSatisfiedCount,//不满意
-				NoEvaluateCount = it.NoEvaluateCount,//未做评价
-				NoPutThroughCount = it.NoPutThroughCount,//未接通
-			})
-			.ToListAsync();
-		}
+        if (IsCenter && list != null)
+        {
+            data = await list.GroupBy(x => new
+            {
+                VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+            })
+            .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+                VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+                SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+                DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+                NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+                NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+                NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+            })
+            .MergeTable()
+            .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+            .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgName = o.Name,
+                OrgCode = it.OrgCode,
+                OrgType = o.OrgType,
+                TotalSumCount = it.TotalSumCount,
+                VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+                SatisfiedCount = it.SatisfiedCount, //满意数
+                RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+                DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+                NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+                NoEvaluateCount = it.NoEvaluateCount,//未做评价
+                NoPutThroughCount = it.NoPutThroughCount,//未接通
+            })
+            .ToListAsync();
+        }
+        else
+        {
+            data = await list.GroupBy(x => new
+            {
+                x.VisitOrgCode
+            })
+            .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgCode = x.VisitOrgCode,
+                TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+                VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+                SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+                DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+                NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+                NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+                NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+            })
+            .MergeTable()
+            .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+            .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgName = o.Name,
+                OrgCode = it.OrgCode,
+                OrgType = o.OrgType,
+                TotalSumCount = it.TotalSumCount,
+                VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+                SatisfiedCount = it.SatisfiedCount, //满意数
+                RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+                DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+                NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+                NoEvaluateCount = it.NoEvaluateCount,//未做评价
+                NoPutThroughCount = it.NoPutThroughCount,//未接通
+            })
+            .ToListAsync();
+        }
         return data;
-	}
-
-	/// <summary>
-	/// 子部门满意度
-	/// </summary>
-	/// <returns></returns>
-	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto)
-	{
-		dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-
-		bool IsCenter = _sessionContext.OrgIsCenter;
+    }
 
-		var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(dto.OrgCode))
-			.LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
-			.Where((x, it) => it.OrderVisit.VisitTime >= dto.StartTime.Value && it.OrderVisit.VisitTime <= dto.EndTime.Value && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
-			.WhereIF(dto.OrgCode == "001", (x, it) => it.VisitOrgCode == dto.OrgCode)
-			.WhereIF(dto.OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode))
-			.WhereIF(!string.IsNullOrEmpty(dto.LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
-			.WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
-			 .GroupBy((x, it) => new
-			 {
-				 VisitOrgCode = it.VisitOrgCode
-			 })
-			 .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-			 {
-				 OrgCode = it.VisitOrgCode,
-				 TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
-				 VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-				 SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-				 RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-				 DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-				 NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-				 NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-				 NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1, 0)))//未接通
-			 })
-			 .MergeTable()
-			 .LeftJoin<SystemOrganize>((x, it) => x.OrgCode == it.Id)
-			.Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-			{
-				OrgName = it.Name,
-				OrgCode = x.OrgCode,
-				OrgType = it.OrgType,
-				TotalSumCount = x.TotalSumCount,
-				VerySatisfiedCount = x.VerySatisfiedCount,//非常满意数
-				SatisfiedCount = x.SatisfiedCount, //满意数
-				RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount,//视为满意
-				DefaultSatisfiedCount = x.DefaultSatisfiedCount,//默认满意
-				NoSatisfiedCount = x.NoSatisfiedCount,//不满意
-				NoEvaluateCount = x.NoEvaluateCount,//未做评价
-				NoPutThroughCount = x.NoPutThroughCount,//未接通
-			})
-			.ToListAsync();
+    /// <summary>
+    /// 子部门满意度
+    /// </summary>
+    /// <returns></returns>
+    public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto)
+    {
+        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+        bool IsCenter = _sessionContext.OrgIsCenter;
+
+        var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(dto.OrgCode))
+            .LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
+            .Where((x, it) => it.OrderVisit.VisitTime >= dto.StartTime.Value && it.OrderVisit.VisitTime <= dto.EndTime.Value && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
+            .WhereIF(dto.OrgCode == "001", (x, it) => it.VisitOrgCode == dto.OrgCode)
+            .WhereIF(dto.OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode))
+            .WhereIF(!string.IsNullOrEmpty(dto.LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+            .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+             .GroupBy((x, it) => new
+             {
+                 VisitOrgCode = it.VisitOrgCode
+             })
+             .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+             {
+                 OrgCode = it.VisitOrgCode,
+                 TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
+                 VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+                 SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                 RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+                 DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+                 NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+                 NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+                 NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1, 0)))//未接通
+             })
+             .MergeTable()
+             .LeftJoin<SystemOrganize>((x, it) => x.OrgCode == it.Id)
+            .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgName = it.Name,
+                OrgCode = x.OrgCode,
+                OrgType = it.OrgType,
+                TotalSumCount = x.TotalSumCount,
+                VerySatisfiedCount = x.VerySatisfiedCount,//非常满意数
+                SatisfiedCount = x.SatisfiedCount, //满意数
+                RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount,//视为满意
+                DefaultSatisfiedCount = x.DefaultSatisfiedCount,//默认满意
+                NoSatisfiedCount = x.NoSatisfiedCount,//不满意
+                NoEvaluateCount = x.NoEvaluateCount,//未做评价
+                NoPutThroughCount = x.NoPutThroughCount,//未接通
+            })
+            .ToListAsync();
         return list;
-	}
+    }
 
-	/// <summary>
-	/// 部门满意度明细统计
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	public ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto)
-	{
-		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
-		bool IsCenter = _sessionContext.OrgIsCenter;
+    /// <summary>
+    /// 部门满意度明细统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto)
+    {
+        dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+        bool IsCenter = _sessionContext.OrgIsCenter;
         return _orderVisitDetailRepository.Queryable()
             .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
             .Where(x => x.OrderVisit.VisitTime >= dto.StartTime && x.OrderVisit.VisitTime <= dto.EndTime && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
@@ -942,21 +949,22 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.TypeId is 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
             .WhereIF(dto.TypeId is 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
             .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum);
-	}
+    }
 
     /// <summary>
     /// 热点区域统计
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    public async Task<(List<SystemArea> area,object items)> HotspotAndAreaStatistics(HotspotAndAreaStatisticsReq dto)
+    public async Task<(List<SystemArea> area, object items)> HotspotAndAreaStatistics(HotspotAndAreaStatisticsReq dto)
     {
         dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
         var areaList = _systemAreaRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == 6 && x.Id != "510000").OrderBy(x => x.Id).MergeTable();
 
         var endIndex = (2 * dto.HotspotLevel).ToString();
         var hotspotList = _hotspotRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == int.Parse(endIndex))
-            .Select(x => new { 
+            .Select(x => new
+            {
                 HotspotId = x.Id,
                 HotspotName = x.HotSpotFullName,
             }).MergeTable();
@@ -965,7 +973,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var orderList = _orderRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime < dto.EndTime)
             .Select(x => new
             {
-                HotspotId= x.HotspotId.Substring(0,int.Parse(endIndex)),
+                HotspotId = x.HotspotId.Substring(0, int.Parse(endIndex)),
                 AreaCode = x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
             }).MergeTable();
 
@@ -1003,13 +1011,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                AreaCode = pp.Id,
                AreaName = pp.AreaName,
                Count = SqlFunc.AggregateSum(dd.Count)
-           }).Where(q => q.HotspotName != "").ToPivotListAsync(q=> q.AreaCode, q=> new { q.HotspotName,q.HotspotId},q=> q.Sum(x=>x.Count));
+           }).Where(q => q.HotspotName != "").ToPivotListAsync(q => q.AreaCode, q => new { q.HotspotName, q.HotspotId }, q => q.Sum(x => x.Count));
 
         var areaTitleList = await _systemAreaRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == 6 && x.Id != "510000").OrderBy(x => x.Id).ToListAsync();
         return (areaTitleList, returnList);
     }
 
-    
+
 
 
     /// <summary>
@@ -1024,7 +1032,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
         var endIndex = (2 * dto.HotspotLevel).ToString();
         var hotspotList = _hotspotRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == int.Parse(endIndex))
-            .Select(x => new {
+            .Select(x => new
+            {
                 HotspotId = x.Id,
                 HotspotName = x.HotSpotFullName,
             }).MergeTable();
@@ -1055,7 +1064,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
              }).MergeTable();
 
 
-        var returnList = await areaList.LeftJoin(hotListAndOrder, (pp, dd) => pp.Id == dd.AreaCode )
+        var returnList = await areaList.LeftJoin(hotListAndOrder, (pp, dd) => pp.Id == dd.AreaCode)
            .GroupBy((pp, dd) => new
            {
                HotspotId = dd.HotspotId,
@@ -1072,10 +1081,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                AreaName = pp.AreaName,
                Count = SqlFunc.AggregateSum(dd.Count)
            }).Where(q => q.HotspotName != "").ToPivotTableAsync(q => q.AreaName, q => new { q.HotspotName }, q => q.Sum(x => x.Count));
-        return  returnList;
+        return returnList;
     }
 
-    
+
 
 
 
@@ -1345,7 +1354,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             if (files != null && files.Any())
                 order.FileJson = await _fileRepository.AddFileAsync(files, order.Id, "", cancellationToken);
             order.ReTransactNum++;
-			await _orderRepository.UpdateAsync(order, cancellationToken);
+            await _orderRepository.UpdateAsync(order, cancellationToken);
 
             if (orderExtension is not null)
             {

+ 71 - 36
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -10,20 +10,17 @@ using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.OrderTranspond;
 using Hotline.Settings;
-using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
-using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.OrderTranspond;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
-using Hotline.Share.Enums.Quality;
 using Hotline.Share.Mq;
 using MapsterMapper;
+using PanGu;
 using StackExchange.Redis;
-using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
@@ -36,12 +33,10 @@ namespace Hotline.Application.Subscribers
     public class DataSharingSubscriber : ICapSubscribe, ITransientDependency
     {
         private readonly IRepository<OrderVisit> _orderVisitRepository;
-        private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
         private readonly IMapper _mapper;
         private readonly IOrderRepository _orderRepository;
         private readonly IOrderDomainService _orderDomainService;
         private readonly ICapPublisher _capPublisher;
-        private readonly IQualityApplication _qualityApplication;
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IRepository<OrderSendBack> _orderSendBackRepository;
         private readonly IWorkflowApplication _workflowApplication;
@@ -55,20 +50,18 @@ namespace Hotline.Application.Subscribers
         private readonly IRepository<SystemDicData> _systemDicDataRepository;
         private readonly ISystemOrganizeRepository _systemOrganizeRepository;
         private readonly IRepository<TranspondCityRawData> _transpondCityRawDataRepository;
-        private readonly IRepository<Workflow> _workflowRepository;
         private readonly IRepository<OrderComplement> _orderComplementRepository;
-        private readonly ITimeLimitDomainService _timeLimitDomainService;
         private readonly IOrderApplication _orderApplication;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<OrderWarning> _orderWarningRepository;
+        private readonly IRepository<OrderRevoke> _orderRevokeRepository;
 
         public DataSharingSubscriber(
             IRepository<OrderVisit> orderVisitRepository,
-            IRepository<OrderVisitDetail> orderVisitDetailRepository,
             IMapper mapper,
             IOrderRepository orderRepository,
             IOrderDomainService orderDomainService,
             ICapPublisher capPublisher,
-            IQualityApplication qualityApplication,
             IRepository<OrderDelay> orderDelayRepository,
             IRepository<OrderSendBack> orderSendBackRepository,
             IWorkflowApplication workflowApplication,
@@ -82,11 +75,11 @@ namespace Hotline.Application.Subscribers
             IRepository<SystemDicData> systemDicDataRepository,
             ISystemOrganizeRepository systemOrganizeRepository,
             IRepository<TranspondCityRawData> transpondCityRawDataRepository,
-            IRepository<Workflow> workflowRepository,
             IRepository<OrderComplement> orderComplementRepository,
-            ITimeLimitDomainService timeLimitDomainService,
             IOrderApplication orderApplication,
-            ISystemSettingCacheManager systemSettingCacheManager
+            ISystemSettingCacheManager systemSettingCacheManager,
+            IRepository<OrderWarning> orderWarningRepository,
+             IRepository<OrderRevoke> orderRevokeRepository
             )
         {
             _orderSendBackRepository = orderSendBackRepository;
@@ -101,18 +94,17 @@ namespace Hotline.Application.Subscribers
             _orderDomainService = orderDomainService;
             _fileRepository = fileRepository;
             _orderVisitRepository = orderVisitRepository;
-            _orderVisitDetailRepository = orderVisitDetailRepository;
             _mapper = mapper;
             _capPublisher = capPublisher;
             _orderDelayRepository = orderDelayRepository;
             _systemDicDataRepository = systemDicDataRepository;
             _systemOrganizeRepository = systemOrganizeRepository;
             _transpondCityRawDataRepository = transpondCityRawDataRepository;
-            _workflowRepository = workflowRepository;
             _orderComplementRepository = orderComplementRepository;
-            _timeLimitDomainService = timeLimitDomainService;
             _orderApplication = orderApplication;
             _systemSettingCacheManager = systemSettingCacheManager;
+            _orderWarningRepository = orderWarningRepository;
+            _orderRevokeRepository = orderRevokeRepository;
         }
 
         /// <summary>
@@ -121,7 +113,7 @@ namespace Hotline.Application.Subscribers
         [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderReturnFeedback)]
         public async Task RecOrderReturnAsync(OrderSendBackResultDto dto, CancellationToken cancellationToken)
         {
-            var sendBack = await _orderSendBackRepository.GetAsync(dto.Id, cancellationToken);
+            var sendBack = await _orderSendBackRepository.GetAsync(p=>p.Id==dto.Id&&p.State==0, cancellationToken);
             if (sendBack != null)
             {
                 sendBack.Result = dto.Result;
@@ -200,6 +192,27 @@ namespace Hotline.Application.Subscribers
             var order = await _orderRepository.GetAsync(p => p.ProvinceNo == dto.ProvinceNo, cancellationToken);
             if (order is null)
                 throw new UserFriendlyException("未查询到工单");
+
+            OrderRevoke orderRevoke = new()
+            {
+                OrderId = order.Id,
+                RevokeTime = DateTime.Parse(dto.RevokeTime),
+                RevokeType = dto.RevokeType,
+                RevokeName = dto.RevokeName,
+                RevokeReasion = dto.Opinion,
+                CliengGuid = dto.CliengGuid,
+                IsProRevoke = true,
+                RevokeTypeName = dto.RevokeType switch
+                {
+                    "1" => "诉求人已私下解决",
+                    "2" => "诉求内容有误",
+                    "3" => "诉求人信息有误",
+                    "other" => "其它",
+                    _ => "其它",
+                }
+            };
+            await _orderRevokeRepository.AddAsync(orderRevoke, cancellationToken);
+
             var current = SessionContextCreator.CreateSessionContext(dto.Source);
             if (string.IsNullOrEmpty(order?.WorkflowId))
             {
@@ -242,7 +255,8 @@ namespace Hotline.Application.Subscribers
             model.OrderId = order.Id;
             model.OrgId = "001";
             model.OrgName = "市民热线服务中心";
-            model.ApplyContent = dto.RemindReasion;
+            model.RemindTime = dto.RemindTime;
+            model.DsBisId= dto.DsBisId;
 
             if (!string.IsNullOrEmpty(order.WorkflowId))
             {
@@ -271,28 +285,45 @@ namespace Hotline.Application.Subscribers
         public async Task RecWarnInfoAsync(WarningDto dto, CancellationToken cancellationToken)
         {
             var order = await _orderRepository.Queryable().Where(x => x.ProvinceNo == dto.CaseSerial).FirstAsync(cancellationToken);
-            var model = new OrderUrge();
-            model.InitId();
-            model.State = 0;
-            model.CreatorOrgName = "省12345";
-            model.CrUser = "省12345";
-            model.ApplyContent = dto.WarnRulename + "    " + dto.WarnDescribe;
-            model.OrderId = order.Id;
-            model.ReplyLimitTime = dto.WarnTimebf;
-            model.OrgId = "001";
-            model.OrgName = "市民热线服务中心";
-
-            if (!string.IsNullOrEmpty(order.WorkflowId))
+            if (order != null)
             {
-                var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
-                if (org != null)
+                var model = new OrderUrge();
+                model.InitId();
+                model.State = 0;
+                model.CreatorOrgName = "省12345";
+                model.CrUser = "省12345";
+                model.ApplyContent = dto.WarnRulename + "    " + dto.WarnDescribe;
+                model.OrderId = order.Id;
+                model.ReplyLimitTime = dto.WarnTimebf;
+                model.OrgId = "001";
+                model.OrgName = "市民热线服务中心";
+
+                if (!string.IsNullOrEmpty(order.WorkflowId))
                 {
-                    model.OrgId = org.Key;
-                    model.OrgName = org.Value;
+                    var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
+                    if (org != null)
+                    {
+                        model.OrgId = org.Key;
+                        model.OrgName = org.Value;
+                    }
                 }
-            }
 
-            await _orderUrgeRepository.AddAsync(model, cancellationToken);
+                await _orderUrgeRepository.AddAsync(model, cancellationToken);
+
+                //写入预警
+                var warning = new OrderWarning()
+                {
+                    OrderId = order.Id,
+                    WarnRulename = dto.WarnRulename,
+                    WarnDescribe = dto.WarnDescribe,
+                    WarnTimebf = dto.WarnTimebf,
+                    WarnDegree = dto.WarnDegree,
+                    WarnType = dto.WarnType,
+                    WarnDate = dto.WarnDate,
+                    IsProWarn = true
+                };
+                await _orderWarningRepository.AddAsync(warning, cancellationToken);
+            }
         }
 
         /// <summary>
@@ -624,6 +655,10 @@ namespace Hotline.Application.Subscribers
         [CapSubscribe(EventNames.SharingOrderSupplements)]
         public async Task RecOrderSupplementsAsync(AddOrderComplementDto dto, CancellationToken cancellationToken)
         {
+            var order = await _orderRepository.GetAsync(d => d.ProvinceNo == dto.CaseSerial, cancellationToken);
+            if (order is null)
+                throw new UserFriendlyException("无效省工单编号");
+            dto.OrderId = order.Id;
             await _orderDomainService.AddOrderComplementAsync(dto, cancellationToken);
         }
 

+ 21 - 7
src/Hotline.Share/Dtos/DataSharing/PusherHotlineDto/CancelOrderDto.cs

@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Hotline.Share.Dtos.DataSharing.PusherHotlineDto
+namespace Hotline.Share.Dtos.DataSharing.PusherHotlineDto
 {
     /// <summary>
     /// 撤销工单
@@ -20,5 +14,25 @@ namespace Hotline.Share.Dtos.DataSharing.PusherHotlineDto
         /// 意见
         /// </summary>
         public string Opinion { get; set; }
+
+        /// <summary>
+        /// 撤单时间
+        /// </summary>
+        public string RevokeTime { get; set; }
+
+        /// <summary>
+        /// 撤单类型
+        /// </summary>
+        public string? RevokeType { get; set; }
+
+        /// <summary>
+        /// 操作人员
+        /// </summary>
+        public string? RevokeName { get; set; }
+
+        /// <summary>
+        /// 材料标识
+        /// </summary>
+        public string? CliengGuid { get; set; }
     }
 }

+ 21 - 1
src/Hotline.Share/Dtos/Order/AddOrderComplementDto.cs

@@ -5,7 +5,12 @@ namespace Hotline.Share.Dtos.Order;
 public class AddOrderComplementDto
 {
     public string OrderId { get; set; }
-    
+
+    /// <summary>
+    /// 服务工单编号
+    /// </summary>
+    public string CaseSerial { get; set; }
+
     /// <summary>
     /// 补充意见
     /// </summary>
@@ -16,6 +21,21 @@ public class AddOrderComplementDto
     /// </summary>
     public string? DsBisId { get; set; }
 
+    /// <summary>
+    /// 补充人员
+    /// </summary>
+    public string? SupplyName { get; set; }
+
+    /// <summary>
+    /// 补充时间
+    /// </summary>
+    public string? SupplyTime { get; set; }
+
+    /// <summary>
+    /// 是否省补充
+    /// </summary>
+    public bool IsProComplement { get; set; }
+
     /// <summary>
     /// 附件
     /// </summary>

+ 7 - 1
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -154,7 +154,13 @@ namespace Hotline.Share.Dtos.Order
         /// 是否紧急
         /// </summary>
         public bool? IsUrgent { get; set; }
-	}
+
+        /// <summary>
+        /// 省来源分类 1:政民互动直派,2:政民互动,3:省12345
+        /// </summary>
+        public string? ProvinceChannel { get; set; }
+
+    }
 
 
     public enum FiledType

+ 58 - 0
src/Hotline.Share/Dtos/ProvinceStatistics/OrderWarningDto.cs

@@ -0,0 +1,58 @@
+namespace Hotline.Share.Dtos.ProvinceStatistics
+{
+    public class OrderWarningDto
+    {
+        /// <summary>
+        /// 预警规则
+        /// </summary>
+        public string WarnRulename { get; set; }
+
+        /// <summary>
+        /// 规则明细
+        /// </summary>
+        public string WarnDescribe { get; set; }
+
+        /// <summary>
+        /// 预警应处理时间
+        /// </summary>
+        public DateTime? WarnTimebf { get; set; }
+
+        /// <summary>
+        /// 预警等级
+        /// </summary>
+        public string WarnDegree { get; set; }
+        public string WarnDegreeNameText => WarnDegreeName();
+
+        /// <summary>
+        /// 预警类型
+        /// </summary>
+        public string WarnType { get; set; }
+        public string WarnTypeNameText => WarnTypeName();
+
+        /// <summary>
+        /// 预警时间
+        /// </summary>
+        public DateTime? WarnDate { get; set; }
+
+        public string WarnTypeName()
+        {
+            return WarnType switch
+            {
+                "sign" => "签收",
+                "finish" => "办结",
+                _ => "签收",
+            };
+        }
+
+        public string WarnDegreeName()
+        {
+            return WarnDegree switch
+            {
+                "1" => "提示",
+                "2" => "警告",
+                "3" => "严重",
+                _ => "提示",
+            };
+        }
+    }
+}

+ 20 - 0
src/Hotline.Share/Dtos/ProvinceStatistics/ProvinceOrderUrgeDto.cs

@@ -0,0 +1,20 @@
+namespace Hotline.Share.Dtos.ProvinceStatistics
+{
+    public class ProvinceOrderUrgeDto
+    {
+        /// <summary>
+        /// 催办人
+        /// </summary>
+        public string? CrUser { get; set; }
+
+        /// <summary>
+        /// 省催办时间
+        /// </summary>
+        public DateTime? RemindTime { get; set; }
+
+        /// <summary>
+        /// 催办申请内容
+        /// </summary>
+        public string? ApplyContent { get; set; }
+    }
+}

+ 183 - 0
src/Hotline.Share/Dtos/ProvinceStatistics/ProvinceSendBackListDto.cs

@@ -255,4 +255,187 @@ namespace Hotline.Share.Dtos.ProvinceStatistics
         }
 
     }
+
+    /// <summary>
+    /// 撤单
+    /// </summary>
+    public class ProvinceOrderRevokeListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 撤单时间
+        /// </summary>
+        public DateTime? RevokeTime { get; set; }
+
+        /// <summary>
+        /// 撤单类型
+        /// </summary>
+        public string? RevokeType { get; set; }
+
+        /// <summary>
+        /// 撤单类型名称
+        /// </summary>
+        public string? RevokeTypeName { get; set; }
+
+        /// <summary>
+        /// 操作人员
+        /// </summary>
+        public string? RevokeName { get; set; }
+
+        /// <summary>
+        /// 撤单理由
+        /// </summary>
+        public string? RevokeReasion { get; set; }
+
+        /// <summary>
+        /// 材料标识
+        /// </summary>
+        public string? CliengGuid { get; set; }
+
+    }
+
+    /// <summary>
+    /// 预警
+    /// </summary>
+    public class ProvinceOrderWarningListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 预警规则
+        /// </summary>
+        public string WarnRulename { get; set; }
+
+        /// <summary>
+        /// 规则明细
+        /// </summary>
+        public string WarnDescribe { get; set; }
+
+        /// <summary>
+        /// 预警应处理时间
+        /// </summary>
+        public DateTime? WarnTimebf { get; set; }
+
+        /// <summary>
+        /// 预警等级
+        /// </summary>
+        public string WarnDegree { get; set; }
+
+        /// <summary>
+        /// 预警类型
+        /// </summary>
+        public string WarnType { get; set; }
+
+        /// <summary>
+        /// 预警时间
+        /// </summary>
+        public DateTime? WarnDate { get; set; }
+
+        /// <summary>
+        /// 是否省预警
+        /// </summary>
+        public bool IsProWarn { get; set; }
+
+    }
+
+    /// <summary>
+    /// 催办
+    /// </summary>
+    public class ProvinceOrderUrgeListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 催办人
+        /// </summary>
+        public string? CrUser { get; set; }
+
+        /// <summary>
+        /// 省催办时间
+        /// </summary>
+        public DateTime? RemindTime { get; set; }
+
+        /// <summary>
+        /// 催办申请内容
+        /// </summary>
+        public string? ApplyContent { get; set; }
+
+    }
+
+    /// <summary>
+    /// 补充
+    /// </summary>
+    public class ProvinceOrderComplementListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        // <summary>
+        /// 补充意见
+        /// </summary>
+        public string Opinion { get; set; }
+
+        /// <summary>
+        /// 补充人员
+        /// </summary>
+        public string? SupplyName { get; set; }
+
+        /// <summary>
+        /// 补充时间
+        /// </summary>
+        public string? SupplyTime { get; set; }
+
+    }
 }

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.83</Version>
+    <Version>1.0.85</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 23 - 1
src/Hotline/Orders/OrderComplement.cs

@@ -10,18 +10,40 @@ namespace Hotline.Orders;
 public class OrderComplement : CreationEntity
 {
     public string OrderId { get; set; }
-    
+
+    /// <summary>
+    /// 工单
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+    public Order Order { get; set; }
+
     /// <summary>
     /// 补充意见
     /// </summary>
     [SugarColumn(Length = 2000)]
     public string Opinion { get; set; }
 
+    /// <summary>
+    /// 补充人员
+    /// </summary>
+    public string? SupplyName { get; set; }
+
+    /// <summary>
+    /// 补充时间
+    /// </summary>
+    public DateTime? SupplyTime { get; set; }
+
     /// <summary>
     /// 省平台业务编号
     /// </summary>
     public string? DsBisId { get; set; }
 
+    /// <summary>
+    /// 是否省补充
+    /// </summary>
+    [SugarColumn(DefaultValue = "f")]
+    public bool IsProComplement { get; set; }
+
     /// <summary>
     /// 附件
     /// </summary>

+ 1 - 0
src/Hotline/Orders/OrderDomainService.cs

@@ -176,6 +176,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         var complement = _mapper.Map<OrderComplement>(dto);
         complement.InitId();
+        complement.IsProComplement = true;  
         if (dto.Files.Any()) complement.FileJson = await _fileRepository.AddFileAsync(dto.Files, complement.Id, "", cancellationToken);
         return await _orderComplementRepository.AddAsync(complement, cancellationToken);
     }

+ 60 - 0
src/Hotline/Orders/OrderRevoke.cs

@@ -0,0 +1,60 @@
+using SqlSugar;
+using System.ComponentModel;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    /// <summary>
+    /// 工单撤单
+    /// </summary>
+    [Description("工单撤单")]
+    public class OrderRevoke : FullStateEntity
+    {
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        public Order Order { get; set; }
+
+        /// <summary>
+        /// 撤单时间
+        /// </summary>
+        public DateTime? RevokeTime { get; set; }
+
+        /// <summary>
+        /// 撤单类型
+        /// </summary>
+        public string? RevokeType { get; set; }
+
+        /// <summary>
+        /// 撤单类型名称
+        /// </summary>
+        public string? RevokeTypeName { get; set; }
+
+        /// <summary>
+        /// 操作人员
+        /// </summary>
+        public string? RevokeName { get; set; }
+
+        /// <summary>
+        /// 撤单理由
+        /// </summary>
+        public string? RevokeReasion { get; set; }
+
+        /// <summary>
+        /// 材料标识
+        /// </summary>
+        public string? CliengGuid { get; set; }
+
+        /// <summary>
+        /// 是否省撤单
+        /// </summary>
+        [SugarColumn(DefaultValue = "f")]
+        public bool IsProRevoke { get; set; }
+    }
+}

+ 93 - 81
src/Hotline/Orders/OrderUrge.cs

@@ -5,75 +5,76 @@ using Hotline.Users;
 using SqlSugar;
 using XF.Domain.Repository;
 
-namespace Hotline.Orders {
-	[Description("催办")]
-	public class OrderUrge : FullStateEntity
-	{
-		/// <summary>
-		/// 工单ID
-		/// </summary>
-		[SugarColumn(ColumnDescription = "工单ID")]
-		public string OrderId { get; set; }
-
-		/// <summary>
-		/// 被催办部门ID
-		/// </summary>
-		[SugarColumn(ColumnDescription = "被催办部门ID")]
-		public string OrgId { get; set; }
-
-		/// <summary>
-		/// 被催办部门名称
-		/// </summary>
-		[SugarColumn(ColumnDescription = "被催办部门名称")]
-		public string OrgName { get; set; }
-
-		/// <summary>
-		/// 创建部门名称
-		/// </summary>
-		[SugarColumn(ColumnDescription = "创建部门名称")]
-		public string? CreatorOrgName { get; set; }
-
-		/// <summary>
-		/// 催办状态
-		/// </summary>
-		[SugarColumn(ColumnDescription = "催办状态   0 待回复  1 已回复  2 签收")]
-		public int State { get; set; }
-
-		/// <summary>
-		/// 催办签收时间
-		/// </summary>
-		[SugarColumn(ColumnDescription = "催办签收时间")]
-		public DateTime? SignTime { get; set; }
-
-		/// <summary>
-		/// 催办回复时间
-		/// </summary>
-		[SugarColumn(ColumnDescription = "催办回复时间")]
-		public DateTime? ReplyTime { get; set; }
-
-		/// <summary>
-		/// 催办回复时限
-		/// </summary>
-		[SugarColumn(ColumnDescription = "催办回复时限")]
-		public DateTime? ReplyLimitTime { get; set; }
-
-		/// <summary>
-		/// 催办申请内容
-		/// </summary>
-		[SugarColumn(ColumnDescription = "催办申请内容", ColumnDataType = "varchar(2000)")]
-		public string? ApplyContent { get; set; }
-
-		/// <summary>
-		/// 催办回复内容
-		/// </summary>
-		[SugarColumn(ColumnDescription = "催办回复内容", ColumnDataType = "varchar(2000)")]
-		public string? ReplyContent { get; set; }
-
-		/// <summary>
-		/// 回复人
-		/// </summary>
-		[SugarColumn(ColumnDescription = "回复人")]
-		public string? ReplyId { get; set; }
+namespace Hotline.Orders
+{
+    [Description("催办")]
+    public class OrderUrge : FullStateEntity
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单ID")]
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 被催办部门ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "被催办部门ID")]
+        public string OrgId { get; set; }
+
+        /// <summary>
+        /// 被催办部门名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "被催办部门名称")]
+        public string OrgName { get; set; }
+
+        /// <summary>
+        /// 创建部门名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "创建部门名称")]
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 催办状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "催办状态   0 待回复  1 已回复  2 签收")]
+        public int State { get; set; }
+
+        /// <summary>
+        /// 催办签收时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "催办签收时间")]
+        public DateTime? SignTime { get; set; }
+
+        /// <summary>
+        /// 催办回复时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "催办回复时间")]
+        public DateTime? ReplyTime { get; set; }
+
+        /// <summary>
+        /// 催办回复时限
+        /// </summary>
+        [SugarColumn(ColumnDescription = "催办回复时限")]
+        public DateTime? ReplyLimitTime { get; set; }
+
+        /// <summary>
+        /// 催办申请内容
+        /// </summary>
+        [SugarColumn(ColumnDescription = "催办申请内容", ColumnDataType = "varchar(2000)")]
+        public string? ApplyContent { get; set; }
+
+        /// <summary>
+        /// 催办回复内容
+        /// </summary>
+        [SugarColumn(ColumnDescription = "催办回复内容", ColumnDataType = "varchar(2000)")]
+        public string? ReplyContent { get; set; }
+
+        /// <summary>
+        /// 回复人
+        /// </summary>
+        [SugarColumn(ColumnDescription = "回复人")]
+        public string? ReplyId { get; set; }
 
         /// <summary>
         /// 省平台业务编号
@@ -84,22 +85,33 @@ namespace Hotline.Orders {
         /// 
         /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(OrderId))]
-		public Order Order { get; set; }
+        public Order Order { get; set; }
 
-		[SugarColumn(ColumnDescription = "回复人")]
-		public string? ReUser { get; set; }
+        [SugarColumn(ColumnDescription = "回复人")]
+        public string? ReUser { get; set; }
 
-		[SugarColumn(ColumnDescription = "申请人")]
-		public string? CrUser { get; set; }
+        [SugarColumn(ColumnDescription = "申请人")]
+        public string? CrUser { get; set; }
+
+        /// <summary>
+        /// 省催办时间
+        /// </summary>
+        public DateTime? RemindTime { get; set; }
+
+        /// <summary>
+        /// 是否省催单
+        /// </summary>
+        [SugarColumn(DefaultValue = "f")]
+        public bool IsProRemind { get; set; }
 
-		[SugarColumn(ColumnDescription = "签收人")]
-		public string? SignUser { get; set; }
+        [SugarColumn(ColumnDescription = "签收人")]
+        public string? SignUser { get; set; }
 
-		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-		public List<FileJson>? FileJson { get; set; }
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<FileJson>? FileJson { get; set; }
 
-		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-		public List<FileJson>? ReplyFileJson { get; set; }
-	}
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<FileJson>? ReplyFileJson { get; set; }
+    }
 }
 

+ 60 - 0
src/Hotline/Orders/OrderWarning.cs

@@ -0,0 +1,60 @@
+using SqlSugar;
+using System.ComponentModel;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    /// <summary>
+    /// 工单预警
+    /// </summary>
+    [Description("工单预警")]
+    public class OrderWarning : FullStateEntity
+    {
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        public Order Order { get; set; }
+
+        /// <summary>
+        /// 预警规则
+        /// </summary>
+        public string WarnRulename { get; set; }
+
+        /// <summary>
+        /// 规则明细
+        /// </summary>
+        public string WarnDescribe { get; set; }
+
+        /// <summary>
+        /// 预警应处理时间
+        /// </summary>
+        public DateTime? WarnTimebf { get; set; }
+
+        /// <summary>
+        /// 预警等级
+        /// </summary>
+        public string WarnDegree { get; set; }
+
+        /// <summary>
+        /// 预警类型
+        /// </summary>
+        public string WarnType { get; set; }
+
+        /// <summary>
+        /// 预警时间
+        /// </summary>
+        public DateTime? WarnDate { get; set; }
+
+        /// <summary>
+        /// 是否省预警
+        /// </summary>
+        [SugarColumn(DefaultValue = "f")]
+        public bool IsProWarn { get; set; }
+    }
+}