tangjiang 9 місяців тому
батько
коміт
37843d4260

+ 79 - 2
src/Hotline.Api/Controllers/ContingencyManagementController.cs

@@ -1,5 +1,14 @@
-using MapsterMapper;
+using Hotline.ContingencyManagement;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.ContingencyManagement;
+using Hotline.Share.Dtos.Order;
+using Hotline.Tools;
+using MapsterMapper;
+using Microsoft.AspNetCore.Mvc;
+using SqlSugar;
 using XF.Domain.Authentications;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers
 {
@@ -7,12 +16,80 @@ namespace Hotline.Api.Controllers
     {
         private readonly IMapper _mapper;
         private readonly ISessionContext _sessionContext;
+        private readonly IRepository<ContingencyManagementOrders> _contingencyManagementOrdersRepository;
 
         public ContingencyManagementController(IMapper mapper,
-            ISessionContext sessionContext)
+            ISessionContext sessionContext,
+            IRepository<ContingencyManagementOrders> contingencyManagementOrdersRepository)
         {
             _mapper = mapper;
             _sessionContext = sessionContext;
+            _contingencyManagementOrdersRepository = contingencyManagementOrdersRepository;
+        }
+
+        /// <summary>
+        /// 应急数据查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("getlist")]
+        public async Task<PagedDto<ContingencyManagementOrdersDto>> GetList([FromQuery] ContingencyManagementPagedKeywordRequest dto)
+        {
+            var (total, items) = await _contingencyManagementOrdersRepository.Queryable()
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
+                .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.No.Contains(dto.No))
+                .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), p => p.HotspotSpliceName.Contains(dto.HotspotSpliceName))
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), p => p.AcceptType.Contains(dto.AcceptType))
+                .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), p => p.SourceChannel.Contains(dto.SourceChannel))
+                .WhereIF(dto.FiledStartTime.HasValue, p => p.FiledTime >= dto.FiledStartTime)
+                .WhereIF(dto.FiledEndTime.HasValue, p => p.FiledTime <= dto.FiledEndTime)
+                .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
+                .OrderByDescending(d => d.FiledTime)
+                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ContingencyManagementOrdersDto>(total, _mapper.Map<IReadOnlyList<ContingencyManagementOrdersDto>>(items));
+        }
+
+        /// <summary>
+        /// 应急数据查询--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("getlist_export")]
+        public async Task<FileStreamResult> GetListExport([FromBody] ExportExcelDto<ContingencyManagementPagedKeywordRequest> dto)
+        {
+            var query = _contingencyManagementOrdersRepository.Queryable()
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Title), p => p.Title.Contains(dto.QueryDto.Title))
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.No), p => p.No.Contains(dto.QueryDto.No))
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.HotspotSpliceName), p => p.HotspotSpliceName.Contains(dto.QueryDto.HotspotSpliceName))
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.AcceptType), p => p.AcceptType.Contains(dto.QueryDto.AcceptType))
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.SourceChannel), p => p.SourceChannel.Contains(dto.QueryDto.SourceChannel))
+                .WhereIF(dto.QueryDto.FiledStartTime.HasValue, p => p.FiledTime >= dto.QueryDto.FiledStartTime)
+                .WhereIF(dto.QueryDto.FiledEndTime.HasValue, p => p.FiledTime <= dto.QueryDto.FiledEndTime)
+                .WhereIF(dto.QueryDto.StartTime.HasValue, p => p.CreationTime >= dto.QueryDto.StartTime)
+                .WhereIF(dto.QueryDto.EndTime.HasValue, p => p.CreationTime <= dto.QueryDto.EndTime)
+                .OrderByDescending(d => d.FiledTime);
+
+            List<ContingencyManagementOrders> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+            var dataDtos = _mapper.Map<ICollection<ContingencyManagementOrdersDto>>(data);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = dataDtos
+                .Select(stu => _mapper.Map(stu, typeof(ContingencyManagementOrdersDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "应急清单数据");
         }
     }
 }

+ 154 - 91
src/Hotline.Api/Controllers/OrderController.cs

