Ver código fonte

Merge branch 'release' of http://git.12345lm.cn/Fengwo/hotline into release

qinchaoyue 6 meses atrás
pai
commit
76a598593f
25 arquivos alterados com 287 adições e 162 exclusões
  1. 6 2
      src/Hotline.Api/Controllers/CommonPController.cs
  2. 16 0
      src/Hotline.Api/Controllers/ExportWordController.cs
  3. 3 1
      src/Hotline.Api/Controllers/OrderController.cs
  4. 26 0
      src/Hotline.Api/Controllers/OrderControlls/OrderComplementController.cs
  5. 17 11
      src/Hotline.Api/Controllers/OrderRevocationController.cs
  6. 12 12
      src/Hotline.Api/Controllers/WorkflowController.cs
  7. 8 0
      src/Hotline.Api/Hotline.Api.csproj
  8. 1 1
      src/Hotline.Application/FlowEngine/IWorkflowApplication.cs
  9. 97 69
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  10. 11 4
      src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs
  11. 3 5
      src/Hotline.Application/Mappers/OrderMapperConfigs.cs
  12. 8 8
      src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs
  13. 9 4
      src/Hotline.Application/Orders/OrderApplication.cs
  14. 11 0
      src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs
  15. 1 0
      src/Hotline.Application/Subscribers/DatasharingSubscriber.cs
  16. 1 1
      src/Hotline.Share/Dtos/Order/AddOrderComplementDto.cs
  17. 5 0
      src/Hotline.Share/Dtos/Order/HomeOrderDto.cs
  18. 3 3
      src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs
  19. 4 4
      src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs
  20. 5 5
      src/Hotline/FlowEngine/Workflows/Workflow.cs
  21. 26 28
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  22. 1 1
      src/Hotline/FlowEngine/Workflows/WorkflowSupplement.cs
  23. 8 2
      src/Hotline/KnowledgeBase/KnowledgeType.cs
  24. 5 0
      src/Hotline/Orders/OrderComplement.cs
  25. 0 1
      src/Hotline/Orders/OrderDomainService.cs

+ 6 - 2
src/Hotline.Api/Controllers/CommonPController.cs

@@ -252,11 +252,13 @@ namespace Hotline.Api.Controllers
 						Time = d.ExpiredTime,
 						Status = d.Status,
 						ActualHandleTime = d.ActualHandleTime,
+						NearlyExpiredTime = d.NearlyExpiredTime,
 						CounterSignType = d.CounterSignType
 					})
 					.ToListAsync();
 				var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning && 
-				((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).OrderBy(x=> x.Time).Take(40).ToList();
+				x.Time > DateTime.Now && x.Status < EOrderStatus.Filed &&  DateTime.Now < x.NearlyExpiredTime 
+				).OrderBy(x=> x.Time).Take(40).ToList();
 				waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
 				//allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
 				//allList.AddRange(waitedList);
@@ -432,11 +434,13 @@ namespace Hotline.Api.Controllers
 						Time = d.ExpiredTime,
 						Status = d.Status,
 						ActualHandleTime = d.ActualHandleTime,
+						NearlyExpiredTime = d.NearlyExpiredTime,
 						CounterSignType = d.CounterSignType
 					})
 					.ToListAsync();
 				var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
-				((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).OrderBy(x=>x.Time).Take(40).ToList();
+				 x.Time > DateTime.Now && x.Status < EOrderStatus.Filed && DateTime.Now < x.NearlyExpiredTime
+				).OrderBy(x=>x.Time).Take(40).ToList();
 				waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
 				//allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
 				//allList.AddRange(waitedList);

+ 16 - 0
src/Hotline.Api/Controllers/ExportWordController.cs

@@ -2,6 +2,7 @@
 using Hotline.Configurations;
 using Hotline.Orders;
 using Hotline.Share.Dtos.OrderExportWord;
+using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
@@ -52,6 +53,21 @@ namespace Hotline.Api.Controllers
                 if (order == null)
                     continue;
 
+                //处理保密数据
+                if (_appOptions.Value.IsZiGong && order.IsSecret)
+                {
+                    var maskString = "***";
+                    order.Contact = maskString;
+                    order.FromName = maskString;
+                    order.FromGender = EGender.Unknown;
+                    order.FromPhone = maskString;
+                    order.FullAddress = maskString;
+                    order.Address = maskString;
+                    order.City = maskString;
+                    order.Street = maskString;
+                    order.ContactMask = maskString;
+                }
+
                 var exportTest = _mapper.Map<OrderSubmissionForm>(order);
 
                 if (_appOptions.Value.IsZiGong)

