Browse Source

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

田爽 5 months ago
parent
commit
bbf2ab76b1

+ 134 - 131
src/Hotline.Api/Controllers/OrderController.cs

@@ -305,8 +305,8 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
-            //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
-            //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
+                                                                                              //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
+                                                                                              //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
             .WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
             .WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
             .WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
             .WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
@@ -1838,7 +1838,7 @@ public class OrderController : BaseController
             if (!_sessionContext.OrgIsCenter)
             if (!_sessionContext.OrgIsCenter)
             {
             {
                 query.Where(d => d.AutomaticDelayNum == 0 || d.AutomaticDelayNum == null);
                 query.Where(d => d.AutomaticDelayNum == 0 || d.AutomaticDelayNum == null);
-			}
+            }
         }
         }
 
 
         var (total, items) = await query
         var (total, items) = await query
@@ -1988,7 +1988,7 @@ public class OrderController : BaseController
             .Includes(x => x.OrderScreens)
             .Includes(x => x.OrderScreens)
             .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
             .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
                         x.OrderScreens.Any() == false
                         x.OrderScreens.Any() == false
-                //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
+            //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
             )
             )
             .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.OrderVisit.Order.IsProvince == false)
             .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.OrderVisit.Order.IsProvince == false)
             .WhereIF(dto.ScreenSendBack is 1,
             .WhereIF(dto.ScreenSendBack is 1,
@@ -3151,7 +3151,7 @@ public class OrderController : BaseController
                 cancellationToken: HttpContext.RequestAborted);
                 cancellationToken: HttpContext.RequestAborted);
 
 
             List<OrderRemarksDto> remarks = workflow.Steps.Where(x => !string.IsNullOrEmpty(x.Remark)).Select(x => new OrderRemarksDto
             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();
+            { Remark = x.Remark, RemarkTime = x.CreationTime, RemarkUser = x.CreatorName }).ToList();
             dto.OrderRemarks = remarks;
             dto.OrderRemarks = remarks;
             if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.SendBackAudit || order.Status == EOrderStatus.BackToUnAccept)
             if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.SendBackAudit || order.Status == EOrderStatus.BackToUnAccept)
             {
             {
@@ -3589,7 +3589,7 @@ public class OrderController : BaseController
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
             startDto.Title = order.Title;
             startDto.Title = order.Title;
-            var (workflow,startStep) = await _workflowDomainService.StartAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
+            var (workflow, startStep) = await _workflowDomainService.StartAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
 
 
             await HandleOrderAsync(order, workflow, startStep, dto.Data, dto.Workflow, HttpContext.RequestAborted);
             await HandleOrderAsync(order, workflow, startStep, dto.Data, dto.Workflow, HttpContext.RequestAborted);
         }
         }
@@ -3599,7 +3599,7 @@ public class OrderController : BaseController
             throw new UserFriendlyException($"工单开启流程失败!, {e.Message}, {e.StackTrace}", "工单开启流程失败");
             throw new UserFriendlyException($"工单开启流程失败!, {e.Message}, {e.StackTrace}", "工单开启流程失败");
         }
         }
 
 
-        if (_appOptions.Value.IsYiBin && dto.Data.Transpond.HasValue && dto.Data.Transpond.Value)
+        if (_appOptions.Value.IsYiBin && order.Transpond.HasValue && order.Transpond.Value)
         {
         {
             //开启流程处理事件,处理市州互转
             //开启流程处理事件,处理市州互转
             await _publisher.PublishAsync(new OrderStartWorkflowNotify(order.Id), PublishStrategy.ParallelWhenAll,
             await _publisher.PublishAsync(new OrderStartWorkflowNotify(order.Id), PublishStrategy.ParallelWhenAll,
@@ -3656,19 +3656,20 @@ public class OrderController : BaseController
     }
     }
 
 
     private async Task HandleOrderAsync(Order order, Workflow workflow, WorkflowStep startStep, OrderHandleFlowDto orderHandleFlowDto,
     private async Task HandleOrderAsync(Order order, Workflow workflow, WorkflowStep startStep, OrderHandleFlowDto orderHandleFlowDto,
-        BasicWorkflowDto workflowDto,
-        CancellationToken cancellationToken)
+        BasicWorkflowDto workflowDto, CancellationToken cancellationToken)
     {
     {
+        var isAutoFillSummaryOpinion = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsAutoFillSummaryOpinion).SettingValue[0]);
+        
         switch (orderHandleFlowDto.OrderAssignMode)
         switch (orderHandleFlowDto.OrderAssignMode)
         {
         {
             case EOrderAssignMode.AdjoinLevel:
             case EOrderAssignMode.AdjoinLevel:
                 var nextDto = _mapper.Map<NextWorkflowDto>(workflowDto);
                 var nextDto = _mapper.Map<NextWorkflowDto>(workflowDto);
                 nextDto.WorkflowId = startStep.WorkflowId;
                 nextDto.WorkflowId = startStep.WorkflowId;
                 nextDto.StepId = startStep.Id;
                 nextDto.StepId = startStep.Id;
-
-                // 宜宾需求: 1.是否是判断节点  2.是否存在历史派单节点  3.存在获取上个派单节点  4.不存在走平均派单
+                
                 if (workflowDto.BusinessType == EBusinessType.Send)
                 if (workflowDto.BusinessType == EBusinessType.Send)
                 {
                 {
+                    // 宜宾需求: 1.是否是派单节点  2.是否存在历史派单节点  3.存在获取上个派单节点  4.不存在走平均派单
                     if (_appOptions.Value.IsYiBin)
                     if (_appOptions.Value.IsYiBin)
                     {
                     {
                         var sendOrderTraces = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send);
                         var sendOrderTraces = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send);
@@ -3716,7 +3717,7 @@ public class OrderController : BaseController
                     }
                     }
                 }
                 }
 
 
-                await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime, cancellationToken);
+                await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime,isAutoFillSummaryOpinion, cancellationToken);
                 break;
                 break;
             case EOrderAssignMode.CrossLevel:
             case EOrderAssignMode.CrossLevel:
                 if (!orderHandleFlowDto.CrossSteps.Any())
                 if (!orderHandleFlowDto.CrossSteps.Any())
