田爽 6 달 전
부모
커밋
ee155558e7
36개의 변경된 파일524개의 추가작업 그리고 464개의 파일을 삭제
  1. 1 1
      build/Dockerfile
  2. 2 2
      src/Hotline.Ai.Jths/Hotline.Ai.Jths.csproj
  3. 2 2
      src/Hotline.Api.Sdk/Hotline.Api.Sdk.csproj
  4. 12 4
      src/Hotline.Api/Controllers/TestController.cs
  5. 9 9
      src/Hotline.Api/Hotline.Api.csproj
  6. 3 1
      src/Hotline.Api/StartupExtensions.cs
  7. 2 1
      src/Hotline.Api/StartupHelper.cs
  8. 0 44
      src/Hotline.Api/config/appsettings.Development.json
  9. 3 3
      src/Hotline.Application.Contracts/Hotline.Application.Contracts.csproj
  10. 1 1
      src/Hotline.Application.Tests/Hotline.Application.Tests.csproj
  11. 259 240
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  12. 32 45
      src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs
  13. 1 1
      src/Hotline.Application/Hotline.Application.csproj
  14. 1 2
      src/Hotline.Application/Quality/QualityApplication.cs
  15. 3 2
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  16. 3 3
      src/Hotline.NewRock/Hotline.NewRock.csproj
  17. 1 1
      src/Hotline.Repository.SqlSugar/Hotline.Repository.SqlSugar.csproj
  18. 4 4
      src/Hotline.Share/Hotline.Share.csproj
  19. 3 3
      src/Hotline.Wex/Hotline.Wex.csproj
  20. 1 1
      src/Hotline.XingTang/Hotline.XingTang.csproj
  21. 3 3
      src/Hotline.YbEnterprise.Sdk/Hotline.YbEnterprise.Sdk.csproj
  22. 50 1
      src/Hotline/Authentications/ProvinceSessionContext.cs
  23. 28 0
      src/Hotline/Authentications/SessionContextProvider.cs
  24. 10 2
      src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs
  25. 16 23
      src/Hotline/FlowEngine/Workflows/Workflow.cs
  26. 26 35
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  27. 5 5
      src/Hotline/Hotline.csproj
  28. 5 2
      src/Hotline/Settings/SettingConstants.cs
  29. 5 5
      src/NewRock.Sdk/NewRock.Sdk.csproj
  30. 2 2
      src/Tr.Sdk/Tr.Sdk.csproj
  31. 2 2
      src/Wex.Sdk/Wex.Sdk.csproj
  32. 2 2
      src/XF.Domain.Repository/XF.Domain.Repository.csproj
  33. 15 0
      src/XF.Domain/Authentications/ISessionContextProvider.cs
  34. 8 8
      src/XF.Domain/XF.Domain.csproj
  35. 1 1
      src/XF.EasyCaching/XF.EasyCaching.csproj
  36. 3 3
      src/XingTang.Sdk/XingTang.Sdk.csproj

+ 1 - 1
build/Dockerfile

@@ -1,4 +1,4 @@
-FROM  mcr.microsoft.com/dotnet/aspnet:7.0
+FROM  mcr.microsoft.com/dotnet/aspnet:8.0
 WORKDIR /app
 COPY out/ .
 ENTRYPOINT ["dotnet", "Hotline.Api.dll"]

+ 2 - 2
src/Hotline.Ai.Jths/Hotline.Ai.Jths.csproj

@@ -1,13 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="Fw.Utility.UnifyResponse" Version="1.0.0" />
   </ItemGroup>

+ 2 - 2
src/Hotline.Api.Sdk/Hotline.Api.Sdk.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
@@ -11,7 +11,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="Fw.Utility.UnifyResponse" Version="1.0.0" />
   </ItemGroup>

+ 12 - 4
src/Hotline.Api/Controllers/TestController.cs

@@ -127,9 +127,10 @@ public class TestController : BaseController
     //private readonly ICacheManager<User> _cache;
     private readonly ICalcExpireTime _expireTime;
     private readonly IOptions<CityBaseConfiguration> _cityBaseConfiguration;
+    private readonly ISessionContextProvider _sessionContextProvider;
 
 
-	public TestController(
+    public TestController(
         //INewRockClient client,
         ILogger<TestController> logger,
         //IAuthorizeGenerator authorizeGenerator,
@@ -179,8 +180,9 @@ ICallApplication callApplication,
         IOptionsSnapshot<AppConfiguration> appOptions,
         ISystemSettingCacheManager systemSettingCacheManager,
         ICalcExpireTime expireTime,
-        IOptions<CityBaseConfiguration> cityBaseConfiguration
-		)
+        IOptions<CityBaseConfiguration> cityBaseConfiguration,
+        ISessionContextProvider sessionContextProvider
+        )
     {
         _logger = logger;
         //_authorizeGenerator = authorizeGenerator;
@@ -230,7 +232,8 @@ ICallApplication callApplication,
         _systemSettingCacheManager = systemSettingCacheManager;
         _expireTime = expireTime;
         _cityBaseConfiguration = cityBaseConfiguration;
-	}
+        _sessionContextProvider = sessionContextProvider;
+    }
 
 
     [HttpGet("time")]
@@ -686,6 +689,11 @@ ICallApplication callApplication,
     [HttpGet("t4")]
     public async Task<string> Test4()
     {
+        var a = _sessionContext.RequiredUserId;
+        var a1 = _sessionContextProvider.SessionContext.RequiredUserId;
+        _sessionContextProvider.SwitchTo(TestSessionContext.Key);
+        var b = _sessionContextProvider.SessionContext.RequiredUserId;
+
         return DateTime.Now.ToString("O");
     }
 

+ 9 - 9
src/Hotline.Api/Hotline.Api.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <Nullable>enable</Nullable>
     <ImplicitUsings>enable</ImplicitUsings>
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
@@ -12,14 +12,14 @@
     <PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
     <PackageReference Include="Fw.Utility.Client" Version="1.0.0" />
     <PackageReference Include="JiebaAspNetCore.Segmenter" Version="1.0.1" />
-    <PackageReference Include="Mapster.DependencyInjection" Version="1.0.0" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.9" />
-    <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="7.0.14" />
-    <PackageReference Include="MiniExcel" Version="1.31.3" />
-    <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
-    <PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.1.0" />
-    <PackageReference Include="Serilog.Sinks.MongoDB" Version="5.3.1" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
+    <PackageReference Include="Mapster.DependencyInjection" Version="1.0.1" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.10" />
+    <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="8.0.10" />
+    <PackageReference Include="MiniExcel" Version="1.34.2" />
+    <PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
+    <PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.3.0" />
+    <PackageReference Include="Serilog.Sinks.MongoDB" Version="6.0.0" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.1" />
     <PackageReference Include="Quartz.AspNetCore" Version="3.8.0" />
   </ItemGroup>
 

+ 3 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -23,12 +23,14 @@ using Hotline.CallCenter.Configs;
 using Hotline.Wex;
 using Hotline.Application.CallCenter.Calls;
 using Hotline.Application.CallCenter;
+using Hotline.Authentications;
 using Hotline.CallCenter.Calls;
 using Swashbuckle.AspNetCore.SwaggerUI;
 using Hotline.Configurations;
 using Hotline.DI;
 using Hotline.Share.Tools;
 using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
+using XF.Domain.Authentications;
 
 namespace Hotline.Api;
 