+ 3 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -1962,7 +1962,9 @@ public class OrderController : BaseController
     [HttpGet("mayscreen")]
     public async Task<PagedDto<OrderVisitDetailDto>> MayScreenList([FromQuery] MayScreenListDto dto)
     {
-        dto.CreationTimeEnd = DateTime.Now;
+        if (_appOptions.Value.IsYiBin) dto.ScreenType = EOrderScreenType.Org;
+
+		dto.CreationTimeEnd = DateTime.Now;
         dto.CreationTimeStart = DateTime.Now;
         if (dto.IsHomePage != null && dto.IsHomePage == true)
         {

+ 26 - 0
src/Hotline.Api/Controllers/OrderControlls/OrderComplementController.cs

@@ -0,0 +1,26 @@
+using Hotline.Orders;
+using Hotline.Share.Dtos.Order;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Hotline.Api.Controllers.OrderControlls;
+
+public class OrderComplementController : BaseController
+{
+    private readonly IOrderDomainService _orderDomainService;
+
+    public OrderComplementController(IOrderDomainService orderDomainService)
+    {
+        _orderDomainService = orderDomainService;
+    }
+    
+    /// <summary>
+    /// 补充
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost]
+    public async Task<string> Supplement([FromBody] AddOrderComplementDto dto)
+    {
+        return await _orderDomainService.AddOrderComplementAsync(dto, HttpContext.RequestAborted);
+    }
+}

+ 17 - 11
src/Hotline.Api/Controllers/OrderRevocationController.cs

@@ -44,8 +44,8 @@ namespace Hotline.Api.Controllers
             ISystemSettingCacheManager systemSettingCacheManager,
             IRepository<SystemOrganize> systemOrganizeRepository,
             IRepository<User> userRepository,
-             IMediator mediator,
-             IWorkflowDomainService workflowDomainService)
+            IMediator mediator,
+            IWorkflowDomainService workflowDomainService)
         {
             _mapper = mapper;
             _orderRevocationRepository = orderRevocationRepository;
@@ -102,11 +102,16 @@ namespace Hotline.Api.Controllers
                         if (!string.IsNullOrEmpty(id))
                         {
                             #region 处理短信业务
+
                             //如果需要发短信、处理短信业务
                             if (dto.IsSendSms && !string.IsNullOrEmpty(order.WorkflowId))
-                            {  //查询当前工单的实际办理节点,如果在热线中心不处理,如果在部门需要更新期满时间
-                                var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true, cancellationToken: HttpContext.RequestAborted);
-                                var nowWorkflow = workflow.Steps.Where(p => p.Id == order.ActualHandleStepId && p.BusinessType >= EBusinessType.Department && p.BusinessType <= EBusinessType.DepartmentLeader).FirstOrDefault();
+                            {
+                                //查询当前工单的实际办理节点,如果在热线中心不处理,如果在部门需要更新期满时间
+                                var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true,
+                                    cancellationToken: HttpContext.RequestAborted);
+                                var nowWorkflow = workflow.Steps.Where(p =>
+                                    p.Id == order.ActualHandleStepId && p.BusinessType >= EBusinessType.Department &&
+                                    p.BusinessType <= EBusinessType.DepartmentLeader).FirstOrDefault();
                                 //在部门才需要发送短信
                                 if (nowWorkflow != null && order.CenterToOrgTime.HasValue)
                                 {
@@ -131,11 +136,12 @@ namespace Hotline.Api.Controllers
                                         await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
                                     }
                                 }
-
                             }
+
                             #endregion
 
                             #region 处理流程业务
+
                             //处理流程业务
                             //如果开启了流程直接归档,如果没开启流程,开启流程到归档
                             if (string.IsNullOrEmpty(order.WorkflowId))
@@ -150,12 +156,14 @@ namespace Hotline.Api.Controllers
                             }
                             else
                             {
-                                await _workflowApplication.JumpToEndAsync(order.WorkflowId, dto.RevocationReason,
+                                await _workflowApplication.JumpToEndAsync(_sessionContext, order.WorkflowId, dto.RevocationReason,
                                     null, order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
                             }
+
                             #endregion
 
                             #region 处理工单的一级部门和实际办理部门
+
                             //处理工单的一级部门和实际办理部门
                             var org = await _systemOrganizeRepository.GetAsync(p => p.Id == OrgSeedData.CenterId, HttpContext.RequestAborted);
                             order.ActualHandleOrgAreaCode = org?.AreaCode;
@@ -180,15 +188,14 @@ namespace Hotline.Api.Controllers
                                 it.ActualHandleTime,
                                 it.ActualHandlerId
                             }).ExecuteCommandAsync();
+
                             #endregion
 
-                           
 
                             successNum++;
                         }
                         else
                             errorNum++;
-
                     }
                 }
                 else