@@ -1,12 +1,13 @@
-using Consul;
-using DotNetCore.CAP;
+using DotNetCore.CAP;
 using Hotline.Api.Filter;
+using Hotline.Application.CallCenter;
 using Hotline.Application.ExportExcel;
 using Hotline.Application.FlowEngine;
 using Hotline.Application.Orders;
 using Hotline.Application.Quality;
 using Hotline.Caching.Interfaces;
-using Hotline.CallCenter.Calls;
+using Hotline.CallCenter.Configs;
+using Hotline.ContingencyManagement;
 using Hotline.Enterprise;
 using Hotline.File;
 using Hotline.FlowEngine.Definitions;
@@ -26,6 +27,7 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.ContingencyManagement;
 using Hotline.Share.Dtos.Enterprise;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
@@ -47,26 +49,16 @@ using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
-using Microsoft.OpenApi.Writers;
+using Microsoft.Extensions.Options;
 using MiniExcelLibs;
 using MongoDB.Driver;
-using NPOI.SS.Formula.Functions;
-using NPOI.SS.Util;
-using Org.BouncyCastle.Utilities;
 using SqlSugar;
-using StackExchange.Redis;
-using System.Diagnostics.Tracing;
-using Hotline.Application.CallCenter;
-using Hotline.CallCenter.Configs;
-using Microsoft.Extensions.Options;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
-using XF.Domain.Constants;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
-using Hotline.Repository.SqlSugar.CallCenter;
 
 namespace Hotline.Api.Controllers;
 
@@ -75,6 +67,7 @@ namespace Hotline.Api.Controllers;
 /// </summary>
 public class OrderController : BaseController
 {
+    #region 注入
     private readonly IOrderDomainService _orderDomainService;
     private readonly IOrderRepository _orderRepository;
     private readonly IWorkflowApplication _workflowApplication;
@@ -113,10 +106,7 @@ public class OrderController : BaseController
     private readonly IRepository<OrderFinality> _orderFinalityRepository;
     private readonly IRepository<OrderSendBack> _orderSendBackRepository;
     private readonly IRepository<OrderSpecial> _orderSpecialRepository;
-
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
-
-    //private readonly IRepository<TrCallRecord> _trCallRecordRepository;
     private readonly IOrderApplication _orderApplication;
     private readonly IEnterpriseService _enterpriseService;
     private readonly IPushDomainService _pushDomainService;
@@ -134,6 +124,8 @@ public class OrderController : BaseController
     private readonly ICallApplication _callApplication;
     private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
     private readonly IOrderSendBackAuditApplication _orderSendBackAuditApplication;
+    private readonly IRepository<ContingencyManagementOrders> _contingencyManagementOrdersRepository;
+    private readonly IRepository<ContingencyManagementHotspot> _contingencyManagementHotspotRepository;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -175,7 +167,6 @@ public class OrderController : BaseController
         IRepository<OrderSendBack> orderSendBackRepository,
         IRepository<OrderSpecial> orderSpecialRepository,
         IRepository<WorkflowTrace> workflowTraceRepository,
-        //IRepository<TrCallRecord> trCallRecordRepository,
         IOrderApplication orderApplication,
         IEnterpriseService enterpriseService,
         IPushDomainService pushDomainService,
@@ -192,7 +183,9 @@ public class OrderController : BaseController
         ICallApplication callApplication,
         IOptionsSnapshot<CallCenterConfiguration> callcenterOptions,
         IRepository<OrderModifyingRecords> orderModifyingRecordsRepository,
-        IOrderSendBackAuditApplication orderSendBackAuditApplication
+        IOrderSendBackAuditApplication orderSendBackAuditApplication,
+        IRepository<ContingencyManagementOrders> contingencyManagementOrdersRepository,
+        IRepository<ContingencyManagementHotspot> contingencyManagementHotspotRepository
         )
     {
         _orderDomainService = orderDomainService;
@@ -234,7 +227,6 @@ public class OrderController : BaseController
         _orderSendBackRepository = orderSendBackRepository;
         _orderSpecialRepository = orderSpecialRepository;
         _workflowTraceRepository = workflowTraceRepository;
-        //_trCallRecordRepository = trCallRecordRepository;
         _logger = logger;
         _orderApplication = orderApplication;
         _enterpriseService = enterpriseService;
@@ -252,8 +244,10 @@ public class OrderController : BaseController
         _callApplication = callApplication;
         _callcenterOptions = callcenterOptions;
         _orderSendBackAuditApplication = orderSendBackAuditApplication;
-
+        _contingencyManagementOrdersRepository = contingencyManagementOrdersRepository;
+        _contingencyManagementHotspotRepository = contingencyManagementHotspotRepository;
     }
