|
@@ -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
|
|
|
{
|