@@ -203,7 +210,6 @@ namespace Hotline.Api.Controllers
                 SuccessNum = successNum,
             };
             return responseDto;
-
         }
     }
-}
+}

+ 12 - 12
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -398,18 +398,18 @@ public class WorkflowController : BaseController
         await _workflowApplication.RejectAsync(dto, HttpContext.RequestAborted);
     }
 
-    /// <summary>
-    /// 补充
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    //[Permission(EPermission.FlowSupplement)]
-    [HttpPost("supplement")]
-    public async Task Supplement([FromBody] SupplementDto dto)
-    {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId);
-        await _workflowDomainService.SupplementAsync(workflow, dto, HttpContext.RequestAborted);
-    }
+    // /// <summary>
+    // /// 补充
+    // /// </summary>
+    // /// <param name="dto"></param>
+    // /// <returns></returns>
+    // //[Permission(EPermission.FlowSupplement)]
+    // [HttpPost("supplement")]
+    // public async Task Supplement([FromBody] SupplementDto dto)
+    // {
+    //     var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId);
+    //     await _workflowDomainService.SupplementAsync(workflow, dto, HttpContext.RequestAborted);
+    // }
 
     /// <summary>
     /// 查询办理类型参数

+ 8 - 0
src/Hotline.Api/Hotline.Api.csproj

@@ -34,4 +34,12 @@
     </None>
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Controllers\OrderControlls\" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Remove="Controllers\Order\OrderComplementController.cs" />
+  </ItemGroup>
+
 </Project>

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

@@ -66,7 +66,7 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 跳转至结束节点(无视流程模板配置以及当前办理对象)
         /// </summary>