@@ -74,7 +76,7 @@ internal static class StartupExtensions
             .AddScoped(typeof(IPasswordHasher<>), typeof(PasswordHasher<>))
             .AddHttpClient()
             ;
-
+        services.AddKeyedScoped<ISessionContext, TestSessionContext>(TestSessionContext.Key);
         //cache
         services.AddCache(d =>
         {

+ 2 - 1
src/Hotline.Api/StartupHelper.cs

@@ -15,6 +15,7 @@ using Mapster;
 using MapsterMapper;
 using MediatR.Pipeline;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.IdentityModel.JsonWebTokens;
 using Microsoft.IdentityModel.Tokens;
 using Microsoft.OpenApi.Models;
 using Quartz;
@@ -88,7 +89,7 @@ namespace Hotline.Api
                         IssuerSigningKey = secKey,
                         AudienceValidator = (audiences, token, parameters) =>
                         {
-                            if (token is JwtSecurityToken jwtToken)
+                            if (token is /*JwtSecurityToken*/ JsonWebToken jwtToken)
                             {
                                 using var serviceProvider = services.BuildServiceProvider();
                                 var cacheAudience = serviceProvider.GetService<ITypedCache<AudienceTicket>>();

+ 0 - 44
src/Hotline.Api/config/appsettings.Development.json

@@ -145,53 +145,9 @@
       "VirtualHost": "fwt-master"
     }
   },
-  //"SmsAccountInfo": {
-  //  "MessageServerUrl": "http://webservice.fway.com.cn:1432/FWebService.asmx/FWay_Service", //短信发送地址
-  //  "AccountUser": "CS12345", //短信系统账号
-  //  "AccountPwd": "9EE3899305A8FC97D6146CAC6B802E6F", //短信系统密码
-  //  "ReturnAccountUser": "fwkj", //短信回传账号
-  //  "ReturnAccountPwd": "fwkj12" //短信回传密码
-  //},
   "FwClient": {
     "ClientId": "hotline",
     "ClientSecret": "08db29cc-0da0-4adf-850c-1b2689bd535d"
   }
-  //"ConfigCenter": {
-  //  "ServerAddresses": [ "http://110.188.24.28:8848" ],
-  //  "Namespace": "17503980-9b0d-4d3e-8e35-c842c41fb888", //debug
-  //  "ServiceName": "hotline"
-  //},
-  //"Tr": {
-  //  //"Address": "http://internal.ttf-cti.com:8080",
-  //  //"Username": "yscs",
-  //  //"Password": "123456",
-  //  "Address": "http://222.213.23.229:29003/",
-  //  "Username": "root",
-  //  "Password": "12345678aa",
-  //  "Ip": "222.213.23.229"
-  //},
-  ////智能回访
-  //"AiVisit": {
-  //  "Url": "http://118.122.73.80:19061",
-  //  "Appkey": "MTAwMDAx",
-  //  "ServiceVersion": "V1.0.0" //接口版本号
-  //},
-  ////智能质检
-  //"AiQuality": {
-  //  "Url": "http://118.122.73.80:19072/" // 正式
-  //  //"Url": "http://118.122.73.80:19072/", // 测试
-  //},
-  ////企业服务
-  //"Enterprise": {
-  //  "AddressUrl": "http://10.12.185.227:8834/",
-  //  "ClientId": "1462598736",
-  //  "ClientSecret": "6nZtVK4rKfnsncGymUHB",
-  //  "TenantId": "000000"
-  //},
-
-  //"SendSms": {
-  //  "Url": "http://localhost:50108/api/v1/PushMessage/addwaitmsg"
-  //}
-
 
 }

+ 3 - 3
src/Hotline.Application.Contracts/Hotline.Application.Contracts.csproj

@@ -1,14 +1,14 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <NoWarn>$(NoWarn);8618;</NoWarn>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="FluentValidation" Version="11.6.0" />
+    <PackageReference Include="FluentValidation" Version="11.10.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
src/Hotline.Application.Tests/Hotline.Application.Tests.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
 

+ 259 - 240
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -61,7 +61,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
     private readonly IOptions<CityBaseConfiguration> _cityBaseConfiguration;
 
-	public WorkflowApplication(
+    public WorkflowApplication(
         IDefinitionDomainService definitionDomainService,
         IWorkflowDomainService workflowDomainService,
         IOrderDomainService orderDomainService,
@@ -80,7 +80,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         IMapper mapper,
         IFileRepository fileRepository,
         ISystemSettingCacheManager systemSettingCacheManager,
-		ILogger<WorkflowApplication> logger,
+        ILogger<WorkflowApplication> logger,
         IOptions<CityBaseConfiguration> cityBaseConfiguration)
     {
         _definitionDomainService = definitionDomainService;
@@ -103,7 +103,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         _logger = logger;
         _systemSettingCacheManager = systemSettingCacheManager;
         _cityBaseConfiguration = cityBaseConfiguration;
-	}
+    }
 
     public async Task<string> StartWorkflowAsync(StartWorkflowDto dto, ISessionContext current, string externalId,
         DateTime? expiredTime, CancellationToken cancellationToken = default)
@@ -237,9 +237,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var workflow = await _workflowDomainService.CreateWorkflowAsync(wfModule, dto.Title,
             current.RequiredUserId, current.RequiredOrgId,
             externalId, cancellationToken);
-        
+
         var defineHandler = startStepDefine.HandlerTypeItems.First();
-        
+
         //todo 需求:所有坐席都可以办,临时方案,后期重构:依据策略决定指派对象
         var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
             new FlowStepHandler
@@ -254,7 +254,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 RoleName = defineHandler.Value,
             }, expiredTime,
             EFlowAssignType.Role);
-        
+
         if (dto.Files.Any())
             startStep.FileJson = await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, startStep.Id, cancellationToken);
 
@@ -277,7 +277,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.StaffNo,
             current.RequiredOrgId,
             current.OrgName);
-        
+
         return workflow.Id;
     }
 
@@ -398,27 +398,27 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var targetStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
         if (targetStepDefine.StepType is EStepType.End)
             throw UserFriendlyException.SameMessage("结束节点不支持撤回");
-		//var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
-		var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
-		if (targetStep is null)
-			throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
-
-		///退回到派单组 没有下一步办理人 获取之前节点办理人
-		if (!dto.NextHandlers.Any())
-		{
-			dto.NextHandlers.Add(new FlowStepHandler()
-			{
-				UserId = targetStep.HandlerId,
-				Username = targetStep.HandlerName,
-				OrgId = targetStep.HandlerOrgId,
-				OrgName = targetStep.HandlerOrgName,
-				Key = targetStep.HandlerId,
-				Value = targetStep.HandlerName,
-				RoleId = targetStep.RoleId,
-				RoleName = targetStep.RoleName
-			});
-		}
-		var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.HandlerType, dto.IsStartCountersign,
+        //var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
+        var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
+        if (targetStep is null)
+            throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
+
+        ///退回到派单组 没有下一步办理人 获取之前节点办理人
+        if (!dto.NextHandlers.Any())
+        {
+            dto.NextHandlers.Add(new FlowStepHandler()
+            {
+                UserId = targetStep.HandlerId,
+                Username = targetStep.HandlerName,
+                OrgId = targetStep.HandlerOrgId,
+                OrgName = targetStep.HandlerOrgName,
+                Key = targetStep.HandlerId,
+                Value = targetStep.HandlerName,
+                RoleId = targetStep.RoleId,
+                RoleName = targetStep.RoleName
+            });
+        }
+        var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.HandlerType, dto.IsStartCountersign,
             dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
 
         //var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