@@ -3746,7 +3747,8 @@ public class OrderController : BaseController
                             OrgId = unhandleStep.HandlerOrgId,
                             OrgId = unhandleStep.HandlerOrgId,
                             OrgName = unhandleStep.HandlerOrgName,
                             OrgName = unhandleStep.HandlerOrgName,
                         };
                         };
-                        var nextSteps = await _workflowDomainService.NextAsync(operater, nextflowDto, order.ExpiredTime, cancellationToken);
+                        var nextSteps = await _workflowDomainService.NextAsync(operater, nextflowDto, order.ExpiredTime,
+                            isAutoFillSummaryOpinion, cancellationToken);
                         tempSteps.AddRange(nextSteps);
                         tempSteps.AddRange(nextSteps);
                     }
                     }
 
 
@@ -4030,9 +4032,9 @@ public class OrderController : BaseController
     {
     {
         var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
         var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
         if (isHandledStep)
         if (isHandledStep)
-	        dto.QueryType = null;
+            dto.QueryType = null;
 
 
-		var isAdmin = _orderDomainService.IsCheckAdmin();
+        var isAdmin = _orderDomainService.IsCheckAdmin();
         var query = _orderRepository
         var query = _orderRepository
             .Queryable(hasHandledStep: isHandledStep, isAdmin: isAdmin)
             .Queryable(hasHandledStep: isHandledStep, isAdmin: isAdmin)
             .Includes(d => d.OrderSpecials);
             .Includes(d => d.OrderSpecials);
@@ -4877,27 +4879,28 @@ public class OrderController : BaseController
 
 
             if (dto.FlowDirection is EFlowDirection.OrgToOrg)
             if (dto.FlowDirection is EFlowDirection.OrgToOrg)
             {
             {
-	            expiredTime.ExpiredTime = order.ExpiredTime.Value;
-	            expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-	            expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-			}
-            else {
-				if (_appOptions.Value.IsZiGong)
-				{
-					if (dto.FlowDirection != null)
-					{
-						expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, dto.FlowDirection.Value, order.Adapt<OrderTimeClacInfo>());
-					}
-					else
-					{
-						expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-					}
-				}
-				else
-				{
-					expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-				}
-			}
+                expiredTime.ExpiredTime = order.ExpiredTime.Value;
+                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
+                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
+            }
+            else
+            {
+                if (_appOptions.Value.IsZiGong)
+                {
+                    if (dto.FlowDirection != null)
+                    {
+                        expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, dto.FlowDirection.Value, order.Adapt<OrderTimeClacInfo>());
+                    }
+                    else
+                    {
+                        expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                    }
+                }
+                else
+                {
+                    expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                }
+            }
 
 
             var processType = dto.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
             var processType = dto.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
                 ? EProcessType.Zhiban
                 ? EProcessType.Zhiban
@@ -4913,13 +4916,13 @@ public class OrderController : BaseController
             //	ETimeType.WorkDay,
             //	ETimeType.WorkDay,
             //	dto.TimeLimit.Value, order.AcceptTypeCode);
             //	dto.TimeLimit.Value, order.AcceptTypeCode);
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                {
-                    ExpiredTime = expiredTime.ExpiredTime,
-                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-                    ProcessType = processType,
-                    Status = EOrderStatus.Special
-                })
+            {
+                ExpiredTime = expiredTime.ExpiredTime,
+                NearlyExpiredTime = expiredTime.NearlyExpiredTime,
+                NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
+                ProcessType = processType,
+                Status = EOrderStatus.Special
+            })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             var orderDto = _mapper.Map<OrderDto>(order);
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
@@ -5075,11 +5078,11 @@ public class OrderController : BaseController
 
 
                 endTime = expiredTime.EndTime;
                 endTime = expiredTime.EndTime;
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                    {
-                        ExpiredTime = expiredTime.EndTime,
-                        NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                        NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
-                    })
+                {
+                    ExpiredTime = expiredTime.EndTime,
+                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
+                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
+                })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
@@ -5171,50 +5174,50 @@ public class OrderController : BaseController
                 HandlerType = special.HandlerType.Value,
                 HandlerType = special.HandlerType.Value,
                 BusinessType = special.BusinessType.Value
                 BusinessType = special.BusinessType.Value
             };
             };
