Преглед изворни кода

回访详情返回录音文件

qinchaoyue пре 5 месеци
родитељ
комит
b9b06a7ef3
2 измењених фајлова са 130 додато и 116 уклоњено
  1. 125 116
      src/Hotline.Api/Controllers/OrderController.cs
  2. 5 0
      src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

+ 125 - 116
src/Hotline.Api/Controllers/OrderController.cs

@@ -71,6 +71,7 @@ using static Lucene.Net.Util.Fst.Util;
 using DocumentFormat.OpenXml.Spreadsheet;
 using System.Threading;
 using Hotline.Caching.Services;
+using Hotline.CallCenter.Calls;
 
 namespace Hotline.Api.Controllers;
 
@@ -776,7 +777,7 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPut("publish/cancel")]
-    public async Task<string> PublishCancelAsync([FromBody]PublishCancelInDto dto)
+    public async Task<string> PublishCancelAsync([FromBody] PublishCancelInDto dto)
     {
         var enabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
         if (enabled == false) return "取消发布功能已被关闭";
@@ -818,7 +819,7 @@ public class OrderController : BaseController
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough , d=>d.IsPutThrough == false)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough, d => d.IsPutThrough == false)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.StartsWith(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
             .WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
@@ -941,20 +942,25 @@ public class OrderController : BaseController
         //获取系统配置智能回访语音URL头
         aiVisitVoiceBaseUrl = _systemSettingCacheManager.GetSetting(SettingConstants.AiVisitVoiceBaseUrl)?.SettingValue[0];
 
-        var histories = await _orderVisitRepository.Queryable()
-            .Includes(m => m.OrderVisitDetails)
-            .Where(m => m.OrderId == orderVisit.OrderId)
-            .Where(m => m.VisitState == EVisitState.None && m.NowEvaluate != null)
-            .Select(m => new OrderVisitDetailHistoryDto
-            {
-                VoiceEvaluate = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Seat).Select(s => s.VoiceEvaluate).First(),
-                SeatEvaluate = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Seat).Select(s => s.SeatEvaluate).First(),
-                VisitOrgName = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.VisitOrgName).First(),
-                OrgProcessingResults = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.OrgProcessingResults).First(),
-                OrgHandledAttitude = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.OrgHandledAttitude).First(),
-                VisitContent = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.VisitContent).First(),
-                VisitTime = m.VisitTime
-            }).ToListAsync();
+        var histories = new List<OrderVisitDetailHistoryDto>();
+        if (_appOptions.Value.IsZiGong)
+        {
+            histories = await _orderVisitRepository.Queryable()
+             .Includes(m => m.OrderVisitDetails)
+             .Where(m => m.OrderId == orderVisit.OrderId)
+             .Where(m => m.VisitState == EVisitState.None && m.NowEvaluate != null)
+             .Select(m => new OrderVisitDetailHistoryDto
+             {
+                 VoiceEvaluate = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Seat).Select(s => s.VoiceEvaluate).First(),
+                 SeatEvaluate = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Seat).Select(s => s.SeatEvaluate).First(),
+                 VisitOrgName = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.VisitOrgName).First(),
+                 OrgProcessingResults = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.OrgProcessingResults).First(),
+                 OrgHandledAttitude = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.OrgHandledAttitude).First(),
+                 VisitContent = m.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org).Select(s => s.VisitContent).First(),
+                 VisitTime = m.VisitTime,
+                 CallId = m.CallId
+             }).ToListAsync();
+        }
 
         var seat = orderVisit.OrderVisitDetails.FirstOrDefault(m => m.VisitTarget == EVisitTarget.Seat);
         if (orderVisit.VisitState == EVisitState.WaitForVisit)
@@ -1086,7 +1092,7 @@ public class OrderController : BaseController
                         });
                 }
                 if (visitDto.CallId != null)