+    #endregion
 
     #region 工单发布
 
@@ -327,9 +321,42 @@ public class OrderController : BaseController
                     publishPublishOrder.Order = _mapper.Map<OrderDto>(order);
                     await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
 
+                    try
+                    {
+                        //应急管理局业务处理
+                        //是否是指定热点
+                        if (await _contingencyManagementHotspotRepository.AnyAsync(p => p.Id == order.HotspotId, HttpContext.RequestAborted))
+                        {
+                            var orderData = await _contingencyManagementOrdersRepository.GetAsync(p => p.Id == order.Id, HttpContext.RequestAborted);
+                            //不存在新增
+                            if (orderData == null)
+                            {
+                                orderData = new ContingencyManagementOrders();
+                                orderData = _mapper.Map<ContingencyManagementOrders>(order);
+                                orderData.Id = order.Id;
+                                orderData.ArrangementOpinion = order.ActualOpinion;
+                                orderData.ArrangeTitle = order.Title;
+                                orderData.ArrangeContent = order.Content;
+                                await _contingencyManagementOrdersRepository.AddAsync(orderData, HttpContext.RequestAborted);
+                            }
+                            else
+                            {
+                                //存在修改
+                                orderData = _mapper.Map<ContingencyManagementOrders>(order);
+                                orderData.ArrangementOpinion = order.ActualOpinion;
+                                orderData.ArrangeTitle = order.Title;
+                                orderData.ArrangeContent = order.Content;
+                                await _contingencyManagementOrdersRepository.UpdateAsync(orderData, HttpContext.RequestAborted);
+                            }
+                            //推送消息
+                            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderContingencyManagement,
+                                _mapper.Map<ContingencyManagementOrdersDto>(orderData));
+                        }
+                    }
+                    catch (Exception)
+                    {
+                    }
 
-                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderContingencyManagement, publishPublishOrder);
-                    
                     var orderVisit = new OrderVisit();
                     orderVisit.No = order.No;
                     orderVisit.OrderId = order.Id;
@@ -429,6 +456,42 @@ public class OrderController : BaseController
         }
         await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
 
+        try
+        {
+            //应急管理局业务处理
+            //是否是指定热点
+            if (await _contingencyManagementHotspotRepository.AnyAsync(p => p.Id == order.HotspotId, HttpContext.RequestAborted))
+            {
+                var orderData = await _contingencyManagementOrdersRepository.GetAsync(p => p.Id == order.Id, HttpContext.RequestAborted);
+                //不存在新增
+                if (orderData == null)
+                {
+                    orderData = new ContingencyManagementOrders();
+                    orderData = _mapper.Map<ContingencyManagementOrders>(order);
+                    orderData.Id = order.Id;
+                    orderData.ArrangementOpinion = dto.ArrangeOpinion;
+                    orderData.ArrangeTitle = dto.ArrangeTitle;
+                    orderData.ArrangeContent = dto.ArrangeContent;
+                    await _contingencyManagementOrdersRepository.AddAsync(orderData, HttpContext.RequestAborted);
+                }
+                else
+                {
+                    //存在修改
+                    orderData = _mapper.Map<ContingencyManagementOrders>(order);
+                    orderData.ArrangementOpinion = dto.ArrangeOpinion;
+                    orderData.ArrangeTitle = dto.ArrangeTitle;
+                    orderData.ArrangeContent = dto.ArrangeContent;
+                    await _contingencyManagementOrdersRepository.UpdateAsync(orderData, HttpContext.RequestAborted);
+                }
+                //推送消息
+                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderContingencyManagement,
+                    _mapper.Map<ContingencyManagementOrdersDto>(orderData));
+            }
+        }
+        catch (Exception)
+        {
+        }
+
         var orderVisit = new OrderVisit();
         orderVisit.No = order.No;
         orderVisit.OrderId = order.Id;
