xf 2 years ago
parent
commit
16aa5040a2

+ 14 - 1
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -249,7 +249,7 @@ public class WorkflowController : BaseController
     /// 办理节点
     /// </summary>
     [HttpPost("next")]
-    public async Task NextAsync([FromBody]NextWorkflowDto dto)
+    public async Task NextAsync([FromBody] NextWorkflowDto dto)
     {
         await _workflowApplication.NextAsync(dto, HttpContext.RequestAborted);
     }
@@ -354,6 +354,19 @@ public class WorkflowController : BaseController
         }
     }
 
+    /// <summary>
+    /// 查询流程流转记录
+    /// </summary>
+    /// <param name="workflowId"></param>
+    /// <returns></returns>
+    [HttpGet("{workflowId}/traces")]
+    public async Task<WorkflowDto> GetWorkflowTraces(string workflowId)
+    {
+        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withTraces: true,
+            cancellationToken: HttpContext.RequestAborted);
+        return _mapper.Map<WorkflowDto>(workflow);
+    }
+
     [HttpGet("base-data")]
     public dynamic BaseData()
     {

+ 49 - 39
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -86,9 +86,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
         var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
-        var isOutOfCallCenter =
-            await CheckIfFlowOutOfCallCenterAsync(nextStepBoxDefine, dto.NextMainHandler, cancellationToken);
-        var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
+        //下一节点为结束节点时,无办理人等参数,只有办理意见即可
+        var isOutOfCallCenter = nextStepBoxDefine.StepType is not EStepType.End 
+                                && await CheckIfFlowOutOfCallCenterAsync(nextStepBoxDefine, dto.NextMainHandler, cancellationToken);
+        var isStartCountersign = nextStepBoxDefine.StepType is not EStepType.End 
+                                 && nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
         await _workflowDomainService.NextAsync(workflow, dto, nextStepBoxDefine, isOutOfCallCenter, isStartCountersign, cancellationToken);
 
         //更新接办部门(详情页面展示)
@@ -159,44 +161,52 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 Name = nextStepDefine.Name,
             };
 