-        Task JumpToEndAsync(string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
+        Task JumpToEndAsync(ISessionContext current,string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
             EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
 
         ////////

+ 97 - 69
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -44,6 +44,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     private readonly IWorkflowDomainService _workflowDomainService;
     private IRepository<WorkflowStep> _workflowStepRepository;
     private IRepository<WorkflowTrace> _workflowTraceRepository;
+    private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
     private readonly IRepository<User> _userRepository;
     private readonly ISystemOrganizeRepository _organizeRepository;
     private readonly IRepository<Role> _roleRepository;
@@ -58,6 +59,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         IWorkflowDomainService workflowDomainService,
         IRepository<WorkflowStep> workflowStepRepository,
         IRepository<WorkflowTrace> workflowTraceRepository,
+        IRepository<WorkflowCountersign> workflowCountersignRepository,
         IRepository<User> userRepository,
         ISystemOrganizeRepository organizeRepository,
         IRepository<Role> roleRepository,
@@ -71,6 +73,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         _workflowDomainService = workflowDomainService;
         _workflowStepRepository = workflowStepRepository;
         _workflowTraceRepository = workflowTraceRepository;
+        _workflowCountersignRepository = workflowCountersignRepository;
         _userRepository = userRepository;
         _organizeRepository = organizeRepository;
         _roleRepository = roleRepository;
@@ -441,7 +444,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 跳转至结束节点(无视流程模板配置以及当前办理对象,直接跳至结束节点)
     /// </summary>
-    public async Task JumpToEndAsync(string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
+    public async Task JumpToEndAsync(ISessionContext current, string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
         EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: true,
@@ -467,15 +470,18 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
         var unhandleSteps = workflow.Steps
             .Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
-
         var unhandleTraces = workflow.Traces
             .Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
 
-        //todo 结束会签
+        //get currentStep
+        var currentStep = unhandleSteps.MaxBy(d => d.CreationTime)
+                          ?? workflow.Steps.MaxBy(d => d.CreationTime);
 
         foreach (var step in unhandleSteps)
         {
             await _workflowDomainService.HandleStepAsync(step, workflow, dto, null, null, cancellationToken);
+            if (step.IsStartCountersign)
+                step.CountersignEnd();
 
             var trace = unhandleTraces.First(d => d.StepId == step.Id);
             _mapper.Map(dto, trace);
@@ -485,11 +491,29 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         await _workflowStepRepository.UpdateRangeAsync(unhandleSteps, cancellationToken);
         await _workflowTraceRepository.UpdateRangeAsync(unhandleTraces, cancellationToken);
 
-        if (workflow.Steps.All(d => d.StepType != EStepType.End))
+        //结束会签
+        var counstersigns = await _workflowCountersignRepository.Queryable()
+            .Where(d => !d.IsCompleted())
+            .ToListAsync(cancellationToken);
+        foreach (var counstersign in counstersigns)
         {
-            var currentStep = unhandleSteps.FirstOrDefault()
-                              ?? workflow.Steps.OrderBy(d => d.CreationTime).Last();
+            //结束会签
+            counstersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
+                current.UserId, current.UserName,
+                current.OrgId, current.OrgName,
+                current.OrgAreaCode, current.OrgAreaName);
+        }
+
+        await _workflowCountersignRepository.UpdateRangeAsync(counstersigns, cancellationToken);
+
+
+        //更新实际办理节点信息
+        workflow.UpdateActualStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+
+        workflow.UpdateCurrentStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
 
+        if (workflow.Steps.All(d => d.StepType != EStepType.End))
+        {
             await _workflowDomainService.EndAsync(workflow, dto,
                 endStepDefine, currentStep, expiredTime, cancellationToken);
         }
@@ -990,7 +1014,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     {
                         users1 = users1.Where(d => d.OrgId.StartsWith(levelOneOrgId));
                     }
-                    else if(stepDefine.BusinessType is EBusinessType.DepartmentLeader)
+                    else if (stepDefine.BusinessType is EBusinessType.DepartmentLeader)
                     {
                         users1 = users1.Where(d => d.OrgId == orgId);
                     }
@@ -1305,66 +1329,70 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     .ToListAsync(cancellationToken);
                 break;
             case EDynamicPolicy.OrgUpLeadCenterTop:
-				orgLevel = _sessionContextProvider.SessionContext.OrgLevel - 1;
-				if (orgLevel < 0) orgLevel = 0;
-				isLead = _sessionContextProvider.SessionContext.Roles.Any(x => x == leadRoleCode);
-				isSkip = await _userRepository.Queryable().AnyAsync(x => x.OrgId == _sessionContextProvider.SessionContext.RequiredOrgId && x.Roles.Any(r => r.Name == leadRoleCode), cancellationToken);
-				if (orgLevel == 0 && (isLead || !isSkip))
-				{
-					businessType = EBusinessType.Send;
-					if (currentBusinessType == EBusinessType.Department)
-						flowDirection = EFlowDirection.OrgToCenter;
-
-					items = await _organizeRepository.Queryable()
-						.Where(d => d.IsCenter)
-						.Select(d => new FlowStepHandler
-						{
-							Key = d.Id,
-							Value = d.Name,
-							OrgId = d.Id,
-							OrgName = d.Name
-						})
-						.ToListAsync(cancellationToken);
-				}
-				else
-				{
-					businessType = EBusinessType.Department;
-					upperOrgId = _sessionContextProvider.SessionContext.RequiredOrgId.GetHigherOrgId(_sessionContextProvider.SessionContext.OrgLevel);
-					if (!isLead)
-					{
-						if (isSkip)
-						{
-							roleId = leadRoleCode;
-							roleName = leadRoleName;
-						}
-					}
-					if (isLead || !isSkip)
-					{
-						//上级部门Id
-						upperOrgId = _sessionContextProvider.SessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
-						roleId = handleRoleCode;
-						roleName = handleRoleName;
-					}
-					else
-					{
-						orgLevel += 1;
-					}
-					items = await _organizeRepository.Queryable()
-						.Where(d => d.Id == upperOrgId)
-						.Select(d => new FlowStepHandler
-						{
-							Key = d.Id,
-							Value = d.Name,
-							OrgId = d.Id,
-							OrgName = d.Name,
-							RoleId = roleId,
-							RoleName = roleName
-						})
-						.ToListAsync(cancellationToken);
-				}
-
-				break;
-			case EDynamicPolicy.OrgUpLead:
+                orgLevel = _sessionContextProvider.SessionContext.OrgLevel - 1;
+                if (orgLevel < 0) orgLevel = 0;
+                isLead = _sessionContextProvider.SessionContext.Roles.Any(x => x == leadRoleCode);
+                isSkip = await _userRepository.Queryable()
+                    .AnyAsync(x => x.OrgId == _sessionContextProvider.SessionContext.RequiredOrgId && x.Roles.Any(r => r.Name == leadRoleCode),
+                        cancellationToken);
+                if (orgLevel == 0 && (isLead || !isSkip))
+                {
+                    businessType = EBusinessType.Send;
+                    if (currentBusinessType == EBusinessType.Department)
+                        flowDirection = EFlowDirection.OrgToCenter;
+
+                    items = await _organizeRepository.Queryable()
+                        .Where(d => d.IsCenter)
+                        .Select(d => new FlowStepHandler
+                        {
+                            Key = d.Id,
+                            Value = d.Name,
+                            OrgId = d.Id,
+                            OrgName = d.Name
+                        })
+                        .ToListAsync(cancellationToken);
+                }
+                else
+                {
+                    businessType = EBusinessType.Department;
+                    upperOrgId = _sessionContextProvider.SessionContext.RequiredOrgId.GetHigherOrgId(_sessionContextProvider.SessionContext.OrgLevel);
+                    if (!isLead)
+                    {
+                        if (isSkip)
+                        {
+                            roleId = leadRoleCode;
+                            roleName = leadRoleName;
+                        }
+                    }
+
+                    if (isLead || !isSkip)
+                    {
+                        //上级部门Id
+                        upperOrgId = _sessionContextProvider.SessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
+                        roleId = handleRoleCode;
+                        roleName = handleRoleName;
+                    }
+                    else
+                    {
+                        orgLevel += 1;
+                    }
+
+                    items = await _organizeRepository.Queryable()
+                        .Where(d => d.Id == upperOrgId)
+                        .Select(d => new FlowStepHandler
+                        {
+                            Key = d.Id,
+                            Value = d.Name,
+                            OrgId = d.Id,
+                            OrgName = d.Name,
+                            RoleId = roleId,
+                            RoleName = roleName
+                        })
+                        .ToListAsync(cancellationToken);
+                }
+
+                break;
+            case EDynamicPolicy.OrgUpLead:
                 businessType = _sessionContextProvider.SessionContext.OrgIsCenter
                     ? EBusinessType.Send
                     : _sessionContextProvider.SessionContext.RequiredOrgId.CalcOrgLevel() == 1
@@ -1395,10 +1423,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 }
                 else
                 {
-	                orgLevel += 1;
+                    orgLevel += 1;
                 }
 
-				items = await _organizeRepository.Queryable()
+                items = await _organizeRepository.Queryable()
                     .Where(d => d.Id == upperOrgId)
                     .Select(d => new FlowStepHandler
                     {

+ 11 - 4
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -116,7 +116,8 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                     order.UpdateHandlingStatus(workflow.IsInCountersign);
                     _mapper.Map(workflow, order);
 
-                    if (data.FlowDirection is EFlowDirection.CenterToOrg)
+                    var isCenterToOrg = data.FlowDirection is EFlowDirection.CenterToOrg; 
+                    if (isCenterToOrg)
                     {
                         var expiredTimeConfig =
                             await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
@@ -223,7 +224,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                     {
                         Order = orderDto,
                         WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace),
-                        ExpiredTimeChanged = notification.ExpiredTimeChanged,
+                        ExpiredTimeChanged = isCenterToOrg,
                         HandlerOrgLevel = notification.HandlerOrgId.CalcOrgLevel()
                     }, cancellationToken: cancellationToken);
                     if (data.FlowDirection is EFlowDirection.CenterToOrg)
@@ -322,8 +323,14 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                                         orderDelay.DelayApplyType = EDelayApplyType.ProvinceApply;
                                         orderDelay.IsProDelay = true;
                                         await _orderDelayRepository.UpdateAsync(orderDelay);
-                                        //推送
-                                        var publishOrderDelay = _mapper.Map<PublishOrderDelayDto>(orderDelay);
+										//省件延期--以省审批前一个节点整理的延期意见为准推送省上 宜宾
+										if (_appOptions.Value.IsYiBin)
+                                        {
+	                                        orderDelay.DelayReason = notification.Dto.Opinion;
+                                        }
+
+										//推送
+										var publishOrderDelay = _mapper.Map<PublishOrderDelayDto>(orderDelay);
                                         await _capPublisher.PublishAsync(EventNames.HotlineOrderApplyDelay, publishOrderDelay,
                                             cancellationToken: cancellationToken);
 

+ 3 - 5
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -83,11 +83,6 @@ public class OrderMapperConfigs : IRegister
                 d.OrgProcessingResults = s.OrgProcessingResults.Value;
             });
 
-
-
-
-
-
         config.ForType<AddOrderDto, Order>()
             .IgnoreIf((s, d) => s.OrderExtension == null, d => d.OrderExtension)
             .Map(d => d.Additions, s => s.Files)
@@ -209,5 +204,8 @@ public class OrderMapperConfigs : IRegister
             .Map(src => src.TranspondCityValue, dest => dest.TranspondCityValue)
             .IgnoreIf((src, dest) => string.IsNullOrEmpty(src.TranspondCityValue), dest => dest.TranspondCityValue)
             .IgnoreNonMapped(true);
+
+        config.ForType<AddOrderComplementDto, OrderComplement>()
+            .Map(d => d.No, s => s.CaseSerial);
     }
 }

+ 8 - 8
src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs

@@ -50,17 +50,17 @@ public class WorkflowMapperConfigs : IRegister
             .AfterMapping((s, d) => d.Id = s.Id)
             ;
 
-        config.ForType<WorkflowSupplement, WorkflowSupplementDto>()
-            .Map(d => d.CreationTime, x => x.CreationTime)
-            .Map(d => d.Additions, x => x.Additions)
-            .Map(d => d.Opinion, x => x.Opinion)
-            .Map(d => d.Creator.Name, x => x.Creator.Name)
-            .IgnoreNonMapped(true)
-            ;
+        // config.ForType<WorkflowSupplement, WorkflowSupplementDto>()
+        //     .Map(d => d.CreationTime, x => x.CreationTime)
+        //     .Map(d => d.Additions, x => x.Additions)
+        //     .Map(d => d.Opinion, x => x.Opinion)
+        //     .Map(d => d.Creator.Name, x => x.Creator.Name)
+        //     .IgnoreNonMapped(true)
+        //     ;
 
         config.ForType<Workflow, WorkflowDto>()
             //.IgnoreIf((s, d) => s.Assigns == null || !s.Assigns.Any(), d => d.AssignOrgs)
-            .IgnoreIf((s, d) => s.Supplements == null || !s.Supplements.Any(), d => d.Supplements)
+            //.IgnoreIf((s, d) => s.Supplements == null || !s.Supplements.Any(), d => d.Supplements)
             .IgnoreIf((s, d) => s.Traces == null || !s.Traces.Any(), d => d.Traces)
             //.IgnoreIf((s, d) => s.StepBoxes == null || !s.StepBoxes.Any(), d => d.StepBoxes)
             //.IgnoreIf((s, d) => s.Definition == null, d => d.Definition)