-                { 
+                {
                     visitDto.CallId = await _callApplication.GetOrSetCallIdAsync(visitDto.CallId, HttpContext.RequestAborted);
                 }
                 await _orderApplication.SaveOrderVisit(visitDto, HttpContext.RequestAborted);
@@ -1262,22 +1268,23 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPut("visit/put_through")]
-	public async Task VisitPutThrough([FromBody] VisitPutThroughDto dto ) {
+    public async Task VisitPutThrough([FromBody] VisitPutThroughDto dto)
+    {
 
         await _orderVisitRepository.Updateable().SetColumns(x => new OrderVisit { IsPutThrough = false }).Where(x => x.Id == dto.id).ExecuteCommandAsync(HttpContext.RequestAborted);
     }
 
 
-	#endregion
+    #endregion
 
-	#region 二次回访申请
+    #region 二次回访申请
 
-	/// <summary>
-	/// 可二次回访申请列表
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	[HttpGet("visitapply/visitagainlist")]
+    /// <summary>
+    /// 可二次回访申请列表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("visitapply/visitagainlist")]
     public async Task<PagedDto<OrderCanVisitAgainDto>> OrderVisitAgainList([FromQuery] OrderVisitAgainListDto dto)
     {
         var (total, items) = await _orderVisitedDetailRepository.Queryable()
@@ -1708,17 +1715,17 @@ public class OrderController : BaseController
     {
         //var workflow = await _workflowRepository.GetAsync(workflowId, HttpContext.RequestAborted);
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: true,
-	        cancellationToken: HttpContext.RequestAborted);
+            cancellationToken: HttpContext.RequestAborted);
         var currentStep = workflow.Steps.FirstOrDefault(d => d.Status == EWorkflowStepStatus.WaitForAccept || d.Status == EWorkflowStepStatus.WaitForHandle);
         if (workflow != null)
         {
-	    
-			var orderDelay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == workflow.ExternalId)
+
+            var orderDelay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == workflow.ExternalId)
                 .FirstAsync(HttpContext.RequestAborted);
             if (orderDelay != null)
             {
-				var result = await _workflowApplication.GetNextStepsAsync(workflowId, HttpContext.RequestAborted);
-				if (!orderDelay.Order.IsProvince)
+                var result = await _workflowApplication.GetNextStepsAsync(workflowId, HttpContext.RequestAborted);
+                if (!orderDelay.Order.IsProvince)
                 {
                     if (result.Steps.Any(x => x.Value == "省审批"))
                     {
@@ -1727,13 +1734,13 @@ public class OrderController : BaseController
                 }
                 if (!_sessionContext.OrgIsCenter && currentStep.Name != "中心初审")
                 {
-	                if (result.Steps.Any(x => x.Value == "中心终审"))
-	                {
-		                result.Steps.Remove(result.Steps.First(x => x.Value == "中心终审"));
-	                }
+                    if (result.Steps.Any(x => x.Value == "中心终审"))
+                    {
+                        result.Steps.Remove(result.Steps.First(x => x.Value == "中心终审"));
+                    }
                 }
 
-				return result;
+                return result;
             }
         }
 
@@ -1908,14 +1915,15 @@ public class OrderController : BaseController
                 result.Steps.Remove(result.Steps.First(x => x.Value == "中心初审"));
             }
         }
-        else {
-	        if (result.Steps.Any(x => x.Value == "中心终审"))
-	        {
-		        result.Steps.Remove(result.Steps.First(x => x.Value == "中心终审"));
-	        }
-		}
+        else
+        {
+            if (result.Steps.Any(x => x.Value == "中心终审"))
+            {
+                result.Steps.Remove(result.Steps.First(x => x.Value == "中心终审"));
+            }
+        }
         return result;
-	}
+    }
 
     /// <summary>
     /// 延期页面基础信息
@@ -1954,8 +1962,8 @@ public class OrderController : BaseController
             // dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
             dto.CreationTimeStart = await _expireTime.CalcWorkTimeReduce(DateTime.Now, 5);
         }
-		var (total, items) = await _orderApplication.MayScreenList(dto)
-			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        var (total, items) = await _orderApplication.MayScreenList(dto)
+            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
     }
 