-            switch (nextStepDefine.HandlerType)
+            if (nextStepDefine.StepType != EStepType.End)
             {
-                case EHandlerType.AssignUser:
-                    var users = await _userRepository.QueryAsync(d =>
-                        nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Id));
-                    options.NextSteps = users.Select(d => new KeyValuePair<string, string>(d.Id, d.Name)).ToList();
-                    break;
-                case EHandlerType.AssignOrg:
-                    var orgs = await _organizeRepository.QueryAsync(d =>
-                        nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.OrgCode));
-                    options.NextSteps = orgs.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName)).ToList();
-                    break;
-                case EHandlerType.Role:
-                    var roles = await _roleRepository.Queryable().Includes(d => d.Accounts, d => d.User)
-                        .Where(d => nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Name)).ToListAsync();
-                    var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
-                    if (nextStepDefine.OnlySelfOrg ?? false)
-                        users1 = users1.Where(d => d.OrgCode == _sessionContext.RequiredOrgCode);
-                    options.NextSteps = users1.Select(d => new KeyValuePair<string, string>(d.Id, d.Name)).ToList();
-                    break;
-                case EHandlerType.OrgLevel:
-                    //当前操作人所属部门的下级部门并且属于配置orgLevel的部门
-                    var levels = nextStepDefine.HandlerClassifies.Select(d => d.Id).Select(d => int.Parse(d));
-                    var orgs1 = await _organizeRepository.QueryAsync(d =>
-                        d.IsEnable && d.OrgCode.StartsWith(_sessionContext.RequiredOrgCode) &&
-                        levels.Contains(d.OrgLevel));
-                    options.NextSteps = orgs1.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName)).ToList();
-                    break;
-                case EHandlerType.OrgType:
-                    var types = nextStepDefine.HandlerClassifies.Select(d => d.Id).Select(d => Enum.Parse<EOrgType>(d));
-                    var org2 = await _organizeRepository.QueryAsync(d =>
-                        d.IsEnable && d.OrgCode.StartsWith(_sessionContext.RequiredOrgCode) &&
-                        types.Contains(d.OrgType));
-                    options.NextSteps = org2.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName)).ToList();
-                    break;
+                switch (nextStepDefine.HandlerType)
+                {
+                    case EHandlerType.AssignUser:
+                        var users = await _userRepository.QueryAsync(d =>
+                            nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Id));
+                        options.NextSteps = users.Select(d => new KeyValuePair<string, string>(d.Id, d.Name)).ToList();
+                        break;
+                    case EHandlerType.AssignOrg:
+                        var orgs = await _organizeRepository.QueryAsync(d =>
+                            nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.OrgCode));
+                        options.NextSteps = orgs.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName))
+                            .ToList();
+                        break;
+                    case EHandlerType.Role:
+                        var roles = await _roleRepository.Queryable().Includes(d => d.Accounts, d => d.User)
+                            .Where(d => nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Name))
+                            .ToListAsync();
+                        var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
+                        if (nextStepDefine.OnlySelfOrg ?? false)
+                            users1 = users1.Where(d => d.OrgCode == _sessionContext.RequiredOrgCode);
+                        options.NextSteps = users1.Select(d => new KeyValuePair<string, string>(d.Id, d.Name)).ToList();
+                        break;
+                    case EHandlerType.OrgLevel:
+                        //当前操作人所属部门的下级部门并且属于配置orgLevel的部门
+                        var levels = nextStepDefine.HandlerClassifies.Select(d => d.Id).Select(d => int.Parse(d));
+                        var orgs1 = await _organizeRepository.QueryAsync(d =>
+                            d.IsEnable && d.OrgCode.StartsWith(_sessionContext.RequiredOrgCode) &&
+                            levels.Contains(d.OrgLevel));
+                        options.NextSteps = orgs1.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName))
+                            .ToList();
+                        break;
+                    case EHandlerType.OrgType:
+                        var types = nextStepDefine.HandlerClassifies.Select(d => d.Id)
+                            .Select(d => Enum.Parse<EOrgType>(d));
+                        var org2 = await _organizeRepository.QueryAsync(d =>
+                            d.IsEnable && d.OrgCode.StartsWith(_sessionContext.RequiredOrgCode) &&
+                            types.Contains(d.OrgType));
+                        options.NextSteps = org2.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName))
+                            .ToList();
+                        break;
 
-                default:
-                    throw new ArgumentOutOfRangeException();
+                    default:
+                        throw new ArgumentOutOfRangeException();
+                }
             }
 
             items.Add(options);

+ 4 - 0
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -47,6 +47,7 @@ namespace Hotline.Application.Mappers
 
             config.ForType<WorkflowStep, WorkflowTrace>()
                 .Ignore(d => d.Id)
+                .Ignore(d=>d.ParentId)
                 .Map(d => d.StepId, s => s.Id);
 
             config.ForType<WorkflowSupplement, WorkflowSupplementDto>()
@@ -57,6 +58,9 @@ namespace Hotline.Application.Mappers
                 .Map(d => d.AssignOrgs, s => string.Join(',', s.Assigns.Select(d => d.OrgName)))
                 ;
 
+            config.ForType<BasicWorkflowDto, WorkflowStep>()
+                .IgnoreNullValues(true);
+
             #endregion
 
             #region order

+ 1 - 1
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -172,7 +172,7 @@ namespace Hotline.Repository.SqlSugar.Extensions
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
-                Log.Information(sql);
+                //Log.Information(sql);
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

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

@@ -257,7 +257,7 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.Complete();
                 await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
-                _mediator.Publish(new EndWorkflowNotify(workflow), cancellationToken);
+                await _mediator.Publish(new EndWorkflowNotify(workflow), cancellationToken);
                 return;
             }