Dun.Jason 1 year ago
parent
commit
f8a1a82b2e

+ 3 - 3
src/Hotline.Ai.Jths/AiQualityService.cs

@@ -31,11 +31,11 @@ namespace Hotline.Ai.Jths
 			{
 				RecordID = model.Id,
 				RecordPath = call.RecordingFileUrl,
-				AgentID = string.IsNullOrEmpty(order.AcceptorStaffNo) ? "999" : order.AcceptorStaffNo,
+				AgentID = "1001",
 				CallNumber = call.CPN,
 				CallTime = call.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss"),
 				RecordForm = recordForm,
-				Extend = model.Source.ToString(),
+				ywlx = model.Source.ToString(),
 			};
 			datalist.Add(aiQuality);
 			var data =JsonConvert.SerializeObject(datalist);
@@ -74,7 +74,7 @@ namespace Hotline.Ai.Jths
 			var req = new RestRequest(path, httpMethod);
 			req.AddHeader("content-type", "application/json");
 			req.AddHeader("token", "");
-			req.AddHeader("version", "1.0");
+			req.AddHeader("version", "V1.0");
 			var sign = MD5Encrypt(request.ToString());
 			req.AddHeader("sign", sign);
 			req.AddHeader("signType", "md5");

+ 2 - 2
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -103,8 +103,8 @@ public class BiCallController : BaseController
                   OutAnswered = SqlFunc.AggregateSum(SqlFunc.IIF(c.CallDirection == ECallDirection.Out && c.AnsweredTime != null, 1, 0)),
                   InHangupImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime == null && c.RingTimes < hangupSeconds, 1, 0)),
                   InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime == null, 1, 0)),
-                  InDurationAvg = SqlFunc.AggregateAvg(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime != null, c.Duration, 0)),
-                  OutDurationAvg = SqlFunc.AggregateAvg(SqlFunc.IIF(c.CallDirection == ECallDirection.Out && c.AnsweredTime != null, c.Duration, 0)),
+                  InDurationAvg = SqlFunc.Ceil(SqlFunc.AggregateAvg(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime != null, c.Duration, 0))),
+                  OutDurationAvg = SqlFunc.Ceil(SqlFunc.AggregateAvg(SqlFunc.IIF(c.CallDirection == ECallDirection.Out && c.AnsweredTime != null, c.Duration, 0))),
                   InAvailableAnswer = SqlFunc.AggregateSum(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime != null && c.Duration >= hangupSeconds, 1, 0)),
                   InHangupImmediateWhenAnswered = SqlFunc.AggregateSum(SqlFunc.IIF(c.CallDirection == ECallDirection.In && c.AnsweredTime != null && c.Duration < hangupSeconds, 1, 0)),
               })

+ 5 - 5
src/Hotline.Api/Controllers/DataSharing/WebPortalController.cs

@@ -359,7 +359,7 @@ namespace Hotline.Api.Controllers.DataSharing
         [HttpPost("getchartdata")]
         public async Task<OpenResponse> GetChartData()
         {
-            var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
+            var startDate = Convert.ToDateTime(DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd 00:00:00"));
             var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
 
             //数据查询
@@ -421,10 +421,10 @@ namespace Hotline.Api.Controllers.DataSharing
             var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
             GetStatistDto getStatistDto = new()
             {
-                AllCount = await _dataOrderRepository.Queryable().GroupBy(p => p.OrderId).CountAsync(),
-                AllTrandCount = await _dataOrderRepository.Queryable().GroupBy(p => p.OrderId).Where(p => p.HandleState == "办理完成").CountAsync(),
-                DayCount = await _dataOrderRepository.Queryable().GroupBy(p => p.OrderId).Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync(),
-                DayTrandCount = await _dataOrderRepository.Queryable().GroupBy(p => p.OrderId).Where(p => p.HandleState == "办理完成").Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync()
+                AllCount = await _dataOrderRepository.Queryable().CountAsync(),
+                AllTrandCount = await _dataOrderRepository.Queryable().Where(p => p.HandleState == "办理完成").CountAsync(),
+                DayCount = await _dataOrderRepository.Queryable().Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync(),
+                DayTrandCount = await _dataOrderRepository.Queryable().Where(p => p.HandleState == "办理完成").Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync()
             };
 
             return OpenResponse.Ok(WebPortalDeResponse<GetStatistDto>.Success(getStatistDto));

+ 35 - 10
src/Hotline.Api/Controllers/OrderController.cs

@@ -1217,19 +1217,24 @@ public class OrderController : BaseController
             .Includes(x => x.Visit, d => d.Order)
             .Includes(x => x.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                d => d.Visit.Order.Title.Contains(dto.Keyword!) || d.Visit.Order.No.Contains(dto.Keyword!));
+                x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!));
         if (dto.Status is EScreenStatus.Apply)
         {
             query.Where(x => (x.Status == EScreenStatus.Apply || x.Status == EScreenStatus.Approval)
                              && SqlFunc.JsonListObjectAny(x.Workflow.HandlerUsers, "Key",
                                  _sessionContext.RequiredUserId));
         }
