Ver código fonte

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

xf 9 meses atrás
pai
commit
79bdd7acd5
34 arquivos alterados com 884 adições e 529 exclusões
  1. 174 158
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  2. 50 112
      src/Hotline.Api/Controllers/Bigscreen/JudicialManagementScreenController.cs
  3. 44 23
      src/Hotline.Api/Controllers/OrderController.cs
  4. 1 1
      src/Hotline.Api/Controllers/OrderProvinceZmhdController.cs
  5. 2 2
      src/Hotline.Api/Controllers/WorkflowController.cs
  6. 17 29
      src/Hotline.Application/Bigscreen/EnforcementDataScreenRefreshService.cs
  7. 31 20
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  8. 18 17
      src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs
  9. 2 1
      src/Hotline.Application/Mappers/OrderMapperConfigs.cs
  10. 9 0
      src/Hotline.Application/Orders/IOrderApplication.cs
  11. 149 3
      src/Hotline.Application/Orders/OrderApplication.cs
  12. 2 1
      src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs
  13. 15 0
      src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs
  14. 141 80
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  15. 2 24
      src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs
  16. 5 0
      src/Hotline.Share/Dtos/JudicialManagement/EnforcementBigscreenDto.cs
  17. 5 0
      src/Hotline.Share/Dtos/Order/OrderDto.cs
  18. 10 0
      src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs
  19. 5 0
      src/Hotline.Share/Dtos/Order/PublishedDto.cs
  20. 5 0
      src/Hotline.Share/Dtos/Settings/TimeConfig.cs
  21. 10 0
      src/Hotline.Share/Dtos/Settings/TimeLimitDto.cs
  22. 1 1
      src/Hotline.Share/Hotline.Share.csproj
  23. 5 0
      src/Hotline.Share/Requests/DepartmentalProcessingStatisticsDto.cs
  24. 59 0
      src/Hotline.Share/Requests/PagedKeywordRequest.cs
  25. 1 1
      src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs
  26. 4 2
      src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs
  27. 6 5
      src/Hotline/FlowEngine/Workflows/Workflow.cs
  28. 13 13
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  29. 0 6
      src/Hotline/Orders/IOrderRepository.cs
  30. 34 6
      src/Hotline/Orders/Order.cs
  31. 5 4
      src/Hotline/Orders/OrderDomainService.cs
  32. 11 0
      src/Hotline/Orders/OrderSpecial.cs
  33. 1 1
      src/Hotline/Settings/TimeLimits/ITimeLimitDomainService.cs
  34. 47 19
      src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

+ 174 - 158
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -10,7 +10,6 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.Bigscreen;
 using Hotline.Share.Dtos.CallCenter;
@@ -22,10 +21,7 @@ using Hotline.Share.Requests;
 using Hotline.Tools;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
-using MiniExcelLibs;
-using NPOI.OpenXmlFormats.Vml;
 using SqlSugar;
-using System.Collections;
 using System.Data;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
@@ -47,7 +43,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
         private readonly IRepository<OrderPublish> _orderPublishRepository;
-        private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
+        private readonly ISystemOrganizeRepository _systemOrganizeRepository;
         private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
         private readonly ISessionContext _sessionContext;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
@@ -61,6 +57,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<SystemArea> _systemAreaRepository;
         private readonly IRepository<Hotspot> _hotspotRepository;
         private readonly IRepository<SystemDicData> _systemDicDataRepository;
+        private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
 
         public BiOrderController(
             IOrderRepository orderRepository,
@@ -74,7 +71,7 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderVisit> orderVisitRepository,
             IRepository<TrCallRecord> trCallRecordRepository,
             IRepository<OrderPublish> orderPublishRepository,
-            IRepository<SystemOrganize> systemOrganizeRepository,
+            ISystemOrganizeRepository systemOrganizeRepository,
             IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
             ISessionContext sessionContext,
             ISystemSettingCacheManager systemSettingCacheManager,
@@ -87,7 +84,8 @@ namespace Hotline.Api.Controllers.Bi
             IOrderReportApplication orderReportApplication,
             IRepository<SystemArea> systemAreaRepository,
             IRepository<Hotspot> hotspotRepository,
-             IRepository<SystemDicData> systemDicDataRepository
+             IRepository<SystemDicData> systemDicDataRepository,
+            ISystemDicDataCacheManager systemDicDataCacheManager
             )
         {
             _orderRepository = orderRepository;
@@ -115,6 +113,7 @@ namespace Hotline.Api.Controllers.Bi
             _systemAreaRepository = systemAreaRepository;
             _hotspotRepository = hotspotRepository;
             _systemDicDataRepository = systemDicDataRepository;
+            _systemDicDataCacheManager = systemDicDataCacheManager;
         }
 
         /// <summary>
@@ -211,7 +210,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "部门超期统计明细数据");
         }
 
-
         /// <summary>
         /// 列表页面基础数据
         /// </summary>
@@ -276,7 +274,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "部门超期统计数据");
         }
 
-
         /// <summary>
         /// 话务员办件统计
         /// </summary>
@@ -468,7 +465,6 @@ namespace Hotline.Api.Controllers.Bi
             return new { List = res, Total = total };
         }
 
-
         /// <summary>
         /// 部门不满意统计
         /// 已加验证部门
@@ -1197,7 +1193,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "部门满意度明细数据");
         }
 
-
         /// <summary>
         /// 中心报表统计
         /// </summary>
@@ -1428,6 +1423,19 @@ namespace Hotline.Api.Controllers.Bi
         {
             var items = await _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto).ToListAsync();
 
+            foreach (var item in items)
+            {
+                item.ZxAllTimes = Math.Round(((double)item.ZxAllTimes / 3600), 2);
+                item.JyAllTimes = Math.Round(((double)item.JyAllTimes / 3600), 2);
+                item.QzAllTimes = Math.Round(((double)item.QzAllTimes / 3600), 2);
+                item.ByAllTimes = Math.Round(((double)item.ByAllTimes / 3600), 2);
+                item.JbAllTimes = Math.Round(((double)item.JbAllTimes / 3600), 2);
+                item.TsAllTimes = Math.Round(((double)item.TsAllTimes / 3600), 2);
+                item.QtAllTimes = Math.Round(((double)item.QtAllTimes / 3600), 2);
+                item.YjAllTimes = Math.Round(((double)item.YjAllTimes / 3600), 2);
+            }
+
+
             var total = new DepartmentAcceptanceTypeStatisticsDto
             {
                 OrgName = "合计",
@@ -1488,7 +1496,17 @@ namespace Hotline.Api.Controllers.Bi
                 var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
                 list = items;
             }
-
+            foreach (var item in list)
+            {
+                item.ZxAllTimes = Math.Round(((double)item.ZxAllTimes / 3600), 2);
+                item.JyAllTimes = Math.Round(((double)item.JyAllTimes / 3600), 2);
+                item.QzAllTimes = Math.Round(((double)item.QzAllTimes / 3600), 2);
+                item.ByAllTimes = Math.Round(((double)item.ByAllTimes / 3600), 2);
+                item.JbAllTimes = Math.Round(((double)item.JbAllTimes / 3600), 2);
+                item.TsAllTimes = Math.Round(((double)item.TsAllTimes / 3600), 2);
+                item.QtAllTimes = Math.Round(((double)item.QtAllTimes / 3600), 2);
+                item.YjAllTimes = Math.Round(((double)item.YjAllTimes / 3600), 2);
+            }
             //增加合计
             list.Add(new DepartmentAcceptanceTypeStatisticsDto
             {
@@ -1645,7 +1663,6 @@ namespace Hotline.Api.Controllers.Bi
         {
             var list = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto.QueryDto);
 
-
             //增加合计
             list.Add(new DepartmentalProcessingStatisticsDataDto
             {
@@ -1790,7 +1807,6 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-
         [HttpGet("departmental_processing_statistics_list")]
         public async Task<PagedDto<OrderDto>> GetDepartmentalProcessingStatisticsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
         {
@@ -1815,7 +1831,6 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-
         [HttpPost("departmental_processing_statistics_list_export")]
         public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
         {
@@ -2179,7 +2194,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "回退错件统计数据");
         }
 
-
         /// <summary>
         /// 回退错件明细
         /// </summary>
@@ -2318,6 +2332,7 @@ namespace Hotline.Api.Controllers.Bi
 
             return res;
         }
+
         /// <summary>
         /// 派单量统计明细
         /// </summary>
@@ -2374,7 +2389,6 @@ namespace Hotline.Api.Controllers.Bi
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
 
-
         /// <summary>
         /// 二次办理统计
         /// </summary>
@@ -2386,6 +2400,7 @@ namespace Hotline.Api.Controllers.Bi
             var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto, HttpContext.RequestAborted);
             return await query.ToListAsync();
         }
+
         /// <summary>
         /// 二次办理统计导出
         /// </summary>
@@ -2420,6 +2435,7 @@ namespace Hotline.Api.Controllers.Bi
 
             return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
         }
+
         /// <summary>
         /// 二次办理明细导出
         /// </summary>
@@ -2453,7 +2469,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "二次办理列表数据");
         }
 
-
         /// <summary>
         /// 二次办理满意度统计
         /// </summary>
@@ -2513,6 +2528,7 @@ namespace Hotline.Api.Controllers.Bi
             list.Add(cityTotal);
             return list;
         }
+
         /// <summary>
         /// 二次办理满意度统计导出
         /// </summary>
@@ -2595,6 +2611,7 @@ namespace Hotline.Api.Controllers.Bi
 
             return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
         }
+
         /// <summary>
         /// 二次办理满意度明细导出
         /// </summary>
@@ -2628,8 +2645,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "二次办理满意度列表数据");
         }
 
-
-
         /// <summary>
         /// 未签收统计
         /// </summary>
@@ -2647,6 +2662,7 @@ namespace Hotline.Api.Controllers.Bi
             }
             return new PagedDto<UnsignedOrderDto>(total, itemsVo);
         }
+
         /// <summary>
         /// 未签收统计导出
         /// </summary>
@@ -2685,7 +2701,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "未签收统计列表数据");
         }
 
-
         /// <summary>
         /// 信件来源统计
         /// </summary>
@@ -2700,6 +2715,7 @@ namespace Hotline.Api.Controllers.Bi
             items.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
             return items;
         }
+
         /// <summary>
         /// 信件来源统计导出
         /// </summary>
@@ -2729,7 +2745,6 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "信件来源统计数据");
         }
 
-
         /// <summary>
         /// 信件来源统计列表
         /// </summary>
@@ -2750,6 +2765,7 @@ namespace Hotline.Api.Controllers.Bi
 
             return new { Item = item, TitleData = titleData };
         }
+
         /// <summary>
         /// 信件来源统计导出
         /// </summary>
@@ -2773,6 +2789,7 @@ namespace Hotline.Api.Controllers.Bi
             var (total, items) = await _orderApplication.QueryOrderSourceDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
+
         /// <summary>
         /// 信件来源统计明细导出
         /// </summary>
@@ -2945,12 +2962,31 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("org-visitdetail-list")]
         public async Task<PagedDto<OrgVisitDetailListResp>> OrgVisitDetailList([FromQuery] OrgVisitDetailListReq dto)
         {
-            var query = _orderRepository.OrgVisitDetailList(dto);
+            var query = _orderReportApplication.OrgVisitDetailList(dto);
             var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
             return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
         }
 
+        /// <summary>
+        /// 部门满意度明细页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("org-visitdetail-list-basedata")]
+        public async Task<object> OrgVisitDetailListBaseData()
+        {
+            var VisitSatisfaction = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction);
+
+            if (_sessionContext.OrgIsCenter)
+            {
+                return new { OrgsOptions = await _systemOrganizeRepository.GetOrgJson(), VisitSatisfaction = VisitSatisfaction };
+            }
+            else
+            {
+                return new { OrgsOptions = await _systemOrganizeRepository.GetOrgJsonForUser(_sessionContext.RequiredOrgId), VisitSatisfaction = VisitSatisfaction };
+            }
+        }
+
         /// <summary>
         /// 部门满意度明细导出
         /// </summary>
@@ -2959,7 +2995,7 @@ namespace Hotline.Api.Controllers.Bi
         [HttpPost("org-visitdetail-list-export")]
         public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
         {
-            var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
+            var query = _orderReportApplication.OrgVisitDetailList(dto.QueryDto);
 
             List<OrderVisitDetail> orders;
             if (dto.IsExportAll)
@@ -2990,9 +3026,10 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("hotspot-area-statistics")]
         public async Task<object> HotspotAndAreaStatistics([FromQuery] HotspotAndAreaStatisticsReq dto)
         {
-            var (areaList ,returnList) = await _orderApplication.HotspotAndAreaStatistics(dto);
 
-            return new { AreaList = areaList, Data =  returnList };
+            var (areaList, returnList) = await _orderApplication.HotspotAndAreaStatistics(dto);
+
+            return new { AreaList = areaList, Data = returnList };
         }
 
         /// <summary>
@@ -3001,153 +3038,132 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot-area-statistics-export")]
-        public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody]HotspotAndAreaStatisticsReq dto)
+        public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody] HotspotAndAreaStatisticsReq dto)
         {
-            var  returnList = await _orderApplication.HotspotAndAreaStatisticsExport(dto);
-            var table = InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
+            var returnList = await _orderApplication.HotspotAndAreaStatisticsExport(dto);
+            var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
             var stream = ExcelHelper.CreateStream(table);
             return ExcelStreamResult(stream, "热点区域统计");
         }
 