@@ -1436,8 +1499,8 @@ public class OrderController : BaseController
         if (dto.Data.Files.Any())
             delay.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, delay.Id, "", HttpContext.RequestAborted);
         else
-	        delay.FileJson = new List<Share.Dtos.File.FileJson>();
-		await _orderDelayRepository.UpdateAsync(delay, HttpContext.RequestAborted);
+            delay.FileJson = new List<Share.Dtos.File.FileJson>();
+        await _orderDelayRepository.UpdateAsync(delay, HttpContext.RequestAborted);
         try
         {
             dto.NextWorkflow.WorkflowId = delay.WorkflowId;
@@ -1655,7 +1718,7 @@ public class OrderController : BaseController
             .Includes(x => x.OrderVisit, y => y.Employee)
             .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.IsDeleted == false)
             .WhereIF(dto.ScreenSendBack is 1, (x, s) => s.Status == EScreenStatus.SendBack && s.SendBackApply == true)
-            .WhereIF(dto.ScreenSendBack is 2, (x, s) => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true) || s.Id == null )
+            .WhereIF(dto.ScreenSendBack is 2, (x, s) => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true) || s.Id == null)
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
             .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
@@ -1666,14 +1729,14 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.OrderVisit.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!))
             .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
             .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue,
-	            x => x.OrderVisit.Order!.CreationTime == dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
+                x => x.OrderVisit.Order!.CreationTime == dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
             .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue,
-	            x => x.OrderVisit.Order!.CurrentHandleTime >= dto.CurrentHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
+                x => x.OrderVisit.Order!.CurrentHandleTime >= dto.CurrentHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
             .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue,
-	            x => x.OrderVisit.Order!.FiledTime == dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
+                x => x.OrderVisit.Order!.FiledTime == dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
             .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue,
-	            x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
-			.WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true,
+                x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
+            .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true,
                 x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
             //.WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
             //.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults),
@@ -1799,8 +1862,8 @@ public class OrderController : BaseController
         if (dto.Data.Files.Any())
             model.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, model.Id, "", HttpContext.RequestAborted);
         else
-	        model.FileJson = new List<Share.Dtos.File.FileJson>();
-		await _orderScreenRepository.AddAsync(model, HttpContext.RequestAborted);
+            model.FileJson = new List<Share.Dtos.File.FileJson>();
+        await _orderScreenRepository.AddAsync(model, HttpContext.RequestAborted);
 
         var workflowId = string.Empty;
         try
@@ -1841,10 +1904,10 @@ public class OrderController : BaseController
         if (dto.Data.Files.Any())
             screen.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, screen.Id, "", HttpContext.RequestAborted);
         else
-	        screen.FileJson = new List<Share.Dtos.File.FileJson>();
-		
-		screen.SendBackApplyNum++;
-		await _orderScreenRepository.UpdateAsync(screen, HttpContext.RequestAborted);
+            screen.FileJson = new List<Share.Dtos.File.FileJson>();
+
+        screen.SendBackApplyNum++;
+        await _orderScreenRepository.UpdateAsync(screen, HttpContext.RequestAborted);
         try
         {
             dto.NextWorkflow.WorkflowId = screen.WorkflowId;
@@ -1863,22 +1926,22 @@ public class OrderController : BaseController
     [HttpPost("screen/previous")]
     public async Task ScreenPrevious([FromBody] PreviousWorkflowDto dto)
     {
-	    var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
-		    cancellationToken: HttpContext.RequestAborted);
+        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
+            cancellationToken: HttpContext.RequestAborted);
         var screen = await _orderScreenRepository.Queryable().Where(x => x.WorkflowId == dto.WorkflowId).FirstAsync();
         if (screen == null)
-	        throw UserFriendlyException.SameMessage("甄别信息错误!");
+            throw UserFriendlyException.SameMessage("甄别信息错误!");
         screen.SendBackApply = workflow.Steps.Count <= 2;