-
+        if (dto.Status.HasValue && dto.Status == EScreenStatus.MyHandle)
+        {
+			query.Where(x => (x.Status != EScreenStatus.Apply )
+			                 && SqlFunc.JsonListObjectAny(x.Workflow.HandlerUsers, "Key",
+				                 _sessionContext.RequiredUserId));
+		}
         var (total, items) = await query
-            .WhereIF(dto.Status.HasValue && dto.Status == EScreenStatus.MyHandle,
-                x => x.Status != EScreenStatus.Apply && x.CreatorId == _sessionContext.UserId)
-            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+            //.WhereIF(dto.Status.HasValue && dto.Status == EScreenStatus.MyHandle,
+            //    x => x.Status != EScreenStatus.Apply && x.CreatorId == _sessionContext.UserId)
+            .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
+            .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
             .WhereIF(!string.IsNullOrEmpty(dto.OrderId), x => x.OrderId == dto.OrderId)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
@@ -1274,7 +1279,8 @@ public class OrderController : BaseController
         var workflowId = string.Empty;
         try
         {
-            await _orderRepository.OrderScreenRevisionVisit(visit.Id, false, HttpContext.RequestAborted);
+            //二次回访会改写数据
+            //await _orderRepository.OrderScreenRevisionVisit(visit.Id, false, HttpContext.RequestAborted);
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderScreen;
             startDto.Title = dto.Data.Content;
@@ -1884,6 +1890,7 @@ public class OrderController : BaseController
         {
             if (order.SmsSended)
             {
+                _logger.LogInformation($"推送短信: orderNo: {order.No}");
                 await _pushDomainService.PushAsync(new MessageDto
                 {
                     PushBusiness = EPushBusiness.OrderAccept,
@@ -2318,7 +2325,11 @@ public class OrderController : BaseController
         var specialAny = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == 0)
             .AnyAsync();
         if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
-        var model = _mapper.Map<OrderSpecial>(dto);
+
+        var screen = await _orderScreenRepository.Queryable().Where(x => x.OrderId == dto.OrderId && (int)x.Status < 2).AnyAsync();
+        if (screen) throw UserFriendlyException.SameMessage("工单存在甄别中的信息!");
+
+		var model = _mapper.Map<OrderSpecial>(dto);
         model.OrgId = _sessionContext.OrgId;
         model.OrgName = _sessionContext.OrgName;
         if (!dto.Audit) model.State = 1;
@@ -2344,7 +2355,14 @@ public class OrderController : BaseController
             if (publish != null)
             {
                 var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
-                await _orderPublishHistoryRepository.AddAsync(publishHistory, HttpContext.RequestAborted);
+                publishHistory.OrderPublishId = publish.Id;
+                publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
+                publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
+                publishHistory.ArrangeContentAfter = publish.ArrangeContent;
+                publishHistory.ArrangeContentBefor = publish.ArrangeContent;
+                publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
+                publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
+				await _orderPublishHistoryRepository.AddAsync(publishHistory, HttpContext.RequestAborted);
                 await _orderPublishRepository.RemoveAsync(publish, false, HttpContext.RequestAborted);
             }
 
@@ -2409,7 +2427,14 @@ public class OrderController : BaseController
             if (publish != null)
             {
                 var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
-                await _orderPublishHistoryRepository.AddAsync(publishHistory, HttpContext.RequestAborted);
+                publishHistory.OrderPublishId = publish.Id;
+                publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
+                publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
+                publishHistory.ArrangeContentAfter = publish.ArrangeContent;
+                publishHistory.ArrangeContentBefor = publish.ArrangeContent;
+                publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
+                publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
+				await _orderPublishHistoryRepository.AddAsync(publishHistory, HttpContext.RequestAborted);
                 await _orderPublishRepository.RemoveAsync(publish, false, HttpContext.RequestAborted);
             }
 

+ 32 - 17
src/Hotline.Api/Controllers/QualityController.cs

@@ -558,37 +558,52 @@ namespace Hotline.Api.Controllers
 		/// <returns></returns>
 		[AllowAnonymous]
 		[HttpPost("AiResult")]
-		public async Task AiResult([FromBody] AiQualityResultDto dto) 
+		public async Task AiResult([FromBody] List<AiQualityResultDto> dto) 
 		{
-			var quality = await _qualitey.GetAsync(dto.source_data.customer_id);
-			if (quality is { State: EQualityState.Apply })
+			foreach (var item in dto)
 			{
-				List<QualityDetail> details = new List<QualityDetail>();
-				foreach (var item in dto.analysis_data.score_items)
+				var quality = await _qualitey.GetAsync(item.record_id);
+				if (quality is { State: EQualityState.Apply } && item.score_items != null && item.score_items.Any())
 				{
-					QualityDetail detail = new QualityDetail
+					List<QualityDetail> details = new List<QualityDetail>();
+					foreach (var item2 in item.score_items)
 					{
-						QualityId = quality.Id,
-						Second = 0,
-						Name = item.name,
-						//Content = item.name,
-						Grade = item.score
-					};
-					details.Add(detail);
+						if (item2.score > 0)
+						{
+							QualityDetail detail = new QualityDetail
+							{
+								QualityId = quality.Id,
+								Second = 0,
+								Name = item2.name,
+								Content = item2.description,
+								Intelligent = true,
+								Grade = item2.score
+							};
+							details.Add(detail);
+						}
+					}
+					await _qualiteyDetail.AddRangeAsync(details);
 				}
-				await _qualiteyDetail.AddRangeAsync(details);
 			}
 		}
+
+		/// <summary>
+		/// 重推质检 
+		/// </summary>
+		/// <param name="id"></param>
+		/// <returns></returns>
 		[AllowAnonymous]
 		[HttpPost("AiResultTest/{id}")]
 		public async Task TaskAsync(string id)
 		{
-			var quality = await _qualitey.GetAsync(id);
-			var order = await _orderRepository.GetAsync(quality.OrderId);
+			var quality = await _qualitey.GetAsync(id, HttpContext.RequestAborted);
+			var order = await _orderRepository.GetAsync(quality.OrderId, HttpContext.RequestAborted);
 			if (order != null && !string.IsNullOrEmpty(order.CallId))
 			{
-				var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId);
+				quality.AiQuality = true;
+				var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId, HttpContext.RequestAborted);
 				await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, HttpContext.RequestAborted);
+				await _qualitey.UpdateAsync(quality, HttpContext.RequestAborted);
 			}
 		}
 