-        private DataTable InitHotspotTable(DataTable dt,List<string> AddColumnName,int HotspotLevel)
+        /// <summary>
+        /// 受理类型统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("accepttype-statistics")]
+        public async Task<List<AcceptTypeStatisticsDto>> AcceptTypeStatistics([FromQuery] AcceptTypeStatisticsReq dto)
         {
-            //修改列名
-            if (dt.Columns.Contains("HotspotName"))
-                dt.Columns["HotspotName"].ColumnName = "一级热点";
-
-            //增加小计
-            DataColumn totalColumn = new DataColumn("小计", typeof(decimal));
-            dt.Columns.Add(totalColumn);
-            if (dt.Columns.Contains("Column1"))
-                dt.Columns.Remove("Column1");
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+            var list = await _orderReportApplication.AcceptTypeStatistics(dto).ToListAsync();
+            int SumCount = list.Sum(x => x.SumCount);
+            list.Add(new AcceptTypeStatisticsDto()
+            {
+                AcceptType = "合计",
+                SumCount = SumCount,
+                CompletionCount = list.Sum(x => x.CompletionCount),
+                VisitCount = list.Sum(x => x.VisitCount)
+            });
 
-            //计算小计
-            for (int i = 0; i < dt.Rows.Count; i++)
+            list.ForEach(x =>
             {
-                int sumcount = 0;
-                for (int j = 1; j < dt.Columns.Count - 1; j++)
-                {
-                    sumcount += Convert.ToInt32(dt.Rows[i][j].ToString());
-                }
-                dt.Rows[i][dt.Columns.Count - 1] = sumcount;
-            }
+                x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
+            });
 
-            //增加合计
-            DataRow totalRow = dt.NewRow();
-            if (dt.Columns[0].ColumnName == "HotspotName") totalRow["HotspotName"] = "合计";
-            else totalRow["一级热点"] = "合计";
-            for (int i = 1; i < dt.Columns.Count; i++)
-            {
-                int sumcount = 0;
-                for (int j = 0; j < dt.Rows.Count; j++)
-                {
-                    sumcount += Convert.ToInt32(dt.Rows[j][i].ToString());
-                }
-                totalRow[i] = sumcount;
-            }
-            dt.Rows.Add(totalRow);
+            return list;
+        }
 
-            //创建新表
-            DataTable dt2 = new DataTable();
+        /// <summary>
+        /// 受理类型统计-导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("accepttype-statistics-export")]
+        public async Task<FileStreamResult> AcceptTypeStatisticsExport([FromBody] ExportExcelDto<AcceptTypeStatisticsReq> dto)
+        {
 
-            //添加表头
-            foreach (var item in AddColumnName)
+            var list = await _orderReportApplication.AcceptTypeStatistics(dto.QueryDto).ToListAsync();
+            int SumCount = list.Sum(x => x.SumCount);
+            list.Add(new AcceptTypeStatisticsDto()
             {
-                if (item.Equals("HotspotName") || item.Equals("一级热点"))
-                {
-                    dt2.Columns.Add("一级热点");
-                    if (HotspotLevel==2)
-                    {
-                        dt2.Columns.Add("二级热点");
-                    }
-                    else if(HotspotLevel==3)
-                    {
-                        dt2.Columns.Add("二级热点");
-                        dt2.Columns.Add("三级热点");
-                    }
-                    else if(HotspotLevel==4)
-                    {
-                        dt2.Columns.Add("二级热点");
-                        dt2.Columns.Add("三级热点");
-                        dt2.Columns.Add("四级热点");
-                    }
-                }
-                else
-                {
-                    if (dt.Columns.Contains(item))
-                        dt2.Columns.Add(item);
-                }
-            }
+                AcceptType = "合计",
+                SumCount = SumCount,
+                CompletionCount = list.Sum(x => x.CompletionCount),
+                VisitCount = list.Sum(x => x.VisitCount)
+            });
 
-            //处理数据
-            foreach (DataRow sourceRow in dt.Rows)
+            list.ForEach(x =>
             {
-                DataRow targetRow = dt2.NewRow();                
-                foreach (var item in AddColumnName)
-                {
-                    if (item.Equals("HotspotName"))
-                    {
-                        targetRow["一级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[0];
-                        if (HotspotLevel==2)
-                        {
-                            targetRow["二级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[1];
-                        }
-                        else if(HotspotLevel==3)
-                        {
-                            try
-                            {
-                                targetRow["二级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[1];
-                            }
-                            catch{
-                                targetRow["二级热点"] = "";
-                            }
-                            try
-                            {
-                                targetRow["三级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[2];
-                            }
-                            catch{
-                                targetRow["三级热点"] = "";
-                            }
-                        }
-                        else if(HotspotLevel==4)
-                        {
-                            try
-                            {
-                                targetRow["二级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[1];
-                            }
-                            catch
-                            {
-                                targetRow["二级热点"] = "";
-                            }
-                            try
-                            {
-                                targetRow["三级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[2];
-                            }
-                            catch
-                            {
-                                targetRow["三级热点"] = "";
-                            }
-                            try
-                            {
-                                targetRow["四级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[3];
-                            }
-                            catch 
-                            {
-                                targetRow["四级热点"] = "";
-                            }
-                            
-                        }
-                    }
-                    else
-                    {
-                        targetRow[item] = sourceRow[item];
-                    }
-                }
-                dt2.Rows.Add(targetRow);
-            }
+                x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
+            });
+
+
+
+            var orderDtos = _mapper.Map<ICollection<AcceptTypeStatisticsDto>>(list);
 
-            return dt2;
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(AcceptTypeStatisticsDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "受理类型统计表数据");
         }
-    }
 
+        /// <summary>
+        /// 下级区域统计
+        /// </summary>
+        /// <param name="StartTime">开始时间</param>
+        /// <param name="EndTime">结束时间</param>
+        /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
+        /// <param name="AreaCode">上级区域Id</param>
+        /// <returns></returns>
+        [HttpGet("area_subordinate")]
+        public async Task<object> AreaSubordinate(DateTime StartTime, DateTime EndTime, int TypeId, string? AreaCode)
+        {
+            EndTime = EndTime.AddDays(1).AddSeconds(-1);
+
+            var IsCenter = _sessionContext.OrgIsCenter;
+
+            string count = "6";
+            if (!string.IsNullOrEmpty(AreaCode) && AreaCode!= "511500")
+                count = (AreaCode.Length + 2).ToString();
+
+            if (string.IsNullOrEmpty(AreaCode))
+                AreaCode = "510000";
+
+            var query = _orderRepository.Queryable()
+                  .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
+                    .WhereIF(TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
+                  .WhereIF(TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
+                  .WhereIF(IsCenter == false, p => p.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                   .GroupBy(p => new { Id = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
+                  .Select(p => new
+                  {
+                      AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
+                      SumCount = SqlFunc.AggregateCount(p.AreaCode)
+                  })
+                  .MergeTable();
+
+            var list = await _systemAreaRepository.Queryable()
+                  .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
+                  .Where((s, o) => s.ParentId == AreaCode)
+                  .Select((s, o) => new
+                  {
+                      AreaCode = s.Id,
+                      SumCount = o.SumCount,
+                      AreaName = s.AreaName,
+                      HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
+                  })
+                .ToListAsync();
+
+            return list;
+
+
+
+        }
+    }
 }

+ 50 - 112
src/Hotline.Api/Controllers/Bigscreen/JudicialManagementScreenController.cs

@@ -17,7 +17,6 @@ namespace Hotline.Api.Controllers.Bigscreen
     public class JudicialManagementScreenController : BaseController
     {
         private readonly IMapper _mapper;
-        private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
         private readonly IRepository<SystemArea> _systemAreaRepository;
         private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
 
@@ -25,16 +24,13 @@ namespace Hotline.Api.Controllers.Bigscreen
         /// 
         /// </summary>
         /// <param name="mapper"></param>
-        /// <param name="enforcementOrdersRepository"></param>
         /// <param name="systemAreaRepository"></param>
         /// <param name="judicialManagementOrdersRepository"></param>
         public JudicialManagementScreenController(IMapper mapper,
-            IRepository<EnforcementOrders> enforcementOrdersRepository,
             IRepository<SystemArea> systemAreaRepository,
             IRepository<JudicialManagementOrders> judicialManagementOrdersRepository)
         {
             _mapper = mapper;
-            _enforcementOrdersRepository = enforcementOrdersRepository;
             _systemAreaRepository = systemAreaRepository;
             _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
         }
@@ -63,10 +59,10 @@ namespace Hotline.Api.Controllers.Bigscreen
                 .Select(d => new OrderModuleDto
                 {
                     OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)),
-                    EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue&& d.IsEnforcementOrder.Value, 1, 0)),
+                    EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
                     TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
                     TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
-                    PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0))
+                    PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder == true, 1, 0))
                 })
                 .ToListAsync();
             if (data != null && data.Count > 0)
@@ -89,43 +85,6 @@ namespace Hotline.Api.Controllers.Bigscreen
             return dto;
         }
 
-        /// <summary>
-        /// 左中受理类型
-        /// </summary>
-        /// <param name="StartTime"></param>
-        /// <param name="EndTime"></param>
-        /// <returns></returns>
-        [AllowAnonymous]
-        [HttpGet("order-accept-type-statistics")]
-        public async Task<List<OrderAcceptTypeStatisticsDto>> GetOrderAcceptTypeStatisticsAsync(DateTime StartTime, DateTime EndTime)
-        {
-            EndTime = EndTime.AddDays(1).AddSeconds(-1);
-
-            var list = await _enforcementOrdersRepository.Queryable()
-                .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                .Where((x, o) => o.Id != null && o.Status > EOrderStatus.Handling && !string.IsNullOrEmpty(o.AcceptType))
-                .Where((x, o) => o.StartTime >= StartTime && o.StartTime <= EndTime)
-                .Select((x, o) => new
-                {
-                    x.Id,
-                    o.AcceptType,
-                    o.Status,
-                    o.ExpiredStatus
-                })
-                .MergeTable()
-                 .GroupBy(x => x.AcceptType)
-                .Select(x => new OrderAcceptTypeStatisticsDto
-                {
-                    AcceptType = x.AcceptType,
-                    SumCount = SqlFunc.AggregateCount(x.Id),
-                    HandlingCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Handling && x.Status < EOrderStatus.Filed, 1, 0)),
-                    FiledCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
-                    OverTimeCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.ExpiredStatus == EExpiredStatus.Expired, 1, 0))
-                }).ToListAsync();
-
-            return list;
-        }
-
         /// <summary>
         /// 左下高频事项统计
         /// </summary>
@@ -141,15 +100,14 @@ namespace Hotline.Api.Controllers.Bigscreen
             if (AreaCode.Length == 6 && AreaCode.IndexOf("00") == 4)
                 AreaCode = AreaCode.Remove(4);
 
-            var list = await _enforcementOrdersRepository.Queryable()
-               .LeftJoin<Order>((x, o) => x.Id == o.Id)
-               .LeftJoin<JudicialComplaintsEventType>((x, o, j) => x.EventTypeOneLevelId == j.Id)
-               .Where((x, o, j) => o.Id != null && x.EventTypeOneLevelId != null && j.Id != null)
-               .Where((x, o, j) => o.StartTime >= StartTime && o.StartTime <= EndTime && o.AreaCode.StartsWith(AreaCode))
-               .Select((x, o, j) => new
+            var list = await _judicialManagementOrdersRepository.Queryable()
+               .LeftJoin<JudicialComplaintsEventType>((o, j) => o.EventTypeOneLevelId == j.Id)
+               .Where((o, j) => o.EventTypeOneLevelId != null && j.Id != null)
+               .Where((o, j) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.AreaCode.StartsWith(AreaCode))
+               .Select((o, j) => new
                {
-                   x.Id,
-                   EventTypeId = x.EventTypeOneLevelId,
+                   o.Id,
+                   EventTypeId = o.EventTypeOneLevelId,
                    j.EventTypeName
                })
                .MergeTable()
@@ -161,7 +119,7 @@ namespace Hotline.Api.Controllers.Bigscreen
                     SumCount = SqlFunc.AggregateCount(p.Id)
                 })
                 .OrderByDescending(p => p.SumCount)
-                .Take(5)
+                .Take(10)
                 .ToListAsync();
 
             return list;
@@ -210,25 +168,23 @@ namespace Hotline.Api.Controllers.Bigscreen
                     AreaName = item.Name
                 };
 
-                var data = await _enforcementOrdersRepository.Queryable()
-                .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                .Where((x, o) => o.Id != null)
-                .Where((x, o) => o.StartTime >= StartTime && o.StartTime <= EndTime && o.AreaCode.StartsWith(item.Id))
-                .Select((x, o) => new
+                var data = await _judicialManagementOrdersRepository.Queryable()
+                .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.AreaCode.StartsWith(item.Id))
+                .Select(o => new
                 {
-                    x.Id,
-                    x.IsEnforcementOrder,
-                    x.IsTheClueTrue,
-                    x.IsPassTheBuckOrder
+                    o.Id,
+                    o.IsEnforcementOrder,
+                    o.IsTheClueTrue,
+                    o.IsPassTheBuckOrder
                 })
                 .MergeTable()
                 .Select(d => new OrderModuleDto
                 {
                     OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)),
-                    EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)),
+                    EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
                     TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
                     TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
-                    PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0))
+                    PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder == true, 1, 0))
                 })
                 .ToListAsync();
                 if (data != null && data.Count > 0)