-		await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
+        await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
         screen.Status = EScreenStatus.SendBack;
         screen.SendBackNum++;
         await _orderScreenRepository.UpdateAsync(screen, HttpContext.RequestAborted);
-	}
-	/// <summary>
-	/// 查询工单甄别流程开启参数
-	/// </summary>
-	/// <returns></returns>
-	[HttpGet("screen/startflow")]
+    }
+    /// <summary>
+    /// 查询工单甄别流程开启参数
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("screen/startflow")]
     public async Task<NextStepsDto> GetScreenFlowStartOptionsAsync()
     {
         //return await _workflowApplication.GetStartOptionsAsync(WorkflowModuleConsts.OrderScreen,
@@ -2360,8 +2423,8 @@ public class OrderController : BaseController
         if (dto.Files.Any())
             urge.ReplyFileJson = await _fileRepository.AddFileAsync(dto.Files, urge.Id, "", HttpContext.RequestAborted);
         else
-	        urge.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
-		await _orderUrgeRepository.UpdateAsync(urge, HttpContext.RequestAborted);
+            urge.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
+        await _orderUrgeRepository.UpdateAsync(urge, HttpContext.RequestAborted);
     }
 
     /// <summary>
@@ -2701,8 +2764,8 @@ public class OrderController : BaseController
         dto.RepeatableEventDetails = repeatables;
         if (!string.IsNullOrEmpty(dto.WorkflowId))
         {
-            var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, withTraces:true,
-				cancellationToken: HttpContext.RequestAborted);
+            var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, withTraces: true,
+                cancellationToken: HttpContext.RequestAborted);
             var centerOpinion = workflow.Steps.Where(x => x.HandlerOrgId == OrgSeedData.CenterId && x.StepType != EStepType.End).MaxBy(d => d.CreationTime)?.Opinion ?? string.Empty;
             dto.CenterOpinion = centerOpinion;
             List<OrderRemarksDto> remarks = workflow.Steps.Where(x => !string.IsNullOrEmpty(x.Remark)).Select(x => new OrderRemarksDto { Remark = x.Remark, RemarkTime = x.CreationTime, RemarkUser = x.CreatorName }).ToList();
@@ -2710,10 +2773,10 @@ public class OrderController : BaseController
             if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.SendBackAudit || order.Status == EOrderStatus.BackToUnAccept)
             {
                 var backTrace = workflow.Traces.Where(x => x.Status == EWorkflowStepStatus.Handled).OrderByDescending(x => x.CreationTime).First();
-                dto.SendBackOpinion = string.IsNullOrEmpty(backTrace.Opinion) ? string.Empty : backTrace.Opinion.Replace("流程归档","");
-				//var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.Id).OrderByDescending(x => x.CreationTime).FirstAsync();
-				//dto.SendBackOpinion = sendBack is { Id: not null } && !string.IsNullOrEmpty(sendBack.Content) ? sendBack.Content : string.Empty;
-			}
+                dto.SendBackOpinion = string.IsNullOrEmpty(backTrace.Opinion) ? string.Empty : backTrace.Opinion.Replace("流程归档", "");
+                //var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.Id).OrderByDescending(x => x.CreationTime).FirstAsync();
+                //dto.SendBackOpinion = sendBack is { Id: not null } && !string.IsNullOrEmpty(sendBack.Content) ? sendBack.Content : string.Empty;
+            }
         }
 
         return dto;
@@ -2923,8 +2986,8 @@ public class OrderController : BaseController
         if (dto.Files.Any())
             order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", HttpContext.RequestAborted);
         else
-	        order.FileJson = new List<Share.Dtos.File.FileJson>();
-		await _orderRepository.UpdateNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
+            order.FileJson = new List<Share.Dtos.File.FileJson>();
+        await _orderRepository.UpdateNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
         //敏感分词
         await _orderApplication.OrderSensitiveParticiple(dto.Content, order.Id, HttpContext.RequestAborted);
         // 副本工单
@@ -3083,7 +3146,7 @@ public class OrderController : BaseController
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 canUpdateOrderSender);
             //TODO 发送短信超期和即将超期