+ 4 - 3
src/Hotline.Application/Mappers/DataSharing/DsMapperConfigs.cs

@@ -114,7 +114,7 @@ namespace Hotline.Application.Mappers.DataSharing
             //延期申请
             config.ForType<PublishOrderDelayDto, DsDelayCaseInfoSend>()
             .Map(d => d.ApplyDelaynum, x => x.DelayNum)
-            .Map(d => d.ApplyDelayunit, x =>(int) x.DelayUnit)
+            .Map(d => d.ApplyDelayunit, x => (int)x.DelayUnit)
             .Map(d => d.ApplyName, x => x.EmployeeName)
             .Map(d => d.ApplyTime, x => x.ApplyDelayTime)
             .Map(d => d.ApplyOuname, x => x.ApplyOrgName)
@@ -130,7 +130,7 @@ namespace Hotline.Application.Mappers.DataSharing
            .Map(d => d.Title, x => x.CaseTitle)
            //.Map(d => d.AcceptorName, x => x.CaseRegister)
            //.Map(d => d.AcceptorStaffNo, x => x.CaseRegisterNo)
-          // .Map(d => d.CreationTime, x => x.CaseDate)
+           // .Map(d => d.CreationTime, x => x.CaseDate)
            .Map(d => d.Contact, x => x.PhoneNumber)
            .Map(d => d.FromName, x => x.AppLicantName)
            .Map(d => d.AgeRangeCode, x => x.AppLicantAge)
@@ -653,7 +653,8 @@ namespace Hotline.Application.Mappers.DataSharing
             #region 门户网站数据
             //办件摘编列表
             config.ForType<DsOrder, OrderListDto>()
-            .Map(d => d.FlowID, x => x.OrderId)
+               .Ignore(d => d.Source)
+               .Map(d => d.FlowID, x => x.OrderId)
                .Map(d => d.FlowCode, x => x.OrderNo)
                .Map(d => d.FlowPwd, x => x.Password)
                .Map(d => d.FlowTitle, x => string.IsNullOrEmpty(x.ArrangeTitle) ? x.Title : x.ArrangeTitle)

+ 4 - 2
src/Hotline.Application/Quality/QualityApplication.cs