@@ -1966,49 +1974,49 @@ public class OrderController : BaseController
     [HttpPost("mayscreen/_export")]
     public async Task<FileStreamResult> ScreenListExport([FromBody] ExportExcelDto<MayScreenListDto> dto)
     {
-	    if (_appOptions.Value.IsYiBin) dto.QueryDto.ScreenType = EOrderScreenType.Org;
+        if (_appOptions.Value.IsYiBin) dto.QueryDto.ScreenType = EOrderScreenType.Org;
 
-	    dto.QueryDto.CreationTimeEnd = DateTime.Now;
-	    dto.QueryDto.CreationTimeStart = DateTime.Now;
-	    if (dto.QueryDto.IsHomePage != null && dto.QueryDto.IsHomePage == true)
-	    {
-		    // dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
-		    dto.QueryDto.CreationTimeStart = await _expireTime.CalcWorkTimeReduce(DateTime.Now, 5);
-	    }
+        dto.QueryDto.CreationTimeEnd = DateTime.Now;
+        dto.QueryDto.CreationTimeStart = DateTime.Now;
+        if (dto.QueryDto.IsHomePage != null && dto.QueryDto.IsHomePage == true)
+        {
+            // dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
+            dto.QueryDto.CreationTimeStart = await _expireTime.CalcWorkTimeReduce(DateTime.Now, 5);
+        }
 
-		var query = _orderApplication.MayScreenList(dto.QueryDto);
-	    List<OrderVisitDetail> data;
-	    if (dto.IsExportAll)
-	    {
-		    data = await query.ToListAsync(HttpContext.RequestAborted);
-	    }
-	    else
-	    {
-		    var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
-		    data = items;
-	    }
+        var query = _orderApplication.MayScreenList(dto.QueryDto);
+        List<OrderVisitDetail> 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<OrderVisitDetailDto>>(data);
+        var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
 
-	    dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
 
-	    var dtos = dataDtos
-		    .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
-		    .Cast<object>()
-		    .ToList();
+        var dtos = dataDtos
+            .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
 
-	    var stream = ExcelHelper.CreateStream(dtos);
+        var stream = ExcelHelper.CreateStream(dtos);
 
-	    return ExcelStreamResult(stream, "工单甄别待申请列表数据");
+        return ExcelStreamResult(stream, "工单甄别待申请列表数据");
     }
 
 
-	/// <summary>
-	/// 工单甄别列表
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	[HttpGet("screen")]
+    /// <summary>
+    /// 工单甄别列表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("screen")]
     public async Task<PagedDto<OrderScreenListDto>> ScreenList([FromQuery] ScreenListDto dto)
     {
         var (total, items) = await _orderApplication.OrderScreenList(dto)
@@ -2206,13 +2214,14 @@ public class OrderController : BaseController
                 result.Steps.Remove(result.Steps.First(x => x.Value == "中心初审"));
             }
         }
-        else {
-			if (result.Steps.Any(x => x.Value == "中心班长"))
-			{
-				result.Steps.Remove(result.Steps.First(x => x.Value == "中心班长"));
-			}
-		}
-		return result;
+        else
+        {
+            if (result.Steps.Any(x => x.Value == "中心班长"))
+            {
+                result.Steps.Remove(result.Steps.First(x => x.Value == "中心班长"));
+            }
+        }
+        return result;
     }
 
     /// <summary>
@@ -2252,11 +2261,11 @@ public class OrderController : BaseController
 
                 if (!_sessionContext.OrgIsCenter)
                 {
-					if (result.Steps.Any(x => x.Value == "中心班长"))
-					{
-						result.Steps.Remove(result.Steps.First(x => x.Value == "中心班长"));
-					}
-				}
+                    if (result.Steps.Any(x => x.Value == "中心班长"))
+                    {
+                        result.Steps.Remove(result.Steps.First(x => x.Value == "中心班长"));
+                    }
+                }
                 return result;
             }
         }
@@ -3299,7 +3308,7 @@ public class OrderController : BaseController
     [HttpPost("add-anonymous")]
     [AllowAnonymous]
     [LogFilter("省平台调用记录")]
-	public async Task<AddOrderResponse> AddAnonymous([FromBody] AddOrderDto dto)
+    public async Task<AddOrderResponse> AddAnonymous([FromBody] AddOrderDto dto)
     {
         return await _orderApplication.ReceiveOrderFromExternalAsync(dto, HttpContext.RequestAborted);
     }
@@ -3613,14 +3622,14 @@ public class OrderController : BaseController
         BasicWorkflowDto workflowDto, CancellationToken cancellationToken)
     {
         var isAutoFillSummaryOpinion = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsAutoFillSummaryOpinion).SettingValue[0]);
-        
+
         switch (orderHandleFlowDto.OrderAssignMode)
         {
             case EOrderAssignMode.AdjoinLevel:
                 var nextDto = _mapper.Map<NextWorkflowDto>(workflowDto);
                 nextDto.WorkflowId = startStep.WorkflowId;
                 nextDto.StepId = startStep.Id;
-                
+
                 if (workflowDto.BusinessType == EBusinessType.Send)
                 {
                     // 宜宾需求: 1.是否是派单节点  2.是否存在历史派单节点  3.存在获取上个派单节点  4.不存在走平均派单
@@ -3653,7 +3662,7 @@ public class OrderController : BaseController
                     }
                 }
 