@@ -255,33 +211,24 @@ namespace Hotline.Api.Controllers.Bigscreen
         [HttpGet("order-overview")]
         public async Task<List<OrderOverviewDto>> GetOrderOverviewAsync()
         {
-            var list = await _enforcementOrdersRepository.Queryable()
-                  .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                  .LeftJoin<SystemArea>((x, o, p) => o.AreaCode == p.Id)
-                  .Where((x, o, p) => o.Id != null)
-                  .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime.Value.Date == DateTime.Now.Date)
-                  .Select((x, o, p) => new OrderOverviewDto
+            var list = await _judicialManagementOrdersRepository.Queryable()
+                  .LeftJoin<SystemArea>((o, s) => o.AreaCode == s.Id)
+                  .Where((o, s) => o.CreationTime.Date >= DateTime.Now.Date)
+                  .Select((o, s) => new
                   {
-                      Id = o.Id,
-                      WorkflowId = o.WorkflowId,
-                      SourceChannel = o.SourceChannel,
-                      SourceChannelCode = o.SourceChannelCode,
-                      Title = o.Title,
-                      AcceptType = o.AcceptType,
-                      AcceptTypeCode = o.AcceptTypeCode,
-                      HotspotId = o.HotspotId,
-                      HotspotName = o.HotspotName,
-                      ActualHandleOrgName = o.ActualHandleOrgName,
-                      ActualHandleOrgCode = o.ActualHandleOrgCode,
-                      Status = o.Status,
-                      ActualHandleTime = o.ActualHandleTime,
-                      ExpiredTime = o.ExpiredTime,
-                      NearlyExpiredTime = o.NearlyExpiredTime,
-                      StartTime = o.StartTime,
-                      AreaName = p.AreaName
+                      o.Id,
+                      o.SourceChannel,
+                      o.SourceChannelCode,
+                      o.Title,
+                      o.AcceptType,
+                      o.AcceptTypeCode,
+                      o.HotspotId,
+                      o.HotspotName,
+                      o.EnforcementOrdersHandler,
+                      s.AreaName,
+                      o.CreationTime
                   })
-                  .MergeTable()
-                  .OrderByDescending(d => d.StartTime)
+                  .OrderByDescending(o => o.CreationTime)
                   .Take(50)
                   .ToListAsync();
 
@@ -300,7 +247,7 @@ namespace Hotline.Api.Controllers.Bigscreen
         {
             EndTime = EndTime.AddDays(1).AddSeconds(-1);
 
-            var list = await _enforcementOrdersRepository.Queryable()
+            var list = await _judicialManagementOrdersRepository.Queryable()
                  .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
                  .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
                 .Where((x, o, p) => o.VisitTime >= StartTime && o.VisitTime <= EndTime && p.VisitTarget == EVisitTarget.Org &&
@@ -348,14 +295,12 @@ namespace Hotline.Api.Controllers.Bigscreen
                 EndDate = DateTime.Now;
             }
 
-            var queryData = await _enforcementOrdersRepository.Queryable()
-                       .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                       .Where((x, o) => o.Id != null)
-                       .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime >= StartDate && o.StartTime <= EndDate)
-                       .Select((x, o) => new
+            var queryData = await _judicialManagementOrdersRepository.Queryable()
+                       .Where(o => o.CreationTime >= StartDate && o.CreationTime <= EndDate)
+                       .Select(o => new
                        {
                            o.Id,
-                           Month = o.StartTime.Value.Month
+                           Month = o.CreationTime.Month
                        })
                        .MergeTable()
                        .GroupBy(x => x.Month)
@@ -392,20 +337,16 @@ namespace Hotline.Api.Controllers.Bigscreen
         {
             EndTime = EndTime.AddDays(1).AddSeconds(-1);
 
-            var SumCount = await _enforcementOrdersRepository.Queryable()
-               .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                .Where((x, o) => o.Id != null)
-               .Where((x, o) => o.StartTime >= StartTime && o.StartTime <= EndTime && o.Status > EOrderStatus.WaitForAccept)
+            var SumCount = await _judicialManagementOrdersRepository.Queryable()
+               .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
                .CountAsync();
 
             if (IsSource)
             {
-                var list = await _enforcementOrdersRepository.Queryable()
-                .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                .Where((x, o) => o.Id != null)
-                .Where((x, o) => o.StartTime >= StartTime && o.StartTime <= EndTime && o.Status > EOrderStatus.WaitForAccept)
-                .GroupBy((x, o) => new { o.SourceChannelCode, o.SourceChannel })
-                .Select((x, o) => new OrderProportionStatisticsDto()
+                var list = await _judicialManagementOrdersRepository.Queryable()
+                .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
+                .GroupBy(o => new { o.SourceChannelCode, o.SourceChannel })
+                .Select(o => new OrderProportionStatisticsDto()
                 {
                     Name = o.SourceChannel,
                     SumCount = SumCount,
@@ -416,12 +357,10 @@ namespace Hotline.Api.Controllers.Bigscreen
             }
             else
             {
-                var list = await _enforcementOrdersRepository.Queryable()
-                .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                .Where((x, o) => o.Id != null)
-                .Where((x, o) => o.StartTime >= StartTime && o.StartTime <= EndTime && o.Status > EOrderStatus.WaitForAccept)
-                .GroupBy((x, o) => new { o.AcceptTypeCode, o.AcceptType })
-                .Select((x, o) => new OrderProportionStatisticsDto()
+                var list = await _judicialManagementOrdersRepository.Queryable()
+               .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
+                .GroupBy(o => new { o.AcceptTypeCode, o.AcceptType })
+                .Select(o => new OrderProportionStatisticsDto()
                 {
                     Name = o.AcceptType,
                     SumCount = SumCount,
@@ -431,6 +370,5 @@ namespace Hotline.Api.Controllers.Bigscreen
                 return list;
             }
         }
-
     }
 }

+ 44 - 23
src/Hotline.Api/Controllers/OrderController.cs

@@ -394,9 +394,11 @@ public class OrderController : BaseController
         //验证订单
         var order = await _orderRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
 
+
         if (order is null)
             throw UserFriendlyException.SameMessage("未找到工单,无法发布");
 
+
         //新增发布工单
         var orderPublish = _mapper.Map<OrderPublish>(dto);
         orderPublish.OrderId = order.Id;
@@ -406,9 +408,17 @@ public class OrderController : BaseController
         order.Publish(orderPublish.PublishState);
         await _orderRepository.UpdateAsync(order);
 
+
+
         //推省上
         var publishPublishOrder = _mapper.Map<PublishPublishOrderDto>(orderPublish);
         publishPublishOrder.Order = _mapper.Map<OrderDto>(order);
+        //查询实际办理附件
+        if (!string.IsNullOrEmpty(order.ActualHandleStepId))
+        {
+            var actualHandleStep = await _workflowStepRepository.GetAsync(order.ActualHandleStepId, HttpContext.RequestAborted);
+            publishPublishOrder.FileJsons = actualHandleStep?.FileJson;
+        }
         await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
 
         var orderVisit = new OrderVisit();
@@ -1564,7 +1574,7 @@ public class OrderController : BaseController
     [HttpPost("delay/calc-endtime")]
     public async Task<TimeResult?> DelayCalcEndTime([FromBody] DelayCalcEndTimeDto dto)
     {
-        return _timeLimitDomainService.CalcEndTime(dto.BeginTime, dto.DelayUnit, dto.DelayNum, 0);
+        return _timeLimitDomainService.CalcEndTime(dto.BeginTime, dto.DelayUnit, dto.DelayNum, 0, 0);
     }
 
     /// <summary>
@@ -1735,7 +1745,7 @@ public class OrderController : BaseController
         var visit = await _orderVisitRepository.GetAsync(dto.Data.VisitId, HttpContext.RequestAborted);
         setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyEndTime);
         var endTime = _timeLimitDomainService
-            .CalcEndTime(visit.VisitTime.Value, ETimeType.WorkDay, int.Parse(setting?.SettingValue[0]), 0).EndTime;
+            .CalcEndTime(visit.VisitTime.Value, ETimeType.WorkDay, int.Parse(setting?.SettingValue[0]), 0, 0).EndTime;
         if (DateTime.Now > endTime && int.Parse(setting?.SettingValue[0]) > 0)
             throw UserFriendlyException.SameMessage("甄别申请时限已超过系统预定设置,不能申请");
 
@@ -2782,7 +2792,6 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    [Permission(EPermission.OrderUpdate)]
     [HttpPut]
     [LogFilter("更新工单")]
     public async Task Update([FromBody] UpdateOrderDto dto)
@@ -2846,14 +2855,15 @@ public class OrderController : BaseController
         ExpiredTimeWithConfig expiredTimeConfig;
         if (dto.Workflow.NextHandlers.Any(d => d.Key == "001171" || d.Key == "001178"))
         {
-            var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80);
+            var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
             expiredTimeConfig = new ExpiredTimeWithConfig
             {
                 Count = 45,
                 TimeType = ETimeType.WorkDay,
                 TimeText = "45个工作日",
                 ExpiredTime = timeResult.EndTime,
-                NearlyExpiredTime = timeResult.NearlyExpiredTime
+                NearlyExpiredTime = timeResult.NearlyExpiredTime,
+                NearlyExpiredTimeOne = timeResult.NearlyExpiredTimeOne,
             };
         }
         //else if (dto.Workflow.FlowDirection == EFlowDirection.CenterToCenter)
@@ -2946,7 +2956,7 @@ public class OrderController : BaseController
         var order = await _orderRepository.Queryable()
             .FirstAsync(d => d.WorkflowId == dto.WorkflowId, HttpContext.RequestAborted);
         if (order is null)
-            throw new UserFriendlyException("无效工单编号");
+            throw UserFriendlyException.SameMessage("无效工单编号");
         //if (await _orderDelayRepository.AnyAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, HttpContext.RequestAborted))
         //{
         //    throw UserFriendlyException.SameMessage("该工单存在正在审核中的延期,不能办理");
@@ -2959,20 +2969,21 @@ public class OrderController : BaseController
         ExpiredTimeWithConfig? expiredTimeConfig = null;
         if (dto.NextHandlers.Any(d => d.Key == "001171" || d.Key == "001178"))
         {
-            var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80);
+            var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
             expiredTimeConfig = new ExpiredTimeWithConfig
             {
                 Count = 45,
                 TimeType = ETimeType.WorkDay,
                 TimeText = "45个工作日",
                 ExpiredTime = timeResult.EndTime,
-                NearlyExpiredTime = timeResult.NearlyExpiredTime
+                NearlyExpiredTime = timeResult.NearlyExpiredTime,
+                NearlyExpiredTimeOne = timeResult.NearlyExpiredTimeOne
             };
             var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
             order.CenterToOrg(
                 expiredTimeConfig.TimeText, expiredTimeConfig.Count,
                 expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime,
-                expiredTimeConfig.NearlyExpiredTime, dto.Opinion,
+                expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 canUpdateOrderSender);
         }
@@ -2983,7 +2994,7 @@ public class OrderController : BaseController
             order.CenterToOrg(
                 expiredTimeConfig.TimeText, expiredTimeConfig.Count,
                 expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime,
-                expiredTimeConfig.NearlyExpiredTime, dto.Opinion,
+                expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 canUpdateOrderSender);
             //写入质检
@@ -2993,7 +3004,7 @@ public class OrderController : BaseController
         {
             expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, order.AcceptTypeCode);
             order.CenterToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime);
+                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne);
         }
 
         _mapper.Map(expiredTimeConfig, order);
@@ -3247,7 +3258,7 @@ public class OrderController : BaseController
             .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
-            .OrderByDescending(d => d.StartTime)
+            .OrderByDescending(d => new { d.IsUrgent, d.StartTime })
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         //if (isHandled)
@@ -3354,7 +3365,7 @@ public class OrderController : BaseController
             .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
             .OrderBy(d => d.Status)
             .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
-            .OrderByIF(dto.IsHandled == false, d => d.CreationTime, OrderByType.Desc)
+             .OrderByIF(dto.IsHandled == false, d => new { IsUrgent = d.IsUrgent, CreationTime = d.CreationTime }, OrderByType.Desc)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         //var (total, items) = await _orderRepository.Queryable()
@@ -4028,7 +4039,7 @@ public class OrderController : BaseController
             //var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now,
             //	ETimeType.WorkDay,
             //	dto.TimeLimit.Value, order.AcceptTypeCode);
-            await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, ProcessType = processType })
+            await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ProcessType = processType })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
@@ -4115,7 +4126,11 @@ public class OrderController : BaseController
         model.StepCode = step.Code;
         model.State = 1;
         model.ESpecialType = ESpecialType.ReTransact;
-
+        model.LastFileOpinion = order.FileOpinion;
+        model.FirstFileOpinion = order.FileOpinion;
+        var firstSpecial = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId).FirstAsync();
+        if (firstSpecial is not null)
+            model.FirstFileOpinion = firstSpecial.FirstFileOpinion;
         model.InitId();
         if (dto.Files.Any())
             model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", HttpContext.RequestAborted);
@@ -4154,7 +4169,7 @@ public class OrderController : BaseController
                     ETimeType.WorkDay,
                     dto.TimeLimit.Value, order.AcceptTypeCode);
                 endTime = expiredTime.EndTime;
-                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime })
+                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
@@ -4235,7 +4250,7 @@ public class OrderController : BaseController
             var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
                 ? EProcessType.Zhiban
                 : EProcessType.Jiaoban;
-            await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, ProcessType = processType })
+            await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ProcessType = processType })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
@@ -4335,7 +4350,7 @@ public class OrderController : BaseController
                 var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
                     ? EProcessType.Zhiban
                     : EProcessType.Jiaoban;
-                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, ProcessType = processType })
+                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ProcessType = processType })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
@@ -4439,6 +4454,7 @@ public class OrderController : BaseController
                   x.ActualHandleTime,
                   x.ExpiredTime,
                   x.NearlyExpiredTime,
+                  x.NearlyExpiredTimeOne,
                   p.NextStepName,
                   p.NextStepCode,
                   p.StepName,
@@ -5319,7 +5335,7 @@ public class OrderController : BaseController
         if (order == null)
             throw new UserFriendlyException($"无效工单编号, orderId: {orderId}", "无效工单编号");
         if (order.IsSigned())
-            throw new UserFriendlyException("该工单已被签收");
+            throw UserFriendlyException.SameMessage("该工单已被签收");
         order.Sign(_sessionContext.RequiredUserId, _sessionContext.UserName);
         order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
 
@@ -5955,13 +5971,15 @@ public class OrderController : BaseController
         var order = await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted);
         var step = new WorkflowStep();
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RoleZuoXi);
+        if (string.IsNullOrEmpty(order.SignerId))
+            throw UserFriendlyException.SameMessage("工单尚未签收,暂不支持平移");
         if (!string.IsNullOrEmpty(order.WorkflowId))
         {
             var steps = await _workflowStepRepository.Queryable()
                 .Where(d => d.ExternalId == orderId && d.Status != EWorkflowStepStatus.Handled)
                 .ToListAsync(HttpContext.RequestAborted);
             if (steps.Count > 1)
-                throw new UserFriendlyException("多个待办理节点暂不支持平移");
+                throw UserFriendlyException.SameMessage("多个待办理节点暂不支持平移");
             step = steps.First();
             if (step.BusinessType is not EBusinessType.Center and not EBusinessType.Send)
                 throw UserFriendlyException.SameMessage("当前办理节点非中心暂不支持平移");
@@ -5997,6 +6015,9 @@ public class OrderController : BaseController
     [HttpPost("change-handler")]
     public async Task ChangeHandler([FromBody] ChangeHandlerDto dto)
     {
+        var special = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == 0).AnyAsync();
+        if (special)
+            throw UserFriendlyException.SameMessage("当前工单特提审批中,请审批后再操作!");
         if (string.IsNullOrEmpty(dto.StepId))
         {
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username })
@@ -6008,10 +6029,10 @@ public class OrderController : BaseController
                 .Includes(d => d.WorkflowTrace)
                 .FirstAsync(d => d.Id == dto.StepId, HttpContext.RequestAborted);
             if (step is null)