@@ -74,7 +74,7 @@ namespace Hotline.Application.Quality
         {
             var quality = _mapper.Map<Hotline.Quality.Quality>(model);
             quality.InitId();
-			await _qualityRepository.AddAsync(quality, cancellationToken);
+			
             if (model.QualityDetails.Any())
             {
                 foreach (var item in model.QualityDetails)
@@ -95,12 +95,14 @@ namespace Hotline.Application.Quality
 					var order = await _orderRepository.GetAsync(model.OrderId);
 					if (order != null && !string.IsNullOrEmpty(order.CallId))
 					{
+                        quality.AiQuality = true;
 						var call = await _trCallRecordRepository.GetAsync(x=>x.CallAccept == order.CallId);
 						await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, cancellationToken);
 					}
 				}
             }
-        }
+            await _qualityRepository.AddAsync(quality, cancellationToken);
+		}
 
         public async Task UpdateQualityAsync(UpdateQualityDto model, CancellationToken cancellationToken)
         {

+ 14 - 9
src/Hotline.Share/Dtos/Quality/AiQualityDto.cs

@@ -71,17 +71,22 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 扩展字段
 		/// </summary>
-		public string Extend { get; set; }
+		public string ywlx { get; set; }
 	}
 
-	public class AiQualityResultDto
+	public class AiQualityResultDto : AiQualitySourceData
 	{
-		public AiQualitySourceData source_data { get; set; }
+		//public AiQualitySourceData source_data { get; set; }
 
-		public AiQualityAnalysisData analysis_data { get; set; }
+		//public AiQualityAnalysisData analysis_data { get; set; }
 	}
-	public class AiQualitySourceData
+	public class AiQualitySourceData : AiQualityAnalysisData
 	{
+		/// <summary>
+		/// 工单号:录音的唯一ID
+		/// </summary>
+		public string record_id { get; set; }
+
 		/// <summary>
 		/// 录音PATH地址
 		/// </summary>
@@ -120,7 +125,7 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 通话的来电时间
 		/// </summary>
-		public string call_time { get; set; }
+		public decimal call_time { get; set; }
 
 		/// <summary>
 		/// 录音格式,wav、mp3、v3、pcm等
@@ -155,7 +160,7 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 工单上传时间
 		/// </summary>
-		public string upload_time { get; set; }
+		public decimal upload_time { get; set; }
 
 		/// <summary>
 		/// 来源,1:平台上传;2:接口上传
@@ -170,7 +175,7 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 文件上传时间
 		/// </summary>
-		public string file_upload_time { get; set; }
+		public decimal file_upload_time { get; set; }
 
 		public AiQualityExtended extended_field { get; set; }
 
@@ -189,7 +194,7 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 智能质检时间
 		/// </summary>
-		public string quality_time { get; set; }
+		public decimal quality_time { get; set; }
 
 		/// <summary>
 		/// 是否减分[1是0否]

+ 11 - 1
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -83,6 +83,11 @@ namespace Hotline.Share.Dtos.Quality
 		/// 分值
 		/// </summary>
 		public int Grade { get; set; }
+
+		/// <summary>
+		/// 智能质检
+		/// </summary>
+		public bool? Intelligent { get; set; }
 	}
 	public class QualityDto : QualityBaseDto
 	{
@@ -151,7 +156,12 @@ namespace Hotline.Share.Dtos.Quality
 		/// 质检明细
 		/// </summary>
 		public List<QualityDetailDto> QualityDetails { get; set; }
-		
+
+		/// <summary>
+		/// 智能质检
+		/// </summary>
+		public bool AiQuality { get; set; }
+
 	}
 	public class QualityBaseDto {
 		public DateTime? LastModificationTime { get; set; }

+ 1 - 1
src/Hotline/DataSharing/Province/Services/ProvinceService.cs

@@ -446,7 +446,7 @@ namespace Hotline.DataSharing.Province.Services
                         CaseSource = dto.SourceChannel,
                         CaseSourceCode = dto.SourceChannelCode,
                         ExpiredTime = submitCaseInfo.TfdBackTimeBf,
-                        CaseType = submitCaseInfo.CaseType,
+                        CaseType = dto.AcceptType,
                         CaseTypeCode = dto.AcceptTypeCode,
                         AllDuration = 0,
                         IsProvince = false,

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

@@ -526,7 +526,7 @@ namespace Hotline.FlowEngine.Workflows
                     throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
 
                 var targetSteps = await CreateConfigStepsAsync(workflow, targetStepDefine, lastStep, dto,
-                    flowAssignInfo, cancellationToken);
+                    flowAssignInfo, EWorkflowTraceStatus.Jump, cancellationToken);
                 targetStep = targetSteps.First();
 
                 workflow.EndCountersign();