-			ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
-
-			if (dto.FlowDirection is EFlowDirection.OrgToOrg)
-			{
-				expiredTime.ExpiredTime = order.ExpiredTime.Value;
-				expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-				expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-			}
-			else
-			{
-				if (_appOptions.Value.IsZiGong)
-				{
-					if (dto.FlowDirection != null)
-					{
-						expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, dto.FlowDirection.Value, order.Adapt<OrderTimeClacInfo>());
-					}
-					else
-					{
-						expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-					}
-				}
-				else
-				{
-					expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-				}
-			}
-			if (expiredTime.ExpiredTime < order.ExpiredTime)
-			{
-				expiredTime.ExpiredTime = order.ExpiredTime.Value;
-				expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-				expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-			}
-
-			var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
+            ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
+
+            if (dto.FlowDirection is EFlowDirection.OrgToOrg)
+            {
+                expiredTime.ExpiredTime = order.ExpiredTime.Value;
+                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
+                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
+            }
+            else
+            {
+                if (_appOptions.Value.IsZiGong)
+                {
+                    if (dto.FlowDirection != null)
+                    {
+                        expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, dto.FlowDirection.Value, order.Adapt<OrderTimeClacInfo>());
+                    }
+                    else
+                    {
+                        expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                    }
+                }
+                else
+                {
+                    expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                }
+            }
+            if (expiredTime.ExpiredTime < order.ExpiredTime)
+            {
+                expiredTime.ExpiredTime = order.ExpiredTime.Value;
+                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
+                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
+            }
+
+            var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
                 ? EProcessType.Zhiban
                 ? EProcessType.Zhiban
                 : EProcessType.Jiaoban;
                 : EProcessType.Jiaoban;
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                {
-                    ExpiredTime = expiredTime.ExpiredTime,
-                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-                    ProcessType = processType,
-                    Status = EOrderStatus.Special
-                })
+            {
+                ExpiredTime = expiredTime.ExpiredTime,
+                NearlyExpiredTime = expiredTime.NearlyExpiredTime,
+                NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
+                ProcessType = processType,
+                Status = EOrderStatus.Special
+            })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             var orderDto = _mapper.Map<OrderDto>(order);
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
@@ -5306,49 +5309,49 @@ public class OrderController : BaseController
                     HandlerType = special.HandlerType.Value,
                     HandlerType = special.HandlerType.Value,
                     BusinessType = special.BusinessType.Value
                     BusinessType = special.BusinessType.Value
                 };
                 };
-				ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
-
-				if (dto.FlowDirection is EFlowDirection.OrgToOrg)
-				{
-					expiredTime.ExpiredTime = order.ExpiredTime.Value;
-					expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-					expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-				}
-				else
-				{
-					if (_appOptions.Value.IsZiGong)
-					{
-						if (dto.FlowDirection != null)
-						{
-							expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, dto.FlowDirection.Value, order.Adapt<OrderTimeClacInfo>());
-						}
-						else
-						{
-							expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-						}
-					}
-					else
-					{
-						expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-					}
-				}
-				if (expiredTime.ExpiredTime < order.ExpiredTime)
-				{
-					expiredTime.ExpiredTime = order.ExpiredTime.Value;
-					expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-					expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-				}
-				var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
+                ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
+
+                if (dto.FlowDirection is EFlowDirection.OrgToOrg)
+                {
+                    expiredTime.ExpiredTime = order.ExpiredTime.Value;
+                    expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
+                    expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
+                }
+                else
+                {
+                    if (_appOptions.Value.IsZiGong)
+                    {
+                        if (dto.FlowDirection != null)
+                        {
+                            expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, dto.FlowDirection.Value, order.Adapt<OrderTimeClacInfo>());
+                        }
+                        else
+                        {
+                            expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                        }
+                    }
+                    else
+                    {
+                        expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                    }
+                }
+                if (expiredTime.ExpiredTime < order.ExpiredTime)
+                {
+                    expiredTime.ExpiredTime = order.ExpiredTime.Value;
+                    expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
+                    expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
+                }
+                var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
                     ? EProcessType.Zhiban
                     ? EProcessType.Zhiban
                     : EProcessType.Jiaoban;
                     : EProcessType.Jiaoban;
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                    {
-                        ExpiredTime = expiredTime.ExpiredTime,
-                        NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                        NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-                        ProcessType = processType,
-                        Status = EOrderStatus.Special
-                    })
+                {
+                    ExpiredTime = expiredTime.ExpiredTime,
+                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
+                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
+                    ProcessType = processType,
+                    Status = EOrderStatus.Special
+                })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
@@ -5491,7 +5494,7 @@ public class OrderController : BaseController
                 d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
                 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.Content), d => d.Content.Contains(dto.Content!))
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
             .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.Channel), d => d.SourceChannelCode == dto.Channel) //来源渠道
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .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!))
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))
@@ -7228,7 +7231,7 @@ public class OrderController : BaseController
         {
         {
             await _orderRepository.Updateable()
             await _orderRepository.Updateable()
                 .SetColumns(o => new Orders.Order()
                 .SetColumns(o => new Orders.Order()
-                    { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username, Status = EOrderStatus.HandOverToUnAccept })
+                { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username, Status = EOrderStatus.HandOverToUnAccept })
                 .Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
                 .Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
         }
         }
         else
         else

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

@@ -668,7 +668,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             TimeTypeOptions = EnumExts.GetDescriptions<ETimeType>().ToList(),
             TimeTypeOptions = EnumExts.GetDescriptions<ETimeType>().ToList(),
             IsMainHandlerShow = workflow.WorkflowDefinition.IsMainHandlerShow,
             IsMainHandlerShow = workflow.WorkflowDefinition.IsMainHandlerShow,
             StepId = currentStep.Id,
             StepId = currentStep.Id,
-            CurrentOrgLevel = string.IsNullOrEmpty(currentStep.HandlerOrgId) ? null : currentStep.HandlerOrgId.CalcOrgLevel()
+            CurrentOrgLevel = string.IsNullOrEmpty(currentStep.HandlerOrgId) ? null : currentStep.HandlerOrgId.CalcOrgLevel(),
+            Opinion = currentStep.Opinion,
         };
         };
 
 
         var currentStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, currentStep.Code);
         var currentStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, currentStep.Code);
@@ -692,18 +693,18 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         {
         {
             if (currentStep.IsCountersignEndStep)
             if (currentStep.IsCountersignEndStep)
             {
             {
-                // 宜宾需求:会签汇总节点展示会签办理节点办理意见
-                var countersignHandleSteps = workflow.Steps.Where(d =>
-                    d.CountersignId == currentStep.CountersignId &&
-                    d.CountersignPosition is ECountersignPosition.Multi or ECountersignPosition.Single).ToList();
-                var sb = new StringBuilder();
-                foreach (var countersignHandleStep in countersignHandleSteps)
-                {
-                    //sb.AppendLine($"{countersignHandleStep.GetActualHandler()?.GetHandler().Value} : {countersignHandleStep.Opinion}");
-                    sb.AppendLine($"{countersignHandleStep.GetHandler().Value} : {countersignHandleStep.Opinion}");
-                }
-
-                dto.Opinion = sb.ToString();
+                // // 宜宾需求:会签汇总节点展示会签办理节点办理意见
+                // var countersignHandleSteps = workflow.Steps.Where(d =>
+                //     d.CountersignId == currentStep.CountersignId &&
+                //     d.CountersignPosition is ECountersignPosition.Multi or ECountersignPosition.Single).ToList();
+                // var sb = new StringBuilder();
+                // foreach (var countersignHandleStep in countersignHandleSteps)
+                // {
+                //     //sb.AppendLine($"{countersignHandleStep.GetActualHandler()?.GetHandler().Value} : {countersignHandleStep.Opinion}");
+                //     sb.AppendLine($"{countersignHandleStep.GetHandler().Value} : {countersignHandleStep.Opinion}");
+                // }
+                //
+                // dto.Opinion = sb.ToString();
 
 
                 //当前待办节点为会签汇总节点时:检查是否为顶级会签汇总节点,t:按配置往下走,f:继续往上汇总,不需要重复往下指派
                 //当前待办节点为会签汇总节点时:检查是否为顶级会签汇总节点,t:按配置往下走,f:继续往上汇总,不需要重复往下指派
                 if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
                 if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))

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

@@ -4,6 +4,7 @@ using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Tools;
 using Mapster;
 using Mapster;
 
 
 namespace Hotline.Application.Mappers;
 namespace Hotline.Application.Mappers;
@@ -111,7 +112,7 @@ public class OrderMapperConfigs : IRegister
             .Ignore(d => d.AcceptorName)
             .Ignore(d => d.AcceptorName)
             .Ignore(d => d.AcceptorStaffNo)
             .Ignore(d => d.AcceptorStaffNo)
             .Ignore(d => d.ExternalId)
             .Ignore(d => d.ExternalId)
-            .Ignore(d=>d.CreationTime)
+            .Ignore(d => d.CreationTime)
             //.AfterMapping((s, d) =>
             //.AfterMapping((s, d) =>
             //{
             //{
             //    //d.UpdateHandlingStatus(s.IsInCountersign);
             //    //d.UpdateHandlingStatus(s.IsInCountersign);
@@ -198,6 +199,8 @@ public class OrderMapperConfigs : IRegister
             .IgnoreIf((src, dest) => src.IsOther == null, dest => dest.IsOther)
             .IgnoreIf((src, dest) => src.IsOther == null, dest => dest.IsOther)
             .Map(src => src.OtherRemark, dest => dest.OtherRemark)
             .Map(src => src.OtherRemark, dest => dest.OtherRemark)
             .IgnoreIf((src, dest) => string.IsNullOrEmpty(src.OtherRemark), dest => dest.OtherRemark)
             .IgnoreIf((src, dest) => string.IsNullOrEmpty(src.OtherRemark), dest => dest.OtherRemark)
+            .Map(src => src.Transpond, dest => dest.Transpond)
+            .IgnoreIf((src, dest) => src.Transpond.HasValue == false, dest => dest.Transpond)
             .Map(src => src.TranspondCityId, dest => dest.TranspondCityId)
             .Map(src => src.TranspondCityId, dest => dest.TranspondCityId)
             .IgnoreIf((src, dest) => string.IsNullOrEmpty(src.TranspondCityId), dest => dest.TranspondCityId)
             .IgnoreIf((src, dest) => string.IsNullOrEmpty(src.TranspondCityId), dest => dest.TranspondCityId)
             .Map(src => src.TranspondCityName, dest => dest.TranspondCityName)
             .Map(src => src.TranspondCityName, dest => dest.TranspondCityName)

+ 1 - 1
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -814,7 +814,7 @@ namespace Hotline.Application.Subscribers
                     if (order.Status >= EOrderStatus.Filed)
                     if (order.Status >= EOrderStatus.Filed)
                     {
                     {
                         order.ActualOpinion += dto.Opinion;
                         order.ActualOpinion += dto.Opinion;
-                        await _orderRepository.Updateable().UpdateColumns(d => d.ActualOpinion).ExecuteCommandAsync(cancellationToken);
+                        await _orderRepository.Updateable(order).UpdateColumns(d => d.ActualOpinion).ExecuteCommandAsync(cancellationToken);
                         await _workflowDomainService.AppendFileOpinionAsync(order.WorkflowId, dto.Opinion, dto.Files, cancellationToken);
                         await _workflowDomainService.AppendFileOpinionAsync(order.WorkflowId, dto.Opinion, dto.Files, cancellationToken);
                     }
                     }
                     else
                     else

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

@@ -36,7 +36,7 @@ namespace Hotline.FlowEngine.Workflows
         /// new
         /// new
         /// </summary>
         /// </summary>
         Task<List<WorkflowStep>> NextAsync(ISessionContext current, NextWorkflowDto dto,
         Task<List<WorkflowStep>> NextAsync(ISessionContext current, NextWorkflowDto dto,
-            DateTime? expiredTime = null, CancellationToken cancellationToken = default);
+            DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default);
 
 
         /// <summary>
         /// <summary>
         /// 查询工作流
         /// 查询工作流

+ 88 - 29
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -20,6 +20,7 @@ using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
 using System.Diagnostics;
 using System.Diagnostics;
+using System.Text;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.File;
 
 
 namespace Hotline.FlowEngine.Workflows
 namespace Hotline.FlowEngine.Workflows
@@ -121,7 +122,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
             //firststeps
             //firststeps
             var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
             var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
-                isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, dto.IsStartCountersign, cancellationToken);
+                isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, dto.IsStartCountersign, cancellationToken: cancellationToken);
 
 
             await _workflowStepRepository.UpdateAsync(startStep, cancellationToken);
             await _workflowStepRepository.UpdateAsync(startStep, cancellationToken);
 
 
@@ -253,7 +254,7 @@ namespace Hotline.FlowEngine.Workflows
         /// new
         /// new
         /// </summary>
         /// </summary>
         public async Task<List<WorkflowStep>> NextAsync(ISessionContext current, NextWorkflowDto dto,
         public async Task<List<WorkflowStep>> NextAsync(ISessionContext current, NextWorkflowDto dto,
-            DateTime? expiredTime = null, CancellationToken cancellationToken = default)
+            DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default)
         {
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
                 withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
                 withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -337,7 +338,7 @@ namespace Hotline.FlowEngine.Workflows
                 currentStep.FileJson = await _fileRepository.AddFileAsync(
                 currentStep.FileJson = await _fileRepository.AddFileAsync(
                     dto.Files, workflow.ExternalId, currentStep.Id, cancellationToken);
                     dto.Files, workflow.ExternalId, currentStep.Id, cancellationToken);
 
 
-           var counterSignType = GetCounterSignType(dto.IsStartCountersign, currentStep.BusinessType);
+            var counterSignType = GetCounterSignType(dto.IsStartCountersign, currentStep.BusinessType);
 
 
             var updateSteps = new List<WorkflowStep> { currentStep };
             var updateSteps = new List<WorkflowStep> { currentStep };
 
 
@@ -471,7 +472,7 @@ namespace Hotline.FlowEngine.Workflows
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
                 nextStepDefine, isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, dto.IsStartCountersign,
                 nextStepDefine, isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, dto.IsStartCountersign,
-                cancellationToken);
+                isAutoFillSummaryOpinion, cancellationToken);
 
 
             // //更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
             // //更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
             // workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
             // workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
@@ -626,7 +627,7 @@ namespace Hotline.FlowEngine.Workflows
             var currentStep = GetUnHandleStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId,
             var currentStep = GetUnHandleStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId,
                 _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.Roles);
                 _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.Roles);
             if (currentStep.Status is not EWorkflowStepStatus.WaitForAccept) return null;
             if (currentStep.Status is not EWorkflowStepStatus.WaitForAccept) return null;
-            
+
             //if (currentStep.Handlers.All(d => d.Key != orgId && d.Key != userId)) return null;
             //if (currentStep.Handlers.All(d => d.Key != orgId && d.Key != userId)) return null;
 
 
             if (currentStep.StepType is EStepType.End)
             if (currentStep.StepType is EStepType.End)
@@ -643,7 +644,7 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.UpdateNav(currentStep)
             await _workflowStepRepository.UpdateNav(currentStep)
                 .Include(d => d.WorkflowTrace)
                 .Include(d => d.WorkflowTrace)
                 .ExecuteCommandAsync();
                 .ExecuteCommandAsync();
-            
+
             workflow.ActualHandleStepAcceptTime = currentStep.AcceptTime;
             workflow.ActualHandleStepAcceptTime = currentStep.AcceptTime;
             await _workflowRepository.Updateable(workflow).ExecuteCommandAsync(cancellationToken);
             await _workflowRepository.Updateable(workflow).ExecuteCommandAsync(cancellationToken);
 
 
@@ -829,7 +830,7 @@ namespace Hotline.FlowEngine.Workflows
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
                 nextStepDefine, isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign,
                 nextStepDefine, isNextDynamic, flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign,
-                cancellationToken);
+                cancellationToken: cancellationToken);
 
 
             ////赋值当前节点的下级办理节点
             ////赋值当前节点的下级办理节点
             //if (dto.IsStartCountersign
             //if (dto.IsStartCountersign
@@ -1429,7 +1430,7 @@ namespace Hotline.FlowEngine.Workflows
                 throw new UserFriendlyException($"未找到归档节点的前一节点, workflowId: {workflowId}, endStepId: {endStep.Id}");
                 throw new UserFriendlyException($"未找到归档节点的前一节点, workflowId: {workflowId}, endStepId: {endStep.Id}");
             prevStep.Opinion += opinion;
             prevStep.Opinion += opinion;
 
 
-            if (files.Any())
+            if (files != null && files.Any())
             {
             {
                 var filejsons = await _fileRepository.AddFileAsync(files, workflow.ExternalId, prevStep.Id, cancellationToken);
                 var filejsons = await _fileRepository.AddFileAsync(files, workflow.ExternalId, prevStep.Id, cancellationToken);
                 prevStep.FileJson.AddRange(filejsons);
                 prevStep.FileJson.AddRange(filejsons);
@@ -2105,7 +2106,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, EFlowAssignType flowAssignType,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, EFlowAssignType flowAssignType,
-            DateTime? expiredTime, bool isStartCountersign, CancellationToken cancellationToken)
+            DateTime? expiredTime, bool isStartCountersign, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default)
         {
         {
             List<WorkflowStep> nextSteps = new();
             List<WorkflowStep> nextSteps = new();
             if (currentStep.IsInCountersign())
             if (currentStep.IsInCountersign())
@@ -2126,7 +2127,7 @@ namespace Hotline.FlowEngine.Workflows
                         {
                         {
                             //创建普通节点(根据配置)
                             //创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignType, EWorkflowTraceType.Normal, expiredTime, cancellationToken);
+                                flowAssignType, EWorkflowTraceType.Normal, expiredTime, isAutoFillSummaryOpinion, cancellationToken);
                         }
                         }
                     }
                     }
                     else
                     else
@@ -2139,7 +2140,7 @@ namespace Hotline.FlowEngine.Workflows
                                 throw new UserFriendlyException("未查询到会签节点");
                                 throw new UserFriendlyException("未查询到会签节点");
 
 
                             nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, expiredTime,
                             nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, expiredTime,
-                                cancellationToken);
+                                isAutoFillSummaryOpinion, cancellationToken);
                         }
                         }
                         else
                         else
                         {
                         {
@@ -2155,7 +2156,7 @@ namespace Hotline.FlowEngine.Workflows
                     {
                     {
                         // check if cs all complete, create next
                         // check if cs all complete, create next
                         nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto,
                         nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto,
-                            expiredTime, cancellationToken);
+                            expiredTime, isAutoFillSummaryOpinion, cancellationToken);
                     }
                     }
                     else
                     else
                     {
                     {
@@ -2181,7 +2182,7 @@ namespace Hotline.FlowEngine.Workflows
             {
             {
                 //创建普通节点(根据配置)
                 //创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignType,
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignType,
-                    EWorkflowTraceType.Normal, expiredTime, cancellationToken);
+                    EWorkflowTraceType.Normal, expiredTime, isAutoFillSummaryOpinion, cancellationToken);
             }
             }
 
 
             return nextSteps;
             return nextSteps;
@@ -2260,7 +2261,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
         /// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
         /// </summary>
         /// </summary>
         private async Task<List<WorkflowStep>> CreateCsEndStepsByTargetPrevAsync(Workflow workflow, WorkflowStep step,
         private async Task<List<WorkflowStep>> CreateCsEndStepsByTargetPrevAsync(Workflow workflow, WorkflowStep step,
-            BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
+            BasicWorkflowDto dto, DateTime? expiredTime, bool isAutoFillSummaryOpinion = false, CancellationToken cancellationToken = default)
         {
         {
             var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
             var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
             if (countersignStartStep is null)
             if (countersignStartStep is null)
@@ -2272,11 +2273,28 @@ namespace Hotline.FlowEngine.Workflows
             if (csInnerSteps.Any(d =>
             if (csInnerSteps.Any(d =>
                     d.Status != EWorkflowStepStatus.Handled || (d.IsStartCountersign && !d.IsStartedCountersignEnd)))
                     d.Status != EWorkflowStepStatus.Handled || (d.IsStartCountersign && !d.IsStartedCountersignEnd)))
                 return nextSteps;
                 return nextSteps;
-            //if (csInnerSteps.All(d => d.Status == EWorkflowStepStatus.Handled))
-            //{
+
+            string? opinion = null;
+            if (isAutoFillSummaryOpinion)
+            {
+                //依据某节点作为根节点,查找最底层办理节点无论普通还是汇总节点
+                var preSteps = GetLastStepsFromRootStep(workflow.Steps, countersignStartStep);
+
+                var sb = new StringBuilder();
+                foreach (var prevStep in preSteps.OrderBy(d => d.HandleTime).ToList())
+                {
+                    sb.AppendLine($"【会签时间】:{prevStep.HandleTime?.ToString("yyyy-MM-dd HH:mm:ss")}");
+                    sb.AppendLine($"【会签人】:{prevStep.HandlerName}");
+                    sb.AppendLine($"【会签结果】:{prevStep.Opinion}");
+                    sb.AppendLine("");
+                }
+
+                opinion = sb.ToString();
+            }
+
             // 创建会签汇总节点
             // 创建会签汇总节点
             var countersignEndStep =
             var countersignEndStep =
-                await CreateCountersignEndStepAsync(workflow, countersignStartStep, dto, expiredTime, cancellationToken);
+                await CreateCountersignEndStepAsync(workflow, countersignStartStep, dto, expiredTime, opinion, cancellationToken);
             nextSteps = new List<WorkflowStep> { countersignEndStep };
             nextSteps = new List<WorkflowStep> { countersignEndStep };
 
 
             //create trace
             //create trace
@@ -2284,14 +2302,46 @@ namespace Hotline.FlowEngine.Workflows
 
 
             await _publisher.PublishAsync(new CountersignEndAssigned(workflow), PublishStrategy.ParallelWhenAll,
             await _publisher.PublishAsync(new CountersignEndAssigned(workflow), PublishStrategy.ParallelWhenAll,
                 cancellationToken);
                 cancellationToken);
-            //}
+
 
 
             return nextSteps;
             return nextSteps;
         }
         }
 
 
+        /// <summary>
+        /// 以某一节点作为根节点开始查找最底层办理节点(需求:自动填充汇总节点意见)
+        /// </summary>
+        private List<WorkflowStep> GetLastStepsFromRootStep(List<WorkflowStep> steps, WorkflowStep rootStep)
+        {
+            var lastSteps = new List<WorkflowStep>();
+            var nextSteps = steps.Where(d => d.PrevStepId == rootStep.Id).ToList();
+            foreach (var nextStep in nextSteps)
+            {
+                if (nextStep.IsStartCountersign)
+                {
+                    //find last csend
+                    var lastCsEndStep = GetLastCountersignEndStep(steps, nextStep);
+                    if (lastCsEndStep != null)
+                        lastSteps.Add(lastCsEndStep);
+                }
+                else
+                {
+                    lastSteps.Add(nextStep);
+                }
+            }
+
+            return lastSteps;
+        }
+
+        private WorkflowStep? GetLastCountersignEndStep(List<WorkflowStep> steps, WorkflowStep nextStep)
+        {
+            var csEndStep = steps.FirstOrDefault(d => d.CountersignStartStepId == nextStep.Id);
+            if (csEndStep == null) return null;
+            return !csEndStep.IsStartCountersign ? csEndStep : GetLastCountersignEndStep(steps, csEndStep);
+        }
+
         private async Task<WorkflowStep> CreateCountersignEndStepAsync(
         private async Task<WorkflowStep> CreateCountersignEndStepAsync(
             Workflow workflow, WorkflowStep countersignStartStep,
             Workflow workflow, WorkflowStep countersignStartStep,
-            BasicWorkflowDto dto, DateTime? expiredTime,
+            BasicWorkflowDto dto, DateTime? expiredTime, string? opinion = null,
             CancellationToken cancellationToken = default)
             CancellationToken cancellationToken = default)
         {
         {
             var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
             var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
@@ -2311,9 +2361,11 @@ namespace Hotline.FlowEngine.Workflows
             csEndStep.Handlers = countersignStartStep.Handlers
             csEndStep.Handlers = countersignStartStep.Handlers
                 .Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
                 .Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
                 .ToList();
                 .ToList();
-            //需求调整:汇总节点指派给发起人部门办理
+            //需求调整:汇总节点指派给发起人部门办理 //todo 待重构
             csEndStep.FlowAssignType = EFlowAssignType.Org;
             csEndStep.FlowAssignType = EFlowAssignType.Org;
-            //csEndStep.StepHandlers = stepHandlers;
+
+            if (!string.IsNullOrEmpty(opinion))
+                csEndStep.Opinion = opinion;
 
 
             csEndStep.Reset();
             csEndStep.Reset();
             csEndStep.ResetParameters();
             csEndStep.ResetParameters();
@@ -2867,7 +2919,8 @@ namespace Hotline.FlowEngine.Workflows
             EFlowAssignType flowAssignType,
             EFlowAssignType flowAssignType,
             EWorkflowTraceType traceType,
             EWorkflowTraceType traceType,
             DateTime? expiredTime,
             DateTime? expiredTime,
-            CancellationToken cancellationToken)
+            bool isAutoFillSummaryOpinion = false,
+            CancellationToken cancellationToken = default)
         {
         {
             List<FlowStepHandler> handlers;
             List<FlowStepHandler> handlers;
             if (stepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
             if (stepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
@@ -2885,10 +2938,14 @@ namespace Hotline.FlowEngine.Workflows
                 handlers = dto.NextHandlers;
                 handlers = dto.NextHandlers;
             }
             }
 
 
+            string? opinion = null;
+            if (isAutoFillSummaryOpinion && stepDefine.StepType is EStepType.Summary)
+                opinion = prevStep.Opinion;
+
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto,
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto,
                 flowAssignType, handlers, null,
                 flowAssignType, handlers, null,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
-                true, traceType, null, expiredTime, cancellationToken);
+                true, traceType, null, expiredTime, opinion, cancellationToken);
         }
         }
 
 
         private async Task<List<WorkflowStep>> CreateStepsAsync(
         private async Task<List<WorkflowStep>> CreateStepsAsync(
@@ -2906,6 +2963,7 @@ namespace Hotline.FlowEngine.Workflows
             EWorkflowTraceType traceType,
             EWorkflowTraceType traceType,
             EHandlerType? handlerType = null,
             EHandlerType? handlerType = null,
             DateTime? expiredTime = null,
             DateTime? expiredTime = null,
+            string? opinion = null,
             CancellationToken cancellationToken = default
             CancellationToken cancellationToken = default
         )
         )
         {
         {
@@ -2915,10 +2973,7 @@ namespace Hotline.FlowEngine.Workflows
                 var isMain = handlers.Count == 1 || (handlers.Count > 1 && handler.Key == dto.NextMainHandler);
                 var isMain = handlers.Count == 1 || (handlers.Count > 1 && handler.Key == dto.NextMainHandler);
                 var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType,
                 var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType,
                     handler, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
                     handler, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
-                    dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType, dto.FlowDirection);
-
-                //var stepHandler = stepHandlers.First(d => d.GetHandler().Key == handler.Key);
-                //step.StepHandlers = new List<WorkflowStepHandler> { stepHandler };
+                    dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType, dto.FlowDirection, opinion);
 
 
                 steps.Add(step);
                 steps.Add(step);
             }
             }
