临时提交

main
陈伟 2026-02-05 09:51:56 +08:00
parent 6cc7902a85
commit cbe0e794db
5 changed files with 811 additions and 392 deletions

View File

@ -4,6 +4,7 @@ using OpenAuth.App.Interface;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Domain.workflow;
using OpenAuth.WebApi.Controllers.ServerController;
using SqlSugar;
namespace workflow;
@ -18,9 +19,21 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.Http;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.Interface;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Domain.workflow;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
/// <summary>
/// 完整工作流引擎适配区县→执法监督科→5个审核科会签→汇总归档/退回)
/// 包含:流程发起/处理 + 拟办/待办/已办/未办结/已完成/全部事项查询
/// </summary>
public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext>
{
@ -45,12 +58,19 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
_sqlSugar = Repository.AsSugarClient();
}
#region 1. 发起流程(区县提交→流转至执法监督科)
#region 一、核心业务:流程发起/处理
public long InitiateFlow(long userId, string userName, InitiateFlowRequest request)
/// <summary>
/// 发起流程(区县提交→流转至执法监督科)
/// </summary>
/// <param name="userId">发起人ID</param>
/// <param name="userName">发起人姓名</param>
/// <param name="requestDto">发起流程请求参数</param>
/// <returns>流程实例ID</returns>
public long InitiateFlow(long userId, string userName, InitiateFlowRequestDto requestDto)
{
// 参数校验
if (string.IsNullOrEmpty(request.FlowCode) || string.IsNullOrEmpty(request.BusinessNo))
if (string.IsNullOrEmpty(requestDto.FlowCode) || string.IsNullOrEmpty(requestDto.BusinessNo))
throw new Exception("流程编码和业务编号不能为空");
if (userId <= 0 || string.IsNullOrEmpty(userName))
throw new Exception("发起人ID和姓名不能为空");
@ -64,10 +84,10 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
// 步骤1查询启用的流程模板违法建设认定流程
var template = _sqlSugar.Queryable<ZyFlowTemplate>()
.Where(t => t.FlowCode == request.FlowCode && t.IsEnabled == true)
.Where(t => t.FlowCode == requestDto.FlowCode && t.IsEnabled == true)
.First();
if (template == null)
throw new Exception($"流程模板【{request.FlowCode}】不存在或未启用");
throw new Exception($"流程模板【{requestDto.FlowCode}】不存在或未启用");
// 步骤2查询流程开始节点区县提交
var startNode = _sqlSugar.Queryable<ZyFlowNode>()
@ -81,7 +101,7 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
{
TemplateId = template.TemplateId,
FlowCode = template.FlowCode,
BusinessNo = request.BusinessNo,
BusinessNo = requestDto.BusinessNo,
Status = "Submitted", // 已提交
CurrentNodeId = startNode.NodeId,
InitiatorId = userId,
@ -106,10 +126,10 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
_sqlSugar.Insertable(startWorkitem).ExecuteCommand();
// 步骤5保存流程变量标题、附件路径等
var attachmentPaths = SaveAttachments(request.Attachments);
var attachmentPaths = SaveAttachments(requestDto.Attachments);
var flowVariables = new List<ZyFlowVariable>
{
new ZyFlowVariable { InstanceId = instanceId, VarKey = "Title", VarValue = request.Title },
new ZyFlowVariable { InstanceId = instanceId, VarKey = "Title", VarValue = requestDto.Title },
new ZyFlowVariable { InstanceId = instanceId, VarKey = "AttachmentPaths", VarValue = attachmentPaths },
new ZyFlowVariable
{
@ -135,14 +155,17 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
return instanceId;
}
#endregion
#region 2. 处理工作项(执法监督科转发/审核科会签/汇总处理)
public bool HandleWorkitem(long userId, string userName, HandleWorkitemRequest request)
/// <summary>
/// 处理工作项(执法监督科转发/审核科会签/汇总处理)
/// </summary>
/// <param name="userId">处理人ID</param>
/// <param name="userName">处理人姓名</param>
/// <param name="requestDto">处理工作项请求参数</param>
/// <returns>处理结果(成功/失败)</returns>
public bool HandleWorkitem(long userId, string userName, HandleWorkitemRequestDto requestDto)
{
// 参数校验
if (request.WorkitemId <= 0)
if (requestDto.WorkitemId <= 0)
throw new Exception("工作项ID无效");
if (userId <= 0 || string.IsNullOrEmpty(userName))
throw new Exception("处理人ID和姓名不能为空");
@ -154,7 +177,7 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
// 步骤1查询待处理的工作项仅待办状态可处理
var workitem = _sqlSugar.Queryable<ZyFlowWorkitem>()
.Where(w => w.WorkitemId == request.WorkitemId && w.Status == "ToDo")
.Where(w => w.WorkitemId == requestDto.WorkitemId && w.Status == "ToDo")
.First();
if (workitem == null)
throw new Exception("工作项不存在、已处理或状态异常");
@ -172,7 +195,7 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
// 步骤3更新当前工作项为已完成
workitem.Status = "Done";
workitem.HandleTime = DateTime.Now;
workitem.Comment = string.IsNullOrEmpty(request.Comment) ? "处理完成" : request.Comment;
workitem.Comment = string.IsNullOrEmpty(requestDto.Comment) ? "处理完成" : requestDto.Comment;
_sqlSugar.Updateable(workitem).ExecuteCommand();
// 步骤4按节点类型分支处理核心逻辑
@ -185,7 +208,7 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
// 并行节点5个审核科会签
case "Parallel" when _auditDeptRoleIds.Contains(currentNode.RoleId):
ProcessParallelAudit(flowInstance.InstanceId, currentNode.NodeId, userId, userName, request);
ProcessParallelAudit(flowInstance.InstanceId, currentNode.NodeId, userId, userName, requestDto);
break;
// 分支节点:汇总(归档/退回区县)
@ -213,23 +236,105 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
#endregion
#region 3. 流程查询(我的待办/我的已办)
#region 二、完整查询:拟办/待办/已办/未办结/已完成/全部事项
/// <summary>
/// 查询我的待办工作项
/// 我的拟办(未认领/待分配给当前用户的事项)
/// </summary>
public List<FlowQueryResult> QueryMyToDo(long userId)
/// <param name="userId">当前用户ID</param>
/// <param name="pageQueryDto">分页参数</param>
/// <returns>分页结果</returns>
public PageQueryResultDto<FlowQuerySingleResultDto> QueryMyDraft(long userId, PageQueryRequestDto pageQueryDto)
{
// 参数初始化
if (userId <= 0)
return new List<FlowQueryResult>();
return new PageQueryResultDto<FlowQuerySingleResultDto>();
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 步骤1查询当前用户的待办工作项
var toDoWorkitems = _sqlSugar.Queryable<ZyFlowWorkitem>()
.Where(w => w.HandlerId == userId && w.Status == "ToDo")
// 拟办逻辑:工作项状态为"Draft"(拟办)、对应角色匹配当前用户、未分配具体处理人
var draftQuery = _sqlSugar
.Queryable<ZyFlowWorkitem, ZyFlowNode>((w, n) => new JoinQueryInfos(
JoinType.Inner, w.NodeId == n.NodeId))
.Where((w, n) =>
w.Status == "Draft" && _auditDeptRoleIds.Contains(n.RoleId)
&& (w.HandlerId == null || w.HandlerId == 0)
&& w.HandlerName != "")
.OrderByDescending((w, n) => w.ReceiveTime);
// 分页查询
var totalCount = draftQuery.Count();
var draftWorkitems = draftQuery
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToList();
// 步骤2组装返回结果
var queryResults = new List<FlowQueryResult>();
// 组装返回结果
var dataList = new List<FlowQuerySingleResultDto>();
foreach (var workitem in draftWorkitems)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
.Where(i => i.InstanceId == workitem.InstanceId)
.First();
if (flowInstance == null)
continue;
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
dataList.Add(new FlowQuerySingleResultDto
{
InstanceId = flowInstance.InstanceId,
BusinessNo = flowInstance.BusinessNo,
Title = flowTitle,
NodeName = workitem.NodeName,
Status = "Draft", // 拟办状态
CreateTime = flowInstance.CreateTime,
InitiatorName = flowInstance.InitiatorName
});
}
return new PageQueryResultDto<FlowQuerySingleResultDto>
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
DataList = dataList
};
}
/// <summary>
/// 我的待办(已分配给当前用户、待处理的事项)
/// </summary>
/// <param name="userId">当前用户ID</param>
/// <param name="pageQueryDto">分页参数</param>
/// <returns>分页结果</returns>
public PageQueryResultDto<FlowQuerySingleResultDto> QueryMyToDo(long userId, PageQueryRequestDto pageQueryDto)
{
// 参数初始化
if (userId <= 0)
return new PageQueryResultDto<FlowQuerySingleResultDto>();
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 待办逻辑:工作项状态为"ToDo"、处理人ID为当前用户
var toDoQuery = _sqlSugar.Queryable<ZyFlowWorkitem>()
.Where(w => w.HandlerId == userId && w.Status == "ToDo")
.OrderByDescending(w => w.ReceiveTime);
// 分页查询
var totalCount = toDoQuery.Count();
var toDoWorkitems = toDoQuery
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToList();
// 组装返回结果
var dataList = new List<FlowQuerySingleResultDto>();
foreach (var workitem in toDoWorkitems)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
@ -238,12 +343,11 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
if (flowInstance == null)
continue;
// 查询流程标题
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
queryResults.Add(new FlowQueryResult
dataList.Add(new FlowQuerySingleResultDto
{
InstanceId = flowInstance.InstanceId,
BusinessNo = flowInstance.BusinessNo,
@ -255,27 +359,51 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
});
}
return queryResults;
return new PageQueryResultDto<FlowQuerySingleResultDto>
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
DataList = dataList
};
}
/// <summary>
/// 查询我的已办工作项
/// 我的已办(当前用户已处理完成的事项)
/// </summary>
public List<FlowQueryResult> QueryMyDone(long userId)
/// <param name="userId">当前用户ID</param>
/// <param name="pageQueryDto">分页参数</param>
/// <returns>分页结果</returns>
public PageQueryResultDto<FlowQuerySingleResultDto> QueryMyDone(long userId, PageQueryRequestDto pageQueryDto)
{
// 参数初始化
if (userId <= 0)
return new List<FlowQueryResult>();
return new PageQueryResultDto<FlowQuerySingleResultDto>();
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 步骤1查询当前用户已完成的工作项对应的流程实例ID去重
// 已办逻辑:工作项状态为"Done"、处理人ID为当前用户去重流程实例
var doneInstanceIds = _sqlSugar.Queryable<ZyFlowWorkitem>()
.Where(w => w.HandlerId == userId && w.Status == "Done")
.Select(w => w.InstanceId)
.Distinct()
.ToList();
// 步骤2组装返回结果
var queryResults = new List<FlowQueryResult>();
foreach (var instanceId in doneInstanceIds)
if (!doneInstanceIds.Any())
return new PageQueryResultDto<FlowQuerySingleResultDto>();
// 分页处理实例ID
var pagedInstanceIds = doneInstanceIds
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToList();
var totalCount = doneInstanceIds.Count;
// 组装返回结果
var dataList = new List<FlowQuerySingleResultDto>();
foreach (var instanceId in pagedInstanceIds)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
.Where(i => i.InstanceId == instanceId)
@ -283,18 +411,16 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
if (flowInstance == null)
continue;
// 查询流程标题
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
// 查询最新的已完成工作项
var lastWorkitem = _sqlSugar.Queryable<ZyFlowWorkitem>()
.Where(w => w.InstanceId == instanceId && w.Status == "Done")
.Where(w => w.InstanceId == instanceId && w.HandlerId == userId && w.Status == "Done")
.OrderByDescending(w => w.HandleTime)
.First();
queryResults.Add(new FlowQueryResult
dataList.Add(new FlowQuerySingleResultDto
{
InstanceId = flowInstance.InstanceId,
BusinessNo = flowInstance.BusinessNo,
@ -306,12 +432,245 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
});
}
return queryResults;
return new PageQueryResultDto<FlowQuerySingleResultDto>
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
DataList = dataList
};
}
/// <summary>
/// 我的未办结(当前用户参与过、流程尚未完成的事项)
/// </summary>
/// <param name="userId">当前用户ID</param>
/// <param name="pageQueryDto">分页参数</param>
/// <returns>分页结果</returns>
public PageQueryResultDto<FlowQuerySingleResultDto> QueryMyUnfinished(long userId, PageQueryRequestDto pageQueryDto)
{
// 参数初始化
if (userId <= 0)
return new PageQueryResultDto<FlowQuerySingleResultDto>();
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 未办结逻辑:
// 1. 当前用户参与过(处理过/待处理)
// 2. 流程状态不是"Completed"(未完成)
var unfinishedInstanceIds = _sqlSugar.Queryable<ZyFlowWorkitem, ZyFlowInstance>((w, i) => new JoinQueryInfos(
JoinType.Inner, w.InstanceId == i.InstanceId))
.Where((w, i) => (w.HandlerId == userId || (w.Status == "Draft" && _auditDeptRoleIds.Contains(w.NodeId)))
&& i.Status != "Completed")
.Select((w, i) => i.InstanceId)
.Distinct()
.ToList();
if (!unfinishedInstanceIds.Any())
return new PageQueryResultDto<FlowQuerySingleResultDto>();
// 分页处理实例ID
var pagedInstanceIds = unfinishedInstanceIds
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToList();
var totalCount = unfinishedInstanceIds.Count;
// 组装返回结果
var dataList = new List<FlowQuerySingleResultDto>();
foreach (var instanceId in pagedInstanceIds)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
.Where(i => i.InstanceId == instanceId)
.First();
if (flowInstance == null)
continue;
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
var currentNode = _sqlSugar.Queryable<ZyFlowNode>()
.Where(n => n.NodeId == flowInstance.CurrentNodeId)
.First();
dataList.Add(new FlowQuerySingleResultDto
{
InstanceId = flowInstance.InstanceId,
BusinessNo = flowInstance.BusinessNo,
Title = flowTitle,
NodeName = currentNode?.NodeName ?? string.Empty,
Status = flowInstance.Status,
CreateTime = flowInstance.CreateTime,
InitiatorName = flowInstance.InitiatorName
});
}
return new PageQueryResultDto<FlowQuerySingleResultDto>
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
DataList = dataList
};
}
/// <summary>
/// 我的已完成(当前用户参与过、流程已归档完成的事项)
/// </summary>
/// <param name="userId">当前用户ID</param>
/// <param name="pageQueryDto">分页参数</param>
/// <returns>分页结果</returns>
public PageQueryResultDto<FlowQuerySingleResultDto> QueryMyCompleted(long userId, PageQueryRequestDto pageQueryDto)
{
// 参数初始化
if (userId <= 0)
return new PageQueryResultDto<FlowQuerySingleResultDto>();
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 已完成逻辑:
// 1. 当前用户参与过(处理过/待处理)
// 2. 流程状态是"Completed"(已完成)
var completedInstanceIds = _sqlSugar.Queryable<ZyFlowWorkitem, ZyFlowInstance>((w, i) => new JoinQueryInfos(
JoinType.Inner, w.InstanceId == i.InstanceId))
.Where((w, i) => (w.HandlerId == userId || (w.Status == "Draft" && _auditDeptRoleIds.Contains(w.NodeId)))
&& i.Status == "Completed")
.Select((w, i) => i.InstanceId)
.Distinct()
.ToList();
if (!completedInstanceIds.Any())
return new PageQueryResultDto<FlowQuerySingleResultDto>();
// 分页处理实例ID
var pagedInstanceIds = completedInstanceIds
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToList();
var totalCount = completedInstanceIds.Count;
// 组装返回结果
var dataList = new List<FlowQuerySingleResultDto>();
foreach (var instanceId in pagedInstanceIds)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
.Where(i => i.InstanceId == instanceId)
.First();
if (flowInstance == null)
continue;
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
var lastNode = _sqlSugar.Queryable<ZyFlowNode>()
.Where(n => n.NodeId == flowInstance.CurrentNodeId)
.First();
dataList.Add(new FlowQuerySingleResultDto
{
InstanceId = flowInstance.InstanceId,
BusinessNo = flowInstance.BusinessNo,
Title = flowTitle,
NodeName = lastNode?.NodeName ?? "流程归档",
Status = flowInstance.Status,
CreateTime = flowInstance.CreateTime,
InitiatorName = flowInstance.InitiatorName
});
}
return new PageQueryResultDto<FlowQuerySingleResultDto>
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
DataList = dataList
};
}
/// <summary>
/// 我的全部事项(拟办+待办+已办+未办结+已完成,去重整合)
/// </summary>
/// <param name="userId">当前用户ID</param>
/// <param name="pageQueryDto">分页参数</param>
/// <returns>分页结果</returns>
public PageQueryResultDto<FlowQuerySingleResultDto> QueryMyAllItems(long userId, PageQueryRequestDto pageQueryDto)
{
// 参数初始化
if (userId <= 0)
return new PageQueryResultDto<FlowQuerySingleResultDto>();
pageQueryDto = pageQueryDto ?? new PageQueryRequestDto();
var pageIndex = pageQueryDto.PageIndex < 1 ? 1 : pageQueryDto.PageIndex;
var pageSize = pageQueryDto.PageSize < 1 ? 10 : pageQueryDto.PageSize;
// 全部事项逻辑:当前用户相关的所有流程实例(去重)
var allInstanceIds = _sqlSugar.Queryable<ZyFlowWorkitem, ZyFlowInstance>((w, i) => new JoinQueryInfos(
JoinType.Inner, w.InstanceId == i.InstanceId))
.Where((w, i) => w.HandlerId == userId || (w.Status == "Draft" && _auditDeptRoleIds.Contains(w.NodeId))
|| i.InitiatorId == userId)
.Select((w, i) => i.InstanceId)
.Distinct()
.ToList();
if (!allInstanceIds.Any())
return new PageQueryResultDto<FlowQuerySingleResultDto>();
// 分页处理实例ID
var pagedInstanceIds = allInstanceIds
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToList();
var totalCount = allInstanceIds.Count;
// 组装返回结果
var dataList = new List<FlowQuerySingleResultDto>();
foreach (var instanceId in pagedInstanceIds)
{
var flowInstance = _sqlSugar.Queryable<ZyFlowInstance>()
.Where(i => i.InstanceId == instanceId)
.First();
if (flowInstance == null)
continue;
var flowTitle = _sqlSugar.Queryable<ZyFlowVariable>()
.Where(v => v.InstanceId == flowInstance.InstanceId && v.VarKey == "Title")
.First()?.VarValue ?? string.Empty;
var currentNode = _sqlSugar.Queryable<ZyFlowNode>()
.Where(n => n.NodeId == flowInstance.CurrentNodeId)
.First();
dataList.Add(new FlowQuerySingleResultDto
{
InstanceId = flowInstance.InstanceId,
BusinessNo = flowInstance.BusinessNo,
Title = flowTitle,
NodeName = currentNode?.NodeName ?? string.Empty,
Status = flowInstance.Status,
CreateTime = flowInstance.CreateTime,
InitiatorName = flowInstance.InitiatorName
});
}
return new PageQueryResultDto<FlowQuerySingleResultDto>
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = totalCount,
TotalPages = (int)Math.Ceiling((double)totalCount / pageSize),
DataList = dataList
};
}
#endregion
#region 4. 核心辅助方法(流转/会签/汇总/附件等)
#region 三、内部核心辅助方法(仅内部调用,不对外暴露
/// <summary>
/// 流程节点流转核心方法
@ -377,10 +736,10 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
/// 处理并行会签(保存结果+判断是否全部完成)
/// </summary>
private void ProcessParallelAudit(long instanceId, long nodeId, long userId, string userName,
HandleWorkitemRequest request)
HandleWorkitemRequestDto requestDto)
{
// 校验会签结果
if (string.IsNullOrEmpty(request.AuditResult))
if (string.IsNullOrEmpty(requestDto.AuditResult))
throw new Exception("会签需选择审核结果Pass/Reject");
// 步骤1获取当前用户所属科室名称
@ -392,8 +751,8 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
InstanceId = instanceId,
NodeId = nodeId,
DeptName = deptName,
AuditResult = request.AuditResult,
AuditComment = request.Comment,
AuditResult = requestDto.AuditResult,
AuditComment = requestDto.Comment,
AuditorId = userId,
AuditorName = userName,
AuditTime = DateTime.Now
@ -417,11 +776,11 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
private void ProcessSummaryNode(ZyFlowInstance flowInstance, ZyFlowNode summaryNode, long userId, string userName)
{
// 步骤1判断是否全部审核通过
var isAllPass = _sqlSugar.Queryable<ZyFlowParallelAudit>()
var hasReject = _sqlSugar.Queryable<ZyFlowParallelAudit>()
.Where(a => a.InstanceId == flowInstance.InstanceId)
.Any(a=> a.AuditResult != "Pass");
.Any(a => a.AuditResult != "Pass");
var isAllPass = !hasReject;
// todo
// 步骤2解析汇总节点下一节点归档/退回)
var nextNodeIds = summaryNode.NextNodeIds?.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(long.Parse)
@ -429,13 +788,13 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
if (nextNodeIds.Count < 2)
throw new Exception("汇总节点需配置2个后续节点归档/退回区县)");
// 步骤3确定目标节点通过→归档,不通过→退回)
var targetNodeId = !isAllPass ? nextNodeIds[0] : nextNodeIds[1];
// 步骤3确定目标节点通过→归档[下标0],不通过→退回区县[下标1]
var targetNodeId = isAllPass ? nextNodeIds[0] : nextNodeIds[1];
var targetNode = _sqlSugar.Queryable<ZyFlowNode>()
.Where(n => n.NodeId == targetNodeId)
.First();
if (targetNode == null)
return;
throw new Exception($"汇总节点目标节点【{(isAllPass ? "" : "退")}】不存在");
// 步骤4创建目标节点工作项
var summaryWorkitem = new ZyFlowWorkitem
@ -448,7 +807,7 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
Status = isAllPass ? "Done" : "ToDo",
ReceiveTime = DateTime.Now,
HandleTime = isAllPass ? DateTime.Now : null,
Comment = isAllPass ? "所有审核科通过,流程归档完成" : "存在审核不通过项,退回区县修改"
Comment = isAllPass ? "所有审核科通过,流程归档完成" : "存在审核不通过项,退回区县修改补充材料"
};
_sqlSugar.Insertable(summaryWorkitem).ExecuteCommand();
@ -475,8 +834,8 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
private void CreateAuditDeptWorkitem(long instanceId, ZyFlowNode parallelNode, long roleId)
{
// 获取科室用户信息
var (userId, userName, deptName) = GetRoleFirstUserInfo(roleId);
if (userId <= 0 || string.IsNullOrEmpty(userName))
var userInfo = GetRoleFirstUserInfo(roleId);
if (userInfo.userId <= 0 || string.IsNullOrEmpty(userInfo.userName))
throw new Exception($"审核科角色【{roleId}】未配置有效用户");
// 创建工作项
@ -484,9 +843,9 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
{
InstanceId = instanceId,
NodeId = parallelNode.NodeId,
NodeName = $"{parallelNode.NodeName}{deptName}",
HandlerId = userId,
HandlerName = userName,
NodeName = $"{parallelNode.NodeName}{userInfo.deptName}",
HandlerId = userInfo.userId,
HandlerName = userInfo.userName,
Status = "ToDo",
ReceiveTime = DateTime.Now,
Comment = "请完成违法建设认定相关审核工作"
@ -572,45 +931,25 @@ public class WorkflowEngineApp : SqlSugarBaseApp<SysCategoryType, SugarDbContext
return deptName ?? "未知科室";
}
/// <summary>
/// 获取角色下第一个用户ID
/// </summary>
private long GetRoleFirstUserId(long roleId)
{
var userInfo = GetRoleFirstUserInfo(roleId);
return userInfo.userId;
}
/// <summary>
/// 获取角色下第一个用户姓名
/// </summary>
private string GetRoleFirstUserName(long roleId)
{
var userInfo = GetRoleFirstUserInfo(roleId);
return userInfo.userName;
}
/// <summary>
/// 获取角色下第一个用户的完整信息
/// </summary>
private (long userId, string userName, string deptName) GetRoleFirstUserInfo(long roleId)
{
var sql = @"
SELECT
u.""Id"" as UserId,
u.""Name"" as UserName,
o.""Name"" as DeptName
FROM sys_user u
INNER JOIN sys_userrole r ON u.""Id"" = r.""UserId""
INNER JOIN sys_userorg uo ON u.""Id"" = uo.""UserId""
INNER JOIN sys_org o ON uo.""OrgId"" = o.""Id""
WHERE r.""RoleId"" = @RoleId
LIMIT 1";
var userInfo = _sqlSugar.SqlQueryable<dynamic>(sql)
.AddParameters(new { RoleId = roleId })
var userInfo = _sqlSugar
.Queryable<SysOrg, SysUserOrg, SysUser>((o, uo, u) => new JoinQueryInfos(
JoinType.Inner, o.Id == uo.OrgId && uo.UserId == u.Id))
.Select((o, uo, u) => new
{
UserId = u.Id,
UserName = u.Name,
DeptName = o.Name
})
.First();
if (userInfo == null)
return (0, string.Empty, string.Empty);
return (userInfo.UserId, userInfo.UserName ?? string.Empty, userInfo.DeptName ?? string.Empty);
}

View File

@ -0,0 +1,217 @@
using Microsoft.AspNetCore.Http;
namespace OpenAuth.WebApi.Controllers.ServerController;
#region 一、接口入参DTO所有请求参数对应Controller接收的参数
/// <summary>
/// 发起流程请求参数
/// </summary>
public class InitiateFlowRequestDto
{
/// <summary>
/// 流程编码唯一标识流程模板IllegalConstructionFlow_2026
/// </summary>
public string FlowCode { get; set; } = string.Empty;
/// <summary>
/// 业务编号唯一标识该笔业务WJ20260205001、XZ20260205002
/// </summary>
public string BusinessNo { get; set; } = string.Empty;
/// <summary>
/// 流程标题(用于展示,如:"XX区域违法建设认定申请"
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 上传附件列表(业务相关证明材料、表单等)
/// </summary>
public List<IFormFile> Attachments { get; set; } = new List<IFormFile>();
}
/// <summary>
/// 处理工作项请求参数
/// </summary>
public class HandleWorkitemRequestDto
{
/// <summary>
/// 工作项ID待处理事项的唯一标识从待办查询接口获取
/// </summary>
public long WorkitemId { get; set; }
/// <summary>
/// 处理备注(可选,记录处理意见、流转说明等)
/// </summary>
public string? Comment { get; set; }
/// <summary>
/// 审核结果仅会签节点必填可选值Pass通过/Reject驳回
/// </summary>
public string? AuditResult { get; set; }
}
/// <summary>
/// 分页查询通用请求参数(所有查询接口共用)
/// </summary>
public class PageQueryRequestDto
{
/// <summary>
/// 当前页码默认1从1开始计数
/// </summary>
public int PageIndex { get; set; } = 1;
/// <summary>
/// 每页显示条数默认10可自定义建议不超过50
/// </summary>
public int PageSize { get; set; } = 10;
}
#endregion
#region 二、接口出参DTO所有返回结果对应Controller返回的数据
/// <summary>
/// 流程查询单条结果返回值(所有查询接口的单条数据格式)
/// </summary>
public class FlowQuerySingleResultDto
{
/// <summary>
/// 流程实例ID唯一标识该流程实例用于后续操作
/// </summary>
public long InstanceId { get; set; }
/// <summary>
/// 业务编号对应发起流程时的BusinessNo
/// </summary>
public string BusinessNo { get; set; } = string.Empty;
/// <summary>
/// 流程标题对应发起流程时的Title
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 当前节点名称(如:"区县提交"、"政策法规科审核"、"汇总归档"
/// </summary>
public string NodeName { get; set; } = string.Empty;
/// <summary>
/// 流程状态枚举值Draft拟办、Submitted已提交、Forwarded已转发、Auditing审核中、Summarized已汇总、Completed已完成、Rejected已驳回
/// </summary>
public string Status { get; set; } = string.Empty;
/// <summary>
/// 流程发起时间
/// </summary>
public DateTime? CreateTime { get; set; }
/// <summary>
/// 发起人姓名
/// </summary>
public string InitiatorName { get; set; } = string.Empty;
}
/// <summary>
/// 分页查询通用返回值(所有分页查询接口共用,泛型适配不同数据列表)
/// </summary>
/// <typeparam name="T">数据列表的泛型类型FlowQuerySingleResultDto</typeparam>
public class PageQueryResultDto<T>
{
/// <summary>
/// 当前页码与请求参数的PageIndex对应
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 每页显示条数与请求参数的PageSize对应
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 总记录数(符合查询条件的所有数据条数)
/// </summary>
public long TotalCount { get; set; }
/// <summary>
/// 总页数自动计算TotalCount / PageSize向上取整
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// 当前页的数据列表
/// </summary>
public List<T> DataList { get; set; } = new List<T>();
}
/// <summary>
/// 接口全局统一响应格式(所有接口返回结果的统一封装,提高前端对接效率)
/// </summary>
/// <typeparam name="T">响应数据的泛型类型long、bool、PageQueryResultDto<FlowQuerySingleResultDto></typeparam>
public class ApiResponseDto<T>
{
/// <summary>
/// 响应状态码200操作成功500操作失败400参数错误/未登录404资源不存在
/// </summary>
public int Code { get; set; } = 200;
/// <summary>
/// 响应消息(成功时返回"操作成功",失败时返回具体错误信息)
/// </summary>
public string Message { get; set; } = "操作成功";
/// <summary>
/// 响应数据成功时返回具体业务数据失败时可返回null或附加说明数据
/// </summary>
public T? Data { get; set; }
/// <summary>
/// 构建成功响应静态方法简化Controller调用
/// </summary>
/// <param name="data">成功时的业务数据</param>
/// <param name="message">自定义成功消息(可选,默认"操作成功"</param>
/// <returns>统一响应格式对象</returns>
public static ApiResponseDto<T> Success(T? data = default, string message = "操作成功")
{
return new ApiResponseDto<T>
{
Code = 200,
Message = message,
Data = data
};
}
/// <summary>
/// 构建失败响应静态方法简化Controller调用
/// </summary>
/// <param name="message">具体错误消息</param>
/// <param name="data">失败时的附加数据可选默认null</param>
/// <returns>统一响应格式对象</returns>
public static ApiResponseDto<T> Fail(string message = "操作失败", T? data = default)
{
return new ApiResponseDto<T>
{
Code = 500,
Message = message,
Data = data
};
}
/// <summary>
/// 构建参数错误/未登录响应静态方法适配400状态码场景
/// </summary>
/// <param name="message">具体错误消息</param>
/// <param name="data">附加数据(可选)</param>
/// <returns>统一响应格式对象</returns>
public static ApiResponseDto<T> BadRequest(string message = "参数错误或未登录", T? data = default)
{
return new ApiResponseDto<T>
{
Code = 400,
Message = message,
Data = data
};
}
}
#endregion

View File

@ -1,91 +0,0 @@
using Microsoft.AspNetCore.Http;
namespace OpenAuth.Repository.Domain.workflow;
/// <summary>
/// 发起流程请求DTO
/// </summary>
public class InitiateFlowRequest
{
/// <summary>
/// 流程编码
/// </summary>
public string FlowCode { get; set; } = string.Empty;
/// <summary>
/// 业务编号
/// </summary>
public string BusinessNo { get; set; } = string.Empty;
/// <summary>
/// 流程标题
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 附件列表
/// </summary>
public List<IFormFile>? Attachments { get; set; }
}
/// <summary>
/// 处理工作项请求DTO
/// </summary>
public class HandleWorkitemRequest
{
/// <summary>
/// 工作项ID
/// </summary>
public long WorkitemId { get; set; }
/// <summary>
/// 处理意见
/// </summary>
public string? Comment { get; set; }
/// <summary>
/// 会签结果Pass/Reject
/// </summary>
public string? AuditResult { get; set; }
}
/// <summary>
/// 流程查询结果DTO
/// </summary>
public class FlowQueryResult
{
/// <summary>
/// 流程实例ID
/// </summary>
public long InstanceId { get; set; }
/// <summary>
/// 业务编号
/// </summary>
public string BusinessNo { get; set; } = string.Empty;
/// <summary>
/// 流程标题
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 当前节点名称
/// </summary>
public string NodeName { get; set; } = string.Empty;
/// <summary>
/// 流程状态
/// </summary>
public string Status { get; set; } = string.Empty;
/// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateTime { get; set; }
/// <summary>
/// 发起人姓名
/// </summary>
public string InitiatorName { get; set; } = string.Empty;
}

View File

@ -1,95 +0,0 @@
namespace OpenAuth.WebApi.Controllers.ServerController;
/// <summary>
/// 统一API返回结果
/// </summary>
/// <typeparam name="T"></typeparam>
public class ApiResult<T>
{
public bool Success { get; set; }
public string Message { get; set; }
public T Data { get; set; }
public int TotalCount { get; set; } // 分页总条数
public static ApiResult<T> Ok(T data, int totalCount = 0, string message = "操作成功")
{
return new ApiResult<T>
{
Success = true,
Message = message,
Data = data,
TotalCount = totalCount
};
}
public static ApiResult<T> Error(string message = "操作失败")
{
return new ApiResult<T>
{
Success = false,
Message = message,
Data = default(T),
TotalCount = 0
};
}
}
// 通用分页输入
public class PageInput
{
public int PageIndex { get; set; } = 1;
public int PageSize { get; set; } = 10;
}
// 通用分页输出
public class PageOutput<T>
{
public int PageIndex { get; set; }
public int PageSize { get; set; }
public long TotalCount { get; set; }
public int TotalPages { get; set; }
public List<T> Data { get; set; } = new List<T>();
}
// 发起流程请求
public class InitiateFlowRequest
{
public string FlowCode { get; set; } = string.Empty;
public string BusinessNo { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public List<IFormFile>? Attachments { get; set; }
}
// 处理工作项请求
public class HandleWorkitemRequest
{
public long WorkitemId { get; set; }
public string? Comment { get; set; }
public string? AuditResult { get; set; } // Pass/Reject
}
// 工作项查询结果(拟办/待办/已办)
public class FlowQueryResult
{
public long InstanceId { get; set; }
public string BusinessNo { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string NodeName { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
public DateTime? CreateTime { get; set; }
public string InitiatorName { get; set; } = string.Empty;
}
// 流程实例查询结果(未办结/已完成)
public class FlowInstanceQueryResult
{
public long InstanceId { get; set; }
public string BusinessNo { get; set; } = string.Empty;
public string FlowName { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string CurrentNodeName { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
public string InitiatorName { get; set; } = string.Empty;
public DateTime? CreateTime { get; set; }
public DateTime? FinishTime { get; set; }
}

View File

@ -6,186 +6,235 @@ using workflow;
namespace OpenAuth.WebApi.Controllers.ServerController;
using Microsoft.AspNetCore.Mvc;
using OpenAuth.App.Interface;
/// <summary>
/// 工作流核心API接口流程发起/处理 + 拟办/待办/已办/未办结/已完成/全部事项查询)
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class CustomWorkflowController : ControllerBase
[Route("api/[controller]/[action]")]
public class WorkflowController : ControllerBase
{
private readonly WorkflowEngineApp _workflowEngineApp;
private readonly IAuth _auth;
public CustomWorkflowController(WorkflowEngineApp workflowEngineApp, IAuth auth)
// 构造函数注入依赖
public WorkflowController(WorkflowEngineApp workflowEngineApp, IAuth auth)
{
_workflowEngineApp = workflowEngineApp;
_auth = auth;
}
#region 基础接口
#region 一、流程操作接口
[HttpGet("user/by-role/{roleId:long}")]
public IActionResult GetUserNameByRoleId(long roleId)
/// <summary>
/// 发起流程(区县提交)
/// </summary>
/// <param name="requestDto">发起流程请求参数</param>
/// <returns>流程实例ID</returns>
[HttpPost]
public ActionResult<ApiResponseDto<long>> InitiateFlow([FromForm] InitiateFlowRequestDto requestDto)
{
try
{
var userName = _workflowEngineApp.GetUserNameByRoleId(roleId);
return Ok(new { Success = true, Data = userName });
// 获取当前登录用户实际项目中从Token/IAuth中解析
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return BadRequest(ApiResponseDto<long>.Fail("未登录或登录过期"));
var instanceId = _workflowEngineApp.InitiateFlow(
currentUser.Id,
currentUser.Name,
requestDto);
return Ok(ApiResponseDto<long>.Success(instanceId, "流程发起成功"));
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
return StatusCode(500, ApiResponseDto<long>.Fail(ex.Message));
}
}
/// <summary>
/// 处理工作项(执法监督科转发/审核科会签/汇总处理)
/// </summary>
/// <param name="requestDto">处理工作项请求参数</param>
/// <returns>处理结果</returns>
[HttpPost]
public ActionResult<ApiResponseDto<bool>> HandleWorkitem([FromBody] HandleWorkitemRequestDto requestDto)
{
try
{
// 获取当前登录用户实际项目中从Token/IAuth中解析
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return BadRequest(ApiResponseDto<bool>.Fail("未登录或登录过期"));
var result = _workflowEngineApp.HandleWorkitem(
currentUser.Id,
currentUser.Name,
requestDto);
return Ok(ApiResponseDto<bool>.Success(result, "工作项处理成功"));
}
catch (Exception ex)
{
return StatusCode(500, ApiResponseDto<bool>.Fail(ex.Message));
}
}
#endregion
#region 流程表单接口
#region 二、完整查询接口(拟办/待办/已办/未办结/已完成/全部事项)
[HttpPost("flow/initiate")]
public IActionResult InitiateAssessmentFlow([FromBody] InitiateAssessmentFlowRequest request)
/// <summary>
/// 查询我的拟办(未认领/待分配事项)
/// </summary>
/// <param name="pageQueryDto">分页查询参数</param>
/// <returns>分页拟办结果</returns>
[HttpGet]
public ActionResult<ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>> QueryMyDraft(
[FromQuery] PageQueryRequestDto pageQueryDto)
{
try
{
var currentUser = _auth.GetCurrentUser()?.User;
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return Unauthorized(new { Success = false, Message = "未登录" });
return BadRequest(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail("未登录或登录过期"));
var instanceId = _workflowEngineApp.InitiateAssessmentFlow(currentUser.Id, currentUser.Name, request);
return Ok(new { Success = true, Data = new { FlowInstanceId = instanceId } });
var result = _workflowEngineApp.QueryMyDraft(currentUser.Id, pageQueryDto);
return Ok(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Success(result, "拟办查询成功"));
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
return StatusCode(500, ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail(ex.Message));
}
}
[HttpGet("flow/by-business/{businessNumber}")]
public IActionResult QueryAssessmentFlowByBusinessNo(string businessNumber)
/// <summary>
/// 查询我的待办(已分配/待处理事项)
/// </summary>
/// <param name="pageQueryDto">分页查询参数</param>
/// <returns>分页待办结果</returns>
[HttpGet]
public ActionResult<ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>> QueryMyToDo(
[FromQuery] PageQueryRequestDto pageQueryDto)
{
try
{
var result = _workflowEngineApp.QueryAssessmentFlowByBusinessNo(businessNumber);
return Ok(new { Success = true, Data = result });
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
}
}
[HttpPut("form/update")]
public IActionResult UpdateAssessmentForm([FromBody] IllegalConstructionAssessment form)
{
try
{
var currentUser = _auth.GetCurrentUser()?.User;
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return Unauthorized(new { Success = false, Message = "未登录" });
return BadRequest(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail("未登录或登录过期"));
var success = _workflowEngineApp.UpdateAssessmentForm(form, currentUser.Id);
return Ok(new { Success = success, Message = success ? "更新成功" : "更新失败" });
var result = _workflowEngineApp.QueryMyToDo(currentUser.Id, pageQueryDto);
return Ok(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Success(result, "待办查询成功"));
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
return StatusCode(500, ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail(ex.Message));
}
}
[HttpPost("form/page")]
public IActionResult QueryAllAssessmentForms([FromBody] PageQueryInput pageInput)
/// <summary>
/// 查询我的已办(已处理完成事项)
/// </summary>
/// <param name="pageQueryDto">分页查询参数</param>
/// <returns>分页已办结果</returns>
[HttpGet]
public ActionResult<ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>> QueryMyDone(
[FromQuery] PageQueryRequestDto pageQueryDto)
{
try
{
var result = _workflowEngineApp.QueryAllAssessmentForms(pageInput);
return Ok(new { Success = true, Data = result });
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
}
}
#endregion
#region 待办查询接口
[HttpPost("flow/draft/{userId:long}")]
public IActionResult QueryMyDraft(long userId, [FromBody] PageQueryInput pageInput)
{
try
{
var result = _workflowEngineApp.QueryMyDraft(userId, pageInput);
return Ok(new { Success = true, Data = result });
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
}
}
[HttpPost("flow/todo/{userId:long}")]
public IActionResult QueryMyToDo(long userId, [FromBody] PageQueryInput pageInput)
{
try
{
var result = _workflowEngineApp.QueryMyToDo(userId, pageInput);
return Ok(new { Success = true, Data = result });
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
}
}
[HttpPost("flow/done/{userId:long}")]
public IActionResult QueryMyDone(long userId, [FromBody] PageQueryInput pageInput)
{
try
{
var result = _workflowEngineApp.QueryMyDone(userId, pageInput);
return Ok(new { Success = true, Data = result });
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
}
}
#endregion
#region 待办处理接口
[HttpPost("flow/workitem/claim/{workitemId:long}/{userId:long}")]
public IActionResult ClaimDraftWorkitem(long workitemId, long userId)
{
try
{
var currentUser = _auth.GetCurrentUser()?.User;
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return Unauthorized(new { Success = false, Message = "未登录" });
return BadRequest(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail("未登录或登录过期"));
var success = _workflowEngineApp.ClaimDraftWorkitem(workitemId, userId, currentUser.Name);
return Ok(new { Success = success, Message = success ? "认领成功" : "认领失败" });
var result = _workflowEngineApp.QueryMyDone(currentUser.Id, pageQueryDto);
return Ok(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Success(result, "已办查询成功"));
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
return StatusCode(500, ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail(ex.Message));
}
}
[HttpPost("flow/workitem/handle/{userId:long}")]
public IActionResult HandleWorkitem(long userId, [FromBody] HandleWorkitemRequest request)
/// <summary>
/// 查询我的未办结(参与过/流程未完成事项)
/// </summary>
/// <param name="pageQueryDto">分页查询参数</param>
/// <returns>分页未办结结果</returns>
[HttpGet]
public ActionResult<ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>> QueryMyUnfinished(
[FromQuery] PageQueryRequestDto pageQueryDto)
{
try
{
var currentUser = _auth.GetCurrentUser()?.User;
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return Unauthorized(new { Success = false, Message = "未登录" });
return BadRequest(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail("未登录或登录过期"));
var success = _workflowEngineApp.HandleWorkitem(userId, currentUser.Name, request);
return Ok(new { Success = success, Message = success ? "处理成功" : "处理失败" });
var result = _workflowEngineApp.QueryMyUnfinished(currentUser.Id, pageQueryDto);
return Ok(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Success(result, "未办结查询成功"));
}
catch (Exception ex)
{
return BadRequest(new { Success = false, Message = ex.Message });
return StatusCode(500, ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail(ex.Message));
}
}
/// <summary>
/// 查询我的已完成(参与过/流程已归档事项)
/// </summary>
/// <param name="pageQueryDto">分页查询参数</param>
/// <returns>分页已完成结果</returns>
[HttpGet]
public ActionResult<ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>> QueryMyCompleted(
[FromQuery] PageQueryRequestDto pageQueryDto)
{
try
{
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return BadRequest(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail("未登录或登录过期"));
var result = _workflowEngineApp.QueryMyCompleted(currentUser.Id, pageQueryDto);
return Ok(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Success(result, "已完成查询成功"));
}
catch (Exception ex)
{
return StatusCode(500, ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail(ex.Message));
}
}
/// <summary>
/// 查询我的全部事项(拟办+待办+已办+未办结+已完成)
/// </summary>
/// <param name="pageQueryDto">分页查询参数</param>
/// <returns>分页全部事项结果</returns>
[HttpGet]
public ActionResult<ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>> QueryMyAllItems(
[FromQuery] PageQueryRequestDto pageQueryDto)
{
try
{
var currentUser = _auth.GetCurrentUser().User;
if (currentUser == null)
return BadRequest(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail("未登录或登录过期"));
var result = _workflowEngineApp.QueryMyAllItems(currentUser.Id, pageQueryDto);
return Ok(ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Success(result, "全部事项查询成功"));
}
catch (Exception ex)
{
return StatusCode(500, ApiResponseDto<PageQueryResultDto<FlowQuerySingleResultDto>>.Fail(ex.Message));
}
}