-            
+
         }
         else if (dto.FlowDirection is EFlowDirection.CenterToOrg)
         {
@@ -3701,23 +3764,23 @@ public class OrderController : BaseController
             .Includes(d => d.Workflow)
             .FirstAsync(d => d.Id == workflow.ExternalId);
         var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-	        dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
-		var audit = new OrderSendBackAudit
-        {
-	        OrderId = workflow.ExternalId,
-	        State = ESendBackAuditState.Apply,
-	        Content = dto.Opinion,
-	        SendBackData = dto,
-	        ApplyOrgId = currentStep.AcceptorOrgId,
-	        ApplyOrgName = currentStep!.AcceptorOrgName,
-	        SendBackOrgId = prevStep.HandlerOrgId, //prevStep.AcceptorOrgId,
-	        SendBackOrgName = prevStep.HandlerOrgName, //prevStep!.AcceptorOrgName,
-	        WorkflowOrgId = _sessionContext.RequiredOrgId,
-	        WorkflowUserId = _sessionContext.RequiredUserId,
-	        WorkflowRoleIds = _sessionContext.Roles.ToList(),
-	        TraceId = currentStep.Id
+            dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
+        var audit = new OrderSendBackAudit
+        {
+            OrderId = workflow.ExternalId,
+            State = ESendBackAuditState.Apply,
+            Content = dto.Opinion,
+            SendBackData = dto,
+            ApplyOrgId = currentStep.AcceptorOrgId,
+            ApplyOrgName = currentStep!.AcceptorOrgName,
+            SendBackOrgId = prevStep.HandlerOrgId, //prevStep.AcceptorOrgId,
+            SendBackOrgName = prevStep.HandlerOrgName, //prevStep!.AcceptorOrgName,
+            WorkflowOrgId = _sessionContext.RequiredOrgId,
+            WorkflowUserId = _sessionContext.RequiredUserId,
+            WorkflowRoleIds = _sessionContext.Roles.ToList(),
+            TraceId = currentStep.Id
         };
-		if (oneSendBack || twoSendBack)
+        if (oneSendBack || twoSendBack)
         {
             var sendBack = await _orderSendBackAuditRepository.Queryable()
                 .Where(x => x.OrderId == workflow.ExternalId && x.State == ESendBackAuditState.Apply).AnyAsync();
@@ -3730,16 +3793,16 @@ public class OrderController : BaseController
             if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
             if ((oneSendBack && isOrgToCenter) || (twoSendBack && isSecondToFirstOrgLevel))
             {
-               
+
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { Status = EOrderStatus.SendBackAudit })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             }
             else
             {
                 audit.State = ESendBackAuditState.End;
-                audit.AuditUser ="默认通过";
+                audit.AuditUser = "默认通过";
                 audit.AuditTime = DateTime.Now;
-				var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
+                var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
                     ? EProcessType.Zhiban
                     : EProcessType.Jiaoban;
@@ -3750,10 +3813,10 @@ public class OrderController : BaseController
         }
         else
         {
-	        audit.State = ESendBackAuditState.End;
-	        audit.AuditUser = "默认通过";
-	        audit.AuditTime = DateTime.Now;
-			var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
+            audit.State = ESendBackAuditState.End;
+            audit.AuditUser = "默认通过";
+            audit.AuditTime = DateTime.Now;
+            var flowDirection = await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
             var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
                 ? EProcessType.Zhiban
                 : EProcessType.Jiaoban;
@@ -3761,8 +3824,8 @@ public class OrderController : BaseController
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             //发送短信TODO
         }
-		await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
-	}
+        await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
+    }
 
     /// <summary>
     /// 工单业务退回审批
@@ -3805,7 +3868,7 @@ public class OrderController : BaseController
             //发送短信TODO
         }
         await _orderSendBackAuditRepository.UpdateAsync(sendBack, HttpContext.RequestAborted);
-	}
+    }
 
     /// <summary>
     /// 工单业务批量退回审批
@@ -4194,7 +4257,7 @@ public class OrderController : BaseController
                 cancellationToken: HttpContext.RequestAborted);
             //}
             await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, HttpContext.RequestAborted);