@@ -528,9 +528,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (startStepDefine.InstanceMode is EInstanceMode.Dynamic &&
             !_workflowDomainService.DynamicShouldTerminal(startStepDefine, _sessionContext.OrgLevel))
         {
-	        var settingHandle = _systemSettingCacheManager.GetSetting(SettingConstants.RoleJingBanRen);
-	        var settingLead = _systemSettingCacheManager.GetSetting(SettingConstants.RoleLingDao);
-			var nextStepOption = await GetDynamicStepAsync(startStepDefine.InstancePolicy.Value,
+            var settingHandle = _systemSettingCacheManager.GetSetting(SettingConstants.RoleJingBanRen);
+            var settingLead = _systemSettingCacheManager.GetSetting(SettingConstants.RoleLingDao);
+            var nextStepOption = await GetDynamicStepAsync(startStepDefine.InstancePolicy.Value,
                    startStepDefine.StepType, startStepDefine.BusinessType, settingHandle?.SettingValue[0], settingLead?.SettingValue[0], cancellationToken);
             return new NextStepsDto<NextStepOption>
             {
@@ -595,10 +595,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (currentStep.InstanceMode is EInstanceMode.Dynamic &&
             !_workflowDomainService.DynamicShouldTerminal(currentStepDefine, _sessionContext.OrgLevel))
         {
-	        var settingHandle = _systemSettingCacheManager.GetSetting(SettingConstants.RoleJingBanRen);
-	        var settingLead = _systemSettingCacheManager.GetSetting(SettingConstants.RoleLingDao);
-			//动态生成下一步
-			var nextStepOption = await GetDynamicStepAsync(currentStep.InstancePolicy.Value, currentStep.StepType,
+            var settingHandle = _systemSettingCacheManager.GetSetting(SettingConstants.RoleJingBanRen);
+            var settingLead = _systemSettingCacheManager.GetSetting(SettingConstants.RoleLingDao);
+            //动态生成下一步
+            var nextStepOption = await GetDynamicStepAsync(currentStep.InstancePolicy.Value, currentStep.StepType,
                 currentStep.BusinessType, settingHandle?.SettingValue[0], settingLead?.SettingValue[0], cancellationToken);
             dto.Steps = new List<NextStepOption> { nextStepOption };
             return dto;
@@ -1112,7 +1112,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <exception cref="ArgumentOutOfRangeException"></exception>
     private async Task<NextStepOption> GetDynamicStepAsync(
         EDynamicPolicy policy, EStepType stepType,
-        EBusinessType currentBusinessType,string handleRoleCode,string leadRoleCode, CancellationToken cancellationToken)
+        EBusinessType currentBusinessType, string handleRoleCode, string leadRoleCode, CancellationToken cancellationToken)
     {
         int orgLevel;
         List<FlowStepHandler> items;
@@ -1121,13 +1121,13 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         EFlowDirection? flowDirection = null;
         bool isLead = false;
         bool isSkip = false;
-		string roleId = string.Empty;
+        string roleId = string.Empty;
         string roleName = string.Empty;
         string handleRoleName = "经办人";
         string leadRoleName = "领导";
         EHandlerType handlerType = EHandlerType.OrgLevel;
 
-		switch (policy)
+        switch (policy)
         {
             case EDynamicPolicy.OrgUpCenterTop:
                 orgLevel = _sessionContext.OrgLevel - 1;
@@ -1190,58 +1190,58 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     })
                     .ToListAsync(cancellationToken);
                 break;
-			case EDynamicPolicy.OrgUpHandleCenterTop:
-				orgLevel = _sessionContext.OrgLevel - 1;
-				if (orgLevel < 0) orgLevel = 0;
+            case EDynamicPolicy.OrgUpHandleCenterTop:
+                orgLevel = _sessionContext.OrgLevel - 1;
+                if (orgLevel < 0) orgLevel = 0;
 
-				if (orgLevel == 0)
-				{
-					businessType = EBusinessType.Send;
-					if (currentBusinessType == EBusinessType.Department)
-						flowDirection = EFlowDirection.OrgToCenter;
+                if (orgLevel == 0)
+                {
+                    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;
-					handlerType = EHandlerType.AssignedOrgOrRole;
-					roleName = handleRoleName;
-					//上级部门Id
-					upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
-					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 = handleRoleCode,
-							RoleName = handleRoleName,
-						})
-						.ToListAsync(cancellationToken);
-				}
+                    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;
+                    handlerType = EHandlerType.AssignedOrgOrRole;
+                    roleName = handleRoleName;
+                    //上级部门Id
+                    upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
+                    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 = handleRoleCode,
+                            RoleName = handleRoleName,
+                        })
+                        .ToListAsync(cancellationToken);
+                }
 
-				break;
-			case EDynamicPolicy.OrgUpHandle:
-				businessType = _sessionContext.OrgIsCenter
-					? EBusinessType.Send
-					: _sessionContext.RequiredOrgId.CalcOrgLevel() == 1
-						? EBusinessType.Send
-						: EBusinessType.Department;
-				orgLevel = _sessionContext.OrgLevel - 1;
-				handlerType = EHandlerType.AssignedOrgOrRole;
-				if (orgLevel <= 0) orgLevel = 1;
+                break;
+            case EDynamicPolicy.OrgUpHandle:
+                businessType = _sessionContext.OrgIsCenter
+                    ? EBusinessType.Send
+                    : _sessionContext.RequiredOrgId.CalcOrgLevel() == 1
+                        ? EBusinessType.Send
+                        : EBusinessType.Department;
+                orgLevel = _sessionContext.OrgLevel - 1;
+                handlerType = EHandlerType.AssignedOrgOrRole;
+                if (orgLevel <= 0) orgLevel = 1;
                 roleName = handleRoleName;
 				//上级部门Id
 				upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
@@ -1382,22 +1382,22 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 					.ToListAsync(cancellationToken);
 				break;
             case EDynamicPolicy.ArriveOneOrg:
-	            businessType = _sessionContext.OrgIsCenter? EBusinessType.Send: EBusinessType.Department;
+                businessType = _sessionContext.OrgIsCenter ? EBusinessType.Send : EBusinessType.Department;
                 orgLevel = _sessionContext.OrgIsCenter ? 0 : 1;