-                throw new UserFriendlyException("无效节点编号");
-            await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps)>
+                throw UserFriendlyException.SameMessage("无效节点编号");
+            await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
             {
-                new(dto.Handler.UserId,dto.Handler.Username,dto.Handler.OrgId,dto.Handler.OrgName, new List<WorkflowStep>{step})
+                new(dto.Handler.UserId,dto.Handler.Username,dto.Handler.OrgId,dto.Handler.OrgName,step.RoleId,step.RoleName, new List<WorkflowStep>{step})
             }, HttpContext.RequestAborted);
         }
     }

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

@@ -48,7 +48,7 @@ namespace Hotline.Api.Controllers
         {
             RefAsync<int> total = 0;
             var items = await _orderRepository.Queryable()
-                .Where(p => p.SourceChannelCode == "SZMHD" && p.IsProvince == false && p.Status >= EOrderStatus.Filed)
+                .Where(p => p.SourceChannelCode == "SZMHD" && p.IsProvince == false && p.Status >= EOrderStatus.Filed && p.Source == ESource.ProvinceStraight)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.No == dto.No)
                 .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.ProvinceNo == dto.ProvinceNo)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.StartsWith(dto.Title!))

+ 2 - 2
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -666,9 +666,9 @@ public class WorkflowController : BaseController
         //.GetAsync(dto.StepId, HttpContext.RequestAborted);
         if (step is null)
             throw new UserFriendlyException("无效节点编号");
-        await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps)>
+        await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
             {
-                new(dto.Handler.UserId,dto.Handler.Username,dto.Handler.OrgId,dto.Handler.OrgName, new List<WorkflowStep>{step})
+                new(dto.Handler.UserId,dto.Handler.Username,dto.Handler.OrgId,dto.Handler.OrgName,step.RoleId,step.RoleName, new List<WorkflowStep>{step})
             }, HttpContext.RequestAborted);
     }
 

+ 17 - 29
src/Hotline.Application/Bigscreen/EnforcementDataScreenRefreshService.cs

@@ -1,14 +1,11 @@
 using Hotline.Caching.Interfaces;
 using Hotline.JudicialManagement;
-using Hotline.Orders;
 using Hotline.Realtimes;
 using Hotline.Settings;
 using Hotline.Share.Dtos.JudicialManagement;
-using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
-using XF.Domain.Constants;
 using XF.Domain.Repository;
 
 namespace Hotline.Application.Bigscreen
@@ -26,7 +23,7 @@ namespace Hotline.Application.Bigscreen
         {
             using var scope = _serviceScopeFactory.CreateScope();
             var realtimeService = scope.ServiceProvider.GetRequiredService<IRealtimeService>();
-            var _enforcementOrdersRepository = scope.ServiceProvider.GetRequiredService<IRepository<EnforcementOrders>>();
+            var _judicialManagementOrdersRepository = scope.ServiceProvider.GetRequiredService<IRepository<JudicialManagementOrders>>();
             var _mapper = scope.ServiceProvider.GetRequiredService<IMapper>();
             var systemSettingCacheManager = scope.ServiceProvider.GetRequiredService<ISystemSettingCacheManager>();
 
@@ -36,33 +33,24 @@ namespace Hotline.Application.Bigscreen
                 try
                 {
 
-                    var list = await _enforcementOrdersRepository.Queryable()
-                  .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                  .LeftJoin<SystemArea>((x, o, p) => o.AreaCode == p.Id)
-                  .Where((x, o, p) => o.Id != null)
-                  .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime.Value.Date == DateTime.Now.Date)
-                  .Select((x, o, p) => new OrderOverviewDto
+                    var list = await _judicialManagementOrdersRepository.Queryable()
+                  .LeftJoin<SystemArea>((o, s) => o.AreaCode == s.Id)
+                  .Where((o, s) => o.CreationTime.Date == DateTime.Now.Date)
+                  .Select((o, s) => new 
                   {
-                      Id = o.Id,
-                      WorkflowId = o.WorkflowId,
-                      SourceChannel = o.SourceChannel,
-                      SourceChannelCode = o.SourceChannelCode,
-                      Title = o.Title,
-                      AcceptType = o.AcceptType,
-                      AcceptTypeCode = o.AcceptTypeCode,
-                      HotspotId = o.HotspotId,
-                      HotspotName = o.HotspotName,
-                      ActualHandleOrgName = o.ActualHandleOrgName,
-                      ActualHandleOrgCode = o.ActualHandleOrgCode,
-                      Status = o.Status,
-                      ActualHandleTime = o.ActualHandleTime,
-                      ExpiredTime = o.ExpiredTime,
-                      NearlyExpiredTime = o.NearlyExpiredTime,
-                      StartTime = o.StartTime,
-                      AreaName = p.AreaName
+                      o.Id,
+                      o.SourceChannel,
+                      o.SourceChannelCode,
+                      o.Title,
+                      o.AcceptType,
+                      o.AcceptTypeCode,
+                      o.HotspotId,
+                      o.HotspotName,
+                      o.EnforcementOrdersHandler,
+                      s.AreaName,
+                      o.CreationTime
                   })
-                  .MergeTable()
-                  .OrderByDescending(d => d.StartTime)
+                  .OrderByDescending(d => d.CreationTime)
                   .Take(50)
                   .ToListAsync();
 

+ 31 - 20
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -147,22 +147,25 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.RequiredUserId, current.RequiredOrgId,
             externalId, cancellationToken);
 
-        //var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-        //    EFlowAssignType.User, current.RequiredUserId, current.UserName,
-        //    current.RequiredOrgId, current.OrgName)};
-
-        var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
-            new FlowStepHandler
-            {
-                Key = current.RequiredUserId,
-                Value = current.UserName,
-                UserId = current.UserId,
-                Username = current.UserName,
-                OrgId = current.RequiredOrgId,
-                OrgName = current.OrgName
-            }, expiredTime);
-
-        var flowAssignInfo =
+		//var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+		//    EFlowAssignType.User, current.RequiredUserId, current.UserName,
+		//    current.RequiredOrgId, current.OrgName)};
+
+		var defineHandler = startStepDefine.HandlerTypeItems.First();
+		var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
+			new FlowStepHandler
+			{
+				Key = current.RequiredUserId,
+				Value = current.UserName,
+				UserId = current.UserId,
+				Username = current.UserName,
+				OrgId = current.RequiredOrgId,
+				OrgName = current.OrgName,
+				RoleId = defineHandler.Key,
+				RoleName = defineHandler.Value,
+			}, expiredTime);
+
+		var flowAssignInfo =
             await GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, cancellationToken);
 
         //var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
@@ -738,6 +741,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var summaryTargetStep = workflow.Steps.FirstOrDefault(d =>
                     d.StepType == EStepType.Normal &&
                     d.Code == stepDefine.SummaryTargetCode &&
+                    d.Status == EWorkflowStepStatus.Handled &&
                     d.IsOrigin);
                 if (summaryTargetStep is null)
                     throw UserFriendlyException.SameMessage("未查询到汇总对象节点");
@@ -750,7 +754,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     Key = summaryTargetStep.HandlerId,
                     Value = summaryTargetStep.HandlerName,
                     UserId = summaryTargetStep.HandlerId,
-                    Username = summaryTargetStep.HandlerName
+                    Username = summaryTargetStep.HandlerName,
+                    OrgId = summaryTargetStep.HandlerOrgId,
+                    OrgName = summaryTargetStep.HandlerOrgName,
+                    RoleId = summaryTargetStep.RoleId,
+                    RoleName = summaryTargetStep.RoleName
                 };
 
                 nextStepOption = new NextStepOption
@@ -845,8 +853,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 if (flowType is EFlowType.Handle
                     && (stepDefine.StepType != EStepType.Summary && stepDefine.BusinessType != EBusinessType.Center))
                     users1 = users1.Where(d => d.OrgId.StartsWith(levelOneOrgId));
+                var defineTypeItem = stepDefine.HandlerTypeItems.First();
 
-                handlers = users1.Where(d => d != null && !string.IsNullOrEmpty(d.Id))
+				handlers = users1.Where(d => d != null && !string.IsNullOrEmpty(d.Id))
                     .Select(d => new FlowStepHandler
                     {
                         Key = d.Id,
@@ -854,8 +863,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         UserId = d.Id,
                         Username = d.Name,
                         OrgId = d.OrgId,
-                        OrgName = d.Organization.Name
-                    })
+                        OrgName = d.Organization.Name,
+                        RoleId = defineTypeItem.Key,
+                        RoleName = defineTypeItem.Value
+					})
                     .ToList();
                 break;
             case EHandlerType.OrgLevel:

+ 18 - 17
src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs

@@ -69,23 +69,24 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
                     //    isRecallToSeatDesignated = false;
                     //var isRecallToSeatDesignated = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated).SettingValue[0]);
                     order.Status = EOrderStatus.SpecialToUnAccept;
-                    //if (isRecallToSeatDesignated)
-                    //{
-                    //    if (data.HandlerType is EHandlerType.Role or EHandlerType.AssignedUser)
-                    //    {
-                    //        var handler = data.NextHandlers.FirstOrDefault();
-                    //        if (handler != null)
-                    //        {
-                    //            order.SignerId = handler.Key;
-                    //            order.SignerName = handler.Value;
-                    //        }
-                    //    }
-                    //}
-                    //else
-                    //{
-                    //    //order.BackToUnsign();
-                    //}
-                }
+                    order.FileEmpty();
+					//if (isRecallToSeatDesignated)
+					//{
+					//    if (data.HandlerType is EHandlerType.Role or EHandlerType.AssignedUser)
+					//    {
+					//        var handler = data.NextHandlers.FirstOrDefault();
+					//        if (handler != null)
+					//        {
+					//            order.SignerId = handler.Key;
+					//            order.SignerName = handler.Value;
+					//        }
+					//    }
+					//}
+					//else
+					//{
+					//    //order.BackToUnsign();
+					//}
+				}
                 await _orderRepository.UpdateAsync(order, false, cancellationToken);
                 break;
             case WorkflowModuleConsts.KnowledgeAdd:

+ 2 - 1
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -73,7 +73,7 @@ public class OrderMapperConfigs : IRegister
                 d.OrgProcessingResults = s.OrgProcessingResults.Value;
             });
 
-            
+
 
 
 
@@ -83,6 +83,7 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.Additions, s => s.Files)
             .IgnoreIf((s, d) => !s.ExpiredTime.HasValue, d => d.ExpiredTime)
             .IgnoreIf((s, d) => !s.NearlyExpiredTime.HasValue, d => d.NearlyExpiredTime)
+            .IgnoreIf((s, d) => !s.NearlyExpiredTimeOne.HasValue, d => d.NearlyExpiredTimeOne)
             .IgnoreIf((s, d) => string.IsNullOrEmpty(s.TimeLimit), d => d.TimeLimit)
             .IgnoreIf((s, d) => !s.TimeLimitCount.HasValue, d => d.TimeLimitCount)
             .IgnoreIf((s, d) => !s.TimeLimitUnit.HasValue, d => d.TimeLimitUnit)

+ 9 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -161,5 +161,14 @@ namespace Hotline.Application.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         Task<DataTable> HotspotAndAreaStatisticsExport(HotspotAndAreaStatisticsReq dto);
+
+        /// <summary>
+        /// 热点-区域统计
+        /// </summary>
+        /// <param name="dt"></param>
+        /// <param name="AddColumnName"></param>
+        /// <param name="HotspotLevel"></param>
+        /// <returns></returns>
+        DataTable InitHotspotTable(DataTable dt, List<string> AddColumnName, int HotspotLevel);
     }
 }

+ 149 - 3
src/Hotline.Application/Orders/OrderApplication.cs

@@ -124,7 +124,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         order.TimeLimitUnit = expiredTimeConfig.TimeType;
         order.ExpiredTime = expiredTimeConfig.ExpiredTime;
         order.NearlyExpiredTime = expiredTimeConfig.NearlyExpiredTime;
-
+        order.NearlyExpiredTimeOne = expiredTimeConfig.NearlyExpiredTimeOne;
         //if (string.IsNullOrEmpty(order.WorkflowId))
         //    throw new UserFriendlyException("该工单流程id异常");
         //var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, cancellationToken: cancellationToken);
@@ -212,7 +212,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 		//stTime = _timeLimitDomainService.WorkDay(stTime);
 		//DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
 		DateTime? dateTime = DateTime.Now;
-		return _orderRepository.Queryable(canView: true).Includes(d => d.OrderDelays)
+		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!))
@@ -261,8 +263,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     public ISugarQueryable<Order> GetToExpireAsync(AboutToExpireListDto dto)
     {
         DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
+        var IsCenter = _sessionContext.OrgIsCenter;
 
-        return _orderRepository.Queryable(canView: true).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))
@@ -1045,6 +1048,149 @@ public class OrderApplication : IOrderApplication, IScopeDependency
            }).ToPivotTableAsync(q => q.AreaName, q => new { q.HotspotName }, q => q.Sum(x => x.Count));
         return  returnList;
     }