-                await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime,isAutoFillSummaryOpinion, cancellationToken);
+                await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime, isAutoFillSummaryOpinion, cancellationToken);
                 break;
             case EOrderAssignMode.CrossLevel:
                 if (!orderHandleFlowDto.CrossSteps.Any())
@@ -3662,7 +3671,7 @@ public class OrderController : BaseController
                 orderHandleFlowDto.CrossSteps = orderHandleFlowDto.CrossSteps.OrderBy(d => d.Sort).ToList();
                 var stepCount = orderHandleFlowDto.CrossSteps.Count;
                 var unhandleSteps = new List<WorkflowStep> { startStep };
-                for (int i = 0; i < stepCount; i++)
+                for (int i = 0;i < stepCount;i++)
                 {
                     var crossStep = orderHandleFlowDto.CrossSteps[i];
                     var tempSteps = new List<WorkflowStep>();
@@ -3858,7 +3867,7 @@ public class OrderController : BaseController
             IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
             OrderTags = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag),
             FocusOnEvents = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FocusOnEvent)
-    };
+        };
         return rsp;
     }
 
@@ -3976,14 +3985,14 @@ public class OrderController : BaseController
     /// 批量归档
     /// </summary>
     [HttpPost("batch-file")]
-    public async Task BatchFile([FromBody]OrderBatchFileDto dto)
+    public async Task BatchFile([FromBody] OrderBatchFileDto dto)
     {
         var orders = await _orderRepository.Queryable()
             .Where(d => dto.OrderIds.Contains(d.Id))
             .ToListAsync(HttpContext.RequestAborted);
         foreach (var order in orders)
         {
-            await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId,dto.Opinion,dto.Files,
+            await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId, dto.Opinion, dto.Files,
                 order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
         }
     }
@@ -4040,9 +4049,9 @@ public class OrderController : BaseController
             .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
             .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-            .OrderByDescending(d=> d.IsUrgent)
-            .OrderByIF(string.IsNullOrEmpty(dto.SortField),d => d.StartTime ,OrderByType.Desc)
-            .OrderByIF(dto is { SortField: "creationTime", SortRule:0 },d=> d.CreationTime,OrderByType.Asc) //创建时间升序
+            .OrderByDescending(d => d.IsUrgent)
+            .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
+            .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
             .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
             .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
@@ -4137,7 +4146,7 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName == dto.CenterToOrgHandlerName)
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
             .OrderBy(d => d.Status)
-            .OrderByIF(string.IsNullOrEmpty(dto.SortField),d => d.CreationTime, OrderByType.Desc)
+            .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)
             .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
             .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
             .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
@@ -4771,17 +4780,17 @@ public class OrderController : BaseController
             .AnyAsync();
         if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
         var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
-		await _orderApplication.SpecialVerify(dto, order, HttpContext.RequestAborted);
+        await _orderApplication.SpecialVerify(dto, order, HttpContext.RequestAborted);
 
-		var  workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
+        var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
         var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
         if (currentStep is null)
-	        currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
+            currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
 
-		var model = _mapper.Map<OrderSpecial>(dto);
-        model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId: currentStep.HandlerOrgId;
+        var model = _mapper.Map<OrderSpecial>(dto);
+        model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId : currentStep.HandlerOrgId;
         model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;
-		var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
+        var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
         model.StepName = step.Name;
         model.StepCode = step.Code;
         model.Status = order.Status;
@@ -4952,12 +4961,12 @@ public class OrderController : BaseController
     }
 
 
-	/// <summary>
-	/// 工单重办信息
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	[HttpPost("re_transact")]
+    /// <summary>
+    /// 工单重办信息
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("re_transact")]
     [LogFilter("工单重办")]
     public async Task Add([FromBody] OrderReTransactDto dto)
     {
@@ -4985,11 +4994,11 @@ public class OrderController : BaseController
         var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
         var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
         if (currentStep is null)
-	        currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
+            currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
 
         model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId : currentStep.HandlerOrgId;
         model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;
-		var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
+        var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
         model.StepName = step.Name;
         model.StepCode = step.Code;
         model.State = 1;

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

@@ -937,6 +937,11 @@ namespace Hotline.Share.Dtos.Order
         public string? OrgHandledAttitudeValue => this.OrgHandledAttitude?.Value;
         public string? VisitContent { get; set; }
         public DateTime? VisitTime { get; set; }
+
+        /// <summary>
+        /// 通话Id
+        /// </summary>
+        public string? CallId { get; set; }
     }
 
     public class DistributionVisitRspDto