-				//上级部门Id
-				upperOrgId = _sessionContext.OrgIsCenter ? _sessionContext.RequiredOrgId.Substring(0,3) : _sessionContext.RequiredOrgId.Substring(0, 6);
-				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
-		            })
-		            .ToListAsync(cancellationToken);
-	            break;
-			case EDynamicPolicy.OrgDownCenterTop:
+                //上级部门Id
+                upperOrgId = _sessionContext.OrgIsCenter ? _sessionContext.RequiredOrgId.Substring(0, 3) : _sessionContext.RequiredOrgId.Substring(0, 6);
+                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
+                    })
+                    .ToListAsync(cancellationToken);
+                break;
+            case EDynamicPolicy.OrgDownCenterTop:
                 businessType = EBusinessType.Department;
                 if (_sessionContext.OrgIsCenter)
                 {
@@ -1465,144 +1465,144 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     /// <returns></returns>
 
-	private async Task<NextStepOption> GetDynamicStepAsync(
-		EDynamicPolicyCountersign policy, EStepType stepType,
-		EBusinessType currentBusinessType, CancellationToken cancellationToken)
-	{
-		int orgLevel;
-		List<FlowStepHandler> items;
-		string upperOrgId;
-		EBusinessType businessType;
-		EFlowDirection? flowDirection = null;
-		switch (policy)
-		{
-			case EDynamicPolicyCountersign.OrgUpCenterTop:
-				orgLevel = _sessionContext.OrgLevel - 1;
-				if (orgLevel < 0) orgLevel = 0;
+    private async Task<NextStepOption> GetDynamicStepAsync(
+        EDynamicPolicyCountersign policy, EStepType stepType,
+        EBusinessType currentBusinessType, CancellationToken cancellationToken)
+    {
+        int orgLevel;
+        List<FlowStepHandler> items;
+        string upperOrgId;
+        EBusinessType businessType;
+        EFlowDirection? flowDirection = null;
+        switch (policy)
+        {
+            case EDynamicPolicyCountersign.OrgUpCenterTop:
+                orgLevel = _sessionContext.OrgLevel - 1;
+                if (orgLevel < 0) orgLevel = 0;
 
-				if (orgLevel == 0)
-				{
-					businessType = EBusinessType.Send;
-					if (currentBusinessType == EBusinessType.Department)
-						flowDirection = EFlowDirection.OrgToCenter;
+                if (orgLevel == 0)
+                {
+                    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;
+                    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;
 
-					//上级部门Id
-					upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
-					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
-						})
-						.ToListAsync(cancellationToken);
-				}
+                    //上级部门Id
+                    upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
+                    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
+                        })
+                        .ToListAsync(cancellationToken);
+                }
 
-				break;
-			case EDynamicPolicyCountersign.OrgUp:
-				businessType = _sessionContext.OrgIsCenter
-					? EBusinessType.Send
-					: _sessionContext.RequiredOrgId.CalcOrgLevel() == 1
-						? EBusinessType.Send
-						: EBusinessType.Department;
-				orgLevel = _sessionContext.OrgLevel - 1;
-				if (orgLevel <= 0) orgLevel = 1;
-				//上级部门Id
-				upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
-				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
-					})
-					.ToListAsync(cancellationToken);
-				break;
-			case EDynamicPolicyCountersign.OrgDownCenterTop:
-				businessType = EBusinessType.Department;
-				if (_sessionContext.OrgIsCenter)
-				{
-					orgLevel = 1;
-					items = await _organizeRepository.Queryable()
-						.Where(d => !d.IsCenter && d.Level == orgLevel)
-						.Select(d => new FlowStepHandler
-						{
-							Key = d.Id,
-							Value = d.Name,
-							OrgId = d.Id,
-							OrgName = d.Name
-						})
-						.ToListAsync(cancellationToken);
-				}
-				else
-				{
-					orgLevel = _sessionContext.OrgLevel + 1;
-					items = await _organizeRepository.Queryable()
-						.Where(d => !d.IsCenter && d.Level == orgLevel &&
-									d.Id.StartsWith(_sessionContext.RequiredOrgId))
-						.Select(d => new FlowStepHandler
-						{
-							Key = d.Id,
-							Value = d.Name,
-							OrgId = d.Id,
-							OrgName = d.Name
-						})
-						.ToListAsync(cancellationToken);
-				}
+                break;
+            case EDynamicPolicyCountersign.OrgUp:
+                businessType = _sessionContext.OrgIsCenter
+                    ? EBusinessType.Send
+                    : _sessionContext.RequiredOrgId.CalcOrgLevel() == 1
+                        ? EBusinessType.Send
+                        : EBusinessType.Department;
+                orgLevel = _sessionContext.OrgLevel - 1;
+                if (orgLevel <= 0) orgLevel = 1;
+                //上级部门Id
+                upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
+                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
+                    })
+                    .ToListAsync(cancellationToken);
+                break;
+            case EDynamicPolicyCountersign.OrgDownCenterTop:
+                businessType = EBusinessType.Department;
+                if (_sessionContext.OrgIsCenter)
+                {
+                    orgLevel = 1;
+                    items = await _organizeRepository.Queryable()
+                        .Where(d => !d.IsCenter && d.Level == orgLevel)
+                        .Select(d => new FlowStepHandler
+                        {
+                            Key = d.Id,
+                            Value = d.Name,
+                            OrgId = d.Id,
+                            OrgName = d.Name
+                        })
+                        .ToListAsync(cancellationToken);
+                }
+                else
+                {
+                    orgLevel = _sessionContext.OrgLevel + 1;
+                    items = await _organizeRepository.Queryable()
+                        .Where(d => !d.IsCenter && d.Level == orgLevel &&
+                                    d.Id.StartsWith(_sessionContext.RequiredOrgId))
+                        .Select(d => new FlowStepHandler
+                        {
+                            Key = d.Id,
+                            Value = d.Name,
+                            OrgId = d.Id,
+                            OrgName = d.Name
+                        })
+                        .ToListAsync(cancellationToken);
+                }
 
-				break;
-			case EDynamicPolicyCountersign.OrgDown:
-				businessType = EBusinessType.Department;
-				orgLevel = _sessionContext.OrgLevel + 1;
-				items = await _organizeRepository.Queryable()
-					.Where(d => d.Level == orgLevel && d.Id.StartsWith(_sessionContext.RequiredOrgId))
-					.Select(d => new FlowStepHandler
-					{
-						Key = d.Id,
-						Value = d.Name,
-						OrgId = d.Id,
-						OrgName = d.Name
-					})
-					.ToListAsync(cancellationToken);
-				break;
-			default:
-				throw new ArgumentOutOfRangeException(nameof(policy), policy, null);
-		}
-
-		return new NextStepOption
-		{
-			Key = orgLevel.ToString(),
-			Value = orgLevel == 0 ? "市民热线服务中心" : $"{orgLevel.ToChinese()}级部门",
-			FlowDirection = flowDirection,
-			StepType = stepType,
-			BusinessType = businessType,
-			HandlerType = EHandlerType.OrgLevel, //目前所有动态策略均属于部门等级
-			Items = items
-		};
-	}
-	/// <summary>
-	/// 查询下一节点办理对象类型(user or org)及实际办理对象
-	/// </summary>
-	public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, WorkflowStep currentStep,
+                break;
+            case EDynamicPolicyCountersign.OrgDown:
+                businessType = EBusinessType.Department;
+                orgLevel = _sessionContext.OrgLevel + 1;
+                items = await _organizeRepository.Queryable()
+                    .Where(d => d.Level == orgLevel && d.Id.StartsWith(_sessionContext.RequiredOrgId))
+                    .Select(d => new FlowStepHandler
+                    {
+                        Key = d.Id,
+                        Value = d.Name,
+                        OrgId = d.Id,
+                        OrgName = d.Name
+                    })
+                    .ToListAsync(cancellationToken);
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(policy), policy, null);
+        }
+
+        return new NextStepOption
+        {
+            Key = orgLevel.ToString(),
+            Value = orgLevel == 0 ? "市民热线服务中心" : $"{orgLevel.ToChinese()}级部门",
+            FlowDirection = flowDirection,
+            StepType = stepType,
+            BusinessType = businessType,
+            HandlerType = EHandlerType.OrgLevel, //目前所有动态策略均属于部门等级
+            Items = items
+        };
+    }
+    /// <summary>
+    /// 查询下一节点办理对象类型(user or org)及实际办理对象
+    /// </summary>
+    public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, WorkflowStep currentStep,
         BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, CancellationToken cancellationToken)
     {
         if (nextStepDefine.StepType is EStepType.End) return new();
@@ -1656,8 +1656,27 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         }
 
         if (isNextDynamic)
-            return dto.HandlerType == EHandlerType.AssignedOrgOrRole? FlowAssignInfo.Create(EFlowAssignType.OrgAndRole, handlers, isStartCountersign) 
-            : FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+        {
+            switch (currentStep.InstancePolicy)
+            {
+                case EDynamicPolicy.OrgUpCenterTop:
+                case EDynamicPolicy.OrgUp:
+                case EDynamicPolicy.OrgDownCenterTop:
+                case EDynamicPolicy.OrgDown:
+                case EDynamicPolicy.ArriveCenter:
+                case EDynamicPolicy.ArriveOneOrg:
+                    return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
+                case EDynamicPolicy.OrgUpHandleCenterTop:
+                case EDynamicPolicy.OrgUpHandle:
+                case EDynamicPolicy.OrgUpLeadCenterTop:
+                case EDynamicPolicy.OrgUpLead:
+                    return FlowAssignInfo.Create(EFlowAssignType.OrgAndRole, handlers, isStartCountersign);
+                default:
+                    throw new ArgumentOutOfRangeException();
+            }
+
+
+        }
 
         return await GetNextStepFlowAssignInfoByDefineAsync(nextStepDefine, dto.HandlerType, isStartCountersign, handlers,
             cancellationToken);
@@ -1695,7 +1714,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             case EHandlerType.AssignedUser:
                 return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
             case EHandlerType.AssignedOrgOrRole:
-	            return FlowAssignInfo.Create(EFlowAssignType.OrgAndRole, handlers, isStartCountersign);
+                return FlowAssignInfo.Create(EFlowAssignType.OrgAndRole, handlers, isStartCountersign);
 
             default:
                 throw new ArgumentOutOfRangeException();
@@ -1771,8 +1790,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true, withTraces: true,
             cancellationToken: cancellationToken);
         var step = workflow.Steps.FirstOrDefault(d =>
-			//d.StepHandlers.Any(d => d.OrgId == _cityBaseConfiguration.Value.CityProvince.OrgId || d.OrgId == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId));
-			d.HandlerOrgId == _cityBaseConfiguration.Value.CityProvince.OrgId || d.HandlerOrgId == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId);
+            //d.StepHandlers.Any(d => d.OrgId == _cityBaseConfiguration.Value.CityProvince.OrgId || d.OrgId == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId));
+            d.HandlerOrgId == _cityBaseConfiguration.Value.CityProvince.OrgId || d.HandlerOrgId == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId);
         if (step is not null)
         {
             step.FileJson = await _fileRepository.AddFileAsync(files, workflow.ExternalId, step.Id, cancellationToken);

+ 32 - 45
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -53,7 +53,7 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
     private readonly Publisher _publisher;
 
-	public WorkflowNextHandler(
+    public WorkflowNextHandler(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         ICapPublisher capPublisher,
@@ -118,54 +118,35 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 
                     if (_appOptions.Value.IsZiGong && data.FlowDirection is EFlowDirection.CenterToOrg)
                     {
-                        var expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg , order.Adapt<OrderTimeClacInfo>());
+                        var expiredTimeConfig =
+                            await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
                         order.CenterToOrg(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
                             expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime
-                            , expiredTimeConfig.NearlyExpiredTimeOne, notification.Dto.Opinion,notification.Trace.HandlerId, notification.Trace.HandlerName,true);
+                            , expiredTimeConfig.NearlyExpiredTimeOne, notification.Dto.Opinion, notification.Trace.HandlerId,
+                            notification.Trace.HandlerName, true);
                     }
 
-                    //var expiredTimeChanged = false;
-                    //if (data.FlowDirection.HasValue
-                    //    && data.External.TimeLimit.HasValue                   
-                    //    && data.External.TimeLimitUnit.HasValue)
-                    //{
-                    //    // 1. calc expiredTime 2. update order.expiredTime 3. update workflow.expiredTime 4. publish province
-
-                    //    // var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now,
-                    //    //     data.External.TimeLimitUnit.Value,
-                    //    //     data.External.TimeLimit.Value, data.FlowDirection is EFlowDirection.OrgToCenter);
-
-                    //    var expiredTimeConfig = _timeLimitDomainService.CalcEndTime(DateTime.Now,
-                    //        new TimeConfig(data.External.TimeLimit.Value, data.External.TimeLimitUnit.Value), order.AcceptTypeCode);
-
-                    //    if (data.FlowDirection is EFlowDirection.OrgToCenter)
-                    //    {
-                    //        order.OrgToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                    //            expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime);
-                    //    }
-                    //    else if (data.FlowDirection is EFlowDirection.CenterToOrg)
-                    //    {
-                    //        order.CenterToOrg(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                    //            expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime);
-                    //        //写入质检
-                    //        await _qualityApplication.AddQualityAsync(EQualitySource.Send, order.Id, cancellationToken);
-                    //    }
-
-                    //    await _workflowDomainService.UpdateExpiredTimeAsync(workflow,
-                    //        expiredTimeConfig.ExpiredTime, expiredTimeConfig.TimeText,
-                    //        expiredTimeConfig.Count, expiredTimeConfig.TimeType, expiredTimeConfig.NearlyExpiredTime, cancellationToken);
+                    if (order.CounterSignType is ECounterSignType.Center &&
+                        notification.Trace.BusinessType is EBusinessType.Seat or EBusinessType.Send &&
+                        notification.Workflow.IsTopCountersignEndStep(notification.Trace) &&
+                        data.FlowDirection is EFlowDirection.CenterToOrg)
+                    {
+                        bool.TryParse(
+                            _systemSettingCacheManager.GetSetting(SettingConstants.IsResetCenterCountersignType)?.SettingValue[0],
+                            out bool isResetCenterCountersignType);
+                        if (isResetCenterCountersignType)
+                            order.CounterSignType = null;
+                    }
 
-                    //    expiredTimeChanged = true;
-                    //}
                     if (data.FlowDirection is EFlowDirection.CenterToOrg)
                         order.SendBackAuditEndTime = await _expireTime.GetWorkDay(DateTime.Now);
-					await _orderRepository.Updateable(order).ExecuteCommandAsync(cancellationToken);
-                    //await _orderRepository.UpdateAsync(order, cancellationToken);
+                    await _orderRepository.UpdateAsync(order, cancellationToken);
 
                     //司法行政监督管理-推诿工单
                     //如果没开启则不处理
                     var isOpenJudicialManagement = _systemSettingCacheManager.GetSetting(SettingConstants.IsOpenJudicialManagement)?.SettingValue[0];
-                    if (isOpenJudicialManagement == "true" && notification.Trace.StepType != EStepType.Summary && notification.Trace.StepType != EStepType.End && !notification.Trace.IsCountersignEndStep)
+                    if (isOpenJudicialManagement == "true" && notification.Trace.StepType != EStepType.Summary &&
+                        notification.Trace.StepType != EStepType.End && !notification.Trace.IsCountersignEndStep)
                         await _publisher.PublishAsync(new AddPassTheBuckOrderNotify(order, _sessionContext.RequiredOrgId, _sessionContext.OrgName),
                             PublishStrategy.ParallelWhenAll, cancellationToken);
 
@@ -176,7 +157,8 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                             switch (notification.FlowAssignInfo.FlowAssignType)
                             {
                                 case EFlowAssignType.Org:
-                                    var orgCodes = notification.Trace.NextHandlers.Select(x => x.OrgId); //notification.FlowAssignInfo.HandlerObjects.Select(x => x.Key);
+                                    var orgCodes = notification.Trace.NextHandlers.Select(x =>
+                                        x.OrgId); //notification.FlowAssignInfo.HandlerObjects.Select(x => x.Key);
                                     var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
                                     var orgList = await _userRepository.Queryable()
                                         .Where(x => orgCodes.Contains(x.OrgId) && x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id)))
@@ -196,14 +178,16 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                                                 TemplateCode = "1007",
                                                 Params = new List<string>() { order.No },
                                                 TelNumber = item.PhoneNo,
-
                                             };
                                             await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
                                         }
                                     }
+
                                     break;
                                 case EFlowAssignType.User:
-                                    var userCodes = notification.Trace.NextHandlers.Select(x => x.UserId); //notification.FlowAssignInfo.HandlerObjects.Select(x => x.Key);
+                                    var userCodes =
+                                        notification.Trace.NextHandlers.Select(x =>
+                                            x.UserId); //notification.FlowAssignInfo.HandlerObjects.Select(x => x.Key);
                                     var userList = await _userRepository.Queryable()
                                         .Where(x => userCodes.Contains(x.Id) && !string.IsNullOrEmpty(x.PhoneNo))
                                         .ToListAsync(cancellationToken);
@@ -220,17 +204,20 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                                             TemplateCode = "1007",
                                             Params = new List<string>() { order.No },
                                             TelNumber = item.PhoneNo,
-
                                         };
                                         await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
                                     }
+
                                     break;
                                 default:
                                     break;
                             }
                         }
                     }
-                    catch { }
+                    catch
+                    {
+                    }
+
                     var orderDto = _mapper.Map<OrderDto>(order);
                     await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowHandled, new OrderFlowDto
                     {
@@ -337,7 +324,8 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                                         await _orderDelayRepository.UpdateAsync(orderDelay);
                                         //推送
                                         var publishOrderDelay = _mapper.Map<PublishOrderDelayDto>(orderDelay);
-                                        await _capPublisher.PublishAsync(EventNames.HotlineOrderApplyDelay, publishOrderDelay, cancellationToken: cancellationToken);
+                                        await _capPublisher.PublishAsync(EventNames.HotlineOrderApplyDelay, publishOrderDelay,
+                                            cancellationToken: cancellationToken);
 
                                         //await _provinceService.DelayCaseInfoSend(publishOrderDelay, cancellationToken);
                                     }
@@ -354,7 +342,6 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 
                     break;
             }
-
         }
         catch (Exception e)
         {

+ 1 - 1
src/Hotline.Application/Hotline.Application.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

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

@@ -199,8 +199,7 @@ namespace Hotline.Application.Quality
                 }
             }
 
-            _logger.LogInformation($"质检对象:{System.Text.Json.JsonSerializer.Serialize(quality,
-                new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs) })}");
+            _logger.LogInformation($"质检对象:{System.Text.Json.JsonSerializer.Serialize(quality, new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs) })}");
         }
 
         /// <summary>

+ 3 - 2
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -10,6 +10,7 @@ using Hotline.Repository.SqlSugar.CallCenter;
 using Hotline.Settings;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos.Bi;
+using Hotline.Share;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.CallCenter;
@@ -1676,7 +1677,7 @@ namespace Hotline.Application.StatisticalReport
                     if (property.Key == "OrgName")
                     {
                         var name = property.Value.ToString();
-                        if (name.IsNullOrEmpty()) continue;
+                        if (string.IsNullOrEmpty(name)) continue;
                         if (dicRow.Any(m => m.Key == name)) continue;
                         var dr = dataTable.NewRow();
                         dr[0] = name;
@@ -1707,7 +1708,7 @@ namespace Hotline.Application.StatisticalReport
                             total += int.Parse(value!);
                         }
                     }
-                    if (!value.IsNullOrEmpty() && !orgName.IsNullOrEmpty())
+                    if (!string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(orgName))
                     {
                         dicRow[orgName!][columnIndex] = value;
                     }

+ 3 - 3
src/Hotline.NewRock/Hotline.NewRock.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
@@ -12,7 +12,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
src/Hotline.Repository.SqlSugar/Hotline.Repository.SqlSugar.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

+ 4 - 4
src/Hotline.Share/Hotline.Share.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
@@ -12,9 +12,9 @@
 
   <ItemGroup>
     <PackageReference Include="DocXCore" Version="1.0.10" />
-    <PackageReference Include="Mapster" Version="7.3.0" />
-    <PackageReference Include="MediatR.Contracts" Version="1.0.1" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Mapster" Version="7.4.0" />
+    <PackageReference Include="MediatR.Contracts" Version="2.0.1" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
     <PackageReference Include="XF.Utility.EnumExtensions" Version="1.0.4" />
   </ItemGroup>

+ 3 - 3
src/Hotline.Wex/Hotline.Wex.csproj

@@ -1,13 +1,13 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
src/Hotline.XingTang/Hotline.XingTang.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

+ 3 - 3
src/Hotline.YbEnterprise.Sdk/Hotline.YbEnterprise.Sdk.csproj

@@ -1,13 +1,13 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="Fw.Utility.UnifyResponse" Version="1.0.0" />
   </ItemGroup>

+ 50 - 1
src/Hotline/Authentications/ProvinceSessionContext.cs

@@ -1,10 +1,13 @@
 using Hotline.Configurations;
