Jelajahi Sumber

Merge branch 'test' into test_Guardian

田爽 3 minggu lalu
induk
melakukan
e333d8bebd
81 mengubah file dengan 1739 tambahan dan 571 penghapusan
  1. 33 16
      src/Hotline.Api/Controllers/Bi/BiCallController.cs
  2. 2 0
      src/Hotline.Api/Controllers/Bi/BiKnowledgeController.cs
  3. 169 92
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  4. 3 0
      src/Hotline.Api/Controllers/Bi/BiQualityController.cs
  5. 41 6
      src/Hotline.Api/Controllers/CallController.cs
  6. 3 1
      src/Hotline.Api/Controllers/CaseController.cs
  7. 3 1
      src/Hotline.Api/Controllers/ContingencyManagementController.cs
  8. 3 1
      src/Hotline.Api/Controllers/EnterpriseLuzhouController.cs
  9. 5 2
      src/Hotline.Api/Controllers/ExportWordController.cs
  10. 3 1
      src/Hotline.Api/Controllers/FileController.cs
  11. 4 2
      src/Hotline.Api/Controllers/HotSpotController.cs
  12. 2 1
      src/Hotline.Api/Controllers/IPPbxController.cs
  13. 4 2
      src/Hotline.Api/Controllers/IndustrialManagementController.cs
  14. 18 9
      src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs
  15. 4 2
      src/Hotline.Api/Controllers/KnowledgeController.cs
  16. 315 104
      src/Hotline.Api/Controllers/OrderController.cs
  17. 1 1
      src/Hotline.Api/Controllers/OrderTerminateController.cs
  18. 2 1
      src/Hotline.Api/Controllers/OrgController.cs
  19. 3 1
      src/Hotline.Api/Controllers/PlanController.cs
  20. 7 3
      src/Hotline.Api/Controllers/StatisticalReportController.cs
  21. 9 5
      src/Hotline.Api/Controllers/SysController.cs
  22. 4 2
      src/Hotline.Api/Controllers/TelRestController.cs
  23. 6 1
      src/Hotline.Api/Controllers/TestController.cs
  24. 2 1
      src/Hotline.Api/Controllers/UserController.cs
  25. 2 1
      src/Hotline.Api/Controllers/WorkflowController.cs
  26. TEMPAT SAMPAH
      src/Hotline.Api/Documents/luzhou/泸州12345平台工单查询接口(V1.0-20250312) .docx
  27. TEMPAT SAMPAH
      src/Hotline.Api/Documents/zigong/丰窝12345平台工单接入接口(V1.1-20250225) .docx
  28. 62 0
      src/Hotline.Api/Filter/UserNameSessionContextFilter.cs
  29. 2 1
      src/Hotline.Api/StartupExtensions.cs
  30. 3 14
      src/Hotline.Application/CallCenter/DefaultCallApplication.cs
  31. 1 0
      src/Hotline.Application/FlowEngine/IWorkflowApplication.cs
  32. 14 2
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  33. 1 0
      src/Hotline.Application/Handlers/FlowEngine/CancelHandler.cs
  34. 16 15
      src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs
  35. 1 0
      src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs
  36. 1 0
      src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs
  37. 1 0
      src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs
  38. 5 1
      src/Hotline.Application/OrderApp/Handlers/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs
  39. 116 19
      src/Hotline.Application/OrderApp/OrderApplication.cs
  40. 1 0
      src/Hotline.Application/Snapshot/Contracts/IOrderSnapshotApplication.cs
  41. 2 0
      src/Hotline.Application/Snapshot/IndustryApplication.cs
  42. 16 2
      src/Hotline.Application/Snapshot/RedPackApplication.cs
  43. 41 3
      src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs
  44. 78 56
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  45. 1 1
      src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs
  46. 22 2
      src/Hotline.Share/Dtos/Article/BulletinDto.cs
  47. 5 0
      src/Hotline.Share/Dtos/CallCenter/QueryCallsFixedDto.cs
  48. 1 0
      src/Hotline.Share/Dtos/FlowEngine/NextStepsDto.cs
  49. 4 0
      src/Hotline.Share/Dtos/Order/Detail/OrderFlowTraceDto.cs
  50. 45 1
      src/Hotline.Share/Dtos/Order/OrderDto.cs
  51. 122 79
      src/Hotline.Share/Dtos/Order/QueryOrderDto.cs
  52. 5 0
      src/Hotline.Share/Dtos/Settings/SystemDicDataDto.cs
  53. 24 12
      src/Hotline.Share/Dtos/Snapshot/IndustryDto.cs
  54. 26 1
      src/Hotline.Share/Dtos/Snapshot/OrderDto.cs
  55. 18 0
      src/Hotline.Share/Dtos/Snapshot/RedPackDto.cs
  56. 42 0
      src/Hotline.Share/Dtos/StatisticalReport/OrderDelayStatisicalReturnDto.cs
  57. 6 1
      src/Hotline.Share/Enums/FlowEngine/EFlowDirection.cs
  58. 6 0
      src/Hotline.Share/Enums/FlowEngine/EHandleMode.cs
  59. 6 0
      src/Hotline.Share/Enums/FlowEngine/EWorkflowTraceType.cs
  60. 22 0
      src/Hotline.Share/Enums/Order/EOrderUpdateSource.cs
  61. 1 1
      src/Hotline.Share/Tools/EnumExtensions.cs
  62. 1 1
      src/Hotline/FlowEngine/WorkflowModules/WorkflowModuleConsts.cs
  63. 9 0
      src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs
  64. 38 21
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  65. 0 43
      src/Hotline/Identity/IIdentityDomainService.cs
  66. 52 0
      src/Hotline/Identity/IdentityDomainService.cs
  67. 7 1
      src/Hotline/Orders/OrderCopy.cs
  68. 1 21
      src/Hotline/Orders/OrderDomainService.cs
  69. 1 0
      src/Hotline/Orders/OrderVisitDetail.cs
  70. 4 4
      src/Hotline/SeedData/SystemDicDataSeedData.cs
  71. 1 1
      src/Hotline/Snapshot/Contracts/ISnapshotPointsDomainService.cs
  72. 12 0
      src/Hotline/Snapshot/Industry.cs
  73. 2 1
      src/Hotline/Snapshot/Services/SnapshotPointsDomainService.cs
  74. 23 1
      src/Hotline/dataview.md
  75. 4 0
      test/Hotline.Tests/Application/IndustryApplicationTest.cs
  76. 48 2
      test/Hotline.Tests/Application/OrderSnapshotApplicationTest.cs
  77. 11 0
      test/Hotline.Tests/Application/RedPackApplicationTest.cs
  78. 7 5
      test/Hotline.Tests/Application/SnapshotApplicationTest.cs
  79. 117 0
      test/Hotline.Tests/Controller/OrderDelayControllerTest.cs
  80. 35 2
      test/Hotline.Tests/Mock/OrderServiceMock.cs
  81. 1 1
      test/Hotline.Tests/TestBase.cs

+ 33 - 16
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -23,6 +23,7 @@ using Hotline.Settings;
 using XF.Utility.EnumExtensions;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers.Bi;
 