+
+
+    public DataTable InitHotspotTable(DataTable dt, List<string> AddColumnName, int HotspotLevel)
+    {
+        //修改列名
+        if (dt.Columns.Contains("HotspotName"))
+            dt.Columns["HotspotName"].ColumnName = "一级热点";
+
+        //增加小计
+        DataColumn totalColumn = new DataColumn("小计", typeof(decimal));
+        dt.Columns.Add(totalColumn);
+        if (dt.Columns.Contains("Column1"))
+            dt.Columns.Remove("Column1");
+
+        //计算小计
+        for (int i = 0; i < dt.Rows.Count; i++)
+        {
+            int sumcount = 0;
+            for (int j = 1; j < dt.Columns.Count - 1; j++)
+            {
+                sumcount += Convert.ToInt32(dt.Rows[i][j].ToString());
+            }
+            dt.Rows[i][dt.Columns.Count - 1] = sumcount;
+        }
+
+        //增加合计
+        DataRow totalRow = dt.NewRow();
+        if (dt.Columns[0].ColumnName == "HotspotName") totalRow["HotspotName"] = "合计";
+        else totalRow["一级热点"] = "合计";
+        for (int i = 1; i < dt.Columns.Count; i++)
+        {
+            int sumcount = 0;
+            for (int j = 0; j < dt.Rows.Count; j++)
+            {
+                sumcount += Convert.ToInt32(dt.Rows[j][i].ToString());
+            }
+            totalRow[i] = sumcount;
+        }
+        dt.Rows.Add(totalRow);
+
+        //创建新表
+        DataTable dt2 = new DataTable();
+
+        //添加表头
+        foreach (var item in AddColumnName)
+        {
+            if (item.Equals("HotspotName") || item.Equals("一级热点"))
+            {
+                dt2.Columns.Add("一级热点");
+                if (HotspotLevel == 2)
+                {
+                    dt2.Columns.Add("二级热点");
+                }
+                else if (HotspotLevel == 3)
+                {
+                    dt2.Columns.Add("二级热点");
+                    dt2.Columns.Add("三级热点");
+                }
+                else if (HotspotLevel == 4)
+                {
+                    dt2.Columns.Add("二级热点");
+                    dt2.Columns.Add("三级热点");
+                    dt2.Columns.Add("四级热点");
+                }
+            }
+            else
+            {
+                if (dt.Columns.Contains(item))
+                    dt2.Columns.Add(item);
+            }
+        }
+
+        //处理数据
+        foreach (DataRow sourceRow in dt.Rows)
+        {
+            DataRow targetRow = dt2.NewRow();
+            foreach (var item in AddColumnName)
+            {
+                if (item.Equals("HotspotName"))
+                {
+                    targetRow["一级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[0];
+                    if (HotspotLevel == 2)
+                    {
+                        targetRow["二级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[1];
+                    }
+                    else if (HotspotLevel == 3)
+                    {
+                        try
+                        {
+                            targetRow["二级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[1];
+                        }
+                        catch
+                        {
+                            targetRow["二级热点"] = "";
+                        }
+                        try
+                        {
+                            targetRow["三级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[2];
+                        }
+                        catch
+                        {
+                            targetRow["三级热点"] = "";
+                        }
+                    }
+                    else if (HotspotLevel == 4)
+                    {
+                        try
+                        {
+                            targetRow["二级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[1];
+                        }
+                        catch
+                        {
+                            targetRow["二级热点"] = "";
+                        }
+                        try
+                        {
+                            targetRow["三级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[2];
+                        }
+                        catch
+                        {
+                            targetRow["三级热点"] = "";
+                        }
+                        try
+                        {
+                            targetRow["四级热点"] = sourceRow["一级热点"].ToString()?.Split('-')[3];
+                        }
+                        catch
+                        {
+                            targetRow["四级热点"] = "";
+                        }
+
+                    }
+                }
+                else
+                {
+                    targetRow[item] = sourceRow[item];
+                }
+            }
+            dt2.Rows.Add(targetRow);
+        }
+
+        return dt2;
+    }
     #region private
 
     /// <summary>

+ 2 - 1
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -165,7 +165,7 @@ namespace Hotline.Application.Orders
                 var reTransactNum = order.ReTransactNum is null ? 1 : order.ReTransactNum + 1;
                 var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
                 var processType = step.FlowDirection == EFlowDirection.OrgToCenter || step.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
-                await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, ReTransactNum = reTransactNum, ProcessType = processType })
+                await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime,NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ReTransactNum = reTransactNum, ProcessType = processType })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
@@ -211,6 +211,7 @@ namespace Hotline.Application.Orders
                 .Includes(x => x.OrderVisit, y => y.Order)
                 .Includes(x => x.OrderVisit, y => y.Employee)
                 .Includes(x => x.SecondaryHandling)
+                .Where(x=>x.OrderVisit.Order.IsProvince == false)
                 .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
                 .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
                 .Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)

+ 15 - 0
src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs

@@ -1,6 +1,7 @@
 using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Requests;
+using Microsoft.AspNetCore.Mvc;
 using SqlSugar;
 
 namespace Hotline.Application.StatisticalReport
@@ -83,5 +84,19 @@ namespace Hotline.Application.StatisticalReport
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<Order> DepartmentAcceptanceTypeOrderList(DepartmentKeyWordRequest dto);
+
+        /// <summary>
+        /// 满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisitDetail> OrgVisitDetailList(OrgVisitDetailListReq dto);
+
+        /// <summary>
+        /// 受理类型统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<AcceptTypeStatisticsDto> AcceptTypeStatistics(AcceptTypeStatisticsReq dto);
     }
 }