+ 9 - 4
src/Hotline.Application/Orders/OrderApplication.cs

@@ -322,9 +322,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime? dateTime = DateTime.Now;
         var IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
-
+        int orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
+        var orgCode = _sessionContextProvider.SessionContext.OrgId;
         return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
-            .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+
+            .WhereIF(orgLevel==3,d => SqlFunc.Subqueryable<WorkflowStep>()
                 .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
                                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
                                  step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
@@ -333,6 +335,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
                                  _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId))))
                 .Any())
+            .WhereIF(orgLevel==2 || orgLevel == 1,d=> d.ActualHandleOrgCode.StartsWith(orgCode))
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!))
@@ -383,9 +386,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         // DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime stTime = _expireTime.WorkDay(DateTime.Now).GetAwaiter().GetResult();
         var IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
-
+        int orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
+        var orgCode = _sessionContextProvider.SessionContext.OrgId;
         return _orderRepository.Queryable(canView: false).Includes(d => d.OrderDelays)
-            .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+            .WhereIF(orgLevel == 3,d => SqlFunc.Subqueryable<WorkflowStep>()
                 .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
                                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
                                  step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
@@ -394,6 +398,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
                                  _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId))))
                 .Any())
+            .WhereIF(orgLevel == 2 || orgLevel == 1, d => d.ActualHandleOrgCode.StartsWith(orgCode))
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             //.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No))

+ 11 - 0
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs

@@ -1,4 +1,5 @@
 using DotNetCore.CAP;
+using Hotline.Configurations;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Orders;
@@ -7,6 +8,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Mq;
 using MapsterMapper;
 using MediatR;
+using Microsoft.Extensions.Options;
 using XF.Domain.Authentications;
 using XF.Domain.Repository;
 
@@ -18,12 +20,14 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 	private readonly IOrderScreenRepository _orderScreenRepository;
 	private readonly ISessionContext _sessionContext;
 	private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
+	private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
 	public OrderScreenNextWorkflowHandler(
 		ICapPublisher capPublisher,
 		IMapper mapper,
 		IOrderScreenRepository orderScreenRepository,
 		ISessionContext sessionContext,
+		IOptionsSnapshot<AppConfiguration> appOptions,
 		IRepository<OrderScreenDetail> orderScreenDetailRepository)
 	{
 		_capPublisher = capPublisher;
@@ -31,6 +35,7 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 		_orderScreenRepository = orderScreenRepository;
 		_sessionContext = sessionContext;
 		_orderScreenDetailRepository = orderScreenDetailRepository;
+		_appOptions = appOptions;
 	}
 
 	/// <summary>Handles a notification</summary>