@@ -84,7 +85,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("calls_export")]
-    [AllowAnonymous]
+	[LogFilterAlpha("导出日志")]
+	[AllowAnonymous]
     public async Task<FileStreamResult> ExportQueryCallsAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
         => ExcelStreamResult(
             _exportApplication.GetExcelStream(
@@ -134,7 +136,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query_calls_statistics_export")]
-    public async Task<FileStreamResult> QueryCallsStatisticsExportAsync([FromBody] ExportExcelDto<StartEndTimeDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryCallsStatisticsExportAsync([FromBody] ExportExcelDto<StartEndTimeDto> dto)
     {
         var items = (await _callReportApplication.QueryCallsDetailStatisticsAsync(dto.QueryDto, HttpContext.RequestAborted));
         return _exportApplication.GetExcelFile(dto, items, "话务日期统计", "Date");
@@ -156,7 +159,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query_calls_statistics_detail/export")]
-    public async Task<FileStreamResult> QueryCallsStatisticsDetailAsync([FromBody] ExportExcelDto<QueryCallsStatisticsDetailInDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryCallsStatisticsDetailAsync([FromBody] ExportExcelDto<QueryCallsStatisticsDetailInDto> dto)
     {
         var items = (await _callReportApplication.QueryCallsStatisticsDetailAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2;
         return _exportApplication.GetExcelFile(dto, items, "话务日期统计详情", "OrderNo");
@@ -214,7 +218,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query_calls_detail_export")]
-    public async Task<FileStreamResult> QueryCallsDetailExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryCallsDetailExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
     {
         return ExcelStreamResult(
             _exportApplication.GetExcelStream(
@@ -262,7 +267,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query_incall_calls_list_export")]
-    public async Task<FileStreamResult> GetInCallCallListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> GetInCallCallListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
     {
         var (total, data) = await _callReportApplication.QueryCallsDetailInTotalAsync(dto.QueryDto, dto.IsExportAll);
 
@@ -322,7 +328,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query_calls_hour_detail_list_export")]
-    public async Task<FileStreamResult> QueryCallsHourDetailListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryCallsHourDetailListExportAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
         => ExcelStreamResult(
             _exportApplication.GetExcelStream(
                 dto,
@@ -356,7 +363,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("seats/export")]
-    public async Task<FileStreamResult> ExportSeatss([FromBody] ExportExcelDto<ReportRequiredPagedRequest> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> ExportSeatss([FromBody] ExportExcelDto<ReportRequiredPagedRequest> dto)
     {
         return ExcelStreamResult(
             _exportApplication.GetExcelStream(
@@ -451,7 +459,8 @@ public class BiCallController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("hourcall/export")]
-    [AllowAnonymous]
+	[LogFilterAlpha("导出日志")]
+	[AllowAnonymous]
     public async Task<FileStreamResult> ExportQueryHourCall([FromBody] ExportExcelDto<BiQueryHourCallDto> dto)
         => ExcelStreamResult(
             _exportApplication.GetExcelStream(
@@ -489,7 +498,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("hourcall_list/export")]
-    public async Task<FileStreamResult> ExportQueryCallList([FromBody] ExportExcelDto<QueryCallListDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> ExportQueryCallList([FromBody] ExportExcelDto<QueryCallListDto> dto)
     {
 		foreach (var item in dto.ColumnInfos)
 		{
@@ -538,7 +548,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("gateway-query/export")]
-    public async Task<FileStreamResult> ExportQueryGatetWay(ExportExcelDto<BiQueryGateWayDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> ExportQueryGatetWay(ExportExcelDto<BiQueryGateWayDto> dto)
         => ExcelStreamResult(
             _exportApplication.GetExcelStream(
                 dto,
@@ -585,7 +596,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-calldate-statistics/export")]
-    public async Task<FileStreamResult> QueryCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
          =>
             _exportApplication.GetExcelFile(
                 dto,
@@ -618,7 +630,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-person-calldate-statistics/export")]
-    public async Task<FileStreamResult> QueryPersonCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryPersonCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
      => _exportApplication.GetExcelFile(
                 dto,
                 await _callReportApplication.QueryPersonCallDateStatisticsDetail(dto.QueryDto)
@@ -651,7 +664,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-enterprise-calldate-statistics/export")]
-    public async Task<FileStreamResult> QueryEnterpriseCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryEnterpriseCallDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
     => _exportApplication.GetExcelFile(
                 dto,
                 await _callReportApplication.QueryEnterpriseCallDateStatisticsDetail(dto.QueryDto)
@@ -692,7 +706,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-callout-date-statistics/export")]
-    public async  Task<FileStreamResult> QueryCallOutDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async  Task<FileStreamResult> QueryCallOutDateStatisticsDetailExport([FromBody]ExportExcelDto<QueryCallDateStatisticsDetailDto> dto)
     {
         List<string> enterpriseTels = _systemSettingCacheManager.GetSetting(SettingConstants.EnterpriseTel)?.SettingValue;
 
@@ -748,7 +763,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-seat-monthcall/export")]
-    public async Task<FileStreamResult> QuerySeatMonthCallExport([FromBody] ExportExcelDto<QuerySeatMonthCallRequest> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QuerySeatMonthCallExport([FromBody] ExportExcelDto<QuerySeatMonthCallRequest> dto)
     =>  _exportApplication.GetExcelFile(
             dto,              
             await _callReportApplication.QuerySeatMonthCall(dto.QueryDto)
@@ -774,7 +790,8 @@ public class BiCallController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("query-seat-monthcall-detail/export")]
-    public async Task<FileStreamResult> QuerySeatMonthCallDetailExport([FromBody] ExportExcelDto<QuerySeatMonthCallDetailRequest> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QuerySeatMonthCallDetailExport([FromBody] ExportExcelDto<QuerySeatMonthCallDetailRequest> dto)
     {
         var query = _callReportApplication.QuerySeatMonthCallDetail(dto.QueryDto);
         List<QuerySeatMonthCallDetailResp> data;

+ 2 - 0
src/Hotline.Api/Controllers/Bi/BiKnowledgeController.cs

@@ -13,6 +13,7 @@ using Hotline.Share.Requests;
 using Hotline.Tools;
 using MapsterMapper;
 using Org.BouncyCastle.Utilities;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -79,6 +80,7 @@ namespace Hotline.Api.Controllers.Bi
 		/// </summary>
 		/// <returns></returns>
 		[HttpPost("data_list/_export")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<FileStreamResult> DataList([FromBody] ExportExcelDto<KnowledgeBiDataListDto> dto)
 		{
 			if (!dto.QueryDto.CreationTimeStart.HasValue || !dto.QueryDto.CreationTimeEnd.HasValue) 

+ 169 - 92
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -51,6 +51,7 @@ using Hotline.Application.OrderApp;
 using Hotline.Share.Tools;
 using MediatR;
 using static Hotline.AppDefaults;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -193,7 +194,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("published/statistics/department/export")]
-        public async Task<FileStreamResult> ExportQueryPublishedOrderDepartmentAsync([FromBody] ExportExcelDto<QueryOrderPublishStatisticsAllDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryPublishedOrderDepartmentAsync([FromBody] ExportExcelDto<QueryOrderPublishStatisticsAllDto> dto)
         {
             var (total, list) = await _orderApplication.QueryPublishedOrderDepartmentAsync(dto.QueryDto, dto.IsExportAll);
             if (list != null && list.Count > 0)
@@ -237,7 +239,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("published/statistics/user/export")]
-        public async Task<FileStreamResult> ExportQueryPublishedOrder([FromBody] ExportExcelDto<QueryOrderPublishStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryPublishedOrder([FromBody] ExportExcelDto<QueryOrderPublishStatisticsDto> dto)
         {
             var (total, list) = await _orderApplication.QueryPublishedOrderAsync(dto.QueryDto, dto.IsExportAll);
             if (list != null && list.Count > 0)
@@ -312,7 +315,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("visit/source/export")]
-        public async Task<FileStreamResult> QueryOrderVisitSourceChannelExportAsync([FromBody] ExportExcelDto<QueryOrderVisitSourceChannelDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> QueryOrderVisitSourceChannelExportAsync([FromBody] ExportExcelDto<QueryOrderVisitSourceChannelDto> dto)
         {
             var list = await _orderApplication.QueryOrderVisitSourceChannelAsync(dto.QueryDto);
             return _exportApplication.GetExcelFile(dto, list, "回访来源统计", "SourceChannel");
@@ -331,7 +335,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("visit/quantity/export")]
-        public async Task<FileStreamResult> QueryOrderVisitQuantityExportAsync([FromBody] ExportExcelDto<QueryOrderVisitQuantity> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> QueryOrderVisitQuantityExportAsync([FromBody] ExportExcelDto<QueryOrderVisitQuantity> dto)
         {
             var items = await _orderVisitApplication.QueryOrderVisitQuantityAsync(dto.QueryDto);
             return _exportApplication.GetExcelFile(dto, items, "回访量统计");
@@ -356,7 +361,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("org_data_list_detail/_export")]
-        public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListDetailRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListDetailRequest> dto)
         {
             var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
             List<Order> data;
@@ -403,7 +409,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("org_data_list_detail_all/_export")]
-        public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListAllDetailRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListAllDetailRequest> dto)
         {
             var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
             List<Order> data;
@@ -471,7 +478,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("org_data_list/_export")]
-        public async Task<FileStreamResult> OrgDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrgDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
         {
             var query = _orderApplication.QueryOrgDataList(dto.QueryDto);
             List<OrderBiOrgDataListVo> data;
@@ -514,7 +522,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("centre_data_list_export")]
-        public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
         {
             var query = _orderApplication.CentreDataList(dto.QueryDto);
             List<OrderBiCentreDataListVo> data = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
@@ -572,7 +581,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot_data_list/export")]
-        public async Task<FileStreamResult> HotspotDataLsitExprot([FromBody] ExportExcelDto<HotspotReportPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotDataLsitExprot([FromBody] ExportExcelDto<HotspotReportPagedRequest> dto)
         {
             if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
             if (dto.QueryDto.Type == 0 && (!dto.QueryDto.ChainStartTime.HasValue || !dto.QueryDto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
@@ -785,7 +795,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-nosatisfied/export")]
-        public async Task<FileStreamResult> ExportQueryVisitNoSatisfied([FromBody] QueryVisitNoSatisfiedDto dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryVisitNoSatisfied([FromBody] QueryVisitNoSatisfiedDto dto)
         {
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
             if (dto.AddColumnName is null || dto.AddColumnName.Count == 0) throw UserFriendlyException.SameMessage("导出字段不能为空");
@@ -838,7 +849,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-nosatisfied-detail-export")]
-        public async Task<FileStreamResult> BiQueryVisitNoSatisfiedDetailExport([FromBody] ExportExcelDto<BiQueryVisitNoSatisfiedDetailDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> BiQueryVisitNoSatisfiedDetailExport([FromBody] ExportExcelDto<BiQueryVisitNoSatisfiedDetailDto> dto)
         {
             if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 
@@ -886,7 +898,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order-delay-data-list-export")]
-        public async Task<FileStreamResult> ExportQueryOrderDelayDataList([FromBody] ExportExcelDto<QueryOrderDelayDataListRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryOrderDelayDataList([FromBody] ExportExcelDto<QueryOrderDelayDataListRequest> dto)
         {
             var query = _orderReportApplication.QueryOrderDelayDataList(dto.QueryDto);
             List<BiOrderDelayDataDto> list;
@@ -942,7 +955,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order-delay-data-detail-export")]
-        public async Task<FileStreamResult> ExportQueryOrderDelayDataDetail([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryOrderDelayDataDetail([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
         {
             var query = _orderReportApplication.QueryOrderDelayDataDetail(dto.QueryDto);
             List<OrderDelay> list;
@@ -1133,7 +1147,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("accept_type_top10_list-export")]
-        public async Task<FileStreamResult> AcceptTypeTop10ListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> AcceptTypeTop10ListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
         {
             var (areaList, returnList, data) = await _orderApplication.AcceptTypeTop10List(dto.QueryDto, true);
             var stream = ExcelHelper.CreateStream(data);
@@ -1161,7 +1176,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotport-org-statistics/export")]
-        public async Task<FileStreamResult> ExportHotPortJoinOrgStatistics([FromBody] ExportHotPortJoinOrgStatisticsRequest dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportHotPortJoinOrgStatistics([FromBody] ExportHotPortJoinOrgStatisticsRequest dto)
         {
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
             if (dto.AddColumnName is null || dto.AddColumnName.Count == 0) throw UserFriendlyException.SameMessage("导出字段不能为空");
@@ -1193,7 +1209,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotport-org-statistics/detail/export")]
-        public async Task<FileStreamResult> HotPortJoinOrgStatisticsDetailExport([FromBody] ExportExcelDto<HotPortJoinOrgStatisticsRequestDetail> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotPortJoinOrgStatisticsDetailExport([FromBody] ExportExcelDto<HotPortJoinOrgStatisticsRequestDetail> dto)
         {
             var query = _orderRepository.HotPortJoinOrgStatisticsDetail(dto.QueryDto);
             List<Order> data;
@@ -1225,7 +1242,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-measure-statistics-export")]
-        [AllowAnonymous]
+		[LogFilterAlpha("导出日志")]
+		[AllowAnonymous]
         public async Task<FileStreamResult> VisitMeasureStatisticsExport([FromBody] ExportExcelDto<VisitMeasureStatisticsRequest> dto)
         {
             var query = _orderVisitRepository.Queryable()
@@ -1384,7 +1402,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
         /// <returns></returns>
         [HttpPost("hotspot-statistics/export")]
-        public async Task<FileStreamResult> HotspotStatisticsExprot([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotStatisticsExprot([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
         {
 			DataTable data = new DataTable();
 
@@ -1482,7 +1501,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot-statistics-detail/export")]
-        public async Task<FileStreamResult> HotspotStatisticsDetailExport([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotStatisticsDetailExport([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
         {
             var query = _orderApplication.HotspotStatisticsDetail(dto.QueryDto);
             List<Order> data;
@@ -1538,7 +1558,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("seat-satisfaction-statistics/export")]
-        public async Task<FileStreamResult> SeatSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> SeatSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.SeatSatisfactionStatistics(dto.QueryDto);
             List<SeatSatisfactionStatisticsDto> data;
@@ -1621,7 +1642,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("seat-satisfaction-statistics-list-detail/export")]
-        public async Task<FileStreamResult> SeatSatisfactionStatisticsListDetailExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> SeatSatisfactionStatisticsListDetailExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.SeatSatisfactionStatisticsListDetail(dto.QueryDto);
             List<SeatSatisfactionStatisticsListDetailDto> data;
@@ -1702,7 +1724,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("query-seat-satisfaction-order-visit-list/export")]
-        public async Task<FileStreamResult> ExportQuerySeatSatisfactionOrderVisitList([FromBody] ExportExcelDto<SeatSatisfactionOrderVisitRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQuerySeatSatisfactionOrderVisitList([FromBody] ExportExcelDto<SeatSatisfactionOrderVisitRequest> dto)
         {
             var query = _orderApplication.QuerySeatSatisfactionOrderVisitList(dto.QueryDto);
             List<OrderVisitDetail> orders;
@@ -1796,7 +1819,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-org-satisfaction-statistics/_export")]
-        public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
         {
             List<VisitAndOrgSatisfactionStatisticsDto> data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto.QueryDto);
             var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
@@ -1918,7 +1942,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-org-statisfaction-org-detail/_export")]
-        public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
         {
             var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto.QueryDto);
             var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
@@ -1997,7 +2022,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-org-satisfaction-detail/_export")]
-        public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
         {
             var query = _orderRepository.VisitAndOrgSatisfactionDetail(dto.QueryDto);
             List<OrgVisitDetailListResp> data;
@@ -2364,24 +2390,25 @@ namespace Hotline.Api.Controllers.Bi
              .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited).CountAsync()
             };
             //
-            var data = await _orderVisitDetailRepository.Queryable()
+            var query = _orderVisitDetailRepository.Queryable()
                 .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
                 .LeftJoin<SystemOrganize>((it, o, so) => it.VisitOrgCode == so.Id)
                 .Where((it, o, so) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
                  .Select((it, o, so) => new
                  {
-                     Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
-                     Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
-                     CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.City, 1, 0)),
-                     CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.City, 1, 0)),
-                     CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.County, 1, 0)),
-                     CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.County, 1, 0)),
-                     CenterDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.IsCenter, 1, 0)),
-                     CenterSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.IsCenter, 1, 0)),
-                     OrgDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && !so.IsCenter, 1, 0)),
-                     OrgSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && !so.IsCenter, 1, 0)),
-                 })
-                .FirstAsync();
+                     Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2", 1, 0)),
+                     Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 0, 1)),
+                     CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "2") && so.OrgType == EOrgType.City, 1, 0)),
+                     CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "2") && so.OrgType == EOrgType.City, 1, 0)),
+                     CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2") && so.OrgType == EOrgType.County, 1, 0)),
+                     CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2") && so.OrgType == EOrgType.County, 1, 0)),
+                     CenterDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2") && so.IsCenter, 1, 0)),
+                     CenterSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "2") && so.IsCenter, 1, 0)),
+                     OrgDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2") && !so.IsCenter, 1, 0)),
+                     OrgSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && !so.IsCenter, 1, 0)),
+                 });
+            Console.Write(query.ToSqlString());
+             var data = await query.FirstAsync();
             if (data.Satisfied > 0)
             {
                 var count = data.Satisfied + data.Dissatisfied;
@@ -2659,12 +2686,12 @@ namespace Hotline.Api.Controllers.Bi
                 .Select((it, so) => new EnterpriseOrderDto
                 {
                     VisitdCount = SqlFunc.AggregateCount(1),
-                    Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
-                    Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
-                    CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.City, 1, 0)),
-                    CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.City, 1, 0)),
-                    CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.County, 1, 0)),
-                    CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.County, 1, 0)),
+                    Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2", 1, 0)),
+                    Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2"), 1, 0)),
+                    CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="2") && so.OrgType == EOrgType.City, 1, 0)),
+                    CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.City, 1, 0)),
+                    CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key")=="1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key")== "2") && so.OrgType == EOrgType.County, 1, 0)),
+                    CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.County, 1, 0)),
                 })
                 .ToListAsync();
 
@@ -3318,7 +3345,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("department_acceptance_type_statistics_export")]
-        public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatistics([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatistics([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
         {
             var query = _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto.QueryDto);
             List<DepartmentAcceptanceTypeStatisticsDto> list;
@@ -3415,7 +3443,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("department_acceptance_type_order_list_export")]
-        public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderList([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderList([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
         {
             var query = _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto.QueryDto);
             List<Order> list;
@@ -3571,7 +3600,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("department_acceptance_type_statistics_export_v1")]
-        public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatisticsV1([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatisticsV1([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
         {
             var query = _orderReportApplication.DepartmentAcceptanceTypeStatisticsV1(dto.QueryDto);
             List<DepartmentAcceptanceTypeStatisticsV1Dto> list;
@@ -3724,7 +3754,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("department_acceptance_type_order_list_export_v1")]
-        public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderListV1([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderListV1([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
         {
             var query = _orderReportApplication.DepartmentAcceptanceTypeOrderListV1(dto.QueryDto);
             List<Order> list;
@@ -3807,7 +3838,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("departmental_processing_statistics_export")]
-        public async Task<FileStreamResult> ExportDepartmentalProcessingStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentalProcessingStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
         {
             var list = new List<DepartmentalProcessingStatisticsDataDto>();
             if (_appOptions.Value.IsLuZhou == true)
@@ -3911,7 +3943,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("departmental_processing_child_statistics_export")]
-        public async Task<FileStreamResult> ExportDepartmentalProcessingChildStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentalProcessingChildStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
         {
             var list = new List<DepartmentalProcessingStatisticsDataDto>();
             if (_appOptions.Value.IsLuZhou == true)
@@ -4005,7 +4038,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("departmental_processing_statistics_list_export")]
-        public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
         {
             ISugarQueryable<SelectOrderId> queryDa;
             if (_appOptions.Value.IsLuZhou == true)
@@ -4098,7 +4132,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("departmental_processing_statistics_details_list_export")]
-        public async Task<FileStreamResult> ExportDepartmentalProcessingStatisticsDetailsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportDepartmentalProcessingStatisticsDetailsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
         {
             ISugarQueryable<SelectOrderId> queryDa;
             if (_appOptions.Value.IsLuZhou == true)
@@ -4375,7 +4410,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("reTransact/_export")]
-        public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
         {
             var query = _orderApplication.OrderReTransact(dto.QueryDto);
             List<OrderReTransactVo> data;
@@ -4415,7 +4451,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("reTransact_detail/_export")]
-        public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
         {
             var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
             List<OrderSpecialDetail> data;
@@ -4477,7 +4514,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("send_order_report/export")]
-        public async Task<FileStreamResult> ExportSendOrderReport([FromBody] ExportExcelDto<QuerySendOrderRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportSendOrderReport([FromBody] ExportExcelDto<QuerySendOrderRequest> dto)
         {
             if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
@@ -4579,7 +4617,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("secondary_handling_report/_export")]
-        public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
         {
             var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto.QueryDto, HttpContext.RequestAborted);
             List<SecondaryHandlingVo> secondaryHandling;
@@ -4614,7 +4653,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("secondary_handling_detail_report/_export")]
-        public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
         {
             var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto.QueryDto, HttpContext.RequestAborted);
             List<OrderSecondaryHandling> secondaryHandling;
@@ -4714,7 +4754,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("secondary_handling_satisfaction_report/_export")]
-        public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
         {
             var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto.QueryDto, HttpContext.RequestAborted);
             List<SecondaryHandlingSatisfactionVo> secondaryHandling;
@@ -4797,7 +4838,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("secondary_handling_satisfaction_detail_report/_export")]
-        public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
         {
             var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto.QueryDto, HttpContext.RequestAborted);
             List<OrderSecondaryHandling> secondaryHandling;
@@ -4849,7 +4891,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("unsigned_order_report/_export")]
-        public async Task<FileStreamResult> UnsignedOrdersReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> UnsignedOrdersReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
         {
             var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
             List<UnsignedOrder> unsignedOrders;
@@ -4906,7 +4949,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("order_source/_export")]
-        public async Task<FileStreamResult> QueryOrderSourceReport([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> QueryOrderSourceReport([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
         {
             //var count = await _orderApplication.QueryOrderSource(dto.QueryDto).CountAsync();
             var query = _orderApplication.QueryOrderSource(dto.QueryDto).GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) });
@@ -4958,7 +5002,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("order_source_list/_export")]
-        public async Task<FileStreamResult> QueryOrderSourceListExport([FromBody] QueryOrderSourceRequest dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> QueryOrderSourceListExport([FromBody] QueryOrderSourceRequest dto)
         {
             var dataTable = await _orderRepository.OrderSourceExport(dto);
             var stream = ExcelHelper.CreateStream(dataTable);
@@ -4982,7 +5027,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("order_source_detail/_export")]
-        public async Task<FileStreamResult> QueryOrderSourceDetailReport([FromBody] ExportExcelDto<QueryOrderSourceDetailRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> QueryOrderSourceDetailReport([FromBody] ExportExcelDto<QueryOrderSourceDetailRequest> dto)
         {
             var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
             List<Order> orders;
@@ -5032,7 +5078,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order_area_time_export")]
-        public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
         {
             var dataTable = await _orderRepository.OrderAreaTimeExport(dto);
             var stream = ExcelHelper.CreateStream(dataTable);
@@ -5066,7 +5113,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order_hotspot_time_export")]
-        public async Task<FileStreamResult> OrderHotspotTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderHotspotTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
         {
             var dataTable = await _orderRepository.OrderHotspotTimeExport(dto);
             var stream = ExcelHelper.CreateStream(dataTable);
@@ -5100,7 +5148,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order_acceptance_time_export")]
-        public async Task<FileStreamResult> OrderAcceptanceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderAcceptanceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
         {
             var titleData = await _systemDicDataRepository.Queryable()
                 .Where(p => p.DicTypeCode == "AcceptType")
@@ -5141,7 +5190,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order_source_time_export")]
-        public async Task<FileStreamResult> OrderSourceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderSourceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
         {
             var dataTable = await _orderRepository.OrderSourceTimeExport(dto);
             var stream = ExcelHelper.CreateStream(dataTable);
@@ -5205,7 +5255,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("org-visitdetail-list-export")]
-        public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
         {
             var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
 
@@ -5250,7 +5301,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot-area-statistics-export")]
-        public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody] HotspotAndAreaStatisticsReq dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody] HotspotAndAreaStatisticsReq dto)
         {
             var returnList = await _orderApplication.HotspotAndAreaStatisticsExport(dto);
             var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
@@ -5288,7 +5340,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("accepttype-statistics-bydate-detail-export")]
-        public async Task<FileStreamResult> AcceptTypeStatisticsByDateDetailExport([FromBody] ExportExcelDto<AcceptTypeStatisticsByDateDetailReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> AcceptTypeStatisticsByDateDetailExport([FromBody] ExportExcelDto<AcceptTypeStatisticsByDateDetailReq> dto)
         {
             var query = _orderRepository.AcceptTypeStatisticsByDateDetail(dto.QueryDto);
 
@@ -5319,7 +5372,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot-area-statistics-detail-export")]
-        public async Task<FileStreamResult> HotspotAndAreaStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAreaStatisticsDetailReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotAndAreaStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAreaStatisticsDetailReq> dto)
         {
             var query = _orderRepository.HotspotAndAreaStatisticsDetail(dto.QueryDto);
 
@@ -5376,7 +5430,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("accepttype-statistics-export")]
-        public async Task<FileStreamResult> AcceptTypeStatisticsExport([FromBody] ExportExcelDto<AcceptTypeStatisticsReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> AcceptTypeStatisticsExport([FromBody] ExportExcelDto<AcceptTypeStatisticsReq> dto)
         {
             var list = await _orderReportApplication.AcceptTypeStatistics(dto.QueryDto).ToListAsync();
             int SumCount = list.Sum(x => x.SumCount);
@@ -5421,7 +5476,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("accepttype-statistics-bydate-export")]
-        public async Task<FileStreamResult> AcceptTypeStatisticsByDateExport([FromBody] AcceptTypeStatisticsByDateReq dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> AcceptTypeStatisticsByDateExport([FromBody] AcceptTypeStatisticsByDateReq dto)
         {
             var returnList = await _orderRepository.AcceptTypeStatisticsByDateExport(dto);
             var table = _orderRepository.InitAcceptTypeTable(returnList, dto.AddColumnName);
@@ -5549,7 +5605,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-hotspot-satisfaction-statistics/_export")]
-        public async Task<FileStreamResult> VisitAndHotspotSatisfactionStatisticsExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> VisitAndHotspotSatisfactionStatisticsExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
         {
             List<VisitAndHotspotSatisfactionStatisticsDto> data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto.QueryDto);
             var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
@@ -5595,7 +5652,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("visit-hotspot-satisfaction-detail/_export")]
-        public async Task<FileStreamResult> VisitAndHotspotSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> VisitAndHotspotSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
         {
             var query = _orderApplication.VisitAndHotspotSatisfactionDetail(dto.QueryDto);
             List<OrderVisitDetail> data;
@@ -5643,7 +5701,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot-accepttype-statistics-export")]
-        public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
         {
             var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
             var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
@@ -5669,7 +5728,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("hotspot-accepttype-statistics-detail-export")]
-        public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
         {
             var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
 
@@ -5712,7 +5772,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("screen-apply-export")]
-        public async Task<FileStreamResult> OrderScreenApplyExport([FromBody] ExportExcelDto<OrderScreenApplyPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderScreenApplyExport([FromBody] ExportExcelDto<OrderScreenApplyPagedRequest> dto)
         {
             var query = _orderApplication.OrderScreenApply(dto.QueryDto);
 
@@ -5754,7 +5815,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("screen-audit-export")]
-        public async Task<FileStreamResult> OrderScreenAuditExport([FromBody] ExportExcelDto<OrderScreenAuditPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderScreenAuditExport([FromBody] ExportExcelDto<OrderScreenAuditPagedRequest> dto)
         {
             var query = _orderApplication.OrderScreenAudit(dto.QueryDto);
 
@@ -5805,7 +5867,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("get_order_nosigen_export")]
-        public async Task<FileStreamResult> ExportGetOrderNoSigen([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportGetOrderNoSigen([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
         {
             var list = await _orderReportApplication.GetOrderNoSigen(dto.QueryDto);
 
@@ -5860,7 +5923,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("get_order_nosigen_detail_export")]
-        public async Task<FileStreamResult> ExportGetOrderNoSigenDetail([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportGetOrderNoSigenDetail([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
         {
             var query = _orderReportApplication.GetOrderNoSigenDetail(dto.QueryDto).Select(o => new { o });
 
@@ -5925,7 +5989,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("get_enterprise_seats_report_export")]
-        public async Task<FileStreamResult> ExportGetEnterpriseSeatsReport([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportGetEnterpriseSeatsReport([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
         {
             var list = await _orderReportApplication.GetEnterpriseSeatsReport(dto.QueryDto);
 
@@ -5974,7 +6039,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("get_enterprise_seats_report_detail_export")]
-        public async Task<FileStreamResult> ExportGetEnterpriseSeatsReportDetail([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportGetEnterpriseSeatsReportDetail([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
         {
             var query = _orderReportApplication.GetEnterpriseSeatsReportDetail(dto.QueryDto);
 
@@ -6033,7 +6099,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("center-accept-export")]
-        public async Task<FileStreamResult> OrderCenterAcceptExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderCenterAcceptExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
         {
             var query = _orderApplication.OrderCenterAccept(dto.QueryDto);
 
@@ -6087,7 +6154,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("center-accept-user-export")]
-        public async Task<FileStreamResult> OrderCenterAcceptUserExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderCenterAcceptUserExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
         {
             var query = _orderApplication.OrderCenterAcceptUser(dto.QueryDto);
 
@@ -6129,7 +6197,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("center-accept-hour-export")]
-        public async Task<FileStreamResult> OrderCenterAcceptHourExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderCenterAcceptHourExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
         {
             var query = _orderRepository.OrderCenterAcceptHour(dto.QueryDto);
 
@@ -6196,7 +6265,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order-data-inventory-export")]
-        public async Task<FileStreamResult> OrderDataInventoryExport([FromBody] ExportExcelDto<OrderDataInventoryReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderDataInventoryExport([FromBody] ExportExcelDto<OrderDataInventoryReq> dto)
         {
             var query = _orderRepository.OrderDataInventory(dto.QueryDto);
 
@@ -6267,7 +6337,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("ordervisit-jude-statistics-export")]
-        public async Task<FileStreamResult> OrderVisitJudeStatisticsExport([FromBody] ExportExcelDto<OrderVisitJudeStatisticsReq> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderVisitJudeStatisticsExport([FromBody] ExportExcelDto<OrderVisitJudeStatisticsReq> dto)
         {
             var query = _orderApplication.OrderVisitJudeStatistics(dto.QueryDto);
             List<OrderVisitJudeStatisticsRep> exportList;
@@ -6302,7 +6373,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("query_order_ts_details_list/export")]
-        public async Task<FileStreamResult> ExportQueryOrderTsDetailsList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryOrderTsDetailsList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.QueryOrderTsDetailsList(dto.QueryDto);
 
@@ -6373,7 +6445,8 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("query_knowledge_quote_list/export")]
-        public async Task<FileStreamResult> ExportQueryKnowledgeQuoteList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportQueryKnowledgeQuoteList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.QueryKnowledgeQuoteList(dto.QueryDto);
 
@@ -6452,7 +6525,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("extended_sendback_statistics/_export")]
-        public async Task<FileStreamResult> ExtendedSendBackStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExtendedSendBackStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.ExtendedSendBackStatistics(dto.QueryDto);
             List<ExtendedSendBackVo> data;
@@ -6499,7 +6573,8 @@ namespace Hotline.Api.Controllers.Bi
         /// </summary>
         /// <returns></returns>
         [HttpPost("extended_sendback_detail/_export")]
-        public async Task<FileStreamResult> ExtendedSendBackDetailExport([FromBody] ExportExcelDto<ExtendedSendBackRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExtendedSendBackDetailExport([FromBody] ExportExcelDto<ExtendedSendBackRequest> dto)
         {
             var query = _orderApplication.ExtendedSendBackDetail(dto.QueryDto);
             List<OrderSendBackAudit> data;
@@ -6617,6 +6692,7 @@ namespace Hotline.Api.Controllers.Bi
 		/// </summary>
 		/// <returns></returns>
 		[HttpPost("org_sendback_statistics/_export")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<FileStreamResult> OrgSendBackAuditStatisticsExport([FromBody] ExportExcelDto<OrgSendBackAuditListDto> dto)
 		{
 			var query = _orderApplication.OrgSendBackAuditList(dto.QueryDto);
@@ -6661,6 +6737,7 @@ namespace Hotline.Api.Controllers.Bi
 		/// </summary>
 		/// <returns></returns>
 		[HttpPost("org_sendback_detail/_export")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<FileStreamResult> OrgSendBackDetailExport([FromBody] ExportExcelDto<OrgSendBackAuditListDto> dto)
 		{
 			var query = _orderApplication.OrgSendBackAuditDetail(dto.QueryDto);

+ 3 - 0
src/Hotline.Api/Controllers/Bi/BiQualityController.cs

@@ -17,6 +17,7 @@ using XF.Utility.EnumExtensions;
 using Hotline.Caching.Interfaces;
 using Hotline.Users;
 using XF.Domain.Repository;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -63,6 +64,7 @@ namespace Hotline.Api.Controllers.Bi
 		/// <param name="dto"></param>
 		/// <returns></returns>
 		[HttpPost("seats_quality_analyse/export")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<FileStreamResult> SeatsQualityAnalyseExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
 		{
 			var query = _qualityApplication.SeatsQualityAnalyse(dto.QueryDto, HttpContext.RequestAborted);
@@ -114,6 +116,7 @@ namespace Hotline.Api.Controllers.Bi
 		/// <param name="dto"></param>
 		/// <returns></returns>
 		[HttpPost("quality_order_overview/export")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<FileStreamResult> QualityOrderOverviewExport([FromBody] ExportExcelDto<QualityWorkAnalysisRequest> dto)
 		{
 			var allOrderNum = await _qualityRepository.Queryable().Where(x => x.Source == EQualitySource.Accepted && x.QualityTime >= dto.QueryDto.StartTime && x.QualityTime <= dto.QueryDto.EndTime && x.State == EQualityState.End).CountAsync();

+ 41 - 6
src/Hotline.Api/Controllers/CallController.cs

@@ -24,6 +24,9 @@ using MapsterMapper;
 using SqlSugar;
 using Hotline.Api.Filter;
 using Microsoft.AspNetCore.Authorization;
+using Hotline.Share.Dtos.Order;
+using Hotline.Tools;
+using XF.Domain.Authentications;
 
 namespace Hotline.Api.Controllers
 {
@@ -138,12 +141,44 @@ namespace Hotline.Api.Controllers
         public async Task<int> QueryCallsFixedCount([FromQuery] QueryCallsFixedDto dto)
             => await _callApplication.QueryCallsFixedAsync(dto, HttpContext.RequestAborted).CountAsync(HttpContext.RequestAborted);
 
-        /// <summary>
-        /// 查询通话记录
-        /// </summary>
-        /// <param name="callId"></param>
-        /// <returns></returns>
-        [HttpGet("{callId}")]
+		/// <summary>
+		/// 导出通话记录
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpPost("calls-fixed/export")]
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportOrders([FromBody] ExportExcelDto<QueryCallsFixedDto> dto)
+		{
+			var query = _callApplication.QueryCallsFixedAsync(dto.QueryDto, HttpContext.RequestAborted);
+			List<CallNativeDto> callls;
+			if (dto.IsExportAll)
+			{
+				callls = await query.ToListAsync(HttpContext.RequestAborted);
+			}
+			else
+			{
+				var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+				callls = items;
+			}
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<CallNativeDto>(dto.ColumnInfos);
+
+			var dtos = callls
+				.Select(stu => _mapper.Map(stu, typeof(CallNativeDto), dynamicClass))
+				.Cast<object>()
+				.ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "通话记录");
+		}
+
+		/// <summary>
+		/// 查询通话记录
+		/// </summary>
+		/// <param name="callId"></param>
+		/// <returns></returns>
+		[HttpGet("{callId}")]
         public Task<List<CallNative>> GetCall(string callId)
         {
             //为兼容天润通话记录返回集合

+ 3 - 1
src/Hotline.Api/Controllers/CaseController.cs

@@ -16,6 +16,7 @@ using Hotline.Share.Enums.Article;
 using XF.Utility.EnumExtensions;
 using Hotline.Share.Dtos.Order;
 using Hotline.Application.ExportExcel;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers
 {
@@ -462,7 +463,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("list/info/export")]
-        public async Task<IActionResult> CaseInfoExport([FromBody] CaseInfoExportDto dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<IActionResult> CaseInfoExport([FromBody] CaseInfoExportDto dto)
         {
             if (dto.Ids.Length > 1)
             {

+ 3 - 1
src/Hotline.Api/Controllers/ContingencyManagementController.cs

@@ -1,4 +1,5 @@
 using DotNetCore.CAP;
+using Hotline.Api.Filter;
 using Hotline.ContingencyManagement;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Share.Dtos;
@@ -69,7 +70,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getlist_export")]
-        public async Task<FileStreamResult> GetListExport([FromBody] ExportExcelDto<ContingencyManagementPagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetListExport([FromBody] ExportExcelDto<ContingencyManagementPagedKeywordRequest> dto)
         {
             var query = _contingencyManagementOrdersRepository.Queryable()
                 .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Title), p => p.ArrangeTitle.Contains(dto.QueryDto.Title))

+ 3 - 1
src/Hotline.Api/Controllers/EnterpriseLuzhouController.cs

@@ -13,6 +13,7 @@ using Hotline.Repository.SqlSugar.Extensions;
 using MapsterMapper;
 using Microsoft.Extensions.Options;
 using XF.Domain.Repository;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers
 {
@@ -120,7 +121,8 @@ namespace Hotline.Api.Controllers
         /// 导出企业专员工单
         /// </summary>
         [HttpPost("specialist/orders/export")]
-        public async Task<FileStreamResult> ExportOrders([FromBody] ExportExcelDto<QueryOrderDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportOrders([FromBody] ExportExcelDto<QueryOrderDto> dto)
         {
             var query = await _enterpriseApplication.QueryEnterpriseSpecialistOrdersAsync(dto.QueryDto, HttpContext.RequestAborted);
             List<Order> orders;

+ 5 - 2
src/Hotline.Api/Controllers/ExportWordController.cs

@@ -1,4 +1,5 @@
-using Hotline.Application.ExportWord;
+using Hotline.Api.Filter;
+using Hotline.Application.ExportWord;
 using Hotline.Caching.Interfaces;
 using Hotline.Configurations;
 using Hotline.Orders;
@@ -56,7 +57,8 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpPost("order_submission_form")]
-        public async Task<IActionResult> OrderSubmissionForm([FromBody] List<string> Ids)
+		[LogFilterAlpha("导出日志")]
+		public async Task<IActionResult> OrderSubmissionForm([FromBody] List<string> Ids)
         {
             var streams = new Dictionary<string, Stream>();
             var path = $"{Directory.GetCurrentDirectory()}/Template/AssignmentForm.doc";
@@ -136,6 +138,7 @@ namespace Hotline.Api.Controllers
         /// <param name="Ids"></param>
         /// <returns></returns>
 		[HttpPost("quality_certificate")]
+		[LogFilterAlpha("导出日志")]
 		public async Task<IActionResult> QualityCertificate([FromBody] List<string> Ids) {
 
 			var streams = new Dictionary<string, Stream>();

+ 3 - 1
src/Hotline.Api/Controllers/FileController.cs

@@ -16,6 +16,7 @@ using Hotline.Share.Requests;
 using SqlSugar;
 using Hotline.Tools;
 using Hotline.Share.Dtos.Order;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers
 {
@@ -247,7 +248,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getaudiofileslist/export")]
-        public async Task<FileStreamResult> ExportGetAudioFilesList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> ExportGetAudioFilesList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _uploadAudioFilesRepository.Queryable()
                 .Where(p => p.CreationTime >= dto.QueryDto.StartTime && p.CreationTime <= dto.QueryDto.EndTime)

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

@@ -1,4 +1,5 @@
-using Hotline.Application.ExportExcel;
+using Hotline.Api.Filter;
+using Hotline.Application.ExportExcel;
 using Hotline.Caching.Interfaces;
 using Hotline.FlowEngine;
 using Hotline.Repository.SqlSugar.Extensions;
@@ -139,7 +140,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("event/tree/export")]
-        public async Task<FileStreamResult> GetEventAllTreeExport([FromBody]ExportExcelDto<string> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetEventAllTreeExport([FromBody]ExportExcelDto<string> dto)
         {
             var items = await _eventCategoryRepository.Queryable()
                 .OrderBy(d => d.OrderBy)

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

@@ -708,7 +708,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("calls/call-list/export")]
-        public async Task<FileStreamResult> GetCallListExport([FromBody] ExportExcelDto<GetCallListDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetCallListExport([FromBody] ExportExcelDto<GetCallListDto> dto)
         {
             var query = _callRecordRepository.GetCallList(dto.QueryDto);
             List<TrCallRecord> data;

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

@@ -205,7 +205,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getindustrialmanagementlist_export")]
-        public async Task<FileStreamResult> GetIndustrialManagementListExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetIndustrialManagementListExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _industryClassificationApplication.GetIndustrialManagementList(dto.QueryDto);
 
@@ -248,7 +249,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("industrial-orders-export")]
-        public async Task<FileStreamResult> GetIndustrialManagementOrderListExport([FromBody] ExportExcelDto<IndustrialManagementRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetIndustrialManagementOrderListExport([FromBody] ExportExcelDto<IndustrialManagementRequestDto> dto)
         {
             var query = _industryClassificationApplication.GetIndustrialManagementOrderList(dto.QueryDto);
 

+ 18 - 9
src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs

@@ -305,7 +305,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getownorderlist_export")]
-        public async Task<FileStreamResult> GetOwnOrderListExport([FromBody] ExportExcelDto<QueryEnforcementOrderNewDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetOwnOrderListExport([FromBody] ExportExcelDto<QueryEnforcementOrderNewDto> dto)
         {
             var query = _enforcementApplication.GetOwnOrderList(dto.QueryDto);
             List<JudicialManagementOrders> data;
@@ -360,7 +361,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getorderlist_export")]
-        public async Task<FileStreamResult> GetOrderListExport([FromBody] ExportExcelDto<QueryEnforcementOrderNewDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetOrderListExport([FromBody] ExportExcelDto<QueryEnforcementOrderNewDto> dto)
         {
             var query = _enforcementApplication.GetOrderList(dto.QueryDto);
             List<JudicialManagementOrders> data;
@@ -611,7 +613,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("event_classification_statistics_order_list_export")]
-        public async Task<FileStreamResult> GetEventClassificationStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryEventClassificationStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetEventClassificationStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryEventClassificationStatisticsDto> dto)
         {
             var query = _enforcementApplication.GetEventClassificationStatisticsOrderListAsync(dto.QueryDto);
             List<JudicialManagementOrders> data;
@@ -657,7 +660,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("enforcement_departmental_processing_statistics_export")]
-        public async Task<FileStreamResult> GetDepartmentalProcessingStatisticsExportAsync([FromBody] ExportExcelDto<QueryDepartmentalProcessingStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetDepartmentalProcessingStatisticsExportAsync([FromBody] ExportExcelDto<QueryDepartmentalProcessingStatisticsDto> dto)
         {
             var list = await _enforcementApplication.GetDepartmentalProcessingStatisticsAsync(dto.QueryDto.StartTime, dto.QueryDto.EndTime).ToListAsync();
 
@@ -701,7 +705,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("enforcement_departmental_processing_statistics_order_list_export")]
-        public async Task<FileStreamResult> GetDepartmentalProcessingStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryDepartmentalProcessingStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetDepartmentalProcessingStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryDepartmentalProcessingStatisticsDto> dto)
         {
             var query = _enforcementApplication.GetDepartmentalProcessingStatisticsOrderListAsync(dto.QueryDto);
             List<EnforcementOrderListDto> data;
@@ -742,7 +747,8 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpPost("regional_classification_statistics_export")]
-        public async Task<FileStreamResult> GetRegionalClassificationStatisticsExportAsync([FromBody] ExportExcelDto<QueryRegionalClassificationStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetRegionalClassificationStatisticsExportAsync([FromBody] ExportExcelDto<QueryRegionalClassificationStatisticsDto> dto)
         {
             var list = await _enforcementApplication.GetRegionalClassificationStatisticsAsync(dto.QueryDto.StartTime, dto.QueryDto.EndTime).ToListAsync();
 
@@ -784,7 +790,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("regional_classification_statistics_order_list_export")]
-        public async Task<FileStreamResult> GetRegionalClassificationStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryRegionalClassificationStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetRegionalClassificationStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryRegionalClassificationStatisticsDto> dto)
         {
             var query = _enforcementApplication.GetRegionalClassificationStatisticsOrderListAsync(dto.QueryDto);
             List<JudicialManagementOrders> data;
@@ -844,7 +851,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("enforcement_visit_org_satisfaction_statistics_export")]
-        public async Task<object> GetVisitAndOrgSatisfactionStatisticsExportAsync([FromBody] ExportExcelDto<QueryOrgSatisfactionStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<object> GetVisitAndOrgSatisfactionStatisticsExportAsync([FromBody] ExportExcelDto<QueryOrgSatisfactionStatisticsDto> dto)
         {
             var list = await _enforcementApplication.GetVisitAndOrgSatisfactionStatisticsAsync(dto.QueryDto.StartTime, dto.QueryDto.EndTime, dto.QueryDto.TypeId).ToListAsync();
 
@@ -890,7 +898,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("enforcement_visit_org_satisfaction_statistics_order_list_export")]
-        public async Task<FileStreamResult> GetVisitAndOrgSatisfactionStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryOrgSatisfactionStatisticsDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetVisitAndOrgSatisfactionStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryOrgSatisfactionStatisticsDto> dto)
         {
             var query = _enforcementApplication.GetVisitAndOrgSatisfactionStatisticsOrderListAsync(dto.QueryDto);
             List<EnforcementOrgSatisfactionOrderListDto> data;

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

@@ -752,7 +752,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("info/export")]
-        public async Task<IActionResult> KnowledgeInfoExport([FromBody] KnowledgeInfoExportInDto dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<IActionResult> KnowledgeInfoExport([FromBody] KnowledgeInfoExportInDto dto)
         {
             if (dto.Ids.Length > 1)
             {
@@ -1837,7 +1838,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("pageview/export")]
-        public async Task<FileStreamResult> GetPageViewListAsync([FromBody] ExportExcelDto<PageViewInDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetPageViewListAsync([FromBody] ExportExcelDto<PageViewInDto> dto)
         {
             var items = (await _knowApplication.GetPageViewListAsync(dto.QueryDto, HttpContext.RequestAborted))
                 .Item2;

File diff ditekan karena terlalu besar
+ 315 - 104
src/Hotline.Api/Controllers/OrderController.cs


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

@@ -159,7 +159,7 @@ namespace Hotline.Api.Controllers
 
 			var isNoPass = await _orderTerminateRepository.AnyAsync(x => x.Status ==  ETerminateStatus.Refuse && x.OrderId == dto.Data.OrderId);
 			if (isNoPass)
-				throw UserFriendlyException.SameMessage("该工单已被拒绝过甄别申请,不能再次申请");
+				throw UserFriendlyException.SameMessage("该工单已被拒绝过终止申请,不能再次申请");
 
 			var model = _mapper.Map<OrderTerminate>(dto.Data);
 			model.Status = ETerminateStatus.Approval ;

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

@@ -72,7 +72,8 @@ namespace Hotline.Api.Controllers
         }
 
         [HttpPost("getorgjsonforuser/export")]
-        [AllowAnonymous]
+		[LogFilterAlpha("导出日志")]
+		[AllowAnonymous]
         public async Task<FileStreamResult> GetOrgJsonItemsExport([FromBody] ExportExcelDto<string> dto)
         {
             var items = await _orgApplication.GetOrgJsonItems();

+ 3 - 1
src/Hotline.Api/Controllers/PlanController.cs

@@ -16,6 +16,7 @@ using Hotline.Share.Enums.Article;
 using XF.Utility.EnumExtensions;
 using Hotline.Share.Dtos.Order;
 using Hotline.Application.ExportExcel;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers
 {
@@ -433,7 +434,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("list/info/export")]
-        public async Task<IActionResult> PlanInfoExport([FromBody] PlanInfoExportDto dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<IActionResult> PlanInfoExport([FromBody] PlanInfoExportDto dto)
         {
             if (dto.Ids.Length > 1)
             {

+ 7 - 3
src/Hotline.Api/Controllers/StatisticalReportController.cs

@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc;
 using SqlSugar;
 using XF.Domain.Authentications;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Api.Filter;
 
 namespace Hotline.Api.Controllers
 {
@@ -49,7 +50,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getseatreturnorderlist_export")]
-        public async Task<FileStreamResult> GetSeatReturnOrderListExport([FromBody] ExportExcelDto<SeatReturnOrderListRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetSeatReturnOrderListExport([FromBody] ExportExcelDto<SeatReturnOrderListRequestDto> dto)
         {
             var query = _orderReportApplication.GetSeatReturnOrderList(dto.QueryDto);
 
@@ -97,7 +99,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getcenterreturnorderlist_export")]
-        public async Task<FileStreamResult> GetCenterReturnOrderListExport([FromBody] ExportExcelDto<SeatReturnOrderListRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetCenterReturnOrderListExport([FromBody] ExportExcelDto<SeatReturnOrderListRequestDto> dto)
         {
             var query = _orderReportApplication.GetCenterReturnOrderList(dto.QueryDto);
 
@@ -141,7 +144,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("order_delay_statisical_list_export")]
-        public async Task<FileStreamResult> OrderDelayStatisicalListExport([FromBody] ExportExcelDto<OrderDelayStatisicalRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> OrderDelayStatisicalListExport([FromBody] ExportExcelDto<OrderDelayStatisicalRequestDto> dto)
         {
             var query = _orderReportApplication.OrderDelayStatisicalList(dto.QueryDto);
 

+ 9 - 5
src/Hotline.Api/Controllers/SysController.cs

@@ -45,6 +45,7 @@ namespace Hotline.Api.Controllers
     public class SysController : BaseController
     {
         private readonly IMapper _mapper;
+        private readonly IHybridCachingProvider _hybridCaching;
         private readonly IRepository<SystemSetting> _systemSettingsRepository;
         private readonly ISystemMenuRepository _systemMenuRepository;
         private readonly IRepository<SystemDicType> _sysDicTypeRepository;
@@ -100,7 +101,8 @@ namespace Hotline.Api.Controllers
 ,
             IOptionsSnapshot<AppConfiguration> appOptions,
             ISystemLogApplication systemLogApplication,
-            IExportApplication exportApplication)
+            IExportApplication exportApplication,
+            IHybridCachingProvider hybridCaching)
         {
             _mapper = mapper;
             _systemSettingsRepository = systemSettingsRepository;
@@ -121,6 +123,7 @@ namespace Hotline.Api.Controllers
             _appOptions = appOptions;
             _systemLogApplication = systemLogApplication;
             _exportApplication = exportApplication;
+            _hybridCaching = hybridCaching;
         }
 
         #region 菜单管理
@@ -307,7 +310,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("dictdata-type/export")]
-        public async Task<FileStreamResult> GetSysDicDataExport([FromBody]ExportExcelDto<GetSysDicDataDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetSysDicDataExport([FromBody]ExportExcelDto<GetSysDicDataDto> dto)
         {
             var items = await _sysDicDataRepository.Queryable().Where(x => x.DicTypeId == dto.QueryDto.typeid).OrderBy(x => x.Sort).ToTreeAsync(x => x.Children, x => x.ParentId, "");
             return _exportApplication.GetExcelFile(dto, items, "字典列表");
@@ -418,7 +422,8 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpPost("area/tree/export")]
-        public async Task<FileStreamResult> GetAreaTreeExport([FromBody]ExportExcelDto<string> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetAreaTreeExport([FromBody]ExportExcelDto<string> dto)
         {
             var items = await _systemAreaDomainService.GetAreaTree(_appOptions.Value.IsZiGong ? 6 : 0);
             return _exportApplication.GetExcelFile(dto, items, "行政区域");
@@ -668,8 +673,7 @@ namespace Hotline.Api.Controllers
         {
             foreach (var key in dto.Keys)
             {
-                await _easyCaching.RemoveAsync(key, HttpContext.RequestAborted);
-                await _redisCaching.KeyDelAsync(key);
+                await _hybridCaching.RemoveAsync(key, HttpContext.RequestAborted);
             }
             return Ok();
         }

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

@@ -1,4 +1,5 @@
-using Hotline.Application.CallCenter;
+using Hotline.Api.Filter;
+using Hotline.Application.CallCenter;
 using Hotline.Article;
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Tels;
@@ -263,7 +264,8 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("get_restapply_list_export")]
-        public async Task<FileStreamResult> GetRestApplyListExport([FromBody] ExportExcelDto<TelRestApplyRequestDto> dto)
+		[LogFilterAlpha("导出日志")]
+		public async Task<FileStreamResult> GetRestApplyListExport([FromBody] ExportExcelDto<TelRestApplyRequestDto> dto)
         {
             var query = _pbxApplication.GetRestApplyList(dto.QueryDto);
 

+ 6 - 1
src/Hotline.Api/Controllers/TestController.cs

@@ -1506,7 +1506,7 @@ public class TestController : BaseController
     public async Task OrderPushTypeCode([FromBody] OrderPushTypeCodeDto dto)
     {
         var orders = await _orderRepository.Queryable()
-            .Where(d => d.PushTypeCode.Contains(dto.PushTypeCode))
+            .Where(d => d.PushTypeCode.Contains(dto.PushTypeCode) && d.Source == ESource.Hotline)
             .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime) //受理时间开始
             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime) //受理时间结束
             .ToListAsync(HttpContext.RequestAborted);
@@ -1537,5 +1537,10 @@ public class TestController : BaseController
 
         return ipv4;
     }
+
+    //public string DecryptSign(string sign)
+    //{
+    //    return sign;
+    //}
 }
 

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

@@ -193,7 +193,8 @@ public class UserController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("paged/_export")]
-    public async Task<FileStreamResult> QueryPagedExport([FromBody] ExportExcelDto<UserPagedDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> QueryPagedExport([FromBody] ExportExcelDto<UserPagedDto> dto)
     {
         var query =  _userApplication.QueryPaged(dto.QueryDto);
         List<User> data;

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

@@ -588,7 +588,8 @@ public class WorkflowController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("order-countersign/_export")]
-    public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<QueryOrderCountersignDto> dto)
+	[LogFilterAlpha("导出日志")]
+	public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<QueryOrderCountersignDto> dto)
     {
         var query = _workflowApplication.QueryOrderCountersigns(dto.QueryDto, _sessionContext)
              .Select((c, w, o) => new WorkflowCountersign()

TEMPAT SAMPAH
src/Hotline.Api/Documents/luzhou/泸州12345平台工单查询接口(V1.0-20250312) .docx


TEMPAT SAMPAH
src/Hotline.Api/Documents/zigong/丰窝12345平台工单接入接口(V1.1-20250225) .docx


+ 62 - 0
src/Hotline.Api/Filter/UserNameSessionContextFilter.cs

@@ -0,0 +1,62 @@
+using Hotline.Identity.Accounts;
+using Hotline.Settings;
+using Hotline.Share.Dtos.CallCenter;
+using Hotline.Share.Tools;
+using Hotline.Users;
+using IdentityModel;
+using Microsoft.AspNetCore.Mvc.Filters;
+using System.Security.Claims;
+using XF.Domain.Authentications;
+using XF.Domain.Repository;
+using static Hotline.AppDefaults;
+
+namespace Hotline.Api.Filter;
+
+public class UserNameSessionContextFilter : ActionFilterAttribute
+{
+    private IAccountRepository _accountRepository;
+    private IRepository<User> _userRepository;
+    private readonly string Name;  
+
+    public UserNameSessionContextFilter(string name)
+    {
+        Name = name;
+    }
+
+    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+    {
+        await ReloadUser(context);
+        await next();
+    }
+
+    private async Task ReloadUser(ActionExecutingContext context)
+    {
+        try
+        {
+            _accountRepository = context.HttpContext.RequestServices.GetRequiredService<IAccountRepository>();
+            _userRepository = context.HttpContext.RequestServices.GetRequiredService<IRepository<User>>();
+            var user = _userRepository.Queryable().Where(m => m.Name == Name).First();
+            if (user == null) return;
+            var account = await _accountRepository.GetExtAsync(m => m.Id == user.Id, m => m.Includes(x => x.Roles));
+
+            List<Claim> userClaims = [
+                new(JwtClaimTypes.Subject, account.Id),
+                new(JwtClaimTypes.PhoneNumber, account.PhoneNo ?? string.Empty),
+                new(ClaimTypes.NameIdentifier, user.Id),
+                new(AppClaimTypes.UserDisplayName, account.Name),
+                new(AppClaimTypes.DepartmentId, user.OrgId ?? string.Empty),
+                new(AppClaimTypes.DepartmentIsCenter, user.Organization?.IsCenter.ToString() ?? string.Empty),
+                new(AppClaimTypes.DepartmentName, user.Organization?.Name ?? string.Empty),
+                new(AppClaimTypes.DepartmentAreaCode, user.Organization?.AreaCode ?? string.Empty),
+                new(AppClaimTypes.DepartmentAreaName, user.Organization?.AreaName ?? string.Empty),
+                new(AppClaimTypes.DepartmentLevel, user.Organization?.Level.ToString() ?? string.Empty),
+                new(AppClaimTypes.AreaId, user.OrgId?.GetHigherOrgId() ?? string.Empty),
+            ];
+            userClaims.AddRange(account.Roles.Select(d => new Claim(JwtClaimTypes.Role, d.Name)));
+            context.HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity(userClaims));
+        }
+        catch
+        {
+        }
+    }
+}

+ 2 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -39,6 +39,7 @@ using Hotline.Pdf;
 using Hotline.XingTang;
 using Hotline.ThirdAccountDomainServices.Interfaces;
 using Hotline.Snapshot.IRepository;
+using Hotline.Validators;
 
 
 namespace Hotline.Api;
@@ -195,7 +196,7 @@ internal static class StartupExtensions
         {
             config.DisableDataAnnotationsValidation = true;
         })
-            .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
+            .AddValidatorsFromAssembly(typeof(ValidatorExtensions).Assembly);
 
         //mq
         services.AddMq(configuration);

+ 3 - 14
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -341,6 +341,7 @@ public abstract class DefaultCallApplication : ICallApplication
             .WhereIF(!string.IsNullOrEmpty(dto.ToNo), d => d.ToNo.Contains(dto.ToNo!))
             .WhereIF(!string.IsNullOrEmpty(dto.UserName), d => d.UserName == dto.UserName)
             .WhereIF(!string.IsNullOrEmpty(dto.TelNo), d => d.TelNo == dto.TelNo)
+            .WhereIF(!string.IsNullOrEmpty(dto.CallNo), d => d.CallNo.Contains(dto.CallNo))
             .WhereIF(dto.EndBy != null, d => d.EndBy == dto.EndBy)
             .WhereIF(dto.CallStartTimeStart != null, d => d.BeginIvrTime >= dto.CallStartTimeStart)
             .WhereIF(dto.CallStartTimeEnd != null, d => d.BeginIvrTime <= dto.CallStartTimeEnd)
@@ -381,18 +382,6 @@ public abstract class DefaultCallApplication : ICallApplication
                 Title = o.Title,
                 IsVisit = !SqlFunc.IsNullOrEmpty(v.Id),
                 IsOrder = !SqlFunc.IsNullOrEmpty(o.Id),
-                StaffNo = SqlFunc.Coalesce(
-                    SqlFunc.IIF(d.StaffNo == "0", null, d.StaffNo),
-                    SqlFunc.Subqueryable<CallNative>()
-                        .Where(m => m.CallNo == d.CallNo && m.StaffNo != "0")
-                        .Max(m => m.StaffNo)
-                    ),
-                TelNo = SqlFunc.Coalesce(
-                    SqlFunc.IIF(d.TelNo == "0", null, d.TelNo),
-                    SqlFunc.Subqueryable<CallNative>()
-                        .Where(m => m.CallNo == d.CallNo && m.TelNo != "0")
-                        .Max(m => m.TelNo)
-                    ),
             }, true)
                 .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), d => d.StaffNo == dto.StaffNo);
         }
@@ -415,8 +404,8 @@ public abstract class DefaultCallApplication : ICallApplication
     {
         return _telOperationRepository.Queryable()
             .Where(m => m.OperateStateText != "未知")
-            .WhereIF(!string.IsNullOrEmpty(dto.UserName), d => d.UserName == dto.UserName)
-            .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), d => d.StaffNo == dto.StaffNo)
+            .WhereIF(!string.IsNullOrEmpty(dto.UserName), d => d.UserName.Contains(dto.UserName))
+            .WhereIF(!string.IsNullOrEmpty(dto.StaffNo), d => d.StaffNo.Contains(dto.StaffNo))
             .WhereIF(!string.IsNullOrEmpty(dto.GroupId), d => d.GroupId == dto.GroupId)
             .WhereIF(dto.TelNo != null, d => d.TelNo.Contains(dto.TelNo))
             .WhereIF(dto.OperateState != null, d => d.OperateState == dto.OperateState)

+ 1 - 0
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -90,6 +90,7 @@ namespace Hotline.Application.FlowEngine
         /// 查询指定节点的下一步待选节点
         /// </summary>
         Task<NextStepsWithOpinionDto<NextStepOption>> GetNextStepsAsync(string workflowId, string stepId, CancellationToken cancellationToken);
+        Task<NextStepsWithOpinionDto<NextStepOption>> GetNextStepsAsync(Workflow workflow, CancellationToken cancellationToken);
 
         /// <summary>
         /// 跨级指派查询下一步可选节点及办理对象参数

+ 14 - 2
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -203,7 +203,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         CancellationToken cancellationToken = default)
     {
         var validator = new StartWorkflowDtoValidator();
-        var validResult = await validator.ValidateAsync(dto, cancellationToken);
+        var validResult = validator.Validate(dto);
         if (!validResult.IsValid)
             throw new UserFriendlyException(
                 $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
@@ -550,6 +550,17 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
         return await GetNextStepsAsync(workflow, currentStep, cancellationToken);
     }
+    
+    public async Task<NextStepsWithOpinionDto<NextStepOption>> GetNextStepsAsync(Workflow workflow, CancellationToken cancellationToken)
+    {
+        var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow,
+            _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId,
+            _sessionContext.Roles);
+        if (currentStep.StepType is EStepType.End)
+            throw new UserFriendlyException("结束节点无需办理");
+
+        return await GetNextStepsAsync(workflow, currentStep, cancellationToken);
+    }
 
     /// <summary>
     /// 跨级指派查询下一步可选节点及办理对象参数
@@ -633,13 +644,14 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             CurrentHandlerType = currentStep.HandlerType,
             CurrentTag = currentStep.Tag ?? string.Empty,
             CurrentIsCountersignEndStep = currentStep.IsCountersignEndStep,
+            CurrentIsTopCountersignEndStep = currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId),
             TimeTypeOptions = EnumExts.GetDescriptions<ETimeType>().ToList(),
             IsMainHandlerShow = workflow.WorkflowDefinition.IsMainHandlerShow,
             StepId = currentStep.Id,
             CurrentOrgLevel = string.IsNullOrEmpty(currentStep.HandlerOrgId) ? null : currentStep.HandlerOrgId.CalcOrgLevel(),
             Opinion = currentStep.Opinion,
         };
-
+        
         var currentStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, currentStep.Code);
 
         if (currentStep.InstanceMode is EInstanceMode.Dynamic &&

+ 1 - 0
src/Hotline.Application/Handlers/FlowEngine/CancelHandler.cs

@@ -32,6 +32,7 @@ public class CancelHandler : INotificationHandler<CancelWorkflowNotify>
         switch (workflow.ModuleCode)
         {
             case WorkflowModuleConsts.OrderHandle:
+            case WorkflowModuleConsts.OrderHandleSnapshot:
                 var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, cancellationToken: cancellationToken);
                 order.CheckIfFiled();
                 order.Cancel();

+ 16 - 15
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -122,6 +122,7 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                     await _telDomainService.TelRestApplyPassAsync(workflow.ExternalId, cancellationToken);
                     break;
                 case WorkflowModuleConsts.OrderHandle:
+                case WorkflowModuleConsts.OrderHandleSnapshot:
                     var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId,
                         withExtension: true, cancellationToken: cancellationToken);
                     //order.CheckIfFiled();
@@ -315,21 +316,21 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                     // await _enforcementApplication.AddPassTheBuckOrderAsync(order, _sessionContext.OrgId, _sessionContext.OrgName, cancellationToken);
                     break;
                 case WorkflowModuleConsts.OrderDelay:
-                    var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
-                    if (delay != null)
-                    {
-                        //delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
-                        delay.DelayState = isReviewPass ? EDelayState.Pass : EDelayState.NoPass;
-                        await _orderDelayRepository.Updateable(delay)
-                            .UpdateColumns(d => d.DelayState)
-                            .ExecuteCommandAsync(cancellationToken);
-                        if (isReviewPass)
-                        {
-                            //处理工单延期
-                            await _orderApplication.DelayOrderExpiredTimeAsync(delay.OrderId, delay.DelayNum,
-                                delay.DelayUnit, delay.IsProDelay, cancellationToken);
-                        }
-                    }
+                    // var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
+                    // if (delay != null)
+                    // {
+                    //     //delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
+                    //     delay.DelayState = isReviewPass ? EDelayState.Pass : EDelayState.NoPass;
+                    //     await _orderDelayRepository.Updateable(delay)
+                    //         .UpdateColumns(d => d.DelayState)
+                    //         .ExecuteCommandAsync(cancellationToken);
+                    //     if (isReviewPass)
+                    //     {
+                    //         //处理工单延期
+                    //         await _orderApplication.DelayOrderExpiredTimeAsync(delay.OrderId, delay.DelayNum,
+                    //             delay.DelayUnit, delay.IsProDelay, cancellationToken);
+                    //     }
+                    // }
                     break;
                 case WorkflowModuleConsts.OrderTerminate:
                     var orderTerminate = await _orderTerminateRepository.Queryable()

+ 1 - 0
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -113,6 +113,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
             switch (workflow.ModuleCode)
             {
                 case WorkflowModuleConsts.OrderHandle:
+                case WorkflowModuleConsts.OrderHandleSnapshot:
                     var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true,
                         withAcceptor: true, withExtension: true, cancellationToken: cancellationToken);
                     order.CheckIfFiled();

+ 1 - 0
src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs

@@ -96,6 +96,7 @@ namespace Hotline.Application.Handlers.FlowEngine
                 switch (workflow.ModuleCode)
                 {
                     case WorkflowModuleConsts.OrderHandle:
+                    case WorkflowModuleConsts.OrderHandleSnapshot:
                         var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true, withAcceptor: true,
                             withExtension: true, cancellationToken: cancellationToken);
                         order.CheckIfFiled();

+ 1 - 0
src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs

@@ -96,6 +96,7 @@ namespace Hotline.Application.Handlers.FlowEngine
                 switch (workflow.ModuleCode)
                 {
                     case WorkflowModuleConsts.OrderHandle:
+                    case WorkflowModuleConsts.OrderHandleSnapshot:
                         var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true, withAcceptor: true,
                             withExtension: true, cancellationToken);
                         order.CheckIfFiled();

+ 5 - 1
src/Hotline.Application/OrderApp/Handlers/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs

@@ -84,7 +84,11 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                         if (screen.ScreenType == EOrderScreenType.Seat)
                         {
                             visitDetail.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
-                            await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
+                            if (_appOptions.Value.IsZiGong)
+                            {
+								visitDetail.VoiceEvaluate = EVoiceEvaluate.DefaultSatisfied;
+							}
+							await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
                         }
                         else
                         {

+ 116 - 19
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -48,6 +48,7 @@ using Hotline.Validators.FlowEngine;
 using Mapster;
 using MapsterMapper;
 using MediatR;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
 using Microsoft.Extensions.Options;
 using PanGu;
 using Quartz.Simpl;
@@ -1317,6 +1318,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (_appOptions.Value.IsYiBin && visit.VisitState == EVisitState.Visited)
             throw UserFriendlyException.SameMessage("已回访,不能重复回访");
 
+        bool exisNoSatisfiedSeat = false;
+        bool exisNoSatisfiedOrg = false;
+
         //记录修改历史
         try
         {
@@ -1333,6 +1337,35 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     await _orderVisitDetailCopyRepository.AddRangeAsync(visitDetailsCopy, cancellationToken);
                     visit.IsUpdate = true;
                 }
+
+                //#  再次回访处理之前的甄别记录
+                //## 若用户将语音评价结果修改为了满意,此时甄别类型为中心话务甄别的工单,需从甄别待审批中删除;部门办件甄别的工单需保留
+                if (visit.OrderVisitDetails != null && visit.OrderVisitDetails.Count > 0)
+                {
+                    // 坐席
+                    // 判断老数据是否是不满意
+                    var visitDataSeat = visit.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Seat).FirstOrDefault();
+                    if (visitDataSeat != null)
+                    {
+                        if (visitDataSeat.VoiceEvaluate == EVoiceEvaluate.NoSatisfied ||
+                            visitDataSeat.VoiceEvaluate == EVoiceEvaluate.VeryNoSatisfied)
+                        {
+                            exisNoSatisfiedSeat = true;
+                        }
+                    }
+
+                    // 部门
+                    // 判断老数据是否是不满意
+                    var visitDataOrg = visit.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).FirstOrDefault();
+                    if (visitDataOrg != null)
+                    {
+                        if (visitDataOrg.OrgProcessingResults?.Value == "不满意" ||
+                            visitDataOrg.OrgProcessingResults?.Value == "非常不满意")
+                        {
+                            exisNoSatisfiedOrg = true;
+                        }
+                    }
+                }
             }
         }
         catch (Exception)
@@ -1423,20 +1456,23 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 {
                     if (visit.Order.Source != ESource.ProvinceStraight)
                     {
-                        //发送查询短信
-                        var messageDto = new Share.Dtos.Push.MessageDto
+                        if (visit.Order.FileOrgIsCenter.Value == false || (visit.Order.FileOrgIsCenter.Value == true && visit.Order.CounterSignType != null))
                         {
-                            PushBusiness = EPushBusiness.SearchSms,
-                            ExternalId = visit.Id,
-                            OrderId = visit.Order.Id,
-                            PushPlatform = EPushPlatform.Sms,
-                            Remark = visit.Order.Title,
-                            Name = visit.Order.FromName,
-                            TemplateCode = "1021",
-                            Params = new List<string>() { visit.Order.No, visit.Order.Password },
-                            TelNumber = visit.Order.Contact,
-                        };
-                        await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                            //发送查询短信
+                            var messageDto = new Share.Dtos.Push.MessageDto
+                            {
+                                PushBusiness = EPushBusiness.SearchSms,
+                                ExternalId = visit.Id,
+                                OrderId = visit.Order.Id,
+                                PushPlatform = EPushPlatform.Sms,
+                                Remark = visit.Order.Title,
+                                Name = visit.Order.FromName,
+                                TemplateCode = "1021",
+                                Params = new List<string>() { visit.Order.No, visit.Order.Password },
+                                TelNumber = visit.Order.Contact,
+                            };
+                            await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                        }
                     }
                 }
             }
@@ -1478,6 +1514,56 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             }, cancellationToken: cancellationToken);
         }
 
+        try
+        {
+            if (_appOptions.Value.IsZiGong == true)
+            {
+                //#  再次回访处理之前的甄别记录
+                //## 若用户将语音评价结果修改为了满意,此时甄别类型为中心话务甄别的工单,需从甄别待审批中删除;部门办件甄别的工单需保留
+                if (dto.IsUpdate.HasValue && dto.IsUpdate == true)
+                {
+                    // 坐席
+                    // 判断老数据是否是不满意
+                    if (exisNoSatisfiedSeat)
+                    {
+                        // 判断更新数据是否是满意
+                        var visitData = dto.VisitDetails.Where(x => x.VisitTarget == EVisitTarget.Seat).FirstOrDefault();
+                        if (visitData != null)
+                        {
+                            if (visitData.VoiceEvaluate != EVoiceEvaluate.NoSatisfied &&
+                                visitData.VoiceEvaluate != EVoiceEvaluate.VeryNoSatisfied &&
+                                visitData.SeatEvaluate != ESeatEvaluate.NoSatisfied &&
+                                visitData.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied)
+                            {
+                                await _orderScreenRepository.RemoveAsync(x => x.VisitId == visitData.VisitId);
+                            }
+                        }
+                    }
+
+                    // 部门
+                    // 判断老数据是否是不满意
+                    if (exisNoSatisfiedOrg)
+                    {
+                        // 判断更新数据是否是满意
+                        var visitData = dto.VisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).FirstOrDefault();
+                        if (visitData != null)
+                        {
+                            if (visitData.OrgProcessingResults != null)
+                            {
+                                if (visitData.OrgProcessingResults.Value != "非常不满意" &&
+                                    visitData.OrgProcessingResults.Value != "不满意")
+                                {
+                                    await _orderScreenRepository.RemoveAsync(x => x.VisitId == visitData.VisitId);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        catch (Exception)
+        { }
+
         if (first != null)
         {
             //写入质检
@@ -3820,17 +3906,17 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     .Where((s, p) => p.DicDataValue == dto.OrderTagCode && d.OrderId == s.OrderId).Any()) //工单标签
             .WhereIF(dto.IsUpdate.HasValue && dto.IsUpdate == true, d => d.IsUpdate == true)
             .WhereIF(dto.IsUpdate.HasValue && dto.IsUpdate == false, d => d.IsUpdate == false || d.IsUpdate == null)
+
             .OrderByIF(_appOptions.Value.IsYiBin && dto.VisitStateQuery != EVisitStateQuery.Visited, d => d.Order.IsUrgent, OrderByType.Desc)
             .OrderByIF(_appOptions.Value.IsZiGong == false, d => d.PublishTime, OrderByType.Desc)
-            //.OrderByDescending(d => d.PublishTime)
             .OrderByIF(dto is { SortField: "publishTime", SortRule: 0 }, x => x.PublishTime, OrderByType.Asc) // 发布时间升序
             .OrderByIF(dto is { SortField: "publishTime", SortRule: 1 }, x => x.PublishTime, OrderByType.Desc)// 发布时间升序
             .OrderByIF(dto is { SortField: "order.creationTime", SortRule: 0 }, x => x.Order.CreationTime, OrderByType.Asc) // 受理时间升序
             .OrderByIF(dto is { SortField: "order.creationTime", SortRule: 1 }, x => x.Order.CreationTime, OrderByType.Desc) // 受理时间升序
             .OrderByIF(dto is { SortField: "order.filedTime", SortRule: 0 }, x => x.Order.FiledTime, OrderByType.Asc) // 办结时间升序
             .OrderByIF(dto is { SortField: "order.filedTime", SortRule: 1 }, x => x.Order.FiledTime, OrderByType.Desc) // 办结时间升序
-            .OrderByIF(dto is { SortField: "order.visitTime", SortRule: 0 }, x => x.VisitTime, OrderByType.Asc) // 回访时间升序
-            .OrderByIF(dto is { SortField: "order.visitTime", SortRule: 1 }, x => x.VisitTime, OrderByType.Desc) // 回访时间升序
+            .OrderByIF(dto is { SortField: "visitTime", SortRule: 0 }, x => x.VisitTime, OrderByType.Asc) // 回访时间升序
+            .OrderByIF(dto is { SortField: "visitTime", SortRule: 1 }, x => x.VisitTime, OrderByType.Desc) // 回访时间升序
             .OrderByIF(_appOptions.Value.IsZiGong && string.IsNullOrEmpty(dto.SortField), d => d.PublishTime, OrderByType.Desc)
             ;
         return query;
@@ -3996,7 +4082,6 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             OrgId = startStep.HandlerOrgId,
             OrgName = startStep.HandlerOrgName,
         };
-        //_sessionContext.ChangeSession(startStep.HandlerId);
         await _sessionContextManager.ChangeSessionContextByUserIdAsync(startStep.HandlerId, cancellationToken);
         var isAutoFillSummaryOpinion = _systemSettingCacheManager.IsAutoFillSummaryOpinion;
 
@@ -4517,7 +4602,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (order == null)
         {
             order = _mapper.Map<Order>(dto);
-            if (order.IsSecret == true)
+            if (order.IsSecret == true && _appOptions.Value.IsYiBin == false)
             {
                 order.FocusOnEventsName = "保密";
                 order.FocusOnEvents = "99";
@@ -5488,7 +5573,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 //如果查询全部
                 //1.1、热线中心用户看系统中所有已申请延期的工单(需排除取消延期的工单)和自动延期的工单
                 //1.2、部门用户看部门及其下级部门已申请延期的工单(需排除取消延期的工单)和部门办理中时自动延期的工单
-                .WhereIF(dto.DataScope is 0, d => (d.AutomaticDelayNum == 0 || d.AutomaticDelayNum == null) && d.DelayState != EDelayState.Withdraw)
+                // .WhereIF(dto.DataScope is 0, d => (d.AutomaticDelayNum == 0 || d.AutomaticDelayNum == null) && d.DelayState != EDelayState.Withdraw)
+                .WhereIF(dto.DataScope is 0, d => d.DelayState != EDelayState.Withdraw)
                 .WhereIF(dto.DataScope is 0 && !_sessionContext.OrgIsCenter, d => d.CreatorOrgId.StartsWith(_sessionContext.RequiredOrgId))
                 .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                     d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
@@ -5507,6 +5593,17 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName == dto.OrgLevelOneName) //一级部门
                 .WhereIF(dto.StartCreationTime.HasValue && dto.EndCreationTime.HasValue,
                     d => d.CreationTime >= dto.StartCreationTime && d.CreationTime <= dto.EndCreationTime) // 申请时间
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.Order.AcceptTypeCode == dto.AcceptType) //受理类型
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel)//来源渠道
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot))//热点名称
+                .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始
+                .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+                .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.Order.ExpiredTime >= dto.ExpiredTimeStart) //期满时间开始
+                .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.Order.ExpiredTime <= dto.ExpiredTimeEnd) //期满时间结束
+                .WhereIF(!string.IsNullOrEmpty(dto.DelayApplyName), d => d.EmployeeName.Contains(dto.DelayApplyName))//申请人
+                .WhereIF(!string.IsNullOrEmpty(dto.DelayApplyOrgName), d => d.ApplyOrgName.Contains(dto.DelayApplyOrgName))//申请部门
+                .WhereIF(dto.IsAutomaticDelay.HasValue && dto.IsAutomaticDelay == true, d => d.AutomaticDelayNum != null && d.AutomaticDelayNum > 0)//自动延期
+                .WhereIF(dto.IsAutomaticDelay.HasValue && dto.IsAutomaticDelay == false, d => d.AutomaticDelayNum == null || d.AutomaticDelayNum == 0)//非自动延期
                 .OrderByDescending(d => d.ApplyDelayTime)
             ;
     }

+ 1 - 0
src/Hotline.Application/Snapshot/Contracts/IOrderSnapshotApplication.cs

@@ -146,4 +146,5 @@ public interface IOrderSnapshotApplication
     Task UpdateIsEmphasisAsync(UpdateIsEmphasisInDto dto);
 
     Task GetOrderDetailAsync(string id, Share.Dtos.Order.OrderDto dto, CancellationToken token);
+    Task<string> GetStartflowAsync(string? orderId, CancellationToken requestAborted);
 }

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

@@ -3,6 +3,7 @@ using DocumentFormat.OpenXml.Wordprocessing;
 using Hotline.Application.Snapshot.Contracts;
 using Hotline.Caching.Interfaces;
 using Hotline.File;
+using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Share.Attributes;
@@ -66,6 +67,7 @@ public class IndustryApplication : IIndustryApplication, IScopeDependency
                 .Then(async org => { dto.ApproveOrgName = org.Name; });
         }
         var entity = dto.Adapt<Industry>();
+        entity.ModuleCode = WorkflowModuleConsts.OrderHandle;
         var id = await _industryRepository.AddAsync(entity, cancellationToken);
         if (dto.Files.NotNullOrEmpty())
         {

+ 16 - 2
src/Hotline.Application/Snapshot/RedPackApplication.cs

@@ -245,12 +245,14 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
         var outDto = new SnapshotOrderAuditDetailOutDto { Order = order.Adapt<SnapshotOrderAuditOrderDetailOutDto>() };
         var industry = await _industryRepository.Queryable(includeDeleted: true)
             .LeftJoin<OrderSnapshot>((i, o) => i.Id == o.IndustryId)
-            .Select((i, o) => new { i.Id, i.CitizenReadPackAmount, i.ArgeePoints, i.ExtraDeductedPoints, i.RefusePoints })
+            .Where((i, o) => o.Id == id)
+            .Select((i, o) => new { i.Id, i.CitizenReadPackAmount, i.ArgeePoints, i.ExtraDeductedPoints, i.RefusePoints , i.IsPoints})
             .FirstAsync();
         outDto.Amount = industry.CitizenReadPackAmount;
         outDto.ArgeePoints = industry.ArgeePoints;
         outDto.ExtraDeductedPoints = industry.ExtraDeductedPoints;
         outDto.RefusePoints = industry.RefusePoints;
+        outDto.IsPoints = industry.IsPoints;
         outDto.RedPackTxt = $"{order.FromPhone}【】元; ";
         var dayStart = DateTime.Now.ToString("yyyy-MM-dd 00:00:00").ObjToDate();
         var dayEnd = DateTime.Now.ToString("yyyy-MM-dd 23:59:59").ObjToDate();
@@ -284,7 +286,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
             .LeftJoin<Order>((redPackAudit, snapshot, order) => redPackAudit.OrderId == order.Id)
             .LeftJoin<SpecialRedPackAudit>((redPackAudit, snapshot, order, special) => redPackAudit.OrderId == special.OrderId)
             .LeftJoin<SupplementRecord>((redPackAudit, snapshot, order, special, supplement) => special.Id == supplement.RedPackAuditId)
-            .Where((redPackAudit, snapshot, order, special) => (redPackAudit.Status == ERedPackAuditStatus.Agree && snapshot.IndustryName == "安全隐患" && order.OrderTagCode!.Contains("DHZY")) || snapshot.IsSafetyDepartment == true || (redPackAudit.Status == ERedPackAuditStatus.Agree && order.CreationTime >= beginTime && order.CreationTime <= endTime && redPackAudit.ApprovedAmount == 20 && order.AcceptTypeCode != "30" && snapshot.IndustryName != "电气焊作业申报") && (order.HotspotId == null || order.HotspotId.StartsWith("18") == false))
+            .Where((redPackAudit, snapshot, order, special) => (redPackAudit.Status == ERedPackAuditStatus.Agree && snapshot.IndustryName == "安全隐患" && order.OrderTagCode!.Contains("DHZY")) || (redPackAudit.Status == ERedPackAuditStatus.Agree && order.CreationTime >= beginTime && order.CreationTime <= endTime && redPackAudit.ApprovedAmount == 20 && order.AcceptTypeCode != "30" && snapshot.IndustryName != "电气焊作业申报" && (order.HotspotId == null || order.HotspotId.StartsWith("18") == false)))
             .WhereIF(dto.Status == 0, (redPackAudit, snapshot, order, special) => special.Id == null)
             .WhereIF(dto.Status == 1, (redPackAudit, snapshot, order, special) => special.Status == ERedPackAuditStatus.Agree)
             .WhereIF(dto.Status == 2, (redPackAudit, snapshot, order, special) => special.Status == ERedPackAuditStatus.Refuse)
@@ -327,6 +329,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                             County = order.County,
                             // IsRectify = s.IsRepetition
                             IsDeal = snapshot.IsDeal,
+                            IsSafetyDepartment = snapshot.IsSafetyDepartment,
                             NetworkENumber = snapshot.NetworkENumber,
                             IsTruth = snapshot.IsTruth,
                             IsTruthDepartment = snapshot.IsTruthDepartment,
@@ -339,10 +342,16 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                             AuditOrgId = special.AuditOrgId,
                             AuditOrgName = special.AuditOrgName,
                             AuditRemark = special.AuditRemark,
+                            ReplenishAmount = supplement.ReplenishAmount,
                             BankCardNo = supplement.BankCardNo,
                             OpenBank = supplement.OpenBank,
+                            AwardName = supplement.Name,
                             AuditStatus = special.Status,
+                            AuditType = supplement.AuditType
                         });
+#if DEBUG
+        var sql = query.ToSqlString();
+#endif        
         return query;
     }
 
@@ -591,6 +600,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                 entity.No = orderNo;
                 entity.IndustryName = industryName.IndustryName;
                 entity.IndustryId = industryName.IndustryId;
+                entity.ReplenishRemark = dto.ReplenishRemark;
                 await _supplementRecordRepository.AddAsync(entity);
 
                 if (dto.IsSendSMS)
@@ -614,6 +624,7 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
             .Then(async audit =>
             {
                 var orderNo = await _orderRepository.Queryable().Where(m => m.Id == audit.OrderId).Select(m => m.No).FirstAsync();
+                var auditTypeId = _systemDic.SnapshotRedPackSpecialType.FirstOrDefault(m => m.DicDataName.StartsWith(dto.AuditType))?.DicDataValue;
 
                 var entity = dto.Adapt<SupplementRecord>();
                 var industryName = await _orderSnapshotRepository.Queryable()
@@ -625,6 +636,9 @@ public class RedPackApplication : IRedPackApplication, IScopeDependency
                 entity.No = orderNo;
                 entity.IndustryName = industryName.IndustryName;
                 entity.IndustryId = industryName.IndustryId;
+                entity.ReplenishRemark = dto.ReplenishRemark;
+                entity.AuditType = dto.AuditType;
+                entity.AuditTypeCode = auditTypeId;
                 await _supplementRecordRepository.AddAsync(entity);
 
                 if (dto.IsSendSMS)

+ 41 - 3
src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs

@@ -1,4 +1,5 @@
 using Hotline.Caching.Interfaces;
+using Hotline.Configurations;
 using Hotline.File;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.Workflows;
@@ -16,6 +17,7 @@ using Hotline.Share.Tools;
 using Hotline.Snapshot;
 using Hotline.Tools;
 using Mapster;
+using Microsoft.Extensions.Options;
 using Novacode.NETCorePort;
 using NPOI.POIFS.Properties;
 using SqlSugar;
@@ -33,6 +35,11 @@ using XF.Utility.EnumExtensions;
 using Hotline.Snapshot.IRepository;
 using Hotline.Application.Snapshot.Contracts;
 using Microsoft.AspNetCore.Http;
+using Hotline.Configurations;
+using Microsoft.Extensions.Options;
+using Hotline.FlowEngine.WorkflowModules;
+using System.Reflection.Metadata.Ecma335;
+using Microsoft.Extensions.Logging;
 
 namespace Hotline.Application.Snapshot;
 public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDependency
@@ -48,8 +55,10 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
     private readonly IFileRepository _fileRepository;
     private readonly ISnapshotLabelLogRepository _snapshotLabelLogRepository;
     private readonly IRedPackAuditRepository _redPackAuditRepository;
+    private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+    private readonly ILogger<SnapshotOrderApplication> _logger;
 
-    public SnapshotOrderApplication(IOrderSnapshotRepository orderSnapshotRepository, IOrderRepository orderRepository, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, ISessionContext sessionContext, ISystemSettingCacheManager systemSettingCacheManager, IIndustryCaseRepository industryCaseRepository, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, IFileRepository fileRepository, ISnapshotLabelLogRepository snapshotLabelLogRepository, IRedPackAuditRepository redPackAuditRepository)
+    public SnapshotOrderApplication(IOrderSnapshotRepository orderSnapshotRepository, IOrderRepository orderRepository, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, ISessionContext sessionContext, ISystemSettingCacheManager systemSettingCacheManager, IIndustryCaseRepository industryCaseRepository, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, IFileRepository fileRepository, ISnapshotLabelLogRepository snapshotLabelLogRepository, IRedPackAuditRepository redPackAuditRepository, IOptionsSnapshot<AppConfiguration> appOptions, ILogger<SnapshotOrderApplication> logger)
     {
         _orderSnapshotRepository = orderSnapshotRepository;
         _orderRepository = orderRepository;
@@ -62,6 +71,8 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
         _fileRepository = fileRepository;
         _snapshotLabelLogRepository = snapshotLabelLogRepository;
         _redPackAuditRepository = redPackAuditRepository;
+        _appOptions = appOptions;
+        _logger = logger;
     }
 
     /// <summary>
@@ -216,8 +227,8 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
             .LeftJoin<WorkflowStep>((snapshot, order, step) => step.ExternalId == order.Id && step.Tag == TagDefaults.OrderMark && step.Status != EWorkflowStepStatus.Handled)
             .Where((snapshot, order, step) => snapshot.IndustryName == "安全隐患")
-            .WhereIF(dto.Status == 1, (snapshot, order, step) => step.Id != null && snapshot.IsSafetyDepartment == null) // 待标记
-            .WhereIF(dto.Status == 2, (snapshot, order, step) => snapshot.IsSafetyDepartment != null) // 已标记
+            .WhereIF(dto.Status == 1, (snapshot, order, step) => step.Id != null && (step.HandlerId == _sessionContext.UserId ||_sessionContext.Roles.Contains(step.RoleId)) && snapshot.IsSafetyDepartment == null) // 待标记
+            .WhereIF(dto.Status == 2, (snapshot, order, step) => snapshot.IsSafetyDepartment != null && snapshot.SignUserId == _sessionContext.UserId) // 已标记
             .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order, step) => order.No.Contains(dto.No))
             .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order, step) => order.Title.Contains(dto.Title))
             .OrderByDescending((snapshot, order, step) => snapshot.CreationTime)
@@ -312,6 +323,8 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
 
     public async Task SaveOrderWorkflowInfo(NextWorkflowDto<OrderHandleFlowDto> dto)
     {
+        if (_systemSettingCacheManager.Snapshot == false) return;
+        
         var snapshot = await _orderSnapshotRepository.GetAsync(dto.Data.OrderId);
         if (snapshot is null) return;
 
@@ -648,4 +661,29 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
             });
 
     }
+
+    public async Task<string> GetStartflowAsync(string? orderId, CancellationToken token)
+    {
+        try
+        {
+            if (orderId.IsNullOrEmpty()) return WorkflowModuleConsts.OrderHandle;
+            if (_systemSettingCacheManager.Snapshot == false) return WorkflowModuleConsts.OrderHandle;
+            if (_appOptions.Value.IsZiGong == false) return WorkflowModuleConsts.OrderHandle;
+
+            var order = await _orderSnapshotRepository.Queryable()
+                .LeftJoin<Industry>((snapshot, industry) => snapshot.IndustryId == industry.Id)
+                .Where((snapshot, industry) => snapshot.Id == orderId)
+                .Select((snapshot, industry) => new { snapshot.Id, industry.ModuleCode })
+                .FirstAsync(token);
+            if (order == null) return WorkflowModuleConsts.OrderHandle;
+
+            return order.ModuleCode ?? WorkflowModuleConsts.OrderHandle;
+        }
+        catch (Exception e)
+        {
+            _logger.LogError("获取随手拍开启流程参数异常", e);
+            return WorkflowModuleConsts.OrderHandle;
+        }
+    }
+
 }

+ 78 - 56
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -1,9 +1,11 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
+using Hotline.Configurations;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Identity.Accounts;
 using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.SeedData;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
@@ -23,6 +25,7 @@ using Hotline.Tools;
 using Hotline.Users;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using Quartz.Simpl;
 using SqlSugar;
 using System.Data;
@@ -52,28 +55,29 @@ namespace Hotline.Application.StatisticalReport
         private readonly IRepository<SystemOrganize> _systemOrganizerepository;
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
-		private readonly IRepository<Hotspot> _hotspotTypeRepository;
-
-		/// <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="sysDicDataCacheManager"></param>
-		/// <param name="trCallRecordRepository"></param>
-		/// <param name="systemSettingCacheManager"></param>
-		/// <param name="userRepository"></param>
-		/// <param name="accountRepository"></param>
-		/// <param name="statisticsDepartRepository"></param>
-		/// <param name="systemOrganizerepository"></param>
-		/// <param name="orderSpecialRepository"></param>
-		public OrderReportApplication(
+        private readonly IRepository<Hotspot> _hotspotTypeRepository;
+        private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+
+        /// <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="sysDicDataCacheManager"></param>
+        /// <param name="trCallRecordRepository"></param>
+        /// <param name="systemSettingCacheManager"></param>
+        /// <param name="userRepository"></param>
+        /// <param name="accountRepository"></param>
+        /// <param name="statisticsDepartRepository"></param>
+        /// <param name="systemOrganizerepository"></param>
+        /// <param name="orderSpecialRepository"></param>
+        public OrderReportApplication(
             IOrderRepository orderRepository,
             IRepository<OrderVisitDetail> orderVisitDetailRepository,
             IRepository<OrderDelay> orderDelayRepository,
@@ -91,8 +95,9 @@ namespace Hotline.Application.StatisticalReport
             IRepository<SystemOrganize> systemOrganizerepository,
              IRepository<OrderSpecial> orderSpecialRepository,
              IRepository<OrderSendBackAudit> orderSendBackAuditRepository,
-			IRepository<Hotspot> hotspotTypeRepository
-			)
+            IRepository<Hotspot> hotspotTypeRepository,
+             IOptionsSnapshot<AppConfiguration> appOptions
+            )
         {
             _orderRepository = orderRepository;
             _orderVisitDetailRepository = orderVisitDetailRepository;
@@ -112,8 +117,10 @@ namespace Hotline.Application.StatisticalReport
             _orderSpecialRepository = orderSpecialRepository;
             _orderSendBackAuditRepository = orderSendBackAuditRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
+            _appOptions = appOptions;
 
-		}
+
+        }
 
         #region 宜宾、自贡
         /// <summary>
@@ -2693,6 +2700,7 @@ namespace Hotline.Application.StatisticalReport
                .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
                .Where((o, w) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
                        && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition == ECountersignPosition.None)
+               .WhereIF(_appOptions.Value.IsZiGong, (o, w) => o.Status < EOrderStatus.Filed)//自贡需要排除已办理完成的
                .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
                .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
                .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
@@ -2721,6 +2729,7 @@ namespace Hotline.Application.StatisticalReport
                 .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
                 .Where((o, w) => w.CreationTime >= dto.StartTime && w.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
                         && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition > ECountersignPosition.None)
+                   .WhereIF(_appOptions.Value.IsZiGong, (o, w) => o.Status < EOrderStatus.Filed)//自贡需要排除已办理完成的
                 .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
                 .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
                 .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
@@ -2773,6 +2782,7 @@ namespace Hotline.Application.StatisticalReport
                     .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
                     .Where((o, w) => w.CreationTime >= dto.StartTime && w.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
                             && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition > ECountersignPosition.None)
+                       .WhereIF(_appOptions.Value.IsZiGong, (o, w) => o.Status < EOrderStatus.Filed)//自贡需要排除已办理完成的
                     .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
                     .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
                     .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
@@ -2787,6 +2797,7 @@ namespace Hotline.Application.StatisticalReport
                     .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
                     .Where((o, w) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
                             && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition == ECountersignPosition.None)
+                       .WhereIF(_appOptions.Value.IsZiGong, (o, w) => o.Status < EOrderStatus.Filed)//自贡需要排除已办理完成的
                     .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
                     .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
                     .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
@@ -3003,43 +3014,54 @@ namespace Hotline.Application.StatisticalReport
             return query;
         }
 
-		public async Task<DataTable> HotspotStatisticsExprot_LZ(ExportExcelDto<HotspotStatisticsRep> dto)
-		{
-			var IsCenter = _sessionContext.OrgIsCenter;
-			DataTable data = new DataTable();
-
-			data = await _hotspotTypeRepository.Queryable()
-			.LeftJoin<Order>((it, o) => o.HotspotId.StartsWith(it.Id))
-			.Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && o.Id != null)
-			.WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
-			.WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
-			.WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+        public async Task<DataTable> HotspotStatisticsExprot_LZ(ExportExcelDto<HotspotStatisticsRep> dto)
+        {
+            var IsCenter = _sessionContext.OrgIsCenter;
+            DataTable data = new DataTable();
+
+            var  list = await _hotspotTypeRepository.Queryable()
+            .LeftJoin<Order>((it, o) => o.HotspotId.StartsWith(it.Id))
+            .Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && o.Id != null)
+            .WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
+            .WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
+            .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
             .GroupBy((it, o) => it.Id)
-			.OrderBy((it, o) => new { it.Id }, OrderByType.Asc)
-			.Select((it, o) => new
+            .OrderBy((it, o) => new { it.Id }, OrderByType.Asc)
+            .Select((it, o) => new HotspotStatisticsDto
 			{
-				HotspotName = it.HotSpotName,
-				HotSpotFullName = it.HotSpotFullName,
-				SumCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.HotspotId.StartsWith(it.Id), 1, 0))
-			})
-			.ToDataTableAsync();
+                HotspotName = it.HotSpotName,
+                HotSpotFullName = it.HotSpotFullName,
+                SumCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.HotspotId.StartsWith(it.Id), 1, 0))
+            })
+            .ToListAsync();
+            data = list.ToDataTable("HotspotStatistics");
 
 			data.Columns["HotspotName"].SetOrdinal(0);
-			data.Columns["HotSpotFullName"].SetOrdinal(1);
+            data.Columns["OneHotspotName"].SetOrdinal(1);
+			data.Columns["TwoHotspotName"].SetOrdinal(2);
+			data.Columns["ThreeHotspotName"].SetOrdinal(3);
+			data.Columns["FourHotspotName"].SetOrdinal(4);
+			data.Columns["FiveHotspotName"].SetOrdinal(5);
 			data.Columns["SumCount"].ColumnName = "分类统计";
-			data.Columns["HotspotName"].ColumnName = "热点名称";
-			data.Columns["HotSpotFullName"].ColumnName = "热点分级";
+            data.Columns["HotspotName"].ColumnName = "热点名称";
+			data.Columns["OneHotspotName"].ColumnName = "一级热点";
+			data.Columns["TwoHotspotName"].ColumnName = "二级热点";
+			data.Columns["ThreeHotspotName"].ColumnName = "三级热点";
+			data.Columns["FourHotspotName"].ColumnName = "四级热点";
+			data.Columns["FiveHotspotName"].ColumnName = "五级热点";
+			data.Columns.Remove("HotSpotFullName");
+			//data.Columns["HotSpotFullName"].ColumnName = "热点分级";
 			//合计
 			DataRow sumRow = data.NewRow();
-			sumRow["热点名称"] = "合计";
-			decimal totalAmount = 0;
-			foreach (DataRow row in data.Rows)
-			{
-				totalAmount += Convert.ToDecimal(row["分类统计"]);
-			}
-			sumRow["分类统计"] = totalAmount;
-			data.Rows.Add(sumRow);
+            sumRow["热点名称"] = "合计";
+            decimal totalAmount = 0;
+            foreach (DataRow row in data.Rows)
+            {
+                totalAmount += Convert.ToDecimal(row["分类统计"]);
+            }
+            sumRow["分类统计"] = totalAmount;
+            data.Rows.Add(sumRow);
             return data;
-		}
-	}
+        }
+    }
 }

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs

@@ -29,7 +29,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
                 ExecuteParam = executeParam,
                 ExecuteResult = executeResult,
                 ExecuteUrl = executeUrl,
-                Remark = remark.Substring(0, 255),
+                Remark = remark.Length > 255 ? remark.Substring(0, 255) : remark,
                 Status = status,
                 IpUrl = ipUrl
             };

+ 22 - 2
src/Hotline.Share/Dtos/Article/BulletinDto.cs

@@ -545,6 +545,27 @@ namespace Hotline.Share.Dtos.Article
         public string IndustryId { get; set; }
     }
 
+    public class BulletinListOutDto
+    { 
+        /// <summary>
+        /// 公告ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+        private string content;
+        /// <summary>
+        /// 内容
+        /// </summary>
+        public string Content { get { return content.RemoveHtmlTags(); } set { content = value; } }
+
+        public DateTime CreationTime { get; set; }
+    }
+
     /// <summary>
     /// 微信小程序获取宣传学习列表出参
     /// </summary>
@@ -560,11 +581,10 @@ namespace Hotline.Share.Dtos.Article
         /// </summary>
         public string Title { get; set; }
 
-        private string content;
         /// <summary>
         /// 内容
         /// </summary>
-        public string Content { get { return content.RemoveHtmlTags(); } set { content = value; } }
+        public string Content { get; set; }
 
         public DateTime CreationTime { get; set; }
     }

+ 5 - 0
src/Hotline.Share/Dtos/CallCenter/QueryCallsFixedDto.cs

@@ -81,5 +81,10 @@ namespace Hotline.Share.Dtos.CallCenter
         /// 排序方式 0 升序 1 降序
         /// </summary>
         public int? SortRule { get; set; }
+
+        /// <summary>
+        /// 通话记录编号
+        /// </summary>
+        public string? CallNo { get; set; }
     }
 }

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

@@ -58,6 +58,7 @@ public class NextStepsDto
     /// 当前节点是否是会签结束节点
     /// </summary>
     public bool CurrentIsCountersignEndStep { get; set; }
+    public bool CurrentIsTopCountersignEndStep { get; set; }
 
     /// <summary>
     /// 时间类型

+ 4 - 0
src/Hotline.Share/Dtos/Order/Detail/OrderFlowTraceDto.cs

@@ -146,6 +146,10 @@ public class OrderFlowTraceDto
 
     #endregion
 
+    /// <summary>
+    /// 发布状态、回访结果
+    /// </summary>
+    public string? OpinionResult {  get; set; }
 }
 
 /// <summary>

+ 45 - 1
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -40,6 +40,13 @@ namespace Hotline.Share.Dtos.Order
         public EOrderStatus Status { get; set; }
 
         public string StatusText => Status.GetDescription();
+
+        /// <summary>
+		/// 终止状态
+		/// </summary>
+        public ETerminateStatus? TerminateStatus { get; set; }
+
+        public string? TerminateStatusText => TerminateStatus?.GetDescription();
     }
 
     public class OrderDto : UpdateOrderDto
@@ -100,6 +107,33 @@ namespace Hotline.Share.Dtos.Order
 
         public List<SystemDicDataOutDto>? OrderTags { get; set; }
 
+        /// <summary>
+        /// 一级标签
+        /// </summary>
+        public string? OrderTagsOneName => GetOrderTagsOne(1);
+
+        /// <summary>
+        /// 二级标签
+        /// </summary>
+        public string? OrderTagsTwoName => GetOrderTagsOne(2);
+
+        private string? GetOrderTagsOne(int level)
+        {
+            if (OrderTags != null && OrderTags.Any())
+            {
+                List<SystemDicDataOutDto> tagsData = [];
+                if (level == 1)
+                    tagsData = OrderTags.Where(p => p.ParentId == null || p.ParentId == "").ToList();
+                if (level == 2)
+                    tagsData = OrderTags.Where(p => p.ParentId != null && p.ParentId != "").ToList();
+                if (tagsData != null && tagsData.Any())
+                {
+                    return string.Join(",", tagsData.Select(x => x.DicDataName));
+                }
+            }
+            return string.Empty;
+        }
+
         #region 流程信息
 
         /// <summary>
@@ -907,6 +941,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string SendBackOpinion { get; set; }
 
+        /// <summary>
+        /// 重办意见
+        /// </summary>
+        public string? ReTransactOpinion { get; set; }
+
         /// <summary>
         /// 退回原因
         /// </summary>
@@ -1159,7 +1198,12 @@ namespace Hotline.Share.Dtos.Order
         /// 能否编辑,true:任何节点可以编辑;false:未发起流程可以编辑
         /// </summary>
         public bool IsEdit { get; set; }
-    }
+
+        /// <summary>
+        /// 工单修改来源
+        /// </summary>
+        public EOrderUpdateSource? Source { get; set; }
+	}
 
     public class OrderUploadFiles
     {

+ 122 - 79
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -19,7 +19,7 @@ namespace Hotline.Share.Dtos.Order
         /// 本地编号(√)
         /// </summary>
         public string No { get; set; }
-        
+
         /// <summary>
         /// 标题
         /// </summary>
@@ -269,14 +269,15 @@ namespace Hotline.Share.Dtos.Order
         public string Id { get; set; }
     }
 
-    public record AlterDelayDayDto {
-		public string Id { get; set; }
+    public record AlterDelayDayDto
+    {
+        public string Id { get; set; }
         public int DelayNum { get; set; }
 
-	}
+    }
 
 
-	public record ApplyDelayDto
+    public record ApplyDelayDto
     {
         public string OrderId { get; set; }
 
@@ -301,25 +302,25 @@ namespace Hotline.Share.Dtos.Order
         public bool IsReviewPass { get; set; }
     }
 
-	public record OrderPushTypeCodeDto
-	{
-		/// <summary>
-		/// 开始时间
-		/// </summary>
-		public DateTime? StartTime { get; set; }
-
-		/// <summary>
-		/// 结束时间
-		/// </summary>
-		public DateTime? EndTime { get; set; }
-
-		/// <summary>
-		/// pushTypeCode
-		/// </summary>
-		public string PushTypeCode { get; set; }
-	}
-
-	public class PublishOrderDelayDto
+    public record OrderPushTypeCodeDto
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// pushTypeCode
+        /// </summary>
+        public string PushTypeCode { get; set; }
+    }
+
+    public class PublishOrderDelayDto
     {
         public string Id { get; set; }
 
@@ -559,11 +560,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int? DataScope { get; set; }
 
-
         /// <summary>
         /// 当前办理节点
         /// </summary>
         public string? CurrentStepName { get; set; }
+
         /// <summary>
         /// 当前办理人
         /// </summary>
@@ -583,6 +584,48 @@ namespace Hotline.Share.Dtos.Order
         /// 延期申请时间
         /// </summary>
         public DateTime? EndCreationTime { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+
+        /// <summary>
+        /// 热点分类关键词
+        /// </summary>
+        public string? Hotspot { get; set; }
+
+        /// <summary>
+        /// 受理时间(工单创建时间)
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 期满时间
+        /// </summary>
+        public DateTime? ExpiredTimeStart { get; set; }
+        public DateTime? ExpiredTimeEnd { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? Channel { get; set; }
+
+        /// <summary>
+        /// 延期申请人
+        /// </summary>
+        public string? DelayApplyName { get; set; }
+
+        /// <summary>
+        /// 延期申请部门
+        /// </summary>
+        public string? DelayApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 是否自动延期
+        /// </summary>
+        public bool? IsAutomaticDelay { get; set; }
     }
 
     public record ApplySuperviseDto
@@ -933,71 +976,71 @@ namespace Hotline.Share.Dtos.Order
         public string? Address { get; set; }
     }
 
-    public record OrgSendBackAuditListDto : PagedKeywordRequest 
+    public record OrgSendBackAuditListDto : PagedKeywordRequest
     {
-		public string? OrgName { get; set; }
-		public string? OrgId { get; set; }
+        public string? OrgName { get; set; }
+        public string? OrgId { get; set; }
 
 
-		public string? No { get; set; }
+        public string? No { get; set; }
 
-		public string? Title { get; set; }
+        public string? Title { get; set; }
 
 
-		/// <summary>
-		/// 来源渠道(√)
-		/// </summary>
-		public string? Channel { get; set; }
+        /// <summary>
+        /// 来源渠道(√)
+        /// </summary>
+        public string? Channel { get; set; }
 
-		/// <summary>
-		/// 受理类型(√)
-		/// </summary>
-		public string? AcceptType { get; set; }
+        /// <summary>
+        /// 受理类型(√)
+        /// </summary>
+        public string? AcceptType { get; set; }
 
-		/// <summary>
-		/// 热点分类
-		/// </summary>
-		public string? Hotspot { get; set; }
+        /// <summary>
+        /// 热点分类
+        /// </summary>
+        public string? Hotspot { get; set; }
 
 
-		/// <summary>
-		/// 受理时间(工单创建时间)(√)
-		/// </summary>
-		public DateTime? CreationTimeStart { get; set; }
-		public DateTime? CreationTimeEnd { get; set; }
+        /// <summary>
+        /// 受理时间(工单创建时间)(√)
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 申请部门
+        /// </summary>
+        public string? ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string? ApplyUserName { get; set; }
+
+        /// <summary>
+        /// 退回审批状态
+        /// </summary>
+        public ESendBackAuditState? State { get; set; }
+
+        /// <summary>
+        /// 审批人
+        /// </summary>
+        public string? AuditUser { get; set; }
 
-		/// <summary>
-		/// 申请部门
-		/// </summary>
-		public string? ApplyOrgName { get; set; }
-
-		/// <summary>
-		/// 申请人
-		/// </summary>
-		public string? ApplyUserName { get; set; }
-
-		/// <summary>
-		/// 退回审批状态
-		/// </summary>
-		public ESendBackAuditState? State { get; set; }
-
-		/// <summary>
-		/// 审批人
-		/// </summary>
-		public string? AuditUser { get; set; }
-
-		/// <summary>
-		/// 审批时间
-		/// </summary>
-		public DateTime? AuditTimeStart { get; set; }
-
-		public DateTime? AuditTimeEnd { get; set; }
-
-		/// <summary>
-		/// 审批意见
-		/// </summary>
-		public string? AuditContent { get; set; }
-	}
+        /// <summary>
+        /// 审批时间
+        /// </summary>
+        public DateTime? AuditTimeStart { get; set; }
+
+        public DateTime? AuditTimeEnd { get; set; }
+
+        /// <summary>
+        /// 审批意见
+        /// </summary>
+        public string? AuditContent { get; set; }
+    }
 
 
     public enum EPublicState

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

@@ -20,6 +20,11 @@
         /// </summary>
         public string DicDataValue { get; set; }
 
+        /// <summary>
+		/// 上级ID
+		/// </summary>
+        public string? ParentId { get; set; }
+
         /// <summary>
         /// 子集集合
         /// </summary>

+ 24 - 12
src/Hotline.Share/Dtos/Snapshot/IndustryDto.cs

@@ -78,6 +78,11 @@ public class IndustryDetailOutDto : IndustryItemsOutDto
     /// App是否启用
     /// </summary>
     public bool IsAppEnable { get; set; }
+
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
 }
 
 public class IndustryItemsOutDto : IndustryOutDto
@@ -173,22 +178,27 @@ public class IndustryOutDto
     /// <summary>
     /// 上报积分
     /// </summary>
-    public int ReportPoints { get; set; }
+    public int? ReportPoints { get; set; }
 
     /// <summary>
     /// 审核同意积分
     /// </summary>
-    public int ArgeePoints { get; set; }
+    public int? ArgeePoints { get; set; }
 
     /// <summary>
     /// 审核不同意扣除积分
     /// </summary>
-    public int RefusePoints { get; set; }
+    public int? RefusePoints { get; set; }
 
     /// <summary>
     /// 额外扣除积分
     /// </summary>
-    public int ExtraDeductedPoints { get; set; }
+    public int? ExtraDeductedPoints { get; set; }
+
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
 
 }
 
@@ -417,26 +427,28 @@ public class AddIndustryDto
     /// <summary>
     /// 上报积分
     /// </summary>
-    [Required]
-    public int ReportPoints { get; set; }
+    public int? ReportPoints { get; set; }
 
     /// <summary>
     /// 审核同意积分
     /// </summary>
-    [Required]
-    public int ArgeePoints { get; set; }
+    public int? ArgeePoints { get; set; }
 
     /// <summary>
     /// 审核不同意扣除积分
     /// </summary>
-    [Required]
-    public int RefusePoints { get; set; }
+    public int? RefusePoints { get; set; }
 
     /// <summary>
     /// 额外扣除积分
     /// </summary>
-    [Required]
-    public int ExtraDeductedPoints { get; set; }
+    public int? ExtraDeductedPoints { get; set; }
+
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
+
 }
 
 public class IndustryCaseItemOutDto : AddIndustryCaseDto

+ 26 - 1
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -466,6 +466,18 @@ public class SnapshotOrderAuditItemsOutDto
     /// 奖励人姓名
     /// </summary>
     public string? AwardName { get; set; }
+
+    /// <summary>
+    /// 标记是否安全生产
+    /// </summary>
+    public bool? IsSafetyDepartment { get; set; }
+
+    public string? IsSafetyDepartmentTxt => IsSafetyDepartment.HasValue ? (IsSafetyDepartment.Value ? "是" : "否") : string.Empty;
+
+    /// <summary>
+    /// 特殊红包审核,审批类型
+    /// </summary>
+    public string? AuditType { get; set; }
 }
 
 /// <summary>
@@ -802,6 +814,11 @@ public class SnapshotOrderAuditDetailOutDto
     /// </summary>
     public IEnumerable<KeyValuePair<int, string>> AuditComBox { get; set; }
 
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    public bool? IsPoints { get; set; }
+
     /// <summary>
     /// 额外扣除积分类型
     /// </summary>
@@ -1020,7 +1037,7 @@ public class UpdateRedPackAuditInDto
     /// <summary>
     /// 积分审核状态
     /// </summary>
-    public ESnapshotSMSStatus PointsStatus { get; set; }
+    public ESnapshotSMSStatus? PointsStatus { get; set; }
 
     /// <summary>
     /// 积分
@@ -1746,6 +1763,14 @@ public class OrderSignBathInDto
     /// 备注
     /// </summary>
     public string Remark { get; set; }
+
+    /// <summary>
+    /// 状态;
+    /// 0: 全部;
+    /// 1: 待标签;
+    /// 2: 已标签;
+    /// </summary>
+    public int Status { get; set; }
 }
 
 public record LabelOrderSnapshotLogItemsInDto : PagedRequest

+ 18 - 0
src/Hotline.Share/Dtos/Snapshot/RedPackDto.cs

@@ -151,6 +151,8 @@ public class UpdateRedPackRecordInDto
     /// 补充发放类型Id
     /// </summary>
     public string ReplenishTypeId { get; set; }
+
+    public string AuditType { get; set; }
 }
 
 
@@ -199,6 +201,11 @@ public class SnapshotRedPackRecordSupplementItemsOutDto
     /// </summary>
     public string FromPhone { get; set; }
 
+    /// <summary>
+    /// 来电人姓名
+    /// </summary>
+    public string FromName { get; set; }
+
     /// <summary>
     /// 区域
     /// </summary>
@@ -238,6 +245,17 @@ public class SnapshotRedPackRecordSupplementItemsOutDto
     /// 备注
     /// </summary>
     public string Remark { get; set; }
+
+    /// <summary>
+    /// 补充发放类型
+    /// </summary>
+    public string? ReplenishType { get; set; }
+
+    /// <summary>
+    /// 补充发放类型Id
+    /// </summary>
+    public string? ReplenishTypeId { get; set; }
+
 }
 
 public record SnapshotRedPackRecordSupplementItemsInDto : PagedRequest

+ 42 - 0
src/Hotline.Share/Dtos/StatisticalReport/OrderDelayStatisicalReturnDto.cs

@@ -44,4 +44,46 @@ namespace Hotline.Share.Dtos.StatisticalReport
         /// </summary>
         public string NodeCode { get; set; }
     }
+
+    public class HotspotStatisticsDto { 
+    
+        /// <summary>
+        /// 分类名称
+        /// </summary>
+        public string HotspotName { get; set; }
+
+        /// <summary>
+        /// 分类全称
+        /// </summary>
+        public string HotSpotFullName { get; set; }
+
+        /// <summary>
+        /// 一级热点
+        /// </summary>
+        public string OneHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 1 && HotSpotFullName.Split("-")[0] == HotspotName ? HotSpotFullName.Split("-")[0] : string.Empty;
+
+        /// <summary>
+        /// 二级热点
+        /// </summary>
+        public string TwoHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 2 && HotSpotFullName.Split("-")[1] == HotspotName ? HotSpotFullName.Split("-")[1] : string.Empty;
+
+        /// <summary>
+        /// 三级热点
+        /// </summary>
+        public string ThreeHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 3 && HotSpotFullName.Split("-")[2] == HotspotName ? HotSpotFullName.Split("-")[2] : string.Empty;
+
+        /// <summary>
+        /// 四级热点
+        /// </summary>
+        public string FourHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 4 && HotSpotFullName.Split("-")[3] == HotspotName ? HotSpotFullName.Split("-")[3] : string.Empty;
+
+        /// <summary>
+        /// 五级热点
+        /// </summary>
+        public string FiveHotspotName => !string.IsNullOrEmpty(HotSpotFullName) && HotSpotFullName.Split("-").Length >= 5 && HotSpotFullName.Split("-")[4] == HotspotName ? HotSpotFullName.Split("-")[4] : string.Empty;
+
+
+        public int SumCount { get; set; }
+
+	}
 }

+ 6 - 1
src/Hotline.Share/Enums/FlowEngine/EFlowDirection.cs

@@ -22,5 +22,10 @@ public enum EFlowDirection
     /// <summary>
     /// 已归档回到部门
     /// </summary>
-    FiledToOrg = 7
+    FiledToOrg = 7,
+
+    /// <summary>
+    /// 其他(流程模板配置为其他时)
+    /// </summary>
+    Other = 99
 }

+ 6 - 0
src/Hotline.Share/Enums/FlowEngine/EHandleMode.cs

@@ -66,4 +66,10 @@ public enum EHandleMode
     /// </summary>
     [Description("二次办理")]
     SecondaryHandle = 202,
+
+    /// <summary>
+    /// 发布退回
+    /// </summary>
+    [Description("发布退回")]
+    PublishPrevious = 203,
 }

+ 6 - 0
src/Hotline.Share/Enums/FlowEngine/EWorkflowTraceType.cs

@@ -56,5 +56,11 @@ namespace Hotline.Share.Enums.FlowEngine
         /// </summary>
         [Description("二次办理")]
         SecondHandle = 7,
+
+        /// <summary>
+        /// 发布退回
+        /// </summary>
+        [Description("发布退回")]
+        PublishPrevious = 8,
     }
 }

+ 22 - 0
src/Hotline.Share/Enums/Order/EOrderUpdateSource.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Order
+{
+	public enum EOrderUpdateSource
+	{
+		/// <summary>
+		/// 受理列表
+		/// </summary>
+		Accepted = 0,
+
+		/// <summary>
+		/// 工单修改
+		/// </summary>
+		Alter =1
+
+	}
+}

+ 1 - 1
src/Hotline.Share/Tools/EnumExtensions.cs

@@ -48,7 +48,7 @@ public static class EnumExtensions
     public static List<KeyValuePair<int, string>> GetEnumKeyValueList<TEnum>() where TEnum : Enum
     {
         // 按照枚举定义的顺序获取键值对
-        return typeof(ESeatEvaluate)
+        return typeof(TEnum)
              .GetFields()
              .Where(f => f.IsLiteral) // 过滤出枚举字段
              .Select(f =>

+ 1 - 1
src/Hotline/FlowEngine/WorkflowModules/WorkflowModuleConsts.cs

@@ -70,7 +70,7 @@ public class WorkflowModuleConsts
     public const string OrderHandleSnapshot = "OrderHandleSnapshot";
 
 
-	public static List<WorkflowModule> AllModules =>
+    public static List<WorkflowModule> AllModules =>
         new()
         {
             new(OrderHandle, "工单办理"),

+ 9 - 0
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -46,6 +46,15 @@ namespace Hotline.FlowEngine.Workflows
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
+        Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
+            Workflow workflow,
+            NextWorkflowDto dto,
+            EHandleMode handleMode = EHandleMode.Normal,
+            DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
+            Action<Workflow, WorkflowStep, StepDefine>? currentStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
+            CancellationToken cancellationToken = default);
+
         /// <summary>
         /// 开启流程并办理至第一个节点
         /// </summary>

+ 38 - 21
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -293,6 +293,20 @@ namespace Hotline.FlowEngine.Workflows
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
                 withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
+
+            return await NextAsync(workflow, dto, handleMode, expiredTime, isAutoFillSummaryOpinion, currentStepConfig,
+                newStepConfig, cancellationToken);
+        }
+
+        public async Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
+            Workflow workflow,
+            NextWorkflowDto dto,
+            EHandleMode handleMode = EHandleMode.Normal,
+            DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
+            Action<Workflow, WorkflowStep, StepDefine>? currentStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
+            CancellationToken cancellationToken = default)
+        {
             CheckWhetherRunnable(workflow.Status);
 
             var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == dto.StepId);
@@ -477,7 +491,8 @@ namespace Hotline.FlowEngine.Workflows
                 }
             }
 
-            await Task.Run(() => currentStepConfig?.Invoke(workflow, currentStep, nextStepDefine), cancellationToken);
+            //await Task.Run(() => currentStepConfig?.Invoke(workflow, currentStep, nextStepDefine), cancellationToken);
+            currentStepConfig?.Invoke(workflow, currentStep, nextStepDefine);
             await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
 
             //更新traces
@@ -622,11 +637,10 @@ namespace Hotline.FlowEngine.Workflows
             var nextDto = _mapper.Map<NextWorkflowDto>(dto);
             nextDto.WorkflowId = workflow.Id;
             nextDto.StepId = startStep.Id;
-            var (_, _, _, nextSteps) =
-                await NextAsync(nextDto,
-                    expiredTime: expiredTime,
-                    isAutoFillSummaryOpinion: true,
-                    newStepConfig: newStepConfig, cancellationToken: cancellationToken);
+            var (_, _, _, nextSteps) = await NextAsync(workflow, nextDto,
+                expiredTime: expiredTime,
+                isAutoFillSummaryOpinion: true,
+                newStepConfig: newStepConfig, cancellationToken: cancellationToken);
             return nextSteps;
         }
 
@@ -1056,7 +1070,7 @@ namespace Hotline.FlowEngine.Workflows
             PreviousAsync(PreviousWorkflowDto dto,
                 EHandleMode handleMode = EHandleMode.Previous,
                 Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
-            CancellationToken cancellationToken = default)
+                CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
                 withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -1346,8 +1360,7 @@ namespace Hotline.FlowEngine.Workflows
                         EBusinessType.Department => EFlowDirection.CenterToOrg,
                         EBusinessType.DepartmentLeader => EFlowDirection.CenterToOrg,
                         EBusinessType.File => EFlowDirection.CenterToFile,
-                        _ => throw new ArgumentOutOfRangeException(nameof(directionStepBusinessType),
-                            directionStepBusinessType, null)
+                        _ => EFlowDirection.Other
                     };
                 case EBusinessType.Department:
                 case EBusinessType.DepartmentLeader:
@@ -1360,8 +1373,7 @@ namespace Hotline.FlowEngine.Workflows
                         EBusinessType.Department => EFlowDirection.OrgToOrg,
                         EBusinessType.DepartmentLeader => EFlowDirection.OrgToOrg,
                         EBusinessType.File => EFlowDirection.OrgToFile,
-                        _ => throw new ArgumentOutOfRangeException(nameof(directionStepBusinessType),
-                            directionStepBusinessType, null)
+                        _ => EFlowDirection.Other
                     };
                 case EBusinessType.File:
                     return directionStepBusinessType switch
@@ -1372,14 +1384,14 @@ namespace Hotline.FlowEngine.Workflows
                         EBusinessType.DepartmentLeader => EFlowDirection.FiledToOrg,
                         EBusinessType.CenterMonitor => EFlowDirection.FiledToCenter,
                         EBusinessType.CenterLeader => EFlowDirection.FiledToCenter,
-                        _ => throw new ArgumentOutOfRangeException(nameof(directionStepBusinessType), directionStepBusinessType, null)
+                        _ => EFlowDirection.Other
                     };
                 case EBusinessType.Unknown:
                 case EBusinessType.Publish:
                 case EBusinessType.Visit:
                 case EBusinessType.TrashEnd:
                 default:
-                    throw new ArgumentOutOfRangeException(nameof(sourceStepBusinessType), sourceStepBusinessType, null);
+                    return EFlowDirection.Other;
             }
         }
 
@@ -1433,10 +1445,10 @@ namespace Hotline.FlowEngine.Workflows
         {
             //根据汇总对象id找到被汇总节点
             var summaryTargetStep = workflow.Steps.Where(d =>
-                d.StepType == EStepType.Normal &&
-                d.Code == summaryTargetStepCode &&
-                d.Status == EWorkflowStepStatus.Handled &&
-                d.IsOrigin)
+                    d.StepType == EStepType.Normal &&
+                    d.Code == summaryTargetStepCode &&
+                    d.Status == EWorkflowStepStatus.Handled &&
+                    d.IsOrigin)
                 .MaxBy(d => d.CreationTime);
             if (summaryTargetStep is null)
                 throw UserFriendlyException.SameMessage("未查询到汇总对象节点");
@@ -1676,7 +1688,8 @@ namespace Hotline.FlowEngine.Workflows
                               workflow.Steps.MaxBy(d => d.CreationTime);
 
             //update uncomplete traces
-            var uncompleteTraces = workflow.Traces.Where(d => d.Status != EWorkflowStepStatus.Handled && d.TraceStyle == ETraceStyle.Flow).ToList();
+            //var uncompleteTraces = workflow.Traces.Where(d => d.Status != EWorkflowStepStatus.Handled && d.TraceStyle == ETraceStyle.Flow).ToList();
+            var uncompleteTraces = workflow.Traces.Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
             if (uncompleteTraces.Any())
             {
                 foreach (var trace in uncompleteTraces)
@@ -1693,10 +1706,13 @@ namespace Hotline.FlowEngine.Workflows
             }
             else
             {
-                var endTrace = workflow.Traces.Where(d => d.StepType == EStepType.End && d.TraceStyle == ETraceStyle.Flow).MaxBy(d => d.CreationTime);
+                //var endTrace = workflow.Traces.Where(d => d.StepType == EStepType.End && d.TraceStyle == ETraceStyle.Flow).MaxBy(d => d.CreationTime);
+                var endTrace = workflow.Traces.Where(d => d.TraceStyle == ETraceStyle.TrashEnd).MaxBy(d => d.CreationTime);
                 if (endTrace is not null)
                 {
-                    endTrace.Opinion += ("\r\n" + dto.Opinion);
+                    endTrace.HandleMode = handleMode;
+                    //endTrace.Opinion += ("\r\n" + dto.Opinion);
+                    endTrace.Opinion = dto.Opinion;
                     updateTraces.Add(endTrace);
                 }
             }
@@ -2413,6 +2429,7 @@ namespace Hotline.FlowEngine.Workflows
                 Status = EWorkflowStatus.Runnable,
                 Steps = new(),
                 Traces = new(),
+                Countersigns = new(),
                 WorkflowDefinition = definition,
                 ExternalId = externalId ?? string.Empty,
                 FlowType = definition.FlowType,
@@ -3526,7 +3543,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task<WorkflowTrace> CreateVisitTraceAsync(WorkflowTrace pubTrace, UserInfo acceptor, string orderVisitId,
-          DateTime creationTime, CancellationToken cancellation)
+            DateTime creationTime, CancellationToken cancellation)
         {
             if (string.IsNullOrEmpty(orderVisitId))
                 throw new UserFriendlyException($"参数异常,orderVisitId不能为空, pubTraceId: {pubTrace.Id}");

+ 0 - 43
src/Hotline/Identity/IIdentityDomainService.cs

@@ -4,8 +4,6 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using XF.Domain.Cache;
-using XF.Domain.Dependency;
 
 namespace Hotline.Identity
 {
@@ -25,45 +23,4 @@ namespace Hotline.Identity
         /// <param name="nonce"></param>
         void SetAccountNonce(string username, string nonce);
     }
-
-    public class IdentityDomainService : IIdentityDomainService, IScopeDependency
-    {
-        private readonly ITypedCache<AccountNonce> _cacheAccountNonce;
-
-        public IdentityDomainService(
-            ITypedCache<AccountNonce> cacheAccountNonce)
-        {
-            _cacheAccountNonce = cacheAccountNonce;
-        }
-
-        /// <summary>
-        /// 校验用户是否真实
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        public bool IsIdentityReal(LoginWithSignatureRequest request)
-        {
-            /*
-             *时间戳timestamp与服务器时间戳相差不能超过60s大于服务器时间戳
-               随机数nonce60s内不能重复
-             */
-            if (string.IsNullOrEmpty(request.Nonce)) return false;
-            var now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-            if (request.Timestamp >= now) return false;
-            if ((now - request.Timestamp) >= 60000) return false;
-            var nonce = _cacheAccountNonce.Get(request.Username)?.Nonce;
-            if (!string.IsNullOrEmpty(nonce) && string.CompareOrdinal(nonce, request.Nonce) == 0) return false;
-            return true;
-        }
-
-        /// <summary>
-        /// 设置账户随机数
-        /// </summary>
-        /// <param name="username"></param>
-        /// <param name="nonce"></param>
-        public void SetAccountNonce(string username, string nonce)
-        {
-            _cacheAccountNonce.Set(username, new AccountNonce(nonce), TimeSpan.FromSeconds(60));
-        }
-    }
 }

+ 52 - 0
src/Hotline/Identity/IdentityDomainService.cs

@@ -0,0 +1,52 @@
+using Hotline.Share.Dtos.Identity;
+using Microsoft.Extensions.Logging;
+using XF.Domain.Cache;
+using XF.Domain.Dependency;
+
+namespace Hotline.Identity;
+
+public class IdentityDomainService : IIdentityDomainService, IScopeDependency
+{
+    private readonly ITypedCache<AccountNonce> _cacheAccountNonce;
+    private readonly ILogger<IdentityDomainService> _logger;
+
+    public IdentityDomainService(
+        ITypedCache<AccountNonce> cacheAccountNonce,
+        ILogger<IdentityDomainService> logger)
+    {
+        _cacheAccountNonce = cacheAccountNonce;
+        _logger = logger;
+    }
+
+    /// <summary>
+    /// 校验用户是否真实
+    /// </summary>
+    /// <param name="request"></param>
+    /// <returns></returns>
+    public bool IsIdentityReal(LoginWithSignatureRequest request)
+    {
+        /*
+             *时间戳timestamp与服务器时间戳相差不能超过60s大于服务器时间戳
+               随机数nonce60s内不能重复
+             */
+        if (string.IsNullOrEmpty(request.Nonce)) return false;
+        var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
+        _logger.LogInformation($"now:{now}, req:{request.Timestamp}");
+        //if ((request.Timestamp - now) > 3) return false;
+        if ((now - request.Timestamp) >= 60) return false;
+        var nonce = _cacheAccountNonce.Get(request.Username)?.Nonce;
+        _logger.LogInformation($"nonce:{nonce}, reqnonce:{request.Nonce}");
+        if (!string.IsNullOrEmpty(nonce) && string.CompareOrdinal(nonce, request.Nonce) == 0) return false;
+        return true;
+    }
+
+    /// <summary>
+    /// 设置账户随机数
+    /// </summary>
+    /// <param name="username"></param>
+    /// <param name="nonce"></param>
+    public void SetAccountNonce(string username, string nonce)
+    {
+        _cacheAccountNonce.Set(username, new AccountNonce(nonce), TimeSpan.FromSeconds(60));
+    }
+}

+ 7 - 1
src/Hotline/Orders/OrderCopy.cs

@@ -1,4 +1,5 @@
-using SqlSugar;
+using Hotline.Share.Enums.Order;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
@@ -30,5 +31,10 @@ namespace Hotline.Orders
 		///  修改时间
 		/// </summary>
 		public DateTime AuditTime { get; set; }
+
+		/// <summary>
+		/// 工单修改来源
+		/// </summary>
+		public EOrderUpdateSource? AuditSource { get; set; }
 	}
 }

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

@@ -340,27 +340,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         {
             try
             {
-                if (_appOptions.Value.IsZiGong)
-                {
-                    if (order.Source == ESource.ProvinceStraight)
-                    {
-                        //发送查询短信
-                        var messageDto = new Share.Dtos.Push.MessageDto
-                        {
-                            PushBusiness = EPushBusiness.SearchSms,
-                            ExternalId = visitId,
-                            OrderId = order.Id,
-                            PushPlatform = EPushPlatform.Sms,
-                            Remark = order.Title,
-                            Name = order.FromName,
-                            TemplateCode = "1021",
-                            Params = new List<string>() { order.No, order.Password },
-                            TelNumber = order.Contact,
-                        };
-                        await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
-                    }
-                }
-                else
+                if (_appOptions.Value.IsZiGong == false)
                 {
                     if (order.Source != ESource.ProvinceStraight && order.FileOrgIsCenter.Value == false)
                     {

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

@@ -80,6 +80,7 @@ namespace Hotline.Orders
         /// <summary>
         /// 回访内容
         /// </summary>
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string? VisitContent { get; set; }
 
         /// <summary>

+ 4 - 4
src/Hotline/SeedData/SystemDicDataSeedData.cs

@@ -32,10 +32,10 @@ public class SystemDicDataSeedData : ISeedData<SystemDicData>
         if (dicTypeCode == SysDicTypeConsts.SnapshotRedPackSpecialType)
         {
             return [
-                new() {  Id = "08dd4bf7-b7c6-471b-8ee5-deb5a1c4776a", DicDataValue = "dqh", DicDataName = "电气焊类", Sort = 1},
-                new() {  Id = "08dd4bf7-b7ab-4729-80b2-b2c5db5d221c", DicDataValue = "qp", DicDataName = "气瓶类", Sort = 2},
-                new() {  Id = "08dd4bf7-b352-4b52-8a96-78f73197c22e", DicDataValue = "dde", DicDataName = "电动车类", Sort = 3},
-                new() {  Id = "08dd4bf7-b349-48ea-8f54-fb8b29070fa3", DicDataValue = "xftd", DicDataName = "消防通道", Sort = 4},
+                new() {  Id = "08dd4bf7-b7c6-471b-8ee5-deb5a1c4776a", DicDataValue = "dqh", DicDataName = "电气焊类|1", Sort = 1},
+                new() {  Id = "08dd4bf7-b7ab-4729-80b2-b2c5db5d221c", DicDataValue = "qp", DicDataName = "气瓶类|1", Sort = 2},
+                new() {  Id = "08dd4bf7-b352-4b52-8a96-78f73197c22e", DicDataValue = "dde", DicDataName = "电动车类|1", Sort = 3},
+                new() {  Id = "08dd4bf7-b349-48ea-8f54-fb8b29070fa3", DicDataValue = "xftd", DicDataName = "消防通道|1", Sort = 4},
                 ];
         }
         if (dicTypeCode == SysDicTypeConsts.SnapshotOrderLabel)

+ 1 - 1
src/Hotline/Snapshot/Contracts/ISnapshotPointsDomainService.cs

@@ -12,5 +12,5 @@ namespace Hotline.Snapshot.Contracts;
 /// </summary>
 public interface ISnapshotPointsDomainService
 {
-    Task AddPointsAsync(string orderId, EPointsSource source, ESnapshotSMSStatus status, int? extraDeductedPoints);
+    Task AddPointsAsync(string orderId, EPointsSource source, ESnapshotSMSStatus? status, int? extraDeductedPoints);
 }

+ 12 - 0
src/Hotline/Snapshot/Industry.cs

@@ -173,6 +173,12 @@ public class Industry : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "行业类型")]
     public EIndustryType IndustryType { get; set; }
 
+    /// <summary>
+    /// 是否开启积分
+    /// </summary>
+    [SugarColumn(ColumnDescription = "是否开启积分")]
+    public bool? IsPoints { get; set; }
+
     /// <summary>
     /// 上报积分
     /// </summary>
@@ -196,4 +202,10 @@ public class Industry : CreationSoftDeleteEntity
     /// </summary>
     [SugarColumn(ColumnDescription = "额外扣除积分")]
     public int? ExtraDeductedPoints { get; set; }
+
+    /// <summary>
+    /// 流程模板Code
+    /// </summary>
+    [SugarColumn(ColumnDescription = "流程模板Code")]
+    public string? ModuleCode { get; set; }
 }

+ 2 - 1
src/Hotline/Snapshot/Services/SnapshotPointsDomainService.cs

@@ -22,8 +22,9 @@ public class SnapshotPointsDomainService : ISnapshotPointsDomainService, IScopeD
         _pointsRecordRepository = snapshotPointsRecordRepository;
     }
 
-    public async Task AddPointsAsync(string orderId, EPointsSource source, ESnapshotSMSStatus status, int? extraDeductedPoints)
+    public async Task AddPointsAsync(string orderId, EPointsSource source, ESnapshotSMSStatus? status, int? extraDeductedPoints)
     {
+        if (status == null) return;
         var order = await _orderSnapshotRepository.Queryable()
             .LeftJoin<Industry>((snapshot, industry) => snapshot.IndustryId == industry.Id)
             .Where((snapshot, industry) => snapshot.Id == orderId)

+ 23 - 1
src/Hotline/dataview.md

@@ -710,4 +710,26 @@ select * from order_send_back_audit WHERE "SendBackOrgId"='001023';
 
 --更新退回申请创建部门
 select * from order_send_back_audit WHERE "CreatorOrgId"='001023';
---update order_send_back_audit SET "CreatorOrgName"='珙县智慧信息服务中心' WHERE "CreatorOrgId"='001023';
+--update order_send_back_audit SET "CreatorOrgName"='珙县智慧信息服务中心' WHERE "CreatorOrgId"='001023';
+
+### 兴唐通讯记录查询
+
+SELECT cn."FromNo" as 主叫号码,"ToNo" as 被叫号码,o."No" as 工单编码,o."Title" AS 工单标题,cn."TelNo" as 响应分机,cn."StaffNo" as 工号,cn."CallNo" as 通话ID,cn."UserName" as 话务员,
+cn."GroupId" as 功能组号码,cn."Duration" as 通话时间,
+(CASE 
+	WHEN cn."EndBy" = 0 THEN
+		'主叫方结束'
+		WHEN cn."EndBy" = 1 THEN
+		'被叫方结束'
+	ELSE
+		'其他未知情况'
+END) as 挂断状态,cn."BeginIvrTime" as 开始时间,cn."AnsweredTime" as 接通时间,cn."EndTime" as 挂断时间
+ FROM call_native  cn 
+LEFT JOIN "order"  o on cn."Id" = o."CallId" 
+WHERE  cn."IsDeleted" =FALSE  
+--呼入
+-- and cn."Direction" = 0 and cn."AnsweredTime" is NOT NULL and  cn."FromNo" ='110' and  cn."ToNo" ='12345'
+--呼出
+and cn."Direction" = 1 and cn."AnsweredTime" is NOT NULL and  cn."FromNo" ='12345' and  cn."ToNo" ='110'
+and cn."CreationTime" >= '2025-01-01' and  cn."CreationTime" <'2025-04-01' ;
+

+ 4 - 0
test/Hotline.Tests/Application/IndustryApplicationTest.cs

@@ -58,6 +58,7 @@ public class IndustryApplicationTest : TestBase
         var orgs = await _systemOrganizeRepository.GetOrgEnabled();
         industry.ApproveOrgId = orgs.First().Key;
         industry.ApproveOrgName = null;
+        industry.IsPoints = false;
         await _industryApplication.UpdateIndustryAsync(industry, CancellationToken.None);
         var updateIndustry = await _industryApplication.GetIndustryDetailAsync(item.Id, CancellationToken.None);
         updateIndustry.ForeachClassProperties(async (industry, property, name, value) =>
@@ -65,7 +66,10 @@ public class IndustryApplicationTest : TestBase
             industry.GetType().GetProperty(name).GetValue(industry).ShouldBe(value);
             return true;
         });
+        updateIndustry.IsPoints.ShouldBe(false);
         await _industryApplication.UpdateIndustryAsync(item.Adapt<UpdateIndustryInDto>(), CancellationToken.None);
+        var changeItem = await _industryRepository.GetAsync(industry.Id);
+        changeItem.ModuleCode.ShouldNotBeNull();
     }
 
     [Fact]

+ 48 - 2
test/Hotline.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -1,6 +1,7 @@
 using Hotline.Api.Controllers;
 using Hotline.Application.Snapshot.Contracts;
 using Hotline.Caching.Interfaces;
+using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
 using Hotline.Orders;
@@ -75,6 +76,23 @@ public class OrderSnapshotApplicationTest : TestBase
         };
     }
 
+    /// <summary>
+    /// 随手拍网格员超时:
+    /// </summary>
+    /// <returns></returns>
+    [Fact]
+    public async Task SnapshotWorkflow_WorkflowModuleError_est()
+    {
+        var order = _orderServiceMock.CreateSnapshotOrder(SetWeiXin)
+            .办理到一级部门(SetZuoXi)
+            .StepHandle(async order =>
+            {
+                var detail = await _orderController.Get(order.Id);
+                detail.Workflow.ModuleCode.ShouldBe(WorkflowModuleConsts.OrderHandleSnapshot);
+            }
+            ).GetCreateResult();
+    }
+
     /// <summary>
     /// 随手拍网格员超时:
     /// </summary>
@@ -113,7 +131,7 @@ public class OrderSnapshotApplicationTest : TestBase
         SetSettingCache(SettingConstants.OvertimeBack, "4");
         var snapshotLabels = _systemDicDataCacheManager.SnapshotOrderLabel;
         var inputLable = snapshotLabels.Where(m => m.DicDataValue == "bss").ToList();
-        var industryCase = await _industryCaseRepository.Queryable().Where(m => m.IsEnable ==  true).FirstAsync();
+        var industryCase = await _industryCaseRepository.Queryable().Where(m => m.IsEnable == true).FirstAsync();
         var order = _orderServiceMock.CreateSnapshotOrder(SetWeiXin)
             .办理到网格员(SetZuoXi)
             .StepHandle(async (order, mock) =>
@@ -170,7 +188,8 @@ public class OrderSnapshotApplicationTest : TestBase
                 data.IndustryCase = industryCase.Id;
                 data.IsRectifyDepartment = true;
             })
-            .StepHandle(async order => {
+            .StepHandle(async order =>
+            {
                 var snapshot = await _orderSnapshotRepository.GetAsync(order.Id);
                 snapshot.IndustryCase.ShouldBe(industryCase.Id);
                 var orderDetail = await _orderController.Get(order.Id);
@@ -210,6 +229,33 @@ public class OrderSnapshotApplicationTest : TestBase
                 baseData.AuditType.ShouldNotBeNull();
                 baseData.AuditTypeCode.ShouldNotBeNull();
                 baseData.Amount.ShouldNotBeNull();
+
+                var specialRedAuditItems = await _redPackApplication.GetRedPackSpecialAuditItems(new SnapshotOrderAuditItemsInDto(order.No, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1) { PageIndex = 1, PageSize = 10 }).ToListAsync();
+                var specialRedAudit = specialRedAuditItems.FirstOrDefault();
+                specialRedAudit.ShouldNotBeNull();
+                var a = _systemDicDataCacheManager.SnapshotReplenishType.First();
+                var b = _systemDicDataCacheManager.SnapshotRedPackSpecialType.First();
+                var inDto = new UpdateRedPackRecordInDto
+                {
+                    RedPackAuditId = baseData.RedPackAuditId,
+                    Name = "收银人",
+                    BankCardNo = "1233921321",
+                    OpenBank = "建设银行",
+                    ReplenishAmount = 10,
+                    ReplenishTime = DateTime.Now,
+                    ReplenishRemark = "补充发放备注",
+                    IsSendSMS = false,
+                    ReplenishType = a.DicDataName,
+                    ReplenishTypeId = a.DicDataValue,
+                    AuditType = b.DicDataName,
+                };
+
+                await _redPackApplication.UpdateRedPackSpecialRecordAsync(inDto);
+                specialRedAuditItems = await _redPackApplication.GetRedPackSpecialAuditItems(new SnapshotOrderAuditItemsInDto(order.No, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1) { PageIndex = 1, PageSize = 10 }).ToListAsync();
+                specialRedAudit = specialRedAuditItems.First();
+                specialRedAudit.ShouldNotBeNull();
+                specialRedAudit.BankCardNo.ShouldBe(inDto.BankCardNo);
+                specialRedAudit.OpenBank.ShouldBe(inDto.OpenBank);
             })
             .GetCreateResult();
         order.Id.ShouldNotBeNull();

+ 11 - 0
test/Hotline.Tests/Application/RedPackApplicationTest.cs

@@ -8,6 +8,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Snapshot;
 using Hotline.Share.Enums.Snapshot;
+using Hotline.Share.Tools;
 using Hotline.Snapshot.IRepository;
 using Hotline.Tests.Mock;
 using Hotline.ThirdAccountDomainServices;
@@ -164,4 +165,14 @@ public class RedPackApplicationTest : TestBase
         }).ToListAsync();
         sendRecordItems.Count.ShouldNotBe(0);
     }
+
+    [Fact]
+    public async Task GetRedPackRecordSupplementItems_Test()
+    {
+        var items = await _redPackApplication.GetRedPackRecordSupplementItems(new SnapshotRedPackRecordSupplementItemsInDto()).ToListAsync();
+        items.Any(m => m.FromName.NotNullOrEmpty()).ShouldBeTrue();
+        items.Any(m => m.Remark.NotNullOrEmpty()).ShouldBeTrue();
+        items.Any(m => m.ReplenishType.NotNullOrEmpty()).ShouldBeTrue();
+        items.ShouldNotBeNull();
+    }
 }

+ 7 - 5
test/Hotline.Tests/Application/SnapshotApplicationTest.cs

@@ -471,17 +471,19 @@ public class SnapshotApplicationTest : TestBase
             ArgeePoints = 3,
             ExtraDeductedPoints = 2,
             RefusePoints = 1,
-            ReportPoints = 4
+            ReportPoints = 4,
+            IsPoints = false
         };
         var industryId = await _industryApplication.AddIndustryAsync(industry, CancellationToken.None);
         var pageDto = await _snapshotApplication.GetIndustryBaseAsync(industryId, CancellationToken.None);
         var industryOut = await _industryApplication.GetIndustryDetailAsync(industryId, CancellationToken.None);
         try
         {
-            industryOut.ArgeePoints.ShouldBe(industry.ArgeePoints);
-            industryOut.ExtraDeductedPoints.ShouldBe(industry.ExtraDeductedPoints);
-            industryOut.RefusePoints.ShouldBe(industry.RefusePoints);
-            industryOut.ReportPoints.ShouldBe(industry.ReportPoints);
+            industryOut.ArgeePoints.Value.ShouldBe(industry.ArgeePoints.Value);
+            industryOut.ExtraDeductedPoints.Value.ShouldBe(industry.ExtraDeductedPoints.Value);
+            industryOut.RefusePoints.Value.ShouldBe(industry.RefusePoints.Value);
+            industryOut.ReportPoints.Value.ShouldBe(industry.ReportPoints.Value);
+            industryOut.IsPoints.ShouldBe(industry.IsPoints);
             pageDto.ShouldNotBeNull();
             pageDto.Files.ShouldNotBeNull();
             foreach (var file in pageDto.Files)

+ 117 - 0
test/Hotline.Tests/Controller/OrderDelayControllerTest.cs

@@ -0,0 +1,117 @@
+using Hotline.Tests.Mock;
+using System.Diagnostics;
+using Hotline.Api.Controllers;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Settings;
+using Hotline.ThirdAccountDomainServices;
+using Hotline.ThirdAccountDomainServices.Interfaces;
+using Hotline.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using XF.Domain.Cache;
+using XF.Domain.Repository;
+using Hotline.Orders;
+using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
+using MapsterMapper;
+using Xunit.Abstractions;
+
+namespace Hotline.Tests.Controller
+{
+    public class OrderDelayControllerTest : TestBase
+    {
+        private readonly OrderController _orderController;
+        private readonly OrderServiceMock _orderServiceMock;
+        private readonly IOrderDelayRepository _orderDelayRepository;
+        private readonly IOrderRepository _orderRepository;
+        private readonly IMapper _mapper;
+        private readonly ITestOutputHelper _testOutputHelper;
+
+        public OrderDelayControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository,
+            UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository,
+            IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdIdentiyService,
+            IThirdAccountRepository thirdAccountRepository, ITypedCache<SystemSetting> cacheSettingData,
+            ThirdAccounSupplierFactory thirdAccountDomainFactory,
+            OrderController orderController,
+            OrderServiceMock orderServiceMock,
+            IOrderDelayRepository orderDelayRepository,
+            IOrderRepository orderRepository,
+            IMapper mapper,
+            ITestOutputHelper testOutputHelper) : base(accountRepository, roleRepository,
+            userController, scopeFactory, userRepository, httpContextAccessor, thirdIdentiyService,
+            thirdAccountRepository, cacheSettingData, thirdAccountDomainFactory)
+        {
+            _orderController = orderController;
+            _orderServiceMock = orderServiceMock;
+            _orderDelayRepository = orderDelayRepository;
+            _orderRepository = orderRepository;
+            _mapper = mapper;
+            _testOutputHelper = testOutputHelper;
+        }
+
+        [Fact]
+        public async Task OrderDelayBatchApproveTest()
+        {
+            SetZuoXi();
+
+            var delayIds = new List<string>();
+            for (int i = 0; i < 10; i++)
+            {
+                var orderId = _orderServiceMock.CreateOrder()
+                    .办理到一级部门()
+                    .办理到二级部门(Set一级部门)
+                    .GetCreateResult().Id;
+
+                //var order = await _orderRepository.Queryable()
+                //    .FirstAsync(o => o.Id == orderId);
+                var delayId = _orderServiceMock.申请延期(Set二级部门);
+                delayIds.Add(delayId);
+            }
+
+            var delay = await _orderDelayRepository.GetAsync(delayIds.First());
+            
+            Set一级部门();
+            var option =  _orderController.OrderDelayNextsteps(delay.WorkflowId).Result as NextStepsWithOpinionDto<NextStepOption>;
+            var step = option.Steps.First();
+            
+            var req = new BatchDelayNextFlowDto
+            {
+                DelayId = delayIds.ToArray(),
+                IsPass = true,
+                NextWorkflow = new NextWorkflowDto
+                {
+                    NextStepCode = step.Key,
+                    NextStepName = step.Value,
+                }
+            };
+
+            _testOutputHelper.WriteLine($"开始审批");
+            var sw = new Stopwatch();
+            sw.Start();
+            var result = await _orderController.BatchAuditDelay(req);
+            sw.Stop();
+            
+            _testOutputHelper.WriteLine($"耗时:{sw.ElapsedMilliseconds}ms");
+            _testOutputHelper.WriteLine(result);
+
+            //var delay = await _orderDelayRepository.Queryable()
+            //    .Includes(d => d.Order)
+            //    .FirstAsync(d => d.Id == delayId);
+
+            //Assert.Equal(EDelayState.Pass, delay.DelayState);
+            //Assert.True(delay.Order.ExpiredTime > order.ExpiredTime);
+
+            //Console.WriteLine(delay.Id);
+        }
+
+        [Fact]
+        public void QueryWaitForApproveDelaysTest()
+        {
+            _testOutputHelper.WriteLine("123");
+        }
+    }
+}

+ 35 - 2
test/Hotline.Tests/Mock/OrderServiceMock.cs

@@ -28,6 +28,7 @@ using Hotline.Api.Controllers.Bi;
 using XF.Domain.Exceptions;
 using System;
 using DocumentFormat.OpenXml.Bibliography;
+using Hotline.Share.Enums.Settings;
 
 namespace Hotline.Tests.Mock;
 public class OrderServiceMock
@@ -71,12 +72,12 @@ public class OrderServiceMock
         _systemDicDataCacheManager = systemDicDataCacheManager;
     }
 
-    public IOrderServiceStartWorkflow CreateSnapshotOrder(Action action)
+    public IOrderServiceStartWorkflow CreateSnapshotOrder(Action action, string industryName = "电气焊作业申报")
     {
         action.Invoke();
         var homePage = _snapshotController.GetHomePageAsync().GetAwaiter().GetResult();
         var industry = homePage.Industrys
-            .Where(m => m.IndustryType == EIndustryType.Clue)
+            .Where(m => m.Name == industryName)
             .OrderBy(m => m.DisplayOrder)
             .FirstOrDefault();
         var pageBase = _snapshotController.GetIndustryBaseAsync(industry.Id).GetAwaiter().GetResult();
@@ -636,4 +637,36 @@ public class OrderServiceMock
         return this;
 
     }
+    
+    public string 申请延期(Action action = null)
+    {
+        action?.Invoke();
+        var options = _orderController.GetDelayFlowStartOptions().Result as NextStepsDto<NextStepOption>;
+        var step = options.Steps.First();
+        var req = new StartWorkflowDto<ApplyDelayDto>
+        {
+            Workflow = new BasicWorkflowDto
+            {
+                NextStepCode = step.Key,
+                NextStepName = step.Value,
+                NextHandlers = new List<StepAssignInfo>{step.Items.First()},
+                Opinion = "单元测试延期申请",
+                FlowDirection = step.FlowDirection,
+                BackToCountersignEnd = step.BackToCountersignEnd,
+                HandlerType = step.HandlerType,
+                BusinessType = step.BusinessType,
+            },
+            Data = new ApplyDelayDto
+            {
+                OrderId = CreateOrderOutDto.Id,
+                DelayNum = 3,
+                DelayReason = "单元测试延期理由",
+                DelayUnit = ETimeType.WorkDay,
+                Files = new()
+            }
+        };
+
+        return _orderController.ApplyDelay(req).GetAwaiter().GetResult();
+
+    }
 }

+ 1 - 1
test/Hotline.Tests/TestBase.cs

@@ -115,7 +115,7 @@ public class TestBase
 
     public void Set二级部门()
     {
-        SetOperator("部门经办人", "测试部门/测试二级部门", "cs21", "001094001", "13408389849", EUserType.Seat, TestSettingConstants.SecondOrgAccountName);
+        SetOperator("部门经办人", "测试部门/测试二级部门", "cs21", "001094001", "13408389849", EUserType.Normal, TestSettingConstants.SecondOrgAccountName);
     }
 
     public void Set班长()

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini