浏览代码

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

田爽 9 月之前
父节点
当前提交
5c924506dc

+ 31 - 11
src/Hotline.Api/Controllers/OrderController.cs

@@ -394,6 +394,12 @@ public class OrderController : BaseController
         //推省上
         //推省上
         var publishPublishOrder = _mapper.Map<PublishPublishOrderDto>(orderPublish);
         var publishPublishOrder = _mapper.Map<PublishPublishOrderDto>(orderPublish);
         publishPublishOrder.Order = _mapper.Map<OrderDto>(order);
         publishPublishOrder.Order = _mapper.Map<OrderDto>(order);
+        //查询实际办理附件
+        if (!string.IsNullOrEmpty(order.ActualHandleStepId))
+        {
+            var actualHandleStep = await _workflowStepRepository.GetAsync(order.ActualHandleStepId, HttpContext.RequestAborted);
+            publishPublishOrder.FileJsons = actualHandleStep?.FileJson;
+        }
         await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
         await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
 
 
         var orderVisit = new OrderVisit();
         var orderVisit = new OrderVisit();
@@ -664,9 +670,8 @@ public class OrderController : BaseController
             .Includes(x => x.Employee)
             .Includes(x => x.Employee)
             .Includes(x => x.OrderVisitDetails)
             .Includes(x => x.OrderVisitDetails)
             .WhereIF(dto.VisitState == EVisitStateQuery.NoVisit,
             .WhereIF(dto.VisitState == EVisitStateQuery.NoVisit,
-                x => (x.VisitState == EVisitState.WaitForVisit ||
-                      x.VisitState == EVisitState.NoSatisfiedWaitForVisit) &&
-                     x.Order.IsProvince == false)
+                x => x.VisitState == EVisitState.WaitForVisit ||
+                      x.VisitState == EVisitState.NoSatisfiedWaitForVisit)
             .WhereIF(dto.VisitState == EVisitStateQuery.Visited, x => x.VisitState == EVisitState.Visited)
             .WhereIF(dto.VisitState == EVisitStateQuery.Visited, x => x.VisitState == EVisitState.Visited)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.StartsWith(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.StartsWith(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
@@ -676,6 +681,8 @@ public class OrderController : BaseController
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.Order.CounterSignType == null)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.Order.CounterSignType == null)
             .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.EmployeeId == _sessionContext.RequiredUserId)
             .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.EmployeeId == _sessionContext.RequiredUserId)
+            .WhereIF(dto.IsProvince != null && dto.IsProvince == true, d => d.Order.IsProvince == true)
+            .WhereIF(dto.IsProvince != null && dto.IsProvince == false, d => d.Order.IsProvince == false)
             .OrderByDescending(x => x.PublishTime)
             .OrderByDescending(x => x.PublishTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
         return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
@@ -2543,14 +2550,27 @@ public class OrderController : BaseController
         dto.RepeatableEventDetails = repeatables;
         dto.RepeatableEventDetails = repeatables;
         if (!string.IsNullOrEmpty(dto.WorkflowId))
         if (!string.IsNullOrEmpty(dto.WorkflowId))
         {
         {
+
             var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
             var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
                 cancellationToken: HttpContext.RequestAborted);
                 cancellationToken: HttpContext.RequestAborted);
-            var centerOpinion = workflow.Steps.Where(x => x.HandlerOrgId == OrgSeedData.CenterId).OrderByDescending(x => x.CreationTime).Select(x => x.Opinion).First();
-            dto.CenterOpinion = string.IsNullOrEmpty(centerOpinion) ? string.Empty : centerOpinion;
-            var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.Id).OrderByDescending(x => x.CreationTime).FirstAsync();
-            dto.SendBackOpinion = sendBack is { Id: not null } && !string.IsNullOrEmpty(sendBack.Content) ? sendBack.Content : string.Empty;
+            //  var centerOpinion = workflow.Steps.Where(x => x.HandlerOrgId == OrgSeedData.CenterId).OrderByDescending(x => x.CreationTime).Select(x => x.Opinion).FirstOrDefault();
+            var centerOpinion = workflow.Steps.Where(x => x.HandlerOrgId == OrgSeedData.CenterId).MaxBy(d => d.CreationTime)?.Opinion ?? string.Empty;
+
+            dto.CenterOpinion = centerOpinion;//string.IsNullOrEmpty(centerOpinion) ? string.Empty : centerOpinion;
             List<OrderRemarksDto> remarks = workflow.Steps.Where(x => !string.IsNullOrEmpty(x.Remark)).Select(x => new OrderRemarksDto { Remark = x.Remark, RemarkTime = x.CreationTime, RemarkUser = x.CreatorName }).ToList();
             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();
             dto.OrderRemarks = remarks;
             dto.OrderRemarks = remarks;
+
+            var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.Id).OrderByDescending(x => x.CreationTime).FirstAsync();
+            dto.SendBackOpinion = sendBack is { Id: not null } && !string.IsNullOrEmpty(sendBack.Content) ? sendBack.Content : string.Empty;
+
+            //var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
+            //    cancellationToken: HttpContext.RequestAborted);
+            //var centerOpinion = workflow.Steps.Where(x => x.HandlerOrgId == OrgSeedData.CenterId).OrderByDescending(x => x.CreationTime).Select(x => x.Opinion).First();
+            //dto.CenterOpinion = string.IsNullOrEmpty(centerOpinion) ? string.Empty : centerOpinion;
+            //var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.Id).OrderByDescending(x => x.CreationTime).FirstAsync();
+            //dto.SendBackOpinion = sendBack is { Id: not null } && !string.IsNullOrEmpty(sendBack.Content) ? sendBack.Content : string.Empty;
+            //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();
+            //dto.OrderRemarks = remarks;
         }
         }
         return dto;
         return dto;
     }
     }
@@ -3920,7 +3940,7 @@ public class OrderController : BaseController
             var orderDto = _mapper.Map<OrderDto>(order);
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
             //}
             //}
-            await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, HttpContext.RequestAborted);
+            await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, HttpContext.RequestAborted);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
             if (publish != null)
             if (publish != null)
             {
             {
@@ -4049,7 +4069,7 @@ public class OrderController : BaseController
             var processType = dto.FlowDirection == EFlowDirection.OrgToCenter || dto.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
             var processType = dto.FlowDirection == EFlowDirection.OrgToCenter || dto.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType })
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-            await _workflowApplication.RecallAsync(recall, endTime, HttpContext.RequestAborted);
+            await _workflowApplication.RecallAsync(recall, endTime, order.Status >= EOrderStatus.Filed, HttpContext.RequestAborted);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
             if (publish != null)
             if (publish != null)
             {
             {
@@ -4130,7 +4150,7 @@ public class OrderController : BaseController
 
 
             //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
             //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
 
 
-            await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, HttpContext.RequestAborted);
+            await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, HttpContext.RequestAborted);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
             if (publish != null)
             if (publish != null)
             {
             {
@@ -4230,7 +4250,7 @@ public class OrderController : BaseController
 
 
                 //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
                 //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
 
 
-                await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, HttpContext.RequestAborted);
+                await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, HttpContext.RequestAborted);
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
                 if (publish != null)
                 if (publish != null)
                 {
                 {

+ 0 - 11
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -369,17 +369,6 @@ public class WorkflowController : BaseController
         return await _workflowApplication.GetRecallStepsAsync(workflowId, HttpContext.RequestAborted);
         return await _workflowApplication.GetRecallStepsAsync(workflowId, HttpContext.RequestAborted);
     }
     }
 
 
-    /// <summary>
-    /// 撤回至任意节点
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    [HttpPost("recall")]
-    public async Task Recall([FromBody] RecallDto dto)
-    {
-        await _workflowApplication.RecallAsync(dto, null, HttpContext.RequestAborted);
-    }
-
     /// <summary>
     /// <summary>
     /// 终止流程
     /// 终止流程
     /// </summary>
     /// </summary>

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

@@ -41,7 +41,7 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// <summary>
         /// 撤回至任意节点
         /// 撤回至任意节点
         /// </summary>
         /// </summary>
-        Task RecallAsync(RecallDto dto, DateTime? expiredTime, CancellationToken cancellationToken);
+        Task RecallAsync(RecallDto dto, DateTime? expiredTime, bool isOrderFiled, CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>
         /// 办理至结束节点(无视流程模板配置,操作人需是当前节点办理对象)
         /// 办理至结束节点(无视流程模板配置,操作人需是当前节点办理对象)

+ 28 - 24
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -147,25 +147,25 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.RequiredUserId, current.RequiredOrgId,
             current.RequiredUserId, current.RequiredOrgId,
             externalId, cancellationToken);
             externalId, cancellationToken);
 
 
-		//var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-		//    EFlowAssignType.User, current.RequiredUserId, current.UserName,
-		//    current.RequiredOrgId, current.OrgName)};
-
-		var defineHandler = startStepDefine.HandlerTypeItems.First();
-		var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
-			new FlowStepHandler
-			{
-				Key = current.RequiredUserId,
-				Value = current.UserName,
-				UserId = current.UserId,
-				Username = current.UserName,
-				OrgId = current.RequiredOrgId,
-				OrgName = current.OrgName,
-				RoleId = defineHandler.Key,
-				RoleName = defineHandler.Value,
-			}, expiredTime);
-
-		var flowAssignInfo =
+        //var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+        //    EFlowAssignType.User, current.RequiredUserId, current.UserName,
+        //    current.RequiredOrgId, current.OrgName)};
+
+        var defineHandler = startStepDefine.HandlerTypeItems.First();
+        var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
+            new FlowStepHandler
+            {
+                Key = current.RequiredUserId,
+                Value = current.UserName,
+                UserId = current.UserId,
+                Username = current.UserName,
+                OrgId = current.RequiredOrgId,
+                OrgName = current.OrgName,
+                RoleId = defineHandler.Key,
+                RoleName = defineHandler.Value,
+            }, expiredTime);
+
+        var flowAssignInfo =
             await GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, cancellationToken);
             await GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, cancellationToken);
 
 
         //var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
         //var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
@@ -318,7 +318,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// <summary>
     /// 撤回至任意节点
     /// 撤回至任意节点
     /// </summary>
     /// </summary>
-    public async Task RecallAsync(RecallDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
+    public async Task RecallAsync(RecallDto dto, DateTime? expiredTime, bool isOrderFiled, CancellationToken cancellationToken)
     {
     {
         var validator = new RecallDtoValidator();
         var validator = new RecallDtoValidator();
         var validationResult = await validator.ValidateAsync(dto, cancellationToken);
         var validationResult = await validator.ValidateAsync(dto, cancellationToken);
@@ -339,7 +339,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
 
         //var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
         //var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
 
 
-        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, expiredTime, cancellationToken);
+        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, expiredTime, isOrderFiled, cancellationToken);
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -353,6 +353,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
         var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
         if (endStepDefine is null)
         if (endStepDefine is null)
             throw new UserFriendlyException("未正确配置结束节点");
             throw new UserFriendlyException("未正确配置结束节点");
+        var unHandleStep = workflow.Steps.FirstOrDefault(d => d.Status is not EWorkflowStepStatus.Handled);
+        if (unHandleStep is null)
+            throw new UserFriendlyException($"无待办节点, workflowId: {workflowId}", "无待办节点");
         var dto = new NextWorkflowDto
         var dto = new NextWorkflowDto
         {
         {
             WorkflowId = workflowId,
             WorkflowId = workflowId,
@@ -362,7 +365,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             BusinessType = endStepDefine.BusinessType,
             BusinessType = endStepDefine.BusinessType,
             ReviewResult = reviewResult,
             ReviewResult = reviewResult,
             Opinion = opinion,
             Opinion = opinion,
-            Files = files
+            Files = files,
+            StepId = unHandleStep.Id
         };
         };
         await NextAsync(dto, current, cancellationToken: cancellationToken);
         await NextAsync(dto, current, cancellationToken: cancellationToken);
     }
     }
@@ -855,7 +859,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     users1 = users1.Where(d => d.OrgId.StartsWith(levelOneOrgId));
                     users1 = users1.Where(d => d.OrgId.StartsWith(levelOneOrgId));
                 var defineTypeItem = stepDefine.HandlerTypeItems.First();
                 var defineTypeItem = stepDefine.HandlerTypeItems.First();
 
 
-				handlers = users1.Where(d => d != null && !string.IsNullOrEmpty(d.Id))
+                handlers = users1.Where(d => d != null && !string.IsNullOrEmpty(d.Id))
                     .Select(d => new FlowStepHandler
                     .Select(d => new FlowStepHandler
                     {
                     {
                         Key = d.Id,
                         Key = d.Id,
@@ -866,7 +870,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         OrgName = d.Organization.Name,
                         OrgName = d.Organization.Name,
                         RoleId = defineTypeItem.Key,
                         RoleId = defineTypeItem.Key,
                         RoleName = defineTypeItem.Value
                         RoleName = defineTypeItem.Value
-					})
+                    })
                     .ToList();
                     .ToList();
                 break;
                 break;
             case EHandlerType.OrgLevel:
             case EHandlerType.OrgLevel:

+ 2 - 2
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -170,7 +170,7 @@ namespace Hotline.Application.Orders
                 var orderDto = _mapper.Map<OrderDto>(order);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
 
 
-                await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, cancellationToken);
+                await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, cancellationToken);
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId);
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId);
                 if (publish != null)
                 if (publish != null)
                 {
                 {
@@ -212,7 +212,7 @@ namespace Hotline.Application.Orders
                 .Includes(x => x.OrderVisit, y => y.Employee)
                 .Includes(x => x.OrderVisit, y => y.Employee)
                 .Includes(x => x.SecondaryHandling)
                 .Includes(x => x.SecondaryHandling)
                 .Where(x => x.OrderVisit.Order.IsProvince == false)
                 .Where(x => x.OrderVisit.Order.IsProvince == false)
-				.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
+                .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
                 .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
                 .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
                 .Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
                 .Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))

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

@@ -178,8 +178,9 @@ namespace Hotline.Application.Subscribers
                     order.Status = EOrderStatus.WaitForAccept;
                     order.Status = EOrderStatus.WaitForAccept;
                     await _orderRepository.UpdateAsync(order, cancellationToken);
                     await _orderRepository.UpdateAsync(order, cancellationToken);
                 }
                 }
+                await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
             }
             }
-            await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
+            
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -306,6 +307,7 @@ namespace Hotline.Application.Subscribers
             model.OrgName = org.Name;
             model.OrgName = org.Name;
             model.OrgId = org.Id;
             model.OrgId = org.Id;
             model.LaunchOrgName = dto.ProvinceOrderSuperviseDto.SuperviseSendDept;
             model.LaunchOrgName = dto.ProvinceOrderSuperviseDto.SuperviseSendDept;
+            model.CrUser = dto.ProvinceOrderSuperviseDto.SupervisePerson;
             model.State = 0;
             model.State = 0;
             model.Province = true;
             model.Province = true;
             model.ApplyContent = dto.ProvinceOrderSuperviseDto.SuperviseContent;
             model.ApplyContent = dto.ProvinceOrderSuperviseDto.SuperviseContent;

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

@@ -43,6 +43,11 @@ namespace Hotline.Share.Dtos.Order
         /// 是否只查询自己的待回访工单
         /// 是否只查询自己的待回访工单
         /// </summary>
         /// </summary>
         public bool? QuerySelf { get; set; }
         public bool? QuerySelf { get; set; }
+
+        /// <summary>
+        /// 是否省工单
+        /// </summary>
+        public bool? IsProvince { get; set; }
     }
     }
 
 
     public record VisitJudgeQueryReq:PagedKeywordRequest
     public record VisitJudgeQueryReq:PagedKeywordRequest

+ 9 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -139,6 +139,10 @@ public class PublishPublishOrderDto
     /// </summary>
     /// </summary>
     public DateTime CreationTime { get; set; }
     public DateTime CreationTime { get; set; }
 
 
+    /// <summary>
+    /// 实际办理附件
+    /// </summary>
+    public List<FileJson>? FileJsons { get; set; }
     #region 省工单使用
     #region 省工单使用
 
 
     /// <summary>
     /// <summary>
@@ -392,6 +396,11 @@ public class SuperviseOrderDto
     /// 督办省编号
     /// 督办省编号
     /// </summary>
     /// </summary>
     public string? SuperviseSerial { get; set; }
     public string? SuperviseSerial { get; set; }
+
+    /// <summary>
+    /// 发起部门名称
+    /// </summary>
+    public string? LaunchOrgName { get; set; }
 }
 }
 
 
 
 

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

@@ -67,7 +67,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 撤回(返回到之前任意节点)
         /// 撤回(返回到之前任意节点)
         /// </summary>
         /// </summary>
         Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, FlowAssignInfo flowAssignInfo,
         Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, FlowAssignInfo flowAssignInfo,
-            DateTime? expiredTime, CancellationToken cancellationToken);
+            DateTime? expiredTime, bool isOrderFiled, CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>
         /// 撤回至开始节点
         /// 撤回至开始节点

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

@@ -262,7 +262,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
             var unCompletedCountersign = workflow.Countersigns
             var unCompletedCountersign = workflow.Countersigns
                 .FirstOrDefault(d => !d.IsCompleted() && d.StarterId == userId);
                 .FirstOrDefault(d => !d.IsCompleted() && d.StarterId == userId);
-            if (unCompletedCountersign is null) 
+            if (unCompletedCountersign is null)
                 return (workflow, null, canHandle, canPrevious, previousOpinion);
                 return (workflow, null, canHandle, canPrevious, previousOpinion);
 
 
             //var existCountersignEndStep = workflow.Steps.Exists(d =>
             //var existCountersignEndStep = workflow.Steps.Exists(d =>
@@ -788,7 +788,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 批量修改工单办理对象
         /// 批量修改工单办理对象
         /// </summary>
         /// </summary>
         public async Task ChangeHandlerBatchAsync(
         public async Task ChangeHandlerBatchAsync(
-            IReadOnlyList<(string userId, string username, string orgId, string orgName,string? roleId,string? roleName, ICollection<WorkflowStep> steps
+            IReadOnlyList<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps
                 )> handlers,
                 )> handlers,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
@@ -798,7 +798,7 @@ namespace Hotline.FlowEngine.Workflows
                 {
                 {
                     step.FlowAssignType = EFlowAssignType.User;
                     step.FlowAssignType = EFlowAssignType.User;
                     step.Assign(handler.userId, handler.username,
                     step.Assign(handler.userId, handler.username,
-                        handler.orgId, handler.orgName,handler.roleId,handler.roleName);
+                        handler.orgId, handler.orgName, handler.roleId, handler.roleName);
                     if (step.WorkflowTrace is null)
                     if (step.WorkflowTrace is null)
                         throw new UserFriendlyException("未查询节点对应快照信息");
                         throw new UserFriendlyException("未查询节点对应快照信息");
                     step.WorkflowTrace.Assign(handler.userId, handler.username,
                     step.WorkflowTrace.Assign(handler.userId, handler.username,
@@ -1015,7 +1015,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 撤回(返回到之前任意节点)
         /// 撤回(返回到之前任意节点)
         /// </summary>
         /// </summary>
         public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
         public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
-            FlowAssignInfo flowAssignInfo, DateTime? expiredTime,
+            FlowAssignInfo flowAssignInfo, DateTime? expiredTime, bool isOrderFiled,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
@@ -1026,7 +1026,7 @@ namespace Hotline.FlowEngine.Workflows
             //await RecallTraceAsync(workflow.Traces, dto.Opinion, _sessionContext, cancellationToken);
             //await RecallTraceAsync(workflow.Traces, dto.Opinion, _sessionContext, cancellationToken);
 
 
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
-                EWorkflowTraceType.Recall, expiredTime, cancellationToken);
+                EWorkflowTraceType.Recall, expiredTime, isOrderFiled, cancellationToken);
 
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
 
@@ -1882,15 +1882,15 @@ namespace Hotline.FlowEngine.Workflows
             newStep.CountersignId = step.CountersignId;
             newStep.CountersignId = step.CountersignId;
             newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
             newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
 
 
-			//退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制
-			if (traceType is EWorkflowTraceType.Previous)
+            //退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制
+            if (traceType is EWorkflowTraceType.Previous)
             {
             {
-	            //newStep.FlowAssignType = EFlowAssignType.User;
+                //newStep.FlowAssignType = EFlowAssignType.User;
                 // 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程 禅道200
                 // 是否中心  临时紧急修改 后续在流程模版定义是否原办理人退回类型 来实现流程 禅道200
                 newStep.FlowAssignType = !step.HandlerOrgIsCenter!.Value ? EFlowAssignType.Org : EFlowAssignType.Role;
                 newStep.FlowAssignType = !step.HandlerOrgIsCenter!.Value ? EFlowAssignType.Org : EFlowAssignType.Role;
                 if (newStep is { FlowAssignType: EFlowAssignType.Role, BusinessType: EBusinessType.Send })
                 if (newStep is { FlowAssignType: EFlowAssignType.Role, BusinessType: EBusinessType.Send })
                     newStep.FlowAssignType = EFlowAssignType.User;
                     newStep.FlowAssignType = EFlowAssignType.User;
-				newStep.Assign(step.HandlerId, step.HandlerName, step.HandlerOrgId, step.HandlerOrgName, step.RoleId, step.RoleName);
+                newStep.Assign(step.HandlerId, step.HandlerName, step.HandlerOrgId, step.HandlerOrgName, step.RoleId, step.RoleName);
             }
             }
 
 
             await _workflowStepRepository.AddAsync(newStep, cancellationToken);
             await _workflowStepRepository.AddAsync(newStep, cancellationToken);
@@ -2089,7 +2089,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
         private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
         private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-            DateTime? expiredTime, CancellationToken cancellationToken)
+            DateTime? expiredTime, bool isOrderFiled, CancellationToken cancellationToken)
         {
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
             var updateTraces = new List<WorkflowTrace>();
             var updateTraces = new List<WorkflowTrace>();
@@ -2136,7 +2136,9 @@ namespace Hotline.FlowEngine.Workflows
                 //await UpdateTracesStateAsync(updateTraces, EWorkflowTraceState.StepRemoveByRecall, cancellationToken);
                 //await UpdateTracesStateAsync(updateTraces, EWorkflowTraceState.StepRemoveByRecall, cancellationToken);
                 foreach (var trace in traces)
                 foreach (var trace in traces)
                 {
                 {
-                    trace.TraceState = EWorkflowTraceState.StepRemoveByRecall;
+                    trace.TraceState = isOrderFiled
+                        ? EWorkflowTraceState.StepRemoveByRecallWhenFiled
+                        : EWorkflowTraceState.StepRemoveByRecall;
                 }
                 }
 
 
                 updateTraces.AddRange(traces);
                 updateTraces.AddRange(traces);

+ 6 - 1
src/Hotline/FlowEngine/Workflows/WorkflowTrace.cs

@@ -60,7 +60,12 @@ public enum EWorkflowTraceState
     StepRemoveByPrevious = 10,
     StepRemoveByPrevious = 10,
 
 
     /// <summary>
     /// <summary>
-    /// 对应节点因撤回被删除
+    /// 对应节点因撤回被删除(工单未归档)
     /// </summary>
     /// </summary>
     StepRemoveByRecall = 20,
     StepRemoveByRecall = 20,
+
+    /// <summary>
+    /// 对应节点因撤回被删除(工单已归档)
+    /// </summary>
+    StepRemoveByRecallWhenFiled = 21,
 }
 }