-           
+
 
             if (order != null && ("001171".Equals(model.OrgId) ||
                                   "001178".Equals(model.OrgId) ||
@@ -4334,7 +4397,7 @@ public class OrderController : BaseController
 
             var reTransactNum = order.ReTransactNum.HasValue ? order.ReTransactNum.Value + 1 : 1;
             var Status = model.StepType == EStepType.Start ? EOrderStatus.BackToUnAccept : EOrderStatus.SendBack;
-			await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, ReTransactNum = reTransactNum, Status = Status }).Where(o => o.Id == order.Id)
+            await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, ReTransactNum = reTransactNum, Status = Status }).Where(o => o.Id == order.Id)
                 .ExecuteCommandAsync(HttpContext.RequestAborted);
 
             //var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == dto.OrderId && x.VisitState != EVisitState.None);
@@ -4367,8 +4430,8 @@ public class OrderController : BaseController
         if (dto.Files.Any())
             special.ReplyFileJson = await _fileRepository.AddFileAsync(dto.Files, special.Id, "", HttpContext.RequestAborted);
         else
-	        special.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
-		await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
+            special.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
+        await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
         var order = await _orderRepository.GetAsync(x => x.Id == special.OrderId);
         if (special.State == 1)
         {
@@ -4471,8 +4534,8 @@ public class OrderController : BaseController
             if (dto.Files.Any())
                 special.ReplyFileJson = await _fileRepository.AddFileAsync(dto.Files, special.Id, "", HttpContext.RequestAborted);
             else
-	            special.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
-			await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
+                special.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
+            await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
             var order = await _orderRepository.GetAsync(x => x.Id == special.OrderId);
             if (special.State == 1)
             {
@@ -4641,7 +4704,7 @@ public class OrderController : BaseController
                 d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             //.WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType)//受理类型
-                                                                                                //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
+                                                                                                    //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)//来源渠道
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))

+ 10 - 0
src/Hotline.Share/Dtos/ContingencyManagement/ContingencyManagementOrdersDto.cs

@@ -166,6 +166,16 @@ namespace Hotline.Share.Dtos.ContingencyManagement
         /// </summary>
         public string ActualOpinion { get; set; } = "办理中...";
 
+        /// <summary>
+        /// 整理标题
+        /// </summary>
+        public string ArrangeTitle { get; set; }
+
+        /// <summary>
+        /// 整理内容
+        /// </summary>
+        public string ArrangeContent { get; set; }
+
         /// <summary>
         /// 整理后办理意见
         /// </summary>

+ 42 - 0
src/Hotline.Share/Dtos/ContingencyManagement/ContingencyManagementPagedKeywordRequest.cs

@@ -0,0 +1,42 @@
+using Hotline.Share.Requests;
+
+namespace Hotline.Share.Dtos.ContingencyManagement
+{
+    public record ContingencyManagementPagedKeywordRequest : PagedKeywordRequest
+    {
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 工单编码(20220101000001)
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string? HotspotSpliceName { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+
+        /// <summary>
+        /// 来源渠道(电话、网站、APP等)
+        /// </summary>
+        public string? SourceChannel { get; set; }
+
+        /// <summary>
+        /// 办结时间开始
+        /// </summary>
+        public DateTime? FiledStartTime { get; set; }
+
+        /// <summary>
+        /// 办结时间结束
+        /// </summary>
+        public DateTime? FiledEndTime { get; set; }
+    }
+}

+ 11 - 0
src/Hotline/ContingencyManagement/ContingencyManagementOrders.cs

@@ -178,6 +178,17 @@ namespace Hotline.ContingencyManagement
         [SugarColumn(Length = 8000)]
         public string ActualOpinion { get; set; } = "办理中...";
 
+        /// <summary>
+        /// 整理标题
+        /// </summary>
+        public string ArrangeTitle { get; set; }
+
+        /// <summary>
+        /// 整理内容
+        /// </summary>
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
+        public string ArrangeContent { get; set; }
+
         /// <summary>
         /// 整理后办理意见
         /// </summary>