@@ -3219,7 +3274,8 @@ namespace Hotline.FlowEngine.Workflows
             bool isMainHandler = false,
             bool isMainHandler = false,
             EHandlerType? handlerType = null, //动态节点依据动态策略判断
             EHandlerType? handlerType = null, //动态节点依据动态策略判断
             EBusinessType? businessType = null,
             EBusinessType? businessType = null,
-            EFlowDirection? flowDirection = null
+            EFlowDirection? flowDirection = null,
+            string? opinion = null
         )
         )
         {
         {
             //if (!handlers.Any())
             //if (!handlers.Any())
@@ -3243,7 +3299,7 @@ namespace Hotline.FlowEngine.Workflows
             step.IsOrigin = isOrigin;
             step.IsOrigin = isOrigin;
             step.Name = stepName;
             step.Name = stepName;
 
 
-            //新增需求: 部门汇总节点由部门办理//todo 待确认中心由部门处理还是由之前办理人办理
+            //新增需求: 部门汇总节点由部门办理//todo 待确认中心由部门处理还是由之前办理人办理 待重构
             if (step.StepType == EStepType.Summary && step.BusinessType == EBusinessType.Department)
             if (step.StepType == EStepType.Summary && step.BusinessType == EBusinessType.Department)
                 step.FlowAssignType = EFlowAssignType.Org;
                 step.FlowAssignType = EFlowAssignType.Org;
 
 
@@ -3256,6 +3312,9 @@ namespace Hotline.FlowEngine.Workflows
             if (businessType.HasValue)
             if (businessType.HasValue)
                 step.BusinessType = businessType.Value;
                 step.BusinessType = businessType.Value;
 
 
+            if (!string.IsNullOrEmpty(opinion))
+                step.Opinion = opinion;
+
             return step;
             return step;
         }
         }
 
 

+ 5 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -565,5 +565,10 @@ namespace Hotline.Settings
         /// 上传文件格式显示
         /// 上传文件格式显示
         /// </summary>
         /// </summary>
         public const string FileExt = "FileExt";
         public const string FileExt = "FileExt";
+        
+        /// <summary>
+        /// 是否自动填写汇总节点信息(将前面的办理意见填写至汇总节点)
+        /// </summary>
+        public const string IsAutoFillSummaryOpinion = "IsAutoFillSummaryOpinion";
     }
     }
 }
 }