+using Microsoft.Extensions.Options;
 using XF.Domain.Authentications;
 
 namespace Hotline.Authentications
 {
     public class ProvinceSessionContext : ISessionContext
     {
+        public const string Key = "ProvinceSessionContext";
+
         public ProvinceSessionContext(CityProvinceConfiguration config)
         {
             UserId = config.UserId;
@@ -26,7 +29,7 @@ namespace Hotline.Authentications
         /// <exception cref="AuthenticationException"></exception>
         public string RequiredUserId => UserId ?? throw new ArgumentNullException();
         //取消写入
-		public string? UserName { get; set; }
+        public string? UserName { get; set; }
         public string? Phone { get; set; }
 
         /// <summary>
@@ -52,4 +55,50 @@ namespace Hotline.Authentications
         /// </summary>
         public string? StaffNo { get; set; }
     }
+
+    public class TestSessionContext : ISessionContext
+    {
+        public const string Key = "TestSessionContext";
+
+        public TestSessionContext(IOptions<CityBaseConfiguration> options)
+        {
+            UserId = options.Value.CityProvince.UserId;
+        }
+
+        /// <summary>
+        /// Id of current tenant or null for host
+        /// </summary>
+        public string? UserId { get; set; }
+
+        /// <summary>
+        /// Id of current user or throw Exception for guest
+        /// </summary>
+        /// <exception cref="AuthenticationException"></exception>
+        public string RequiredUserId { get; }
+        public string? UserName { get; set; }
+        public string? Phone { get; set; }
+
+        /// <summary>
+        /// Roles
+        /// </summary>
+        public string[] Roles { get; set; }
+        public string? OrgId { get; set; }
+        public string RequiredOrgId { get; }
+        public string? OrgName { get; set; }
+        public int OrgLevel { get; set; }
+        public string? OrgAreaCode { get; set; }
+        public bool OrgIsCenter { get; set; }
+
+        /// <summary>
+        /// 部门行政区划名称
+        /// </summary>
+        public string? OrgAreaName { get; set; }
+        public string? AreaId { get; set; }
+        public string? ClientId { get; set; }
+
+        /// <summary>
+        /// 工号
+        /// </summary>
+        public string? StaffNo { get; set; }
+    }
 }

+ 28 - 0
src/Hotline/Authentications/SessionContextProvider.cs

@@ -0,0 +1,28 @@
+using Hotline.Configurations;
+using Microsoft.Extensions.DependencyInjection;
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+
+namespace Hotline.Authentications;
+
+public class SessionContextProvider : ISessionContextProvider, IScopeDependency
+{
+    private readonly IServiceProvider _serviceProvider;
+    public ISessionContext SessionContext { get; set; }
+
+    public SessionContextProvider(IServiceProvider serviceProvider, ISessionContext sessionContext)
+    {
+        _serviceProvider = serviceProvider;
+        SessionContext = sessionContext;
+    }
+
+    public void SwitchTo(string key)
+    {
+        //SessionContext = new ProvinceSessionContext(new CityProvinceConfiguration
+        //{
+        //    UserId = "123",
+        //    UserName = "abc"
+        //});
+        SessionContext = _serviceProvider.GetRequiredKeyedService<ISessionContext>(key);
+    }
+}

+ 10 - 2
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -485,8 +485,12 @@ public abstract class StepBasicEntity : CreationEntity
                 {
                     Key = HandlerOrgId,
                     Value = HandlerOrgName,
+                    UserId = HandlerId,
+                    Username = HandlerName,
                     OrgId = HandlerOrgId,
-                    OrgName = HandlerOrgName
+                    OrgName = HandlerOrgName,
+                    RoleId = RoleId,
+                    RoleName = RoleName
                 };
             case EFlowAssignType.User:
                 return new FlowStepHandler
@@ -505,8 +509,12 @@ public abstract class StepBasicEntity : CreationEntity
                 {
                     Key = RoleId,
                     Value = RoleName,
+                    UserId = HandlerId,
+                    Username = HandlerName,
+                    OrgId = HandlerOrgId,
+                    OrgName = HandlerOrgName,
                     RoleId = RoleId,
-                    RoleName = RoleName,
+                    RoleName = RoleName
                 };
             default:
                 throw new ArgumentOutOfRangeException();

+ 16 - 23
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -295,7 +295,7 @@ public partial class Workflow : CreationEntity
     /// </summary>
     [SugarColumn(ColumnDataType = "json", IsJson = true)]
     public List<string> FlowedOrgIds { get; set; } = new();
-
+    
     /// <summary>
     /// 流经办理人
     /// </summary>
@@ -417,7 +417,7 @@ public partial class Workflow
 
 
 
-        ClearHandlers();
+        //ClearHandlers();
 
         SetAllDuration();
 
@@ -430,7 +430,7 @@ public partial class Workflow
         EndTime = DateTime.Now;
         ActualOpinion = opinion;
 
-        ClearHandlers();
+        //ClearHandlers();
     }
 
     /// <summary>
@@ -658,8 +658,8 @@ public partial class Workflow
     /// <param name="handlerObjects"></param>
     public void ResetHandlers(EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
     {
-        ClearHandlers();
-        SetHandlers(assignType, handlerObjects);
+        //ClearHandlers();
+        //SetHandlers(assignType, handlerObjects);
     }
 
     /// <summary>
@@ -677,7 +677,7 @@ public partial class Workflow
     public void UpdateHandlers(string handlerId, string handlerOrg, EFlowAssignType assignType,
         List<HandlerGroupItem> handlerObjects, bool isCreateNewStep)
     {
-        RemoveCurrentHandleGroup(handlerId, handlerOrg);
+        //RemoveCurrentHandleGroup(handlerId, handlerOrg);
         if (isCreateNewStep)
             SetHandlers(assignType, handlerObjects);
     }
@@ -728,7 +728,7 @@ public partial class Workflow
     /// <param name="prevStep"></param>
     public void UpdatePreviousHandlers(string handlerId, string handlerOrg, WorkflowStep prevStep)
     {
-        RemoveCurrentHandleGroup(handlerId, handlerOrg);
+        //RemoveCurrentHandleGroup(handlerId, handlerOrg);
 
         var groupId = Guid.NewGuid().ToString();
         var handlerObjects = new HandlerGroupItem
@@ -852,20 +852,6 @@ public partial class Workflow
         OrgLevelOneName = orgName;
     }
 
-    // public void CenterToOrg(DateTime expiredTime)
-    // {
-    //     ProcessType = EProcessType.Jiaoban;
-    //     ExpiredTime = expiredTime;
-    //     CenterToOrgTime = DateTime.Now;
-    // }
-    //
-    // public void OrgToCenter(DateTime expiredTime)
-    // {
-    //     ProcessType = EProcessType.Zhiban;
-    //     ExpiredTime = expiredTime;
-    //     CenterToOrgTime = null;
-    // }
-
     public void Redo()
     {
         ResetOption();
@@ -900,7 +886,7 @@ public partial class Workflow
             CsActualHandleOrgIds.Add(orgId);
     }
 
-    public bool IsTopCountersignEndStep(WorkflowStep step)
+    public bool IsTopCountersignEndStep(StepBasicEntity step)
     {
         if (string.IsNullOrEmpty(TopCountersignStepId))
             throw new UserFriendlyException("该流程当前未开启会签");
@@ -908,4 +894,11 @@ public partial class Workflow
     }
 
     #endregion
-}
+}
+
+/*
+ 1. 弃用 workflow, order 上的 handlerUserIds, flowUserIds
+ 2. 弃用 step, trace 上的handlers
+ 3. 统一封装创建step, 复制step,指派类型及办理对象开放参数,依据3种策略进行创建
+ 4. 重构recall,重构recallDto(domain层传入指派信息dto), 取消session传入
+ */

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

@@ -1,5 +1,4 @@
-using Dm;
-using Hotline.File;
+using Hotline.File;
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
@@ -11,18 +10,14 @@ using Hotline.Share.Dtos.FlowEngine.Definition;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Users;
 using MapsterMapper;
-using MediatR;
 using Microsoft.Extensions.Logging;
 using SqlSugar;
-using System.Diagnostics;
 using Hotline.EventBus;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
-using System.Reflection.Metadata;
-using System.Security.AccessControl;
 
 namespace Hotline.FlowEngine.Workflows
 {
@@ -166,11 +161,11 @@ namespace Hotline.FlowEngine.Workflows
             //    current.OrgAreaCode, current.OrgAreaName,
             //    current.OrgLevel);
 
-            workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
-                flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects, true);
+            // workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
+            //     flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects, true);
 
             //更新指派信息
-            workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
+            //workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
@@ -507,9 +502,9 @@ namespace Hotline.FlowEngine.Workflows
             //    await _workflowStepRepository.UpdateAsync(currentStep, cancellationToken);
             //}
 
-            //更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
-            workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
-                flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects, nextSteps.Any());
+            // //更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
+            // workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
+            //     flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects, nextSteps.Any());
 
             //todo 计算办理工作时长
 