+ 141 - 80
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -23,43 +23,36 @@ namespace Hotline.Application.StatisticalReport
     public class OrderReportApplication : IOrderReportApplication, IScopeDependency
     {
         private readonly IOrderRepository _orderRepository;
-        private readonly IRepository<Hotspot> _hotspotTypeRepository;
-        private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
         private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IMapper _mapper;
-        private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<OrderSpecial> _orderSpecialRepository;
-        private readonly IRepository<OrderVisit> _orderVisitRepository;
-        private readonly IRepository<TrCallRecord> _trCallRecordRepository;
         private readonly IRepository<OrderPublish> _orderPublishRepository;
-        private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
-        private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
         private readonly ISessionContext _sessionContext;
-        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
-        private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<OrderScreen> _orderScreenRepository;
         private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="orderRepository"></param>
+        /// <param name="orderVisitDetailRepository"></param>
+        /// <param name="orderDelayRepository"></param>
+        /// <param name="mapper"></param>
+        /// <param name="orderPublishRepository"></param>
+        /// <param name="sessionContext"></param>
+        /// <param name="workflowTraceRepository"></param>
+        /// <param name="orderScreenRepository"></param>
+        /// <param name="orderSecondaryHandlingApplication"></param>
+        /// <param name="timeLimitDomainService"></param>
         public OrderReportApplication(
             IOrderRepository orderRepository,
-            IRepository<Hotspot> hotspotTypeRepository,
-            ISystemDicDataCacheManager sysDicDataCacheManager,
             IRepository<OrderVisitDetail> orderVisitDetailRepository,
             IRepository<OrderDelay> orderDelayRepository,
-            IRepository<WorkflowCountersign> workflowCountersignRepository,
-            IRepository<OrderSpecial> orderSpecialRepository,
             IMapper mapper,
-            IRepository<OrderVisit> orderVisitRepository,
-            IRepository<TrCallRecord> trCallRecordRepository,
             IRepository<OrderPublish> orderPublishRepository,
-            IRepository<SystemOrganize> systemOrganizeRepository,
-            IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
             ISessionContext sessionContext,
-            ISystemSettingCacheManager systemSettingCacheManager,
-            IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<OrderScreen> orderScreenRepository,
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
@@ -67,25 +60,16 @@ namespace Hotline.Application.StatisticalReport
             )
         {
             _orderRepository = orderRepository;
-            _hotspotTypeRepository = hotspotTypeRepository;
-            _sysDicDataCacheManager = sysDicDataCacheManager;
             _orderVisitDetailRepository = orderVisitDetailRepository;
             _orderDelayRepository = orderDelayRepository;
-            _workflowCountersignRepository = workflowCountersignRepository;
-            _orderSpecialRepository = orderSpecialRepository;
             _mapper = mapper;
-            _orderVisitRepository = orderVisitRepository;
-            _trCallRecordRepository = trCallRecordRepository;
             _orderPublishRepository = orderPublishRepository;
-            _systemOrganizeRepository = systemOrganizeRepository;
-            _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
             _sessionContext = sessionContext;
-            _systemSettingCacheManager = systemSettingCacheManager;
-            _orderSpecialDetailRepository = orderSpecialDetailRepository;
             _workflowTraceRepository = workflowTraceRepository;
             _orderScreenRepository = orderScreenRepository;
             _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
             _timeLimitDomainService = timeLimitDomainService;
+
         }
         /// <summary>
         /// 部门办件统计表---新
@@ -156,8 +140,8 @@ FROM (
 		select  ""HandlerOrgId"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""YbOrderCountNum"",0 ""ZbOrderCountNum"",0 ""YbOverdue"",0 ""ZbOverdue"",0 ""HqybOverdue"",0 ""HqzbOverdue"",0 ""DelayEnd"",0 ""DelayWait"",0""Archived"" ,0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"" ,0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"",0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2   {2} --and ""t"".""CountersignPosition""<=1 
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10  and ""t"".""Status"">=2   {2} --and ""t"".""CountersignPosition""<=1 
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -166,7 +150,7 @@ FROM (
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2  {2} --and ""t"".""CountersignPosition""<=1 
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -174,8 +158,8 @@ FROM (
 		select  ""HandlerOrgId"",0 ""YbOrderCountNum"",0 ""ZbOrderCountNum"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""YbOverdue"" ,0 ""ZbOverdue"",0 ""HqybOverdue"",0 ""HqzbOverdue"",0 ""DelayEnd"",0 ""DelayWait"",0""Archived"",0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"",0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"" ,0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""t"".""CountersignPosition""=0   {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""t"".""CountersignPosition""=0   {2}
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -184,7 +168,7 @@ FROM (
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2 and (SELECT NOW())>""StepExpiredTime"" and ""t"".""CountersignPosition""=0   {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -192,8 +176,8 @@ FROM (
 		select  ""HandlerOrgId"",0 ""YbOrderCountNum"",0 ""ZbOrderCountNum"",0 ""YbOverdue"" ,0 ""ZbOverdue"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""HqybOverdue"",0 ""HqzbOverdue"",0 ""DelayEnd"",0 ""DelayWait"",0""Archived"",0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"",0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"" ,0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""CountersignPosition"">0  {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""CountersignPosition"">0  {2}
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -203,7 +187,7 @@ FROM (
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2 and (SELECT NOW())>""StepExpiredTime"" 
 			and   ""CountersignPosition"">0  {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -211,8 +195,8 @@ FROM (
 		select  ""HandlerOrgId"",0 ""YbOrderCountNum"",0 ""ZbOrderCountNum"",0 ""YbOverdue"" ,0 ""ZbOverdue"",0 ""HqybOverdue"",0 ""HqzbOverdue"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""DelayEnd"",0 ""DelayWait"" ,0""Archived"",0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"",0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"" ,0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2 and ""CountersignPosition"">0 {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2 and ""CountersignPosition"">0 {2}
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -221,7 +205,7 @@ FROM (
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2 and ""CountersignPosition"">0 {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL  {4}
 		GROUP BY ""HandlerOrgId""
 		UNION ALL
@@ -354,8 +338,8 @@ FROM (
 		select  ""HandlerOrgId"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""YbOrderCountNum"",0 ""ZbOrderCountNum"",0 ""YbOverdue"",0 ""ZbOverdue"",0 ""HqybOverdue"",0 ""HqzbOverdue"",0 ""DelayEnd"",0 ""DelayWait"",0""Archived"" ,0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"" ,0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"",0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2   {2} --and ""t"".""CountersignPosition""<=1 
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2   {2} --and ""t"".""CountersignPosition""<=1 
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -364,7 +348,7 @@ FROM (
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2  {2} --and ""t"".""CountersignPosition""<=1 
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -372,8 +356,8 @@ FROM (
 		select  ""HandlerOrgId"",0 ""YbOrderCountNum"",0 ""ZbOrderCountNum"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""YbOverdue"" ,0 ""ZbOverdue"",0 ""HqybOverdue"",0 ""HqzbOverdue"",0 ""DelayEnd"",0 ""DelayWait"",0""Archived"",0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"",0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"" ,0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""t"".""CountersignPosition""=0   {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""t"".""CountersignPosition""=0   {2}
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -382,7 +366,7 @@ FROM (
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2 and (SELECT NOW())>""StepExpiredTime"" and ""t"".""CountersignPosition""=0   {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -390,8 +374,8 @@ FROM (
 		select  ""HandlerOrgId"",0 ""YbOrderCountNum"",0 ""ZbOrderCountNum"",0 ""YbOverdue"" ,0 ""ZbOverdue"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""HqybOverdue"",0 ""HqzbOverdue"",0 ""DelayEnd"",0 ""DelayWait"",0""Archived"",0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"",0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"" ,0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""CountersignPosition"">0  {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2 and ""HandleTime"">""StepExpiredTime"" and ""CountersignPosition"">0  {2}
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -401,7 +385,7 @@ FROM (
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2 and (SELECT NOW())>""StepExpiredTime"" 
 			and   ""CountersignPosition"">0  {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -409,8 +393,8 @@ FROM (
 		select  ""HandlerOrgId"",0 ""YbOrderCountNum"",0 ""ZbOrderCountNum"",0 ""YbOverdue"" ,0 ""ZbOverdue"",0 ""HqybOverdue"",0 ""HqzbOverdue"",SUM(( CASE  WHEN ( ""HandlerOrgId"" IS NOT NULL ) THEN 1  ELSE 0 END )) AS ""DelayEnd"",0 ""DelayWait"" ,0""Archived"",0 ""ToBeArchived"",0 ""WaitPublished"",0 ""PublishedOpen"",0 ""PublishedNoOpen"",0 ""OrderDelayCount"",0 ""ScreenCount"",0 ""ScreenApproval"", 0 ""ScreenPass"" , 0 ""ScreenNotPass"" ,0 ""SatisfactionCount"", 0 ""NotSatisfactionCount"" from(
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
-			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status"">=2 and ""CountersignPosition"">0 {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""TraceState"" !=10 and ""t"".""Status"">=2 and ""CountersignPosition"">0 {2}
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL {4}
 		GROUP BY ""HandlerOrgId""
 		union ALL
@@ -419,7 +403,7 @@ FROM (
 		 select ""o"".""Id"",SUBSTRING(""t"".""HandlerOrgId"",1,{3}) ""HandlerOrgId"" from ""workflow_trace"" ""t""
 			left join ""order"" ""o"" on ""o"".""Id""=""t"".""ExternalId""
 			where ""o"".""CreationTime"">='{0}' and ""o"".""CreationTime""<='{1}'  and ""t"".""ModuleCode""='OrderHandle' and ""t"".""Status""<2 and ""CountersignPosition"">0 {2}
-			GROUP BY ""HandlerOrgId"",""o"".""Id""
+			GROUP BY SUBSTRING(""t"".""HandlerOrgId"",1,{3}),""o"".""Id""
 		)""s"" where ""HandlerOrgId"" IS not NULL  {4}
 		GROUP BY ""HandlerOrgId""
 		UNION ALL
@@ -504,10 +488,11 @@ order by ""su"".""OrgCode""";
                     query = _workflowTraceRepository.Queryable()
                         .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
                          .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime
-                         && t.Status >= EWorkflowStepStatus.Handled)
+                         && t.Status >= EWorkflowStepStatus.Handled && t.TraceState != EWorkflowTraceState.StepRemoveByPrevious)
                          .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                          .GroupBy((t, o) => o.Id)
                          .Select((t, o) => new SelectOrderId { Id = o.Id })
                          .MergeTable();
@@ -519,7 +504,8 @@ order by ""su"".""OrgCode""";
                        && t.Status < EWorkflowStepStatus.Handled)
                        .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                        .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                       .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                        .GroupBy((t, o) => o.Id)
                        .Select((t, o) => new SelectOrderId { Id = o.Id })
                        .MergeTable();
@@ -530,7 +516,8 @@ order by ""su"".""OrgCode""";
                         .Where((d, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && d.DelayState == EDelayState.Pass)
                         .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (d, o) => o.Source == ESource.ProvinceStraight)
                         .WhereIF(dto.OrgCode == "001", (d, o) => d.ApplyOrgCode == dto.OrgCode)
-                        .WhereIF(dto.OrgCode != "001", (d, o) => d.ApplyOrgCode.StartsWith(dto.OrgCode))
+                        .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (d, o) => d.ApplyOrgCode.StartsWith(dto.OrgCode))
+                        .WhereIF(dto.OrgCode == "001" && dto.OrgCode == dto.ParentOrgCode, (d, o) => d.ApplyOrgCode == dto.OrgCode)
                         .OrderByDescending((d, o) => o.CreationTime)
                         .Select((d, o) => new SelectOrderId { Id = o.Id })
                        .MergeTable();
@@ -539,10 +526,12 @@ order by ""su"".""OrgCode""";
                     query = _workflowTraceRepository.Queryable()
                         .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
                          .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime
-                         && t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition == ECountersignPosition.None)
+                         && t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition == ECountersignPosition.None
+                         && t.TraceState != EWorkflowTraceState.StepRemoveByPrevious)
                          .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                          .GroupBy((t, o) => o.Id)
                          .Select((t, o) => new SelectOrderId { Id = o.Id })
                          .MergeTable();
@@ -554,7 +543,8 @@ order by ""su"".""OrgCode""";
                          && t.Status < EWorkflowStepStatus.Handled && DateTime.Now > t.StepExpiredTime && t.CountersignPosition == ECountersignPosition.None)
                          .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                          .GroupBy((t, o) => o.Id)
                          .Select((t, o) => new SelectOrderId { Id = o.Id })
                          .MergeTable();
@@ -563,10 +553,12 @@ order by ""su"".""OrgCode""";
                     query = _workflowTraceRepository.Queryable()
                         .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
                          .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime
-                         && t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition > ECountersignPosition.None)
+                         && t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition > ECountersignPosition.None
+                         && t.TraceState != EWorkflowTraceState.StepRemoveByPrevious)
                          .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                          .GroupBy((t, o) => o.Id)
                          .Select((t, o) => new SelectOrderId { Id = o.Id })
                          .MergeTable();
@@ -578,7 +570,8 @@ order by ""su"".""OrgCode""";
                          && t.Status < EWorkflowStepStatus.Handled && DateTime.Now > t.StepExpiredTime && t.CountersignPosition > ECountersignPosition.None)
                          .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                          .GroupBy((t, o) => o.Id)
                          .Select((t, o) => new SelectOrderId { Id = o.Id })
                          .MergeTable();
@@ -587,10 +580,12 @@ order by ""su"".""OrgCode""";
                     var cqybquery = _workflowTraceRepository.Queryable()
                            .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
                             .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime
-                            && t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition >= ECountersignPosition.None)
+                            && t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition >= ECountersignPosition.None
+                            && t.TraceState != EWorkflowTraceState.StepRemoveByPrevious)
                             .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                             .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                            .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                             .GroupBy((t, o) => o.Id)
                             .Select((t, o) => new SelectOrderId { Id = o.Id })
                             .MergeTable();
@@ -600,7 +595,8 @@ order by ""su"".""OrgCode""";
                              && t.Status < EWorkflowStepStatus.Handled && DateTime.Now > t.StepExpiredTime && t.CountersignPosition >= ECountersignPosition.None)
                              .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                              .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                             .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                              .GroupBy((t, o) => o.Id)
                              .Select((t, o) => new SelectOrderId { Id = o.Id })
                              .MergeTable();
@@ -610,10 +606,12 @@ order by ""su"".""OrgCode""";
                     query = _workflowTraceRepository.Queryable()
                            .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
                             .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime
-                            && t.Status >= EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None)
+                            && t.Status >= EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None
+                            && t.TraceState != EWorkflowTraceState.StepRemoveByPrevious)
                             .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                             .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                            .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                             .GroupBy((t, o) => o.Id)
                             .Select((t, o) => new SelectOrderId { Id = o.Id })
                             .MergeTable();
@@ -625,7 +623,8 @@ order by ""su"".""OrgCode""";
                              && t.Status < EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None)
                              .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
                              .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
-                             .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                         .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (t, o) => t.HandlerOrgId == dto.OrgCode)
                              .GroupBy((t, o) => o.Id)
                              .Select((t, o) => new SelectOrderId { Id = o.Id })
                              .MergeTable();
@@ -635,7 +634,8 @@ order by ""su"".""OrgCode""";
                             .Where(o => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Status < EOrderStatus.WaitForAccept)
                            .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, o => o.Source == ESource.ProvinceStraight)
                             .WhereIF(dto.OrgCode == "001", o => o.ActualHandleOrgCode == dto.OrgCode)
-                            .WhereIF(dto.OrgCode != "001", o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, o => o.ActualHandleOrgCode == dto.OrgCode)
                              .Select(o => new SelectOrderId { Id = o.Id })
                           .MergeTable();
                     break;
@@ -644,7 +644,8 @@ order by ""su"".""OrgCode""";
                           .Where(o => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Status >= EOrderStatus.Filed)
                          .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, o => o.Source == ESource.ProvinceStraight)
                           .WhereIF(dto.OrgCode == "001", o => o.ActualHandleOrgCode == dto.OrgCode)
-                          .WhereIF(dto.OrgCode != "001", o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, o => o.ActualHandleOrgCode == dto.OrgCode)
                            .Select(o => new SelectOrderId { Id = o.Id })
                         .MergeTable();
                     break;
@@ -653,7 +654,8 @@ order by ""su"".""OrgCode""";
                          .Where(o => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Status == EOrderStatus.Filed)
                         .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, o => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", o => o.ActualHandleOrgCode == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, o => o.ActualHandleOrgCode == dto.OrgCode)
                           .Select(o => new SelectOrderId { Id = o.Id })
                        .MergeTable();
                     break;
@@ -662,7 +664,8 @@ order by ""su"".""OrgCode""";
                          .Where(o => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Status >= EOrderStatus.Published && o.IsPublicity == true)
                         .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, o => o.Source == ESource.ProvinceStraight)
                          .WhereIF(dto.OrgCode == "001", o => o.ActualHandleOrgCode == dto.OrgCode)
-                         .WhereIF(dto.OrgCode != "001", o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, o => o.ActualHandleOrgCode == dto.OrgCode)
                           .Select(o => new SelectOrderId { Id = o.Id })
                        .MergeTable();
                     break;
@@ -671,7 +674,8 @@ order by ""su"".""OrgCode""";
                         .Where(o => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Status >= EOrderStatus.Published && o.IsPublicity == false)
                        .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, o => o.Source == ESource.ProvinceStraight)
                         .WhereIF(dto.OrgCode == "001", o => o.ActualHandleOrgCode == dto.OrgCode)
-                        .WhereIF(dto.OrgCode != "001", o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, o => o.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+                            .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, o => o.ActualHandleOrgCode == dto.OrgCode)
                          .Select(o => new SelectOrderId { Id = o.Id })
                       .MergeTable();
                     break;
@@ -681,7 +685,8 @@ order by ""su"".""OrgCode""";
                        .Where((d, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Id != null)
                        .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (d, o) => o.Source == ESource.ProvinceStraight)
                        .WhereIF(dto.OrgCode == "001", (d, o) => d.CreatorOrgId == dto.OrgCode)
-                       .WhereIF(dto.OrgCode != "001", (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (d, o) => d.CreatorOrgId == dto.OrgCode)
                         .Select((d, o) => new SelectOrderId { Id = o.Id })
                        .MergeTable();
                     break;
@@ -692,7 +697,8 @@ order by ""su"".""OrgCode""";
                        && (d.Status == EScreenStatus.Approval || d.Status == EScreenStatus.Apply))
                        .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (d, o) => o.Source == ESource.ProvinceStraight)
                        .WhereIF(dto.OrgCode == "001", (d, o) => d.CreatorOrgId == dto.OrgCode)
-                       .WhereIF(dto.OrgCode != "001", (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (d, o) => d.CreatorOrgId == dto.OrgCode)
                         .Select((d, o) => new SelectOrderId { Id = o.Id })
                        .MergeTable();
                     break;
@@ -700,9 +706,10 @@ order by ""su"".""OrgCode""";
                     query = _orderScreenRepository.Queryable()
                        .LeftJoin<Order>((d, o) => d.OrderId == o.Id)
                        .Where((d, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Id != null && d.Status == EScreenStatus.End)
-                       .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (d, o) =>o.Source == ESource.ProvinceStraight)
+                       .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (d, o) => o.Source == ESource.ProvinceStraight)
                        .WhereIF(dto.OrgCode == "001", (d, o) => d.CreatorOrgId == dto.OrgCode)
-                       .WhereIF(dto.OrgCode != "001", (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (d, o) => d.CreatorOrgId == dto.OrgCode)
                         .Select((d, o) => new SelectOrderId { Id = o.Id })
                        .MergeTable();
                     break;
@@ -712,7 +719,8 @@ order by ""su"".""OrgCode""";
                       .Where((d, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Id != null && d.Status == EScreenStatus.Refuse)
                       .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (d, o) => o.Source == ESource.ProvinceStraight)
                       .WhereIF(dto.OrgCode == "001", (d, o) => d.CreatorOrgId == dto.OrgCode)
-                       .WhereIF(dto.OrgCode != "001", (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode != dto.ParentOrgCode, (d, o) => d.CreatorOrgId.StartsWith(dto.OrgCode))
+                       .WhereIF(dto.OrgCode != "001" && dto.OrgCode == dto.ParentOrgCode, (d, o) => d.CreatorOrgId == dto.OrgCode)
                         .Select((d, o) => new SelectOrderId { Id = o.Id })
                        .MergeTable();
                     break;
@@ -1782,5 +1790,58 @@ order by ""su"".""OrgCode""";
                  .OrderByDescending(d => d.CreationTime)
                  .MergeTable();
         }
+
+
+        /// <summary>
+        /// 满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderVisitDetail> OrgVisitDetailList(OrgVisitDetailListReq dto)
+        {
+            var IsCenter = _sessionContext.OrgIsCenter;
+
+            return _orderVisitDetailRepository.Queryable()
+                .Includes(x => x.OrderVisit, x => x.Order, x => x.OrderScreens)
+                .Includes(x => x.OrderVisit, x => x.Employee)
+                .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.VisitTarget == EVisitTarget.Org)
+                .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .WhereIF(dto.OrgVisitStatisticsType.HasValue, x => x.OrderVisit.Order.ProcessType == (EProcessType)((int)dto.OrgVisitStatisticsType))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
+                .WhereIF(!string.IsNullOrEmpty(dto.VisitUser), x => x.OrderVisit.Employee.Name.Contains(dto.VisitUser))
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order.Title.Contains(dto.Title))
+                .WhereIF(dto.OrgCodes.Any(), x => dto.OrgCodes.Contains(x.VisitOrgCode))
+                .WhereIF(dto.HotspotIds.Any(), x => dto.HotspotIds.Contains(x.OrderVisit.Order.HotspotId))
+                .WhereIF(dto.Channels.Any(), x => dto.Channels.Contains(x.OrderVisit.Order.SourceChannelCode))
+                .WhereIF(dto.CreationTimeStart.HasValue, x => x.OrderVisit.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始
+                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.OrderVisit.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+                .WhereIF(dto.ActualHandleTimeStart.HasValue, x => x.OrderVisit.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
+                .WhereIF(dto.ActualHandleTimeEnd.HasValue, x => x.OrderVisit.Order.ActualHandleTime <= dto.ActualHandleTimeEnd)
+                .OrderBy(x => x.OrderVisit.VisitTime); //办结时间结束
+
+        }
+
+
+        /// <summary>
+        /// 受理类型统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<AcceptTypeStatisticsDto> AcceptTypeStatistics(AcceptTypeStatisticsReq dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+            var query = _orderRepository.Queryable()
+                .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime < dto.EndTime)
+                .GroupBy(x => x.AcceptType)
+                .Select(x => new AcceptTypeStatisticsDto
+                {
+                    AcceptType = x.AcceptType,
+                    SumCount = SqlFunc.AggregateCount(x.AcceptType),
+                    CompletionCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
+                    VisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status == EOrderStatus.Visited, 1, 0))
+                });
+            return query;
+        }
     }
 }

+ 2 - 24
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -14,6 +14,7 @@ using System.Linq;
 using System.Linq.Dynamic.Core;
 using System.Reflection;
 using System.Reflection.Emit;
+using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 
 namespace Hotline.Repository.SqlSugar.Orders
@@ -744,30 +745,7 @@ namespace Hotline.Repository.SqlSugar.Orders
             return dt2;
         }
 
-        /// <summary>
-        /// 满意度明细
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        public ISugarQueryable<OrderVisitDetail> OrgVisitDetailList(OrgVisitDetailListReq dto)
-        {
-            return Db.Queryable<OrderVisitDetail>()
-                .Includes(x => x.OrderVisit, x => x.Order, x => x.OrderScreens)
-                .Includes(x => x.OrderVisit, x => x.Employee)
-                .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.VisitTarget == EVisitTarget.Org)
-                .WhereIF(dto.OrgVisitStatisticsType.HasValue, x => x.OrderVisit.Order.ProcessType == (EProcessType)((int)dto.OrgVisitStatisticsType))
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
-                .WhereIF(!string.IsNullOrEmpty(dto.VisitUser), x => x.OrderVisit.Employee.Name.Contains(dto.VisitUser))
-                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order.Title.Contains(dto.Title))
-                .WhereIF(dto.OrgCodes.Any(), x => dto.OrgCodes.Contains(x.VisitOrgCode))
-                .WhereIF(dto.HotspotIds.Any(), x => dto.HotspotIds.Contains(x.OrderVisit.Order.HotspotId))
-                .WhereIF(dto.Channels.Any(), x => dto.Channels.Contains(x.OrderVisit.Order.SourceChannelCode))
-                .WhereIF(dto.CreationTimeStart.HasValue, x => x.OrderVisit.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始
-                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.OrderVisit.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束
-                .WhereIF(dto.ActualHandleTimeStart.HasValue, x => x.OrderVisit.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
-                .WhereIF(dto.ActualHandleTimeEnd.HasValue, x => x.OrderVisit.Order.ActualHandleTime <= dto.ActualHandleTimeEnd); //办结时间结束
-        }
+        
 
 
         public ISugarQueryable<SelectOrderId> OrderListUnionAll(ISugarQueryable<SelectOrderId> t1, ISugarQueryable<SelectOrderId> t2)

+ 5 - 0
src/Hotline.Share/Dtos/JudicialManagement/EnforcementBigscreenDto.cs

@@ -139,6 +139,11 @@ namespace Hotline.Share.Dtos.JudicialManagement
     /// </summary>
     public class OrderOverviewDto
     {
+        public DateTime CreationTime {  get; set; }
+        /// <summary>
+        /// 执法部门
+        /// </summary>
+        public List<Kv> EnforcementOrdersHandler { get; set; }
         public string Id { get; set; }
         public string WorkflowId { get; set; }
 

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

@@ -810,6 +810,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public DateTime? NearlyExpiredTime { get; set; }
 
+        /// <summary>
+        /// 即将超期第一级
+        /// </summary>
+        public DateTime? NearlyExpiredTimeOne { get; set; }
+
         /// <summary>
         /// 办理时间限制(如:24小时、7个工作日)
         /// </summary>

+ 10 - 0
src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs

@@ -225,6 +225,16 @@ namespace Hotline.Share.Dtos.Order
 
 		public string? OrgName { get; set; }
 
+		/// <summary>
+		/// 首次归档意见
+		/// </summary>
+		public string? FirstFileOpinion { get; set; }
+
+		/// <summary>
+		/// 上次归档意见
+		/// </summary>
+		public string? LastFileOpinion { get; set; }
+
 
 		/// <summary>
 		/// 特提节点

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

@@ -139,6 +139,11 @@ public class PublishPublishOrderDto
     /// </summary>
     public DateTime CreationTime { get; set; }
 
+    /// <summary>
+    /// 实际办理附件
+    /// </summary>
+    public List<FileJson>? FileJsons { get; set; }
+
     #region 省工单使用
 
     /// <summary>

+ 5 - 0
src/Hotline.Share/Dtos/Settings/TimeConfig.cs

@@ -34,5 +34,10 @@ namespace Hotline.Share.Dtos.Settings
         /// 即将超期时间
         /// </summary>
         public DateTime NearlyExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期时间第一级
+        /// </summary>
+        public DateTime NearlyExpiredTimeOne { get; set; }
     }
 }

+ 10 - 0
src/Hotline.Share/Dtos/Settings/TimeLimitDto.cs

@@ -205,6 +205,11 @@ namespace Hotline.Share.Dtos.Settings
         /// 即将超期时间
         /// </summary>
         public DateTime NearlyExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期第一级
+        /// </summary>
+        public DateTime NearlyExpiredTimeOne { get; set; }
     }
 
     #endregion
@@ -239,6 +244,11 @@ namespace Hotline.Share.Dtos.Settings
         /// 超期时限百分比
         /// </summary>
         public int Percentage { get; set; }
+
+        /// <summary>
+        /// 超期时间百分比(第一级)
+        /// </summary>
+        public int PercentageOne { get; set; }
     }
 
     #endregion

+ 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.80</Version>
+    <Version>1.0.81</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 5 - 0
src/Hotline.Share/Requests/DepartmentalProcessingStatisticsDto.cs

@@ -231,6 +231,11 @@ namespace Hotline.Share.Requests
         /// </summary>
         public string OrgCode { get; set; }
 
+        /// <summary>
+        /// 父级ID
+        /// </summary>
+        public string ParentOrgCode { get; set; }
+
         /// <summary>
         /// 部门名称
         /// </summary>

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

@@ -398,3 +398,62 @@ public record HotspotAndAreaStatisticsReq
     public List<string> AddColumnName { get; set; } = new();
 
 }
+
+
+public class AcceptTypeStatisticsReq
+{
+    public DateTime StartTime { get; set; }
+
+    public DateTime EndTime { get; set; }
+
+    /// <summary>
+    /// 0:全部 ,1:市民,2:企业
+    /// </summary>
+    public int TypeId { get; set; }
+
+    public string Gateway { get; set; }
+
+    /// <summary>
+    /// 导出列名
+    /// </summary>
+    public List<string> AddColumnName { get; set; } = new();
+
+}
+
+
+public class AcceptTypeStatisticsDto
+{
+    /// <summary>
+    /// 受理类型
+    /// </summary>
+    public string AcceptType { get; set; }
+    /// <summary>
+    /// 分类量
+    /// </summary>
+    public int SumCount { get; set; }
+
+    /// <summary>
+    /// 办结量
+    /// </summary>
+    public int CompletionCount { get; set; }
+
+    /// <summary>
+    /// 办结率
+    /// </summary>
+    public string CompletionRate => SumCount > 0 ? Math.Round((double)CompletionCount / (double)SumCount * 100, digits: 3)+"%" : 0.000+"%";
+
+    /// <summary>
+    /// 回访量
+    /// </summary>
+    public int VisitCount { get; set; }
+
+    /// <summary>
+    /// 回访率
+    /// </summary>
+    public string VisitRate => SumCount > 0 ? Math.Round((double)VisitCount / (double)SumCount *100, digits: 3)+"%" : 0.000+"%";
+
+    /// <summary>
+    /// 占比
+    /// </summary>
+    public string SumCountRate { get; set; }
+}

+ 1 - 1
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -234,7 +234,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 批量修改工单办理对象
         /// </summary>
         Task ChangeHandlerBatchAsync(
-            IReadOnlyList<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps)> handlers,
+            IReadOnlyList<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)> handlers,
             CancellationToken cancellationToken);
 
         /// <summary>

+ 4 - 2
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -490,8 +490,10 @@ public abstract class StepBasicEntity : CreationEntity
                     UserId = HandlerId,
                     Username = HandlerName,
                     OrgId = HandlerOrgId,
-                    OrgName = HandlerOrgName
-                };
+                    OrgName = HandlerOrgName,
+                    RoleId = RoleId,
+                    RoleName = RoleName
+				};
             case EFlowAssignType.Role:
                 return new FlowStepHandler
                 {

+ 6 - 5
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -35,12 +35,13 @@ public partial class Workflow : CreationEntity
 
     public string? ModuleCode { get; set; }
 
-    #endregion
+	#endregion
 
-    /// <summary>
-    /// 流程标题
-    /// </summary>
-    public string Title { get; set; }
+	/// <summary>
+	/// 流程标题
+	/// </summary>
+	[SugarColumn(ColumnDataType = "varchar(2000)")]
+	public string Title { get; set; }
 
     ///// <summary>
     ///// 到期时间(期满时间)

+ 13 - 13
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -330,8 +330,8 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
             DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken)
         {
-            ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId, current.Roles);
-            //CheckWhetherRunnable(workflow.Status);
+            //ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId, current.Roles);
+            CheckWhetherRunnable(workflow.Status);
 
             #region 办理当前节点
 
@@ -789,7 +789,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 批量修改工单办理对象
         /// </summary>
         public async Task ChangeHandlerBatchAsync(
-            IReadOnlyList<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps
+            IReadOnlyList<(string userId, string username, string orgId, string orgName,string? roleId,string? roleName, ICollection<WorkflowStep> steps
                 )> handlers,
             CancellationToken cancellationToken)
         {
@@ -799,11 +799,11 @@ namespace Hotline.FlowEngine.Workflows
                 {
                     step.FlowAssignType = EFlowAssignType.User;
                     step.Assign(handler.userId, handler.username,
-                        handler.orgId, handler.orgName);
+                        handler.orgId, handler.orgName,handler.roleId,handler.roleName);
                     if (step.WorkflowTrace is null)
                         throw new UserFriendlyException("未查询节点对应快照信息");
                     step.WorkflowTrace.Assign(handler.userId, handler.username,
-                        handler.orgId, handler.orgName);
+                        handler.orgId, handler.orgName, handler.roleId, handler.roleName);
                 }
             }
 
@@ -1883,15 +1883,15 @@ namespace Hotline.FlowEngine.Workflows
             newStep.CountersignId = step.CountersignId;
             newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
 
-            //退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制
-            if (traceType is EWorkflowTraceType.Previous)
+			//退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制
+			if (traceType is EWorkflowTraceType.Previous)
             {
-				
-				newStep.FlowAssignType = EFlowAssignType.User;
-				// 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程
-				if (step.HandlerOrgIsCenter!.Value)
-                    newStep.FlowAssignType = EFlowAssignType.Org;
-                newStep.Assign(step.HandlerId, step.HandlerName, step.HandlerOrgId, step.HandlerOrgName);
+	            //newStep.FlowAssignType = EFlowAssignType.User;
+                // 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程 禅道200
+                newStep.FlowAssignType = !step.HandlerOrgIsCenter!.Value ? EFlowAssignType.Org : EFlowAssignType.Role;
+                if (newStep is { FlowAssignType: EFlowAssignType.Role, BusinessType: EBusinessType.Send })
+                    newStep.FlowAssignType = EFlowAssignType.User;
+				newStep.Assign(step.HandlerId, step.HandlerName, step.HandlerOrgId, step.HandlerOrgName, step.RoleId, step.RoleName);
             }
 
             await _workflowStepRepository.AddAsync(newStep, cancellationToken);

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

@@ -82,12 +82,6 @@ namespace Hotline.Orders
         /// <returns></returns>
         Task<DataTable> OrderSourceTimeExport(TimeSharingPagedKeywordRequest dto);
 
-        /// <summary>
-        /// 满意度明细
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        ISugarQueryable<OrderVisitDetail> OrgVisitDetailList(OrgVisitDetailListReq dto);
 
         /// <summary>
         /// 信件来源统计

+ 34 - 6
src/Hotline/Orders/Order.cs

@@ -308,6 +308,12 @@ namespace Hotline.Orders
         /// </summary>
         public DateTime? NearlyExpiredTime { get; set; }
 
+
+        /// <summary>
+        /// 即将超期时间第一级
+        /// </summary>
+        public DateTime? NearlyExpiredTimeOne { get; set; }
+
         /// <summary>
         /// 交办时间(中心交部门办理时间)
         /// </summary>
@@ -401,6 +407,8 @@ namespace Hotline.Orders
 
         #region 实际办理信息(节点,部门,意见)
 
+        public string? ActualHandleStepId { get; set; }
+
         /// <summary>
         /// 实际办理节点code(会签状态此字段保存最外层会签发起节点code)
         /// </summary>
@@ -972,10 +980,27 @@ namespace Hotline.Orders
         }
 
         /// <summary>
-        /// 发布
+        /// 特提之后 归档信息清空
         /// </summary>
-        /// <param name="isPublicity"></param>
-        public void Publish(bool isPublicity)
+        public void FileEmpty() {
+            FiledTime = null;
+			HandleDurationWorkday = 0;
+            HandleDuration = 0;
+			FileDurationWorkday = 0;
+            FileDuration = 0;
+			AllDurationWorkday = 0;
+            AllDuration = 0;
+			CreationTimeHandleDurationWorkday = 0;
+            CreationTimeHandleDuration = 0;
+			CenterToOrgHandleDurationWorkday = 0;
+            CenterToOrgHandleDuration = 0;
+		}
+
+		/// <summary>
+		/// 发布
+		/// </summary>
+		/// <param name="isPublicity"></param>
+		public void Publish(bool isPublicity)
         {
             //Progress = EProgress.Published;
             Status = EOrderStatus.Published;
@@ -998,7 +1023,7 @@ namespace Hotline.Orders
         }
 
         public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit,
-            DateTime expiredTime, DateTime nearlyExpiredTime,
+            DateTime expiredTime, DateTime nearlyExpiredTime,DateTime nearlyExpiredTimeOne,
             string opinion, string handlerId, string handlerName,
             bool canUpdateOrderSender)
         {
@@ -1015,13 +1040,14 @@ namespace Hotline.Orders
                 CenterToOrgHandlerName = handlerName;
             }
             NearlyExpiredTime = nearlyExpiredTime;
+            NearlyExpiredTimeOne = nearlyExpiredTimeOne;
             SendOrderNumber += 1;
 
             if (string.IsNullOrEmpty(WaitForPublisherId))
                 WaitForPublisherId = handlerId;
         }
 
-        public void OrgToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
+        public void OrgToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime,DateTime nearlyExpiredTimeOne)
         {
             ProcessType = EProcessType.Zhiban;
             TimeLimit = timelimit;
@@ -1029,19 +1055,21 @@ namespace Hotline.Orders
             TimeLimitUnit = timilimitUnit;
             ExpiredTime = expiredTime;
             NearlyExpiredTime = nearlyExpiredTime;
+            NearlyExpiredTimeOne = nearlyExpiredTimeOne;
             CenterToOrgTime = null;
             CenterToOrgOpinion = null;
             CenterToOrgHandlerId = null;
             CenterToOrgHandlerName = null;
         }
 
-        public void CenterToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
+        public void CenterToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime, DateTime nearlyExpiredTimeOne)
         {
             TimeLimit = timelimit;
             TimeLimitCount = timelimitCount;
             TimeLimitUnit = timilimitUnit;
             ExpiredTime = expiredTime;
             NearlyExpiredTime = nearlyExpiredTime;
+            NearlyExpiredTimeOne = nearlyExpiredTimeOne;
         }
 
         public void SetHandleDuration()

+ 5 - 4
src/Hotline/Orders/OrderDomainService.cs

@@ -247,14 +247,14 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 	            .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
 			if (sendNum <= 0) return;
             var sendSteps = steps.Take(sendNum).ToList();
-            await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps)>
+            await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
             {
-                new(user.Id, user.Name, user.OrgId, user.Organization.Name, sendSteps)
+                new(user.Id, user.Name, user.OrgId, user.Organization.Name,null,null, sendSteps)
             }, cancellationToken);
         }
 
     }
-
+        
     /// <summary>
     /// 触发平均派单
     /// </summary>
@@ -275,7 +275,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 cancellationToken);
             if (steps.Any())
             {
-                List<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps)> handlers = new();
+                List<(string userId, string username, string orgId, string orgName,string? roleId,string? roleName, ICollection<WorkflowStep> steps)> handlers = new();
                 var avg = steps.Count / schedulings.Count;
                 var remaining = steps.Count % schedulings.Count;
                 for (var i = 0; i < schedulings.Count; i++)
@@ -287,6 +287,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                         scheduling.SchedulingUser.UserName,
                         scheduling.SchedulingUser.OrgId,
                         scheduling.SchedulingUser.OrgIdName,
+                        null,null,
                         steps.Take(size).ToList()));
                     scheduling.SendOrderNum += size;
 					await _schedulingRepository.Updateable()

+ 11 - 0
src/Hotline/Orders/OrderSpecial.cs

@@ -113,6 +113,17 @@ namespace Hotline.Orders
 		[Navigate(NavigateType.OneToMany, nameof(OrderSpecialDetail.SpecialId))]
 		public List<OrderSpecialDetail> ReTransactError { get; set; }
 
+		/// <summary>
+		/// 首次归档意见
+		/// </summary>
+		[SugarColumn(ColumnDataType = "varchar(8000)")]
+		public string? FirstFileOpinion { get; set; }
+
+		/// <summary>
+		/// 上次归档意见
+		/// </summary>
+		[SugarColumn(ColumnDataType = "varchar(8000)")]
+		public string? LastFileOpinion { get; set; }
 
 	}
 

+ 1 - 1
src/Hotline/Settings/TimeLimits/ITimeLimitDomainService.cs

@@ -40,7 +40,7 @@ namespace Hotline.Settings.TimeLimits
         /// <param name="timeType"></param>
         /// <param name="timeValue"></param>
         /// <returns></returns>
-        TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, int Percentage);
+        TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, int Percentage,int PercentageOne);
 
         /// <summary>
         /// 

+ 47 - 19
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -4,6 +4,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using MapsterMapper;
+using System.ComponentModel;
 using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -34,25 +35,25 @@ namespace Hotline.Settings.TimeLimits
 
             //初始化常量TODO
             timeSettingList = new List<CalcTimeSetting>();
-            CalcTimeSetting setting1 = new CalcTimeSetting() { BusCode = "10", BusName = "咨询", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 };
+            CalcTimeSetting setting1 = new CalcTimeSetting() { BusCode = "10", BusName = "咨询", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 , PercentageOne =50};
             timeSettingList.Add(setting1);
-            CalcTimeSetting setting2 = new CalcTimeSetting() { BusCode = "30", BusName = "举报", TimeType = ETimeType.WorkDay, TimeValue = 5, Percentage = 80 };
+            CalcTimeSetting setting2 = new CalcTimeSetting() { BusCode = "30", BusName = "举报", TimeType = ETimeType.WorkDay, TimeValue = 5, Percentage = 80 , PercentageOne  = 50};
             timeSettingList.Add(setting2);
-            CalcTimeSetting setting3 = new CalcTimeSetting() { BusCode = "35", BusName = "投诉", TimeType = ETimeType.WorkDay, TimeValue = 5, Percentage = 80 };
+            CalcTimeSetting setting3 = new CalcTimeSetting() { BusCode = "35", BusName = "投诉", TimeType = ETimeType.WorkDay, TimeValue = 5, Percentage = 80 , PercentageOne =50 };
             timeSettingList.Add(setting3);
-            CalcTimeSetting setting4 = new CalcTimeSetting() { BusCode = "20", BusName = "求助", TimeType = ETimeType.WorkDay, TimeValue = 5, Percentage = 80 };
+            CalcTimeSetting setting4 = new CalcTimeSetting() { BusCode = "20", BusName = "求助", TimeType = ETimeType.WorkDay, TimeValue = 5, Percentage = 80 , PercentageOne =50 };
             timeSettingList.Add(setting4);
-            CalcTimeSetting setting5 = new CalcTimeSetting() { BusCode = "15", BusName = "建议", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 };
+            CalcTimeSetting setting5 = new CalcTimeSetting() { BusCode = "15", BusName = "建议", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 , PercentageOne = 50 };
             timeSettingList.Add(setting5);
-            CalcTimeSetting setting6 = new CalcTimeSetting() { BusCode = "1", BusName = "意见", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 };
+            CalcTimeSetting setting6 = new CalcTimeSetting() { BusCode = "1", BusName = "意见", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 , PercentageOne = 50 };
             timeSettingList.Add(setting6);
-            CalcTimeSetting setting7 = new CalcTimeSetting() { BusCode = "2", BusName = "惠民帮助", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 };
+            CalcTimeSetting setting7 = new CalcTimeSetting() { BusCode = "2", BusName = "惠民帮助", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 ,PercentageOne = 50 };
             timeSettingList.Add(setting7);
             //CalcTimeSetting setting8 = new CalcTimeSetting() { BugCode = "3", BusName = "大气污染举报", TimeType = ETimeType.WorkDay, TimeValue = 5 };
             //timeSettingList.Add(setting8);
-            CalcTimeSetting setting9 = new CalcTimeSetting() { BusCode = "25", BusName = "表扬", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 };
+            CalcTimeSetting setting9 = new CalcTimeSetting() { BusCode = "25", BusName = "表扬", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 ,PercentageOne = 50 };
             timeSettingList.Add(setting9);
-            CalcTimeSetting setting10 = new CalcTimeSetting() { BusCode = "40", BusName = "其他", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 };
+            CalcTimeSetting setting10 = new CalcTimeSetting() { BusCode = "40", BusName = "其他", TimeType = ETimeType.WorkDay, TimeValue = 3, Percentage = 80 , PercentageOne = 50 };
             timeSettingList.Add(setting10);
         }
 
@@ -111,17 +112,17 @@ namespace Hotline.Settings.TimeLimits
             await _timeLimitRepository.UpdateAsync(model, cancellationToken);
         }
 
-        public TimeResult? CalcEndTime(EFlowDirection flowDirection, int Percentage, ETimeType? timeType = null, int? timeValue = null)
+        public TimeResult? CalcEndTime(EFlowDirection flowDirection, int Percentage,int PercentageOne, ETimeType? timeType = null, int? timeValue = null)
         {
             switch (flowDirection)
             {
                 case EFlowDirection.CenterToOrg:
                     if (!timeType.HasValue || !timeValue.HasValue)
                         throw new UserFriendlyException("无效参数");
-                    return CalcEndTime(DateTime.Now, timeType.Value, timeValue.Value,Percentage);
+                    return CalcEndTime(DateTime.Now, timeType.Value, timeValue.Value,Percentage,PercentageOne);
                 case EFlowDirection.OrgToCenter:
                     //todo 根据配置
-                    return CalcEndTime(DateTime.Now, ETimeType.Day, 1, Percentage);
+                    return CalcEndTime(DateTime.Now, ETimeType.Day, 1, Percentage,PercentageOne);
                 default:
                     throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null);
             }
@@ -310,7 +311,7 @@ namespace Hotline.Settings.TimeLimits
                     }
                     else
                     {
-                        if (endTime>WorkEndTime)
+                        if (endTime> WorkEndTime && endTime < WorkBeginTime.AddDays(1))
                         {
                             endTime = WorkBeginTime.AddDays(1);
                         }
@@ -422,13 +423,14 @@ namespace Hotline.Settings.TimeLimits
             var setting = timeSettingList.FirstOrDefault(x => x.BusCode == busCode);
             if (setting != null)
             {
-                var result =  CalcEndTime(beginTime, setting.TimeType, setting.TimeValue, setting.Percentage);
+                var result =  CalcEndTime(beginTime, setting.TimeType, setting.TimeValue, setting.Percentage, setting.PercentageOne);
                 var expiredTimeWithConfig = new ExpiredTimeWithConfig();
                 expiredTimeWithConfig.TimeText = setting.TimeValue+"个"+setting.TimeType.GetDescription();
                 expiredTimeWithConfig.TimeType = setting.TimeType;
                 expiredTimeWithConfig.Count = setting.TimeValue;
                 expiredTimeWithConfig.ExpiredTime = result.EndTime;
                 expiredTimeWithConfig.NearlyExpiredTime = result.NearlyExpiredTime;
+                expiredTimeWithConfig.NearlyExpiredTimeOne = result.NearlyExpiredTimeOne;
                 return expiredTimeWithConfig;
             }
             return null;
@@ -439,10 +441,11 @@ namespace Hotline.Settings.TimeLimits
             var setting = timeSettingList.FirstOrDefault(x => x.BusCode == busCode);
             if (setting!=null)
             {
-                var result = CalcEndTime(beginTime, timeConfig.TimeType, timeConfig.Count, setting.Percentage);
+                var result = CalcEndTime(beginTime, timeConfig.TimeType, timeConfig.Count, setting.Percentage,setting.PercentageOne);
                 var expiredTimeWithConfig = _mapper.Map<ExpiredTimeWithConfig>(timeConfig);
                 expiredTimeWithConfig.ExpiredTime = result.EndTime;
                 expiredTimeWithConfig.NearlyExpiredTime = result.NearlyExpiredTime;
+                expiredTimeWithConfig.NearlyExpiredTimeOne = result.NearlyExpiredTimeOne;
                 return expiredTimeWithConfig;
             }
             return null;
@@ -454,7 +457,7 @@ namespace Hotline.Settings.TimeLimits
             var setting = timeSettingList.FirstOrDefault(x => x.BusCode == busCode);
             if (setting!=null)
             {
-                var result = CalcEndTime(beginTime, timeType, timeValue, setting.Percentage);
+                var result = CalcEndTime(beginTime, timeType, timeValue, setting.Percentage,setting.PercentageOne);
                 return result;
             }
             return null;
@@ -466,11 +469,13 @@ namespace Hotline.Settings.TimeLimits
         /// <param name="beginTime"></param>
         /// <param name="timeType"></param>
         /// <param name="timeValue"></param>
-        /// <param name="isCenter"></param>
+        /// <param name="Percentage">即将超期百分比</param>
+        /// <param name="PercentageOne">超期百分比第一级</param>
         /// <returns></returns>
-        public TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue,int Percentage)
+        public TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue,int Percentage,int PercentageOne)
         {
             DateTime startTime = beginTime;
+            DateTime startTimeOne = beginTime;
             //如果是部门,采用部门计算方式
             switch (timeType)
             {
@@ -581,6 +586,7 @@ namespace Hotline.Settings.TimeLimits
                         var duration =  WorkEndTime - WorkBeginTime;
                         double workMinutes = duration.TotalMinutes;
                         double totalWorkMinutes = (workMinutes * timeValue) * (Percentage/100.00);
+                        double totalWorkMinutesOne = (workMinutes * timeValue) * (Percentage / 50.00);
                         
                         //判断开始时间不在工时间段修正时间复位至当天或者第二天的开始时间(如果大于结束时间则复位至第二天的开始时间)
                         if (beginTime < WorkBeginTime)
@@ -621,6 +627,28 @@ namespace Hotline.Settings.TimeLimits
                                         startTime = startTime.AddMinutes(totalWorkMinutes);
                                     }
                                 }
+
+                                if (totalWorkMinutesOne >= workMinutes)
+                                {
+                                    startTimeOne = startTimeOne.AddDays(day);
+                                    totalWorkMinutesOne = totalWorkMinutesOne - workMinutes;
+                                }
+                                else if(totalWorkMinutesOne < workMinutes && totalWorkMinutesOne!=0)
+                                {
+                                    if (startTimeOne.AddMinutes(totalWorkMinutesOne)> DateTime.Parse(startTimeOne.ToShortDateString()+" "+ workTimeWorkDay.SettingValue[1]+":00"))
+                                    {
+                                        totalWorkMinutesOne = totalWorkMinutesOne - ((DateTime.Parse(startTimeOne.ToShortDateString() + " " + workTimeWorkDay.SettingValue[1] + ":00") - startTimeOne).TotalMinutes);
+                                        startTimeOne = startTimeOne.AddDays(day);
+                                        startTimeOne = DateTime.Parse(startTimeOne.ToShortDateString() + " " + workTimeWorkDay.SettingValue[0] + ":00").AddMinutes(totalWorkMinutesOne);
+                                        totalWorkMinutesOne = 0;
+                                    }
+                                    else
+                                    {
+                                        startTimeOne = startTimeOne.AddMinutes(totalWorkMinutesOne);
+                                    }
+                                }
+
+
                                 day = 1;
                             }
                             else
@@ -649,7 +677,7 @@ namespace Hotline.Settings.TimeLimits
                     //}
 
 
-                    return new TimeResult { EndTime = beginTime, RuleStr = timeValue + "个工作日", NearlyExpiredTime = startTime };
+                    return new TimeResult { EndTime = beginTime, RuleStr = timeValue + "个工作日", NearlyExpiredTime = startTime , NearlyExpiredTimeOne = startTimeOne };
                 //新增自然日
                 case ETimeType.Day:
                     return new TimeResult { EndTime = beginTime.AddDays(timeValue), RuleStr = timeValue + "个自然日", NearlyExpiredTime = beginTime };