@@ -789,7 +789,7 @@ namespace Hotline.FlowEngine.Workflows
             startStep.Status = EWorkflowStepStatus.WaitForHandle;
             startStep.PrevChosenStepCode = null;
             startStep.StepExpiredTime = workflow.ExpiredTime;
-            
+
             startStep.InitId();
             return startStep;
         }
@@ -797,10 +797,11 @@ namespace Hotline.FlowEngine.Workflows
         #region private method
 
         public async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
-            List<Kv> handles, CancellationToken cancellationToken)
+            List<Kv> handles, EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
         {
             var startStep = CreateStartStep(workflow, startStepDefine, dto, handles);
             await _workflowStepRepository.AddAsync(startStep, cancellationToken);
+            await CreateTraceAsync(workflow, startStep, traceStatus, cancellationToken);
             return startStep;
         }
 
@@ -844,7 +845,7 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //todo 创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo, cancellationToken);
+                                flowAssignInfo, EWorkflowTraceStatus.Normal, cancellationToken);
                         }
                     }
                     else
@@ -886,13 +887,13 @@ namespace Hotline.FlowEngine.Workflows
                 //todo 创建动态下一级节点
                 nextSteps = await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto,
                     flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
-                    ECountersignPosition.None, false, cancellationToken);
+                    ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, cancellationToken);
             }
             else
             {
                 //todo 创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    cancellationToken);
+                    EWorkflowTraceStatus.Normal, cancellationToken);
             }
 
             return nextSteps;
@@ -912,7 +913,7 @@ namespace Hotline.FlowEngine.Workflows
 
             return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers, countersignId,
                 EWorkflowStepStatus.WaitForAccept, prevStep.GetNextStepCountersignPosition(),
-                false, cancellationToken);
+                false, EWorkflowTraceStatus.Normal, cancellationToken);
         }
 
         /// <summary>
@@ -1319,10 +1320,10 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.SetStatusRunnable();
 
             var targetStepNew = targetIsStartStep
-                ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
-                    new List<Kv> { new(_sessionContext.RequiredUserId, _sessionContext.UserName) }, cancellationToken)
-                : (await CreateConfigStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, flowAssignInfo,
-                    cancellationToken)).First();
+                ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, traceStatus, cancellationToken)
+                : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, flowAssignInfo.FlowAssignType, dto.NextHandlers,
+                    null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus, cancellationToken)).First();
+
 
             //更新当前办理节点信息
             workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
@@ -1401,6 +1402,7 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             FlowAssignInfo flowAssignInfo,
             //DateTime expiredTime,
+            EWorkflowTraceStatus traceStatus,
             CancellationToken cancellationToken)
         {
             List<Kv> handlers;
@@ -1416,7 +1418,7 @@ namespace Hotline.FlowEngine.Workflows
             }
 
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignInfo.FlowAssignType, handlers,
-                null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, cancellationToken);
+                null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus, cancellationToken);
         }
 
         private async Task<List<WorkflowStep>> CreateStepsAsync(
@@ -1431,6 +1433,7 @@ namespace Hotline.FlowEngine.Workflows
             ECountersignPosition csPosition,
             //DateTime expiredTime,
             bool isOrigin,
+            EWorkflowTraceStatus traceStatus,
             CancellationToken cancellationToken
         )
         {
@@ -1464,7 +1467,7 @@ namespace Hotline.FlowEngine.Workflows
             //create traces todo add range traces
             foreach (var step in steps)
             {
-                await CreateTraceAsync(workflow, step, EWorkflowTraceStatus.Normal, cancellationToken);
+                await CreateTraceAsync(workflow, step, traceStatus, cancellationToken);
             }
 
             return steps;

+ 5 - 0
src/Hotline/Quality/Quality.cs

@@ -85,5 +85,10 @@ namespace Hotline.Quality
 		/// </summary>
 		[Navigate(NavigateType.OneToOne, nameof(VisitId))]
 		public OrderVisit Visit { get; set; }
+
+		/// <summary>
+		/// 智能质检
+		/// </summary>
+		public bool? AiQuality { get; set; } = false;
 	}
 }

+ 6 - 1
src/Hotline/Quality/QualityDetail.cs

@@ -43,5 +43,10 @@ namespace Hotline.Quality
 		/// </summary>
 		[Navigate(NavigateType.OneToOne, nameof(QualityId))]
 		public Quality Quality { get; set; }
-	}
+
+		/// <summary>
+		/// 是否智能质检项目
+		/// </summary>
+		[SugarColumn(ColumnDescription = "是否智能质检项目")]
+		public bool? Intelligent { get; set; } = false;	}
 }