@@ -67,6 +72,12 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 							if (screen.Order != null && screen.Order.Source == ESource.ProvinceStraight)
 							{
 								var screenOrderDto = _mapper.Map<OrderDto>(screen.Order);
+								//省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
+								if (_appOptions.Value.IsYiBin)
+								{
+									screenDto.Content = notification.Dto.Opinion;
+									screenDto.Files = new List<Share.Dtos.File.FileDto>();
+								}
 								//推省上
 								_capPublisher.Publish(EventNames.HotlineOrderScreenApply, new PublishScreenDto()
 								{

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

@@ -892,6 +892,7 @@ namespace Hotline.Application.Subscribers
             if (order is null)
                 throw new UserFriendlyException("无效省工单编号");
             dto.OrderId = order.Id;
+            dto.IsProComplement = true;
             await _orderDomainService.AddOrderComplementAsync(dto, cancellationToken);
         }
 

+ 1 - 1
src/Hotline.Share/Dtos/Order/AddOrderComplementDto.cs

@@ -39,7 +39,7 @@ public class AddOrderComplementDto
     /// <summary>
     /// 附件
     /// </summary>
-    public List<FileDto> Files { get; set; }
+    public List<FileDto> Files { get; set; } = new();
 }
 
 public class OrderComplementDto : AddOrderComplementDto

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

@@ -40,6 +40,11 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public DateTime? Time { get; set; }
 
+		/// <summary>
+		/// 即将超期
+		/// </summary>
+		public DateTime? NearlyExpiredTime { get; set; }
+
 		/// <summary>
 		/// 类型
 		/// </summary>

+ 3 - 3
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -592,12 +592,12 @@ namespace Hotline.Share.Dtos.TrCallCenter
         /// <summary>
         /// 呼叫方向
         /// </summary>
-        public ECallDirection CallDirection { get; set; }
+        public ECallDirection? CallDirection { get; set; }
 
         /// <summary>
         /// 呼叫方向
         /// </summary>
-        public string CallDirectionText => CallDirection.GetDescription();
+        public string CallDirectionText => CallDirection?.GetDescription();
 
         /// <summary>
         /// 挂断方
@@ -748,7 +748,7 @@ namespace Hotline.Share.Dtos.TrCallCenter
         /// <summary>
         /// 工单
         /// </summary>
-        public OrderDto Order { get; set; }
+        public OrderDto? Order { get; set; }
 
         /// <summary>
         /// 归属地

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

@@ -155,10 +155,10 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         List<StepDefine> NextStepDefineFilter(EPathPolicy pathPolicy, List<StepDefine> nextStepDefines);
 
-        /// <summary>
-        /// 撤销流程
-        /// </summary>
-        Task CancelAsync(CancelDto dto, DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
+        // /// <summary>
+        // /// 撤销流程
+        // /// </summary>
+        // Task CancelAsync(CancelDto dto, DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
 
         ///// <summary>
         ///// 更新期满时间

+ 5 - 5
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -374,11 +374,11 @@ public partial class Workflow
     [Navigate(NavigateType.OneToOne, nameof(DefinitionId))]
     public WorkflowDefinition WorkflowDefinition { get; set; }
 
-    /// <summary>
-    /// 补充信息
-    /// </summary>
-    [Navigate(NavigateType.OneToMany, nameof(WorkflowSupplement.WorkflowId))]
-    public List<WorkflowSupplement> Supplements { get; set; }
+    // /// <summary>
+    // /// 补充信息
+    // /// </summary>
+    // [Navigate(NavigateType.OneToMany, nameof(WorkflowSupplement.WorkflowId))]
+    // public List<WorkflowSupplement> Supplements { get; set; }
 
     /// <summary>
     /// 会签

+ 26 - 28
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -28,7 +28,6 @@ namespace Hotline.FlowEngine.Workflows
         private readonly IWorkflowRepository _workflowRepository;
         private readonly IRepository<WorkflowStep> _workflowStepRepository;
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
-        private readonly IRepository<WorkflowSupplement> _workflowSupplementRepository;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
@@ -44,7 +43,6 @@ namespace Hotline.FlowEngine.Workflows
             IWorkflowRepository workflowRepository,
             IRepository<WorkflowStep> workflowStepRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
-            IRepository<WorkflowSupplement> workflowSupplementRepository,
             IRepository<WorkflowCountersign> workflowCountersignRepository,
             ISystemSettingCacheManager systemSettingCacheManager,
             IWfModuleCacheManager wfModuleCacheManager,
@@ -57,7 +55,6 @@ namespace Hotline.FlowEngine.Workflows
             _workflowRepository = workflowRepository;
             _workflowStepRepository = workflowStepRepository;
             _workflowTraceRepository = workflowTraceRepository;
-            _workflowSupplementRepository = workflowSupplementRepository;
             _workflowCountersignRepository = workflowCountersignRepository;
             _sessionContext = sessionContextProvider.SessionContext;
             _mapper = mapper;
@@ -519,8 +516,8 @@ namespace Hotline.FlowEngine.Workflows
             var query = _workflowRepository.Queryable().Where(d => d.Id == workflowId);
             if (withDefine)
                 query = query.Includes(d => d.WorkflowDefinition);
-            if (withSupplements)
-                query = query.Includes(d => d.Supplements);
+            // if (withSupplements)
+            //     query = query.Includes(d => d.Supplements);
             //if (withAssigns)
             //    query = query.Includes(d => d.Assigns);
             if (withCountersigns)
@@ -1678,7 +1675,7 @@ namespace Hotline.FlowEngine.Workflows
             //todo 检查当前办理人是否为该流程中的办理人
 
             var supplement = _mapper.Map<WorkflowSupplement>(dto);
-            await _workflowSupplementRepository.AddAsync(supplement, cancellationToken);
+            //await _workflowSupplementRepository.AddAsync(supplement, cancellationToken);
         }
 
         /// <summary>
@@ -1776,28 +1773,28 @@ namespace Hotline.FlowEngine.Workflows
             return nextStepDefines;
         }
 
-        /// <summary>
-        /// 撤销流程
-        /// </summary>
-        public async Task CancelAsync(CancelDto dto, DateTime? expiredTime, ISessionContext current,
-            CancellationToken cancellationToken)
-        {
-            var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
-                cancellationToken: cancellationToken);
-
-            var currentStep = GetUnHandleStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId,
-                _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.Roles);
-            //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId, _sessionContextProvider.SessionContext.RequiredUserId);
-
-            var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
-
-            var basicDto = _mapper.Map<BasicWorkflowDto>(dto);
-            var endTrace = await EndAsync(workflow, basicDto, endStepDefine, currentStep,
-                expiredTime, cancellationToken: cancellationToken);
-
-            await _publisher.PublishAsync(new CancelWorkflowNotify(workflow), PublishStrategy.ParallelWhenAll,
-                cancellationToken);
-        }
+        // /// <summary>
+        // /// 撤销流程
+        // /// </summary>
+        // public async Task CancelAsync(CancelDto dto, DateTime? expiredTime, ISessionContext current,
+        //     CancellationToken cancellationToken)
+        // {
+        //     var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
+        //         cancellationToken: cancellationToken);
+        //
+        //     var currentStep = GetUnHandleStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId,
+        //         _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.Roles);
+        //     //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId, _sessionContextProvider.SessionContext.RequiredUserId);
+        //
+        //     var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
+        //
+        //     var basicDto = _mapper.Map<BasicWorkflowDto>(dto);
+        //     var endTrace = await EndAsync(workflow, basicDto, endStepDefine, currentStep,
+        //         expiredTime, cancellationToken: cancellationToken);
+        //
+        //     await _publisher.PublishAsync(new CancelWorkflowNotify(workflow), PublishStrategy.ParallelWhenAll,
+        //         cancellationToken);
+        // }
 
         /// <summary>
         /// 新增流程流转记录
@@ -2277,6 +2274,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         private void HandleStep(WorkflowStep step, string opinion, string nextStepCode)
         {
+            //todo 重构:ISessionContext传入
             step.Handle(_sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.UserName,
                 _sessionContextProvider.SessionContext.RequiredOrgId, _sessionContextProvider.SessionContext.OrgName,
                 _sessionContextProvider.SessionContext.OrgAreaCode, _sessionContextProvider.SessionContext.OrgAreaName,

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

@@ -5,7 +5,7 @@ using XF.Domain.Repository;
 namespace Hotline.FlowEngine.Workflows;
 
 /// <summary>
-/// 流程补充信息
+/// 流程补充信息(启用:暂无此业务)
 /// </summary>
 public class WorkflowSupplement : CreationEntity
 {

+ 8 - 2
src/Hotline/KnowledgeBase/KnowledgeType.cs

@@ -39,10 +39,16 @@ public class KnowledgeType : FullStateEntity
     [SugarColumn(IsNullable = true)]
     public string? ParentId { get; set; }
 
+
     /// <summary>
-    /// 子级
+    /// 旧系统类型id
     /// </summary>
-    [SqlSugar.SugarColumn(IsIgnore = true)]
+    public int? OldTypeId { get; set; }
+
+	/// <summary>
+	/// 子级
+	/// </summary>
+	[SqlSugar.SugarColumn(IsIgnore = true)]
     public List<KnowledgeType> children { get; set; }
 
 

+ 5 - 0
src/Hotline/Orders/OrderComplement.cs

@@ -37,6 +37,11 @@ public class OrderComplement : CreationEntity
     /// 省平台业务编号
     /// </summary>
     public string? DsBisId { get; set; }
+    
+    /// <summary>
+    /// 工单编号
+    /// </summary>
+    public string? No { get; set; }
 
     /// <summary>
     /// 是否省补充

+ 0 - 1
src/Hotline/Orders/OrderDomainService.cs

@@ -184,7 +184,6 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         var complement = _mapper.Map<OrderComplement>(dto);
         complement.InitId();
-        complement.IsProComplement = true;
         if (dto.Files.Any()) complement.FileJson = await _fileRepository.AddFileAsync(dto.Files, complement.Id, "", cancellationToken);
         return await _orderComplementRepository.AddAsync(complement, cancellationToken);
     }