namespace Admin.NET.Plugin.ApprovalFlow.Service;
///
/// 流程实例服务
///
[ApiDescriptionSettings(ApprovalFlowConst.GroupName, Order = 95)]
public class FlowInstanceService : IDynamicApiController, ITransient
{
private readonly FlowEngineService _engine;
private readonly SqlSugarRepository _instanceRep;
private readonly SqlSugarRepository _taskRep;
private readonly SqlSugarRepository _logRep;
public FlowInstanceService(
FlowEngineService engine,
SqlSugarRepository instanceRep,
SqlSugarRepository taskRep,
SqlSugarRepository logRep)
{
_engine = engine;
_instanceRep = instanceRep;
_taskRep = taskRep;
_logRep = logRep;
}
///
/// 发起流程
///
[HttpPost]
[ApiDescriptionSettings(Name = "Start")]
[DisplayName("发起流程")]
public async Task Start(StartFlowInput input)
{
return await _engine.StartFlow(input);
}
///
/// 查询实例详情
///
[HttpGet]
[ApiDescriptionSettings(Name = "Detail")]
[DisplayName("流程实例详情")]
public async Task GetDetail([FromQuery] long id)
{
var instance = await _instanceRep.GetByIdAsync(id);
if (instance == null) return null;
var tasks = await _taskRep.AsQueryable()
.Where(t => t.InstanceId == id)
.OrderBy(t => t.CreateTime)
.ToListAsync();
return new FlowInstanceDetailOutput
{
Id = instance.Id,
FlowId = instance.FlowId,
BizType = instance.BizType,
BizId = instance.BizId,
BizNo = instance.BizNo,
Title = instance.Title,
InitiatorId = instance.InitiatorId,
InitiatorName = instance.InitiatorName,
Status = instance.Status,
CurrentNodeId = instance.CurrentNodeId,
StartTime = instance.StartTime,
EndTime = instance.EndTime,
Tasks = tasks.Select(t => new FlowTaskOutput
{
Id = t.Id,
NodeId = t.NodeId,
NodeName = t.NodeName,
AssigneeId = t.AssigneeId,
AssigneeName = t.AssigneeName,
Status = t.Status,
Comment = t.Comment,
ActionTime = t.ActionTime,
}).ToList(),
};
}
///
/// 根据业务单据查询流程实例
///
[HttpGet]
[ApiDescriptionSettings(Name = "GetByBiz")]
[DisplayName("按业务查流程")]
public async Task GetByBiz([FromQuery] string bizType, [FromQuery] long bizId)
{
var instance = await _instanceRep.AsQueryable()
.Where(i => i.BizType == bizType && i.BizId == bizId)
.OrderByDescending(i => i.CreateTime)
.FirstAsync();
if (instance == null) return null;
return await GetDetail(instance.Id);
}
///
/// 审批时间线
///
[HttpGet]
[ApiDescriptionSettings(Name = "Timeline")]
[DisplayName("审批时间线")]
public async Task> GetTimeline([FromQuery] long instanceId)
{
return await _logRep.AsQueryable()
.LeftJoin((l, t) => l.TaskId == t.Id)
.Where((l, t) => l.InstanceId == instanceId)
.OrderBy((l, t) => l.CreateTime)
.Select((l, t) => new FlowTimelineItem
{
Id = l.Id,
NodeId = l.NodeId,
NodeName = t.NodeName,
Action = l.Action,
OperatorId = l.OperatorId,
OperatorName = l.OperatorName,
Comment = l.Comment,
CreateTime = l.CreateTime,
})
.ToListAsync();
}
}