@@ -524,7 +519,7 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.StartCountersign(currentStep.Id, counterSignType);
 
             //更新指派信息
-            workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
+            //workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
 
             //更新会签实际办理对象信息
             if (currentStep.IsActualHandled)
@@ -642,10 +637,7 @@ namespace Hotline.FlowEngine.Workflows
 
             //remove workflow.steps
             await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
-            //await _workflowStepRepository.RemoveNav(removeSteps)
-            //    .Include(d => d.StepHandlers)
-            //    .ExecuteCommandAsync();
-
+            
             var stepIds = removeSteps.Select(d => d.Id).ToList();
             var updateTraces = workflow.Traces.Where(d => stepIds.Contains(d.StepId)).ToList();
             await UpdateTracesStateAsync(updateTraces, EWorkflowTraceState.StepRemoveByPrevious, cancellationToken);
@@ -670,8 +662,8 @@ namespace Hotline.FlowEngine.Workflows
                 OrgName = prevStep.HandlerOrgName,
             });
 
-            //更新流程可办理对象
-            workflow.UpdatePreviousHandlers(applicantId, applicantOrgId, prevStep);
+            // //更新流程可办理对象
+            // workflow.UpdatePreviousHandlers(applicantId, applicantOrgId, prevStep);
 
             //orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
             var isOrgToCenter = prevStep.BusinessType is EBusinessType.Send && prevStep.IsOrigin;
@@ -986,18 +978,18 @@ namespace Hotline.FlowEngine.Workflows
         {
             var workflow = await GetWorkflowAsync(workflowId, withSteps: true, withTraces: true,
                 cancellationToken: cancellationToken);
-            workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
-
-            workflow.HandlerOrgs = new();
-            workflow.HandlerUsers = new List<HandlerGroupItem>
-            {
-                new()
-                {
-                    GroupId = Guid.NewGuid().ToString(),
-                    Key = userId,
-                    Value = username
-                }
-            };
+            // workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
+            //
+            // workflow.HandlerOrgs = new();
+            // workflow.HandlerUsers = new List<HandlerGroupItem>
+            // {
+            //     new()
+            //     {
+            //         GroupId = Guid.NewGuid().ToString(),
+            //         Key = userId,
+            //         Value = username
+            //     }
+            // };
 
             var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start && d.IsOrigin);
             startStep.Handlers = new List<Kv> { new(userId, username) };
@@ -1449,7 +1441,6 @@ namespace Hotline.FlowEngine.Workflows
             _mapper.Map(workflow, startStep);
             startStep.FlowAssignType = flowAssignType;
             startStep.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
-            //startStep.StepHandlers = stepHandlers;
             startStep.NextSteps = nextSteps;
             startStep.IsMain = true;
             startStep.IsOrigin = true;
@@ -2344,8 +2335,8 @@ namespace Hotline.FlowEngine.Workflows
                 OrgName = targetStep.HandlerOrgName
             });
 
-            workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
-            workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
+            //workflow.Assign(flowAssignInfo.FlowAssignType, flowAssignInfo.GetHandlerIds());
+            //workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
 
             //calc workflow expired time
             var isOrgToCenter = CheckIfFlowFromOrgToCenter(workflow, targetStep);
@@ -2660,7 +2651,7 @@ namespace Hotline.FlowEngine.Workflows
                     Key = d.Key,
                     Value = d.Value
                 }).ToList();
-                workflow.UpdateHandlers(removeHandlers, newStep.FlowAssignType.Value, handlerObjs);
+                //workflow.UpdateHandlers(removeHandlers, newStep.FlowAssignType.Value, handlerObjs);
 
                 await _workflowRepository.UpdateAsync(workflow, cancellationToken);
             }

+ 5 - 5
src/Hotline/Hotline.csproj

@@ -1,17 +1,17 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <NoWarn>$(NoWarn);8618;</NoWarn>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Mapster" Version="7.3.0" />
-    <PackageReference Include="MediatR" Version="12.0.1" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
-    <PackageReference Include="MiniExcel" Version="1.31.3" />
+    <PackageReference Include="Mapster" Version="7.4.0" />
+    <PackageReference Include="MediatR" Version="12.4.1" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
+    <PackageReference Include="MiniExcel" Version="1.34.2" />
     <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
     <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="XF.Utility.MQ" Version="1.0.9" />

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

@@ -524,8 +524,6 @@ namespace Hotline.Settings
 
 		#endregion
 
-        
-
         /// <summary>
         /// 定量查询返回数据条数上限
         /// </summary>
@@ -535,5 +533,10 @@ namespace Hotline.Settings
         /// 旧数据通知公告知识库附件地址	
         /// </summary>
         public const string OldFilesUrls = "OldFilesUrls";
+        
+        /// <summary>
+        /// 是否重置中心会签类型
+        /// </summary>
+        public const string IsResetCenterCountersignType = "IsResetCenterCountersignType";
     }
 }

+ 5 - 5
src/NewRock.Sdk/NewRock.Sdk.csproj

@@ -1,16 +1,16 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Mapster" Version="7.3.0" />
-    <PackageReference Include="MediatR.Contracts" Version="1.0.1" />
-    <PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Mapster" Version="7.4.0" />
+    <PackageReference Include="MediatR.Contracts" Version="2.0.1" />
+    <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
     <PackageReference Include="System.Xml.XmlSerializer" Version="4.3.0" />
   </ItemGroup>

+ 2 - 2
src/Tr.Sdk/Tr.Sdk.csproj

@@ -1,13 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
     <PackageReference Include="RestSharp" Version="110.2.0" />
   </ItemGroup>

+ 2 - 2
src/Wex.Sdk/Wex.Sdk.csproj

@@ -1,13 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
     <PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
   </ItemGroup>
 

+ 2 - 2
src/XF.Domain.Repository/XF.Domain.Repository.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
@@ -10,7 +10,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.153" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.169" />
     <PackageReference Include="XF.Utility.SequentialId" Version="1.0.2" />
   </ItemGroup>
 

+ 15 - 0
src/XF.Domain/Authentications/ISessionContextProvider.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XF.Domain.Authentications
+{
+    public interface ISessionContextProvider
+    {
+        public ISessionContext SessionContext { get; set; }
+
+        public void SwitchTo(string key);
+    }
+}

+ 8 - 8
src/XF.Domain/XF.Domain.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
@@ -11,13 +11,13 @@
 
   <ItemGroup>
     <PackageReference Include="Fw.Utility.UnifyResponse" Version="1.0.0" />
-    <PackageReference Include="IdentityModel" Version="6.1.0" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
-    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
-    <PackageReference Include="Serilog.AspNetCore" Version="6.0.1" />
-    <PackageReference Include="Serilog.Enrichers.Span" Version="2.3.0" />
-    <PackageReference Include="Ulid" Version="1.3.3" />
-    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.25.1" />
+    <PackageReference Include="IdentityModel" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
+    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
+    <PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
+    <PackageReference Include="Serilog.Enrichers.Span" Version="3.1.0" />
+    <PackageReference Include="Ulid" Version="1.3.4" />
+    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.1.2" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
src/XF.EasyCaching/XF.EasyCaching.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>

+ 3 - 3
src/XingTang.Sdk/XingTang.Sdk.csproj

@@ -1,13 +1,13 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.153" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.169" />
   </ItemGroup>
 
 </Project>