2024-11-13 09:19:06 +08:00
using ce.autofac.extension ;
using Infrastructure ;
using Infrastructure.Extensions ;
using Infrastructure.Helpers ;
using Microsoft.Extensions.Configuration ;
using OpenAuth.App.Base ;
using OpenAuth.App.BasicQueryService ;
using OpenAuth.App.Config ;
using OpenAuth.App.Interface ;
using OpenAuth.App.Request ;
using OpenAuth.Repository ;
using OpenAuth.Repository.Core ;
using OpenAuth.Repository.Domain ;
using SqlSugar ;
using System.Data ;
using System.Linq ;
using Newtonsoft.Json ;
using OpenAuth.App.BaseApp.Jobs ;
using System.Text ;
using DocumentFormat.OpenXml.Spreadsheet ;
using Infrastructure.Utilities ;
2025-04-18 13:23:18 +08:00
using OpenAuth.App ;
2024-11-13 09:19:06 +08:00
using System.Diagnostics ;
using NPOI.Util ;
namespace OpenAuth.App
{
public partial class WFProcessApp : SqlSugarBaseApp < WFProcess , SugarDbContext >
{
ISqlSugarClient client ;
UserManager userManager ;
PositionManager positionManager ;
IConfiguration _configuration ;
OpenJobApp _job ;
public WFProcessApp ( SqlSugar . ISugarUnitOfWork < SugarDbContext > unitWork ,
SqlSugar . ISimpleClient < WFProcess > repository ,
IAuth auth ,
UserManager userManager ,
OpenJobApp job ,
PositionManager positionManager ,
IConfiguration _configuration
) : base ( unitWork , repository , auth )
{
client = base . Repository . AsSugarClient ( ) ;
this . userManager = userManager ;
this . positionManager = positionManager ;
this . _configuration = _configuration ;
_job = job ;
}
#region 获取数据
/// <summary>
/// 获取流程列表
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <returns></returns>
public async Task < PageInfo < List < WFProcess > > > GetPageList ( PageReq pageReq , WFProcessSearchDto searchParams )
{
RefAsync < int > totalCount = 0 ;
var exp = Expressionable . Create < WFProcess > ( )
. AndIF ( ! string . IsNullOrEmpty ( searchParams . Keyword ) , t = > t . Title . Contains ( searchParams . Keyword ) | | t . SchemeName . Contains ( searchParams . Keyword ) )
. AndIF ( ! string . IsNullOrEmpty ( searchParams . Code ) , t = > t . SchemeCode = = searchParams . Code )
. AndIF ( searchParams . StartDate ! = null & & searchParams . EndDate ! = null , t = > t . CreateDate > = searchParams . StartDate & & t . CreateDate < = searchParams . EndDate ) ;
if ( searchParams . Type = = 3 )
{
exp = exp . And ( t = > t . EnabledMark = = 3 ) ;
}
else
{
exp = exp . And ( t = > t . EnabledMark = = 1 ) ;
if ( searchParams . Type = = 1 )
{
exp = exp . And ( t = > t . IsFinished = = 1 ) ;
}
else
{
exp = exp . And ( t = > t . IsFinished = = 0 ) ;
}
}
var list = await client . Queryable < WFProcess > ( )
. Where ( exp . ToExpression ( ) )
. OrderByDescending ( t = > t . CreateDate )
. ToPageListAsync ( pageReq . page , pageReq . limit , totalCount ) ;
return new PageInfo < List < WFProcess > >
{
Items = list ,
Total = totalCount
} ;
}
/// <summary>
/// 获取我的流程
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <param name="type"> 1正常2草稿3作废</param>
/// <returns></returns>
public async Task < PageInfo < List < WFProcess > > > GetMyPageList ( PageReq pageReq , WFProcessSearchDto searchParams , int type )
{
RefAsync < int > totalCount = 0 ;
var userId = _auth . GetUserId ( ) ;
var expression = Expressionable . Create < WFProcess > ( ) ;
expression = expression . And ( t = > t . CreateUserId = = userId | | t . UserId = = userId ) ;
if ( type = = 2 )
{
expression = expression . And ( t = > t . EnabledMark = = 2 ) ;
}
else
{
expression = expression . And ( t = > t . EnabledMark ! = 2 ) ;
}
if ( ! string . IsNullOrEmpty ( searchParams . Keyword ) )
{
expression = expression . And ( t = > t . Title . Contains ( searchParams . Keyword ) | | t . SchemeName . Contains ( searchParams . Keyword ) ) ;
}
if ( ! string . IsNullOrEmpty ( searchParams . Code ) )
{
expression = expression . And ( t = > t . SchemeCode = = searchParams . Code ) ;
}
if ( searchParams . StartDate ! = null & & searchParams . EndDate ! = null )
{
expression = expression . And ( t = > t . CreateDate > = searchParams . StartDate & & t . CreateDate < = searchParams . EndDate ) ;
}
var list = await client . Queryable < WFProcess > ( )
. Where ( expression . ToExpression ( ) )
. OrderByDescending ( t = > t . CreateDate )
. ToPageListAsync ( pageReq . page , pageReq . limit , totalCount ) ;
return new PageInfo < List < WFProcess > >
{
Items = list ,
Total = totalCount
} ;
}
/// <summary>
/// 获取流程进程实体
/// </summary>
/// <param name="keyValue">主键</param>
/// <returns></returns>
public async Task < WFProcess > GetEntity ( string keyValue )
{
return await base . Repository . GetByIdAsync ( keyValue ) ;
}
# endregion
#region 保存更新删除
/// <summary>
/// 删除流程进程实体
/// </summary>
/// <param name="processId">流程进程主键</param>
public async Task < bool > DeleteEntity ( string processId )
{
return await base . Repository . DeleteByIdAsync ( processId ) ;
}
# endregion
#region 流程API
/// <summary>
/// 保存草稿
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <param name="schemeCode">流程模板编码</param>
/// <param name="userId">创建人</param>
/// <param name="parentProcessId">父级流程进程主键</param>
/// <param name="parentNodeId">父级流程节点Id</param>
/// <param name="parentTaskId">父级任务id</param>
/// <param name="isChild">是否为子流程</param>
/// <param name="title">流程标题</param>
/// <returns></returns>
public async Task < Response < bool > > SaveDraft ( string processId , string schemeCode , string userId , string instanceInfo , string parentProcessId , string parentNodeId , string parentTaskId , int isChild , string title = "" )
{
var flag = false ;
var currentUser = _auth . GetCurrentUser ( ) . User ;
// 判断当前流程进程是否有保存过
var processEntity = await GetEntity ( processId ) ;
if ( processEntity = = null )
{
// 创建草稿,已经存在不做处理
var schemeInfo = await client . Queryable < WFSchemeInfo > ( ) . FirstAsync ( a = > a . Code = = schemeCode ) ;
WFProcess wfProcessEntity = new WFProcess ( )
{
Id = processId ,
SchemeCode = schemeCode ,
SchemeId = schemeInfo . SchemeId ,
SchemeName = schemeInfo . Name ,
Title = title ,
InstanceInfo = JsonConvert . DeserializeObject < WFInstanceInfo > ( instanceInfo ) ,
EnabledMark = 2 ,
IsAgain = 0 ,
IsFinished = 0 ,
IsChild = isChild ,
IsStart = 0 ,
ParentNodeId = parentNodeId ,
ParentProcessId = parentProcessId ,
ParentTaskId = parentTaskId ,
CreateUserId = currentUser . Id . ToString ( ) ,
CreateUserName = currentUser . Name ,
CreateUserAccount = currentUser . Account ,
UserId = currentUser . Id . ToString ( )
} ;
if ( string . IsNullOrEmpty ( title ) )
{
wfProcessEntity . Title = currentUser . Name + "-" + schemeInfo . Name ;
}
wfProcessEntity . CreateDate = DateTime . Now ;
wfProcessEntity . UserId = currentUser . Id . ToString ( ) ;
flag = await base . Repository . InsertAsync ( wfProcessEntity ) ;
}
else if ( ! string . IsNullOrEmpty ( title ) & & processEntity . Title ! = title )
{
processEntity . Title = title ;
flag = await base . Repository . UpdateAsync ( processEntity ) ;
}
else
{
flag = true ;
}
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
/// <summary>
/// 保存草稿-新版用户查询
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <param name="schemeCode">流程模板编码</param>
/// <param name="userId">创建人</param>
/// <param name="parentProcessId">父级流程进程主键</param>
/// <param name="parentNodeId">父级流程节点Id</param>
/// <param name="parentTaskId">父级任务id</param>
/// <param name="isChild">是否为子流程</param>
/// <param name="title">流程标题</param>
/// <returns></returns>
public async Task < Response < bool > > SaveDraftWithUser ( string processId , string schemeCode , string userName , string instanceInfo , string parentProcessId , string parentNodeId , string parentTaskId , int isChild , string title = "" )
{
var flag = false ;
var currentUser = await client . Queryable < SysUser > ( ) . FirstAsync ( r = > r . Name = = userName )
? ? new SysUser
{
Id = - 1 ,
Account = Define . SYSTEM_USERNAME ,
Name = "超级管理员" ,
} ;
// 判断当前流程进程是否有保存过
var processEntity = await GetEntity ( processId ) ;
if ( processEntity = = null )
{
// 创建草稿,已经存在不做处理
var schemeInfo = await client . Queryable < WFSchemeInfo > ( ) . FirstAsync ( a = > a . Code = = schemeCode ) ;
WFProcess wfProcessEntity = new WFProcess ( )
{
Id = processId ,
SchemeCode = schemeCode ,
SchemeId = schemeInfo . SchemeId ,
SchemeName = schemeInfo . Name ,
Title = title ,
InstanceInfo = JsonConvert . DeserializeObject < WFInstanceInfo > ( instanceInfo ) ,
EnabledMark = 2 ,
IsAgain = 0 ,
IsFinished = 0 ,
IsChild = isChild ,
IsStart = 0 ,
ParentNodeId = parentNodeId ,
ParentProcessId = parentProcessId ,
ParentTaskId = parentTaskId ,
CreateUserId = currentUser ? . Id . ToString ( ) ,
CreateUserName = currentUser ? . Name ,
CreateUserAccount = currentUser ? . Account ,
UserId = currentUser ? . Id . ToString ( )
} ;
if ( string . IsNullOrEmpty ( title ) )
{
wfProcessEntity . Title = currentUser . Name + "-" + schemeInfo . Name ;
}
wfProcessEntity . CreateDate = DateTime . Now ;
wfProcessEntity . UserId = currentUser . Id . ToString ( ) ;
flag = await base . Repository . InsertAsync ( wfProcessEntity ) ;
}
else if ( ! string . IsNullOrEmpty ( title ) & & processEntity . Title ! = title )
{
processEntity . Title = title ;
flag = await base . Repository . UpdateAsync ( processEntity ) ;
}
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
/// <summary>
/// 删除草稿
/// </summary>
/// <param name="processId">流程进程主键</param>
public async Task < Response < bool > > DeleteDraft ( string processId )
{
var flag = false ;
var response = new Response < bool > ( ) ;
var iWFEngine = await Bootstraper ( string . Empty , processId , null ) ;
var scriptResult = await ExecuteScript ( processId , "deleteDraft" , iWFEngine . CreateUser ,
iWFEngine . WFScheme . DeleteDraftType ,
iWFEngine . WFScheme . DeleteDraftDbCode ,
iWFEngine . WFScheme . DeleteDraftDbSQL ,
iWFEngine . WFScheme . DeleteDraftUrl ,
iWFEngine . WFScheme . DeleteDraftIOCName ) ;
if ( scriptResult )
{
flag = await DeleteEntity ( processId ) ;
if ( flag )
{
response . Result = true ;
response . Message = "success" ;
}
else
{
response . Result = false ;
response . Message = "脚本执行成功,但流程信息删除失败" ;
}
}
else
{
response . Result = false ;
response . Message = "error" ;
}
return response ;
}
/// <summary>
/// 创建流程
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <param name="schemeCode">流程模板编码</param>
/// <param name="userId">创建人</param>
/// <param name="nextUsers">下一个节点审核人</param>
/// <param name="title">流程标题</param>
/// <returns></returns>
public async Task < Response < bool > > Create ( string processId , string schemeCode , string userId , Dictionary < string , string > nextUsers , string InstanceInfo , string title = "" )
{
var flag = false ;
var userInfo = await GetUserInfo ( userId ) ;
var iWFEngine = await Bootstraper ( schemeCode , processId , userInfo , nextUsers ) ;
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( iWFEngine . StartNode . Id ) ;
//获取当前流程信息
var process = await GetEntity ( processId ) ;
// 处理任务并更新数据
List < WFTask > myTaskList ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
var processEntity = GetWFProcessEntity ( iWFEngine . Config . Params , title ) ;
processEntity . InstanceInfo = JsonConvert . DeserializeObject < WFInstanceInfo > ( InstanceInfo ) ;
if ( string . IsNullOrEmpty ( processEntity . Title ) )
{
processEntity . Title = userInfo . Name + "-" + processEntity . SchemeName ;
}
processEntity . CreateDate = DateTime . Now ;
if ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 )
{
processEntity . IsFinished = 1 ;
if ( process ! = null & & process . IsChild = = 1 )
{
WFTask ts = new WFTask ( ) ;
await ChildrenEndTask ( process . ParentProcessId , process . ParentNodeId , "" , ts , "" ) ;
}
}
if ( process ! = null & & process . IsChild = = 1 )
{
var taskEntity = await client . Queryable < WFTask > ( ) . Where ( a = > a . Id = = process . ParentTaskId ) . FirstAsync ( ) ;
if ( taskEntity ! = null )
{
taskEntity . State = 3 ;
if ( taskEntity . Type = = 7 )
{
var currentUser = _auth . GetCurrentUser ( ) . User ;
taskEntity . UserId = currentUser . Id . ToString ( ) ;
taskEntity . UserName = currentUser . Name ;
}
await uwo . WFTask . UpdateAsync ( taskEntity ) ;
}
}
if ( ! string . IsNullOrEmpty ( schemeCode ) )
{
await uwo . WFProcess . InsertAsync ( processEntity ) ;
}
else
{
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
}
myTaskList = await ExecuteWFTaskEntity ( taskList , iWFEngine , processId , "create" , "create" ) ;
foreach ( var item in myTaskList )
{
if ( item . Type = = 7 )
{
await uwo . WFTaskUser . InsertRangeAsync ( item . WFTaskUser ) ;
}
item . ProcessTitle = processEntity . Title ;
await Add ( item ) ;
}
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
OperationCode = "create" ,
OperationName = "提交流程" ,
TaskType = 0 ,
IsLast = 1 ,
Des = "提交流程" ,
ProcessId = processId ,
UnitId = iWFEngine . StartNode . Id ,
UnitName = string . IsNullOrEmpty ( iWFEngine . StartNode . Name ) ? "开始节点" : iWFEngine . StartNode . Name
} ;
await AddLog ( wfTaskLogEntity ) ;
flag = uwo . Commit ( ) ;
}
var respone = new Response < bool > ( ) ;
if ( flag )
{
var scriptResults = new List < bool > ( ) ;
// 脚本执行
var scriptTaskList = myTaskList . FindAll ( t = > t . Type = = 10 ) ;
foreach ( var item in scriptTaskList )
{
var result = await ExecuteScript ( item , "create" , processId , "" , "" , iWFEngine . CreateUser , iWFEngine , null , "" ) ;
scriptResults . Add ( result ) ;
}
if ( scriptResults . Contains ( false ) )
{
respone . Result = false ;
respone . Message = "流程信息存储成功,但脚本执行失败" ;
}
else
{
respone . Result = true ;
respone . Message = "success" ;
}
}
else
{
respone . Result = false ;
respone . Message = "error" ;
}
return respone ;
}
/// <summary>
/// 创建流程
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <param name="schemeCode">流程模板编码</param>
/// <param name="userId">创建人</param>
/// <param name="nextUsers">下一个节点审核人</param>
/// <param name="title">流程标题</param>
/// <returns></returns>
public async Task < Response < bool > > CreateWithUser ( string processId , string schemeCode , string userName , Dictionary < string , string > nextUsers , string InstanceInfo , string title = "" )
{
var flag = false ;
//var userInfo = await client.Queryable<SysUser>().FirstAsync(r => r.Name == userName);
var userInfo = await client . Queryable < SysUser > ( ) . FirstAsync ( r = > r . Name = = userName )
? ? new SysUser
{
Id = - 1 ,
Account = Define . SYSTEM_USERNAME ,
Name = "超级管理员" ,
} ;
var iWFEngine = await BootstraperWithUser ( schemeCode , processId , userInfo , nextUsers ) ;
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( iWFEngine . StartNode . Id ) ;
//获取当前流程信息
var process = await GetEntity ( processId ) ;
// 处理任务并更新数据
List < WFTask > myTaskList ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
var processEntity = GetWFProcessEntity ( iWFEngine . Config . Params , title ) ;
processEntity . InstanceInfo = JsonConvert . DeserializeObject < WFInstanceInfo > ( InstanceInfo ) ;
if ( string . IsNullOrEmpty ( processEntity . Title ) )
{
processEntity . Title = userInfo . Name + "-" + processEntity . SchemeName ;
}
processEntity . CreateDate = DateTime . Now ;
if ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 )
{
processEntity . IsFinished = 1 ;
if ( process ! = null & & process . IsChild = = 1 )
{
WFTask ts = new WFTask ( ) ;
await ChildrenEndTask ( process . ParentProcessId , process . ParentNodeId , "" , ts , "" ) ;
}
}
if ( process ! = null & & process . IsChild = = 1 )
{
var taskEntity = await client . Queryable < WFTask > ( ) . Where ( a = > a . Id = = process . ParentTaskId ) . FirstAsync ( ) ;
if ( taskEntity ! = null )
{
taskEntity . State = 3 ;
if ( taskEntity . Type = = 7 )
{
var currentUser = _auth . GetCurrentUser ( ) . User ;
taskEntity . UserId = currentUser . Id . ToString ( ) ;
taskEntity . UserName = currentUser . Name ;
}
await uwo . WFTask . UpdateAsync ( taskEntity ) ;
}
}
if ( ! string . IsNullOrEmpty ( schemeCode ) )
{
await uwo . WFProcess . InsertAsync ( processEntity ) ;
}
else
{
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
}
myTaskList = await ExecuteWFTaskEntity ( taskList , iWFEngine , processId , "create" , "create" ) ;
foreach ( var item in myTaskList )
{
if ( item . Type = = 7 )
{
await uwo . WFTaskUser . InsertRangeAsync ( item . WFTaskUser ) ;
}
item . ProcessTitle = processEntity . Title ;
await Add ( item ) ;
}
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
OperationCode = "create" ,
OperationName = "提交流程" ,
TaskType = 0 ,
IsLast = 1 ,
Des = "提交流程" ,
ProcessId = processId ,
UnitId = iWFEngine . StartNode . Id ,
UnitName = string . IsNullOrEmpty ( iWFEngine . StartNode . Name ) ? "开始节点" : iWFEngine . StartNode . Name
} ;
await AddLog ( wfTaskLogEntity ) ;
flag = uwo . Commit ( ) ;
}
var respone = new Response < bool > ( ) ;
if ( flag )
{
var scriptResults = new List < bool > ( ) ;
// 脚本执行
var scriptTaskList = myTaskList . FindAll ( t = > t . Type = = 10 ) ;
foreach ( var item in scriptTaskList )
{
var result = await ExecuteScript ( item , "create" , processId , "" , "" , iWFEngine . CreateUser , iWFEngine , null , "" ) ;
scriptResults . Add ( result ) ;
}
if ( scriptResults . Contains ( false ) )
{
respone . Result = false ;
respone . Message = "流程信息存储成功,但脚本执行失败" ;
}
else
{
respone . Result = true ;
respone . Message = "success" ;
}
}
else
{
respone . Result = false ;
respone . Message = "error" ;
}
return respone ;
}
/// <summary>
/// 重新创建流程
/// </summary>
/// <param name="processId">流程实例主键</param>
/// <param name="des">备注</param>
/// <returns></returns>
public async Task < Response < bool > > CreateAgain ( string processId , string des )
{
var flag = false ;
var iWFEngine = await Bootstraper ( "" , processId , null , null ) ;
var unList = ( List < WFTask > ) await GetUnFinishTaskList ( processId ) ;
var taskEntity = unList . Find ( t = > t . State = = 1 & & t . UnitId = = iWFEngine . StartNode . Id ) ;
if ( taskEntity = = null )
{
throw ( new Exception ( "找不到重新提交流程任务!" ) ) ;
}
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( iWFEngine . StartNode . Id ) ;
// 处理任务并更新数据
List < WFTask > myTaskList ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
await uwo . WFProcess . UpdateSetColumnsTrueAsync ( a = > new WFProcess ( ) { IsCancel = 1 , IsAgain = 0 } , a = > a . Id = = processId ) ;
await uwo . WFTask . UpdateSetColumnsTrueAsync ( a = > new WFTask ( ) { State = 3 } , a = > a . Id = = taskEntity . Id ) ;
// 更新上一个流转过来的任务,提示他无法被撤销
await CloseTaskLogCancel ( taskEntity . ProcessId , taskEntity . PrevTaskId ) ;
myTaskList = await ExecuteWFTaskEntity ( taskList , iWFEngine , processId , taskEntity . Token , taskEntity . Id ) ;
foreach ( var item in myTaskList )
{
if ( item . Type = = 7 )
{
await uwo . WFTaskUser . InsertRangeAsync ( item . WFTaskUser ) ;
}
await Add ( item ) ;
}
await CreateTaskLog ( taskEntity , "" , "重新提交" , des , "" ) ;
//await _imMsgIBLL.VirtualDeleteByContentId(taskEntity.Token); // 更新消息
flag = uwo . Commit ( ) ;
}
var respone = new Response < bool > ( ) ;
if ( flag )
{
var scriptResults = new List < bool > ( ) ;
// 脚本执行
var scriptTaskList = myTaskList . FindAll ( t = > t . Type = = 10 ) ;
foreach ( var item in scriptTaskList )
{
var result = await ExecuteScript ( item , "createAgain" , processId , "" , "" , iWFEngine . CreateUser , iWFEngine , null , "" ) ;
scriptResults . Add ( result ) ;
}
if ( scriptResults . Contains ( false ) )
{
respone . Result = false ;
respone . Message = "流程信息存储成功,但脚本执行失败" ;
}
else
{
respone . Result = true ;
respone . Message = "success" ;
}
}
else
{
respone . Result = false ;
respone . Message = "error" ;
}
return respone ;
}
/// <summary>
/// 撤销流程(只有在该流程未被处理的情况下)
/// </summary>
/// <param name="processId">流程进程主键</param>
public async Task < bool > RevokeFlow ( string processId )
{
var iWFEngine = await Bootstraper ( string . Empty , processId , null , null ) ;
if ( iWFEngine . Config . Params . IsStart ! = 1 )
{
// 获取脚本任务
var scriptList = ( List < WFTask > ) await GetList ( processId , 10 , "create" ) ;
foreach ( var item in scriptList )
{
await ExecuteRevokeScript ( item . UnitId , item . UnitName , processId , iWFEngine . CreateUser , iWFEngine ) ;
}
using ( var uwo = UnitWork . CreateContext ( ) )
{
await uwo . WFTask . DeleteAsync ( a = > a . ProcessId = = processId ) ;
await uwo . WFTaskLog . DeleteAsync ( a = > a . ProcessId = = processId ) ;
await uwo . WFProcess . UpdateSetColumnsTrueAsync ( a = > new WFProcess { EnabledMark = 2 } , a = > a . Id = = processId ) ;
uwo . Commit ( ) ;
}
await ExecuteScript ( processId , "RevokeFlow" , iWFEngine . CreateUser ,
iWFEngine . WFScheme . UndoType ,
iWFEngine . WFScheme . UndoDbCode ,
iWFEngine . WFScheme . UndoDbSQL ,
iWFEngine . WFScheme . UndoUrl ,
iWFEngine . WFScheme . UndoIOCName ) ;
return true ;
}
return false ;
}
/// <summary>
/// 催办流程
/// </summary>
/// <param name="processId">流程进程主键</param>
public async Task < Response < bool > > UrgeFlow ( string processId )
{
// var userInfo = await this.CurrentUser();
var iWFEngine = await Bootstraper ( string . Empty , processId , null , null ) ;
// 获取未完成的任务
var taskList = await GetUnFinishTaskList ( processId ) ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
foreach ( var item in taskList )
{
if ( item . Type = = 1 | | item . Type = = 3 | | item . Type = = 5 | | item . Type = = 6 | | item . Type = = 7 )
{
item . IsUrge = 1 ;
item . UrgeTime = DateTime . Now ;
// 发送消息
var msg = $"【审核】【催办】{item.ProcessTitle},{item.UnitName}" ;
var userList = new List < string > ( ) ;
// todo 单体任务处理
userList . Add ( item . UserId ) ;
var node = iWFEngine . GetNode ( item . UnitId ) ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, node.MessageType, item.F_Token);
await uwo . WFTask . UpdateAsync ( item ) ;
}
}
//await wfProcessSerive.Update(new WFProcessEntity() { F_IsUrge = 1, F_Id = processId });
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
Des = "催办审核" ,
TaskType = 98 ,
ProcessId = processId ,
UnitId = iWFEngine . StartNode . Id ,
UnitName = string . IsNullOrEmpty ( iWFEngine . StartNode . Name ) ? "开始节点" : iWFEngine . StartNode . Name
} ;
wfTaskLogEntity . CreateDate = DateTime . Now ;
wfTaskLogEntity . UserId = _auth . GetUserId ( ) ;
wfTaskLogEntity . UserName = _auth . GetUserNickName ( ) ;
wfTaskLogEntity . Id = Guid . NewGuid ( ) . ToString ( ) ;
await uwo . WFTaskLog . InsertAsync ( wfTaskLogEntity ) ;
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
/// <summary>
/// 审批流程
/// </summary>
/// <param name="taskId">流程任务主键</param>
/// <param name="code">流程审批操作码agree 同意 disagree 不同意 lrtimeout 超时</param>
/// <param name="name">流程审批操名称</param>
/// <param name="des">审批意见</param>
/// <param name="nextUsers">下一节点指定审核人</param>
/// <param name="stampImg">盖章图片</param>
/// <param name="stampPassWord">盖章图片密码</param>
/// <param name="nextId">下一个审核节点</param>
public async Task AuditFlow ( string taskId , string code , string name , string des , Dictionary < string , string > nextUsers , string stampImg , string stampPassWord , string nextId )
{
var taskEntiy = await client . Queryable < WFTask > ( ) . Where ( a = > a . Id = = taskId ) . FirstAsync ( ) ;
if ( taskEntiy = = null )
{
throw ( new Exception ( "找不到对应流程任务!" ) ) ;
}
else if ( taskEntiy . State ! = 1 )
{
if ( taskEntiy . State = = 3 | | taskEntiy . State = = 4 )
{
throw ( new Exception ( "该任务已完成!" ) ) ;
}
else
{
throw ( new Exception ( "该任务未被激活!" ) ) ;
}
}
//后期改
stampImg = "" ;
//stampImg = await _wFStampIBLL.ToWfImg(stampImg, stampPassWord);
var iWFEngine = await Bootstraper ( "" , taskEntiy . ProcessId , null , nextUsers ) ;
// 1.判断任务类型 1 普通任务 5 会签任务
if ( taskEntiy . Type = = 1 | | taskEntiy . Type = = 7 )
{
await AuditNode ( iWFEngine , taskEntiy , code , name , des , stampImg , nextId ) ;
}
else if ( taskEntiy . Type = = 5 )
{
await AuditNodeByCountersign ( iWFEngine , taskEntiy , code , name , des , stampImg ) ;
}
else
{
throw ( new Exception ( "该任务无法审核!" ) ) ;
}
//await _imMsgIBLL.VirtualDeleteByContentId(taskEntiy.F_Token); // 更新消息
// 发送消息
var msg = $"【提醒】{iWFEngine.Config.Params.Title},{taskEntiy.UnitName}已被处理" ;
var userList = new List < string > ( ) ;
userList . Add ( iWFEngine . CreateUser . Id ) ;
var node = iWFEngine . StartNode ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, node.MessageType, iWFEngine.Config.Params.ProcessId);
}
/// <summary>
/// 批量审核(只有同意和不同意)
/// </summary>
/// <param name="code">操作码</param>
/// <param name="taskIdList">任务id串</param>
public async Task AuditFlows ( string code , List < string > taskIdList )
{
foreach ( var taskId in taskIdList )
{
string operationName = code = = "agree" ? "同意" : "不同意" ;
await AuditFlow ( taskId , code , operationName , "批量审核" , null , "" , "" , "" ) ;
}
}
/// <summary>
/// 撤销审核
/// </summary>
/// <param name="processId"></param>
/// <param name="taskId">流程任务主键</param>
/// <returns></returns>
public async Task < Response < bool > > RevokeAudit ( string processId , string taskId )
{
var iWFEngine = await Bootstraper ( string . Empty , processId , null , null ) ;
WFTask taskEntity ;
WFProcess processEntity ;
if ( string . IsNullOrEmpty ( taskId ) )
{ //撤销重新提交任务
processEntity = await GetEntity ( processId ) ;
if ( processEntity . IsCancel ! = 1 )
{
throw ( new Exception ( "当前流程无法撤销!" ) ) ;
}
var myTaskList = ( List < WFTask > ) await GetLastTaskList ( processId , iWFEngine . StartNode . Id ) ;
taskEntity = myTaskList [ 0 ] ;
processEntity . IsAgain = 1 ;
processEntity . IsCancel = 0 ;
}
else
{
taskEntity = await client . Queryable < WFTask > ( ) . Where ( a = > a . Id = = taskId ) . FirstAsync ( ) ;
if ( taskEntity . State = = 1 )
{
throw ( new Exception ( "当前任务无法撤销!" ) ) ;
}
var taskLogEntity = await GetLogEntity ( taskId ) ;
if ( taskLogEntity = = null | | taskLogEntity . IsCancel ! = 1 )
{
throw ( new Exception ( "当前任务无法撤销!" ) ) ;
}
processEntity = new WFProcess ( )
{
Id = processId
} ;
processEntity . IsFinished = 0 ;
processEntity . IsAgain = 0 ;
}
using ( var uwo = UnitWork . CreateContext ( ) )
{
// 获取脚本任务
var scriptList = await GetList ( processId , 10 , taskEntity . Id ) ;
foreach ( var item in scriptList )
{
await ExecuteRevokeScript ( item . UnitId , item . UnitName , processId , iWFEngine . CreateUser , iWFEngine ) ;
// 删除脚本任务执行日志
await DeleteLogByTaskId ( item . Id ) ;
}
// 删除所有生成的任务
await Delete ( processId , taskEntity . Id ) ;
// 如果是加签审核的,关闭最早的任务
if ( taskEntity . Type = = 6 )
{
var myTaskEntiy = await GetTaskEntity ( taskEntity . FirstId ) ; // 原始审核任务
myTaskEntiy . State = 5 ;
await uwo . WFTask . UpdateAsync ( myTaskEntiy ) ;
}
// 如果是撤销转移任务
if ( taskEntity . State = = 6 )
{
// 删除转移任务
await DeleteByFirstId ( taskEntity . Id ) ;
}
// 删除所有生成的日志
await DeleteLog ( processId , taskEntity . Id ) ;
// 更新等待任务状态
await OpenTask ( processId , taskEntity . UnitId , 21 , taskEntity . Id ) ;
taskEntity . State = 1 ;
await uwo . WFTask . UpdateAsync ( taskEntity ) ;
await uwo . Db . Updateable ( processEntity )
. IgnoreColumns ( ignoreAllNullColumns : true )
. ExecuteCommandAsync ( ) ;
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
/// <summary>
/// 流程加签
/// </summary>
/// <param name="taskId">流程任务主键</param>
/// <param name="userId">加签人员</param>
/// <param name="des">加签说明</param>
public async Task < Response < bool > > SignFlow ( string taskId , string userId , string des )
{
var taskEntiy = await GetTaskEntity ( taskId ) ;
if ( taskEntiy = = null )
{
throw ( new Exception ( "找不到对应流程任务!" ) ) ;
}
else if ( taskEntiy . State ! = 1 )
{
if ( taskEntiy . State = = 3 | | taskEntiy . State = = 4 )
{
throw ( new Exception ( "该任务已完成!" ) ) ;
}
else
{
throw ( new Exception ( "该任务未被激活!" ) ) ;
}
}
using ( var uwo = UnitWork . CreateContext ( ) )
{
// 更新任务状态
taskEntiy . State = 5 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
// 更新上一个流转过来的任务,提示他无法被撤销
await CloseTaskLogCancel ( taskEntiy . ProcessId , taskEntiy . PrevTaskId ) ;
// 填写日志
await CreateTaskLog ( taskEntiy , "sign" , "加签" , des , "" ) ;
if ( taskEntiy . Type ! = 6 )
{
taskEntiy . FirstId = taskEntiy . Id ;
}
var userInfo = await uwo . User . GetByIdAsync ( userId ) ;
// 添加加签任务
taskEntiy . PrevTaskId = taskEntiy . Id ;
//taskEntiy.UserCompanyId = userInfo.CompanyId;
//taskEntiy.UserDepartmentId = userInfo.DepartmentId;
taskEntiy . UserId = userInfo . Id . ToString ( ) ;
taskEntiy . UserName = userInfo . Name ;
taskEntiy . Type = 6 ;
taskEntiy . State = 1 ;
await uwo . WFTask . InsertAsync ( taskEntiy ) ;
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
/// <summary>
/// 流程加签审核
/// </summary>
/// <param name="taskId">流程任务主键</param>
/// <param name="code">操作码</param>
/// <param name="name">流程审批操名称</param>
/// <param name="des">审批意见</param>
/// <returns></returns>
public async Task < Response < bool > > SignAudit ( string taskId , string code , string name , string des )
{
var taskEntiy = await GetTaskEntity ( taskId ) ;
if ( taskEntiy = = null )
{
throw ( new Exception ( "找不到对应流程任务!" ) ) ;
}
else if ( taskEntiy . State ! = 1 )
{
if ( taskEntiy . State = = 3 | | taskEntiy . State = = 4 )
{
throw ( new Exception ( "该任务已完成!" ) ) ;
}
else
{
throw ( new Exception ( "该任务未被激活!" ) ) ;
}
}
using ( var uwo = UnitWork . CreateContext ( ) )
{
var myTaskEntiy = await GetTaskEntity ( taskEntiy . FirstId ) ; // 原始审核任务
myTaskEntiy . IsLast = 0 ;
await uwo . WFTask . UpdateAsync ( myTaskEntiy ) ;
myTaskEntiy . State = 1 ;
myTaskEntiy . IsLast = 1 ;
await Add ( myTaskEntiy ) ;
// 更新任务状态
taskEntiy . State = 3 ;
if ( taskEntiy . Type = = 7 )
{
var currentUser = _auth . GetCurrentUser ( ) . User ;
taskEntiy . UserId = currentUser . Id . ToString ( ) ;
taskEntiy . UserName = currentUser . Name ;
}
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
// 填写日志
await CreateTaskLog ( taskEntiy , code , name , des , "" ) ;
// 更新上一个流转过来的任务,提示他无法被撤销
await CloseTaskLogCancel ( taskEntiy . ProcessId , taskEntiy . PrevTaskId ) ;
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
/// <summary>
/// 确认阅读
/// </summary>
/// <param name="taskId">流程任务主键</param>
public async Task < Response < bool > > ReadFlow ( string taskId )
{
var taskEntiy = await GetTaskEntity ( taskId ) ;
if ( taskEntiy = = null )
{
throw ( new Exception ( "找不到对应流程任务!" ) ) ;
}
else if ( taskEntiy . State = = 1 )
{
using ( var uwo = UnitWork . CreateContext ( ) )
{
taskEntiy . State = 3 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
TaskType = taskEntiy . Type ,
ProcessId = taskEntiy . ProcessId ,
UnitId = taskEntiy . UnitId ,
UnitName = taskEntiy . UnitName ,
IsAgree = taskEntiy . IsAgree ,
OperationCode = "read" ,
OperationName = "已阅" ,
Token = taskEntiy . Token ,
PrevUnitId = taskEntiy . PrevUnitId ,
PrevUnitName = taskEntiy . PrevUnitName ,
TaskId = taskEntiy . Id ,
IsCancel = 0
} ;
await AddLog ( wfTaskLogEntity ) ;
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
else
{
return new Response < bool >
{
Result = false ,
Message = "error"
} ;
}
}
/// <summary>
/// 转移流程
/// </summary>
/// <param name="taskId">任务id</param>
/// <param name="userId">转移人用户id</param>
/// <param name="des">说明</param>
/// <returns></returns>
public async Task < Response < bool > > TransferUser ( string taskId , string userId , string des )
{
var taskEntiy = await GetTaskEntity ( taskId ) ;
if ( taskEntiy = = null )
{
throw ( new Exception ( "找不到对应流程任务!" ) ) ;
}
else if ( taskEntiy . State = = 1 )
{
using ( var uwo = UnitWork . CreateContext ( ) )
{
var userInfo = await uwo . User . GetByIdAsync ( userId ) ;
// 更新任务状态
taskEntiy . State = 6 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
// 更新流程
WFProcess processEntity = new WFProcess ( )
{
Id = taskEntiy . ProcessId ,
IsStart = 1 ,
IsCancel = 0 ,
} ;
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
// 填写日志
await CreateTaskLog ( taskEntiy , "transfer" , "转移" , des , "" ) ;
// 更新上一个流转过来的任务,提示他无法被撤销
await CloseTaskLogCancel ( taskEntiy . ProcessId , taskEntiy . PrevTaskId ) ;
// 新建任务
var newTask = taskEntiy ; //.ToJson().ToObject<WFTaskEntity>();
newTask . State = 1 ;
newTask . PrevTaskId = taskEntiy . Id ;
//newTask.UserCompanyId = userInfo.F_CompanyId;
//newTask.UserDepartmentId = userInfo.F_DepartmentId;
newTask . UserId = userInfo . Id . ToString ( ) ;
newTask . UserName = userInfo . Name ;
await uwo . WFTask . InsertAsync ( newTask ) ;
// 发送消息
var iWFEngine = await Bootstraper ( "" , taskEntiy . ProcessId , null ) ;
var msg = $"【审核】{taskEntiy.ProcessTitle},{taskEntiy.UnitName}" ;
var userList = new List < string > ( ) ;
userList . Add ( userInfo . Id . ToString ( ) ) ;
var node = iWFEngine . GetNode ( taskEntiy . UnitId ) ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, node.MessageType, newTask.F_Token);
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
else
{
return new Response < bool >
{
Result = false ,
Message = "error"
} ;
}
}
/// <summary>
/// 获取下一节点审核人
/// </summary>
/// <param name="code">流程模板编码</param>
/// <param name="processId">流程进程主键</param>
/// <param name="nodeId">流程节点Id</param>
/// <param name="operationCode">流程操作代码</param>
/// <param name="userId">创建人</param>
/// <returns></returns>
public async Task < Dictionary < string , List < WFUserInfo > > > GetNextAuditors ( string code , string processId , string nodeId , string operationCode , string userId )
{
Dictionary < string , List < WFUserInfo > > res = new Dictionary < string , List < WFUserInfo > > ( ) ;
var userInfo = await client . Queryable < SysUser > ( ) . Where ( a = > a . Id . ToString ( ) = = userId ) . FirstAsync ( ) ;
var iWFEngine = await Bootstraper ( code , processId , userInfo ) ;
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( nodeId , operationCode ) ;
foreach ( var item in taskList )
{
if ( ( item . Type = = 1 | | item . Type = = 3 | | item . Type = = 5 | | item . Type = = 7 ) & & item . User . IsNew )
{
if ( ! res . ContainsKey ( item . UnitId ) )
{
res . Add ( item . UnitId , new List < WFUserInfo > ( ) ) ;
}
res [ item . UnitId ] . Add ( item . User ) ;
}
}
return res ;
}
/// <summary>
/// 作废流程
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <returns></returns>
public async Task < Response < bool > > DeleteProcess ( string processId )
{
var flag = false ;
var iWFEngine = await Bootstraper ( string . Empty , processId , null ) ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
// 更新流程状态
WFProcess processEntity = new WFProcess ( )
{
Id = processId ,
} ;
await uwo . WFProcess . UpdateSetColumnsTrueAsync ( a = > new WFProcess { EnabledMark = 3 } , a = > a . Id = = processId ) ;
await uwo . WFTask . UpdateSetColumnsTrueAsync ( a = > new WFTask { State = 7 } , a = > a . ProcessId = = processId & & a . State = = 1 ) ;
flag = uwo . Commit ( ) ;
}
var response = new Response < bool > ( ) ;
if ( flag )
{
var scriptResult = await ExecuteScript ( processId , "delete" , iWFEngine . CreateUser ,
iWFEngine . WFScheme . DeleteType ,
iWFEngine . WFScheme . DeleteDbCode ,
iWFEngine . WFScheme . DeleteDbSQL ,
iWFEngine . WFScheme . DeleteUrl ,
iWFEngine . WFScheme . DeleteIOCName ) ;
if ( scriptResult )
{
response . Result = true ;
response . Message = "success" ;
}
else
{
response . Result = false ;
response . Message = "流程状态更新成功,但脚本执行失败" ;
}
}
else
{
response . Result = false ;
response . Message = "error" ;
}
return response ;
}
/// <summary>
/// 流程还原
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <returns></returns>
public async Task < Response < bool > > RecoverProcess ( string processId )
{
var flag = false ;
var iWFEngine = await Bootstraper ( string . Empty , processId , null ) ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
// 更新流程状态
WFProcess processEntity = new WFProcess ( )
{
Id = processId ,
} ;
await uwo . WFProcess . UpdateSetColumnsTrueAsync ( a = > new WFProcess { EnabledMark = 1 } , a = > a . Id = = processId ) ;
await uwo . WFTask . UpdateSetColumnsTrueAsync ( a = > new WFTask { State = 1 } , a = > a . ProcessId = = processId & & a . State = = 7 ) ;
flag = uwo . Commit ( ) ;
}
var response = new Response < bool > ( ) ;
if ( flag )
{
response . Result = true ;
response . Message = "success" ;
}
else {
response . Result = false ;
response . Message = "error" ;
}
return response ;
}
/// <summary>
/// 指派流程审核人
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <param name="pointList">流程指派人信息</param>
/// <returns></returns>
public async Task < Response < bool > > PointUser ( string processId , List < WFProcessPoint > pointList )
{
var list = await GetUnFinishTaskList ( processId ) ;
Dictionary < string , List < WFTask > > map = new Dictionary < string , List < WFTask > > ( ) ;
foreach ( var item in list )
{
if ( ! map . ContainsKey ( item . UnitId ) )
{
map . Add ( item . UnitId , new List < WFTask > ( ) ) ;
}
map [ item . UnitId ] . Add ( item ) ;
}
var addList = new List < WFTask > ( ) ;
var iWFEngine = await Bootstraper ( "" , processId , null ) ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
foreach ( var item in pointList )
{
if ( map . ContainsKey ( item . UnitId ) )
{
await CloseTask ( processId , map [ item . UnitId ] [ 0 ] . Token , "" ) ;
var userIdList = item . UserIds . Split ( "," ) ;
foreach ( var userId in userIdList )
{
var addItem = Newtonsoft . Json . JsonConvert . SerializeObject ( map [ item . UnitId ] [ 0 ] ) . ToObject < WFTask > ( ) ;
addItem . State = 1 ;
if ( addItem . Type = = 6 )
{
addItem . Type = 1 ;
}
var userEntity = _auth . GetCurrentUser ( ) . User ;
addItem . UserId = userId ;
addItem . UserName = userEntity . Name ;
//addItem.UserCompanyId = userEntity.F_CompanyId;
//addItem.UserDepartmentId = userEntity.F_DepartmentId;
// 发送消息
var msg = $"【审核】{addItem.ProcessTitle},{addItem.UnitName}" ;
var userList = new List < string > ( ) ;
userList . Add ( userId ) ;
var node = iWFEngine . GetNode ( addItem . UnitId ) ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, node.MessageType, addItem.F_Token);
addList . Add ( addItem ) ;
}
}
else
{
throw ( new Exception ( "找不到指派任务节点!" ) ) ;
}
}
foreach ( var item in addList )
{
await Add ( item ) ;
}
var flag = uwo . Commit ( ) ;
return new Response < bool > ( )
{
Result = flag ,
Message = flag = = true ? "success" : "error"
} ;
}
}
# endregion
# region
/// <summary>
/// 流程模板初始化
/// </summary>
/// <param name="code">流程模板</param>
/// <param name="processId">流程实例</param>
/// <param name="userInfo">提交人用户信息</param>
/// <param name="nextUsers">下一个节点审核人</param>
/// <returns></returns>
private async Task < IWFEngine > Bootstraper ( string code , string processId , SysUser userInfo , Dictionary < string , string > nextUsers = null )
{
WFEngineConfig wfEngineConfig = new WFEngineConfig ( ) ;
WFParams wfParams = new WFParams ( ) ;
wfEngineConfig . Params = wfParams ;
var currentUser = _auth . GetCurrentUser ( ) . User ;
wfParams . CurrentUser = new WFUserInfo ( )
{
Id = currentUser . Id . ToString ( ) ,
Account = currentUser . Account ,
Name = currentUser . Name
//CompanyId = currentUser.F_CompanyId,
//DepartmentId = currentUser.F_DepartmentId
} ;
if ( ! string . IsNullOrEmpty ( code ) )
{
var schemeInfo = await client . Queryable < WFSchemeInfo > ( ) . FirstAsync ( a = > a . Code = = code ) ;
if ( schemeInfo ! = null )
{
var data = await client . Queryable < WFScheme > ( ) . FirstAsync ( a = > a . Id = = schemeInfo . SchemeId ) ;
if ( data ! = null )
{
wfParams . Scheme = data . Content ;
wfParams . SchemeCode = code ;
wfParams . SchemeId = schemeInfo . SchemeId ;
wfParams . SchemeName = schemeInfo . Name ;
wfParams . ProcessId = processId ;
wfParams . HasInstance = false ;
wfParams . CreateUser = new WFUserInfo ( )
{
Id = userInfo . Id . ToString ( ) ,
Account = userInfo . Account ,
Name = userInfo . Name
//CompanyId = userInfo.F_CompanyId,
//DepartmentId = userInfo.F_DepartmentId
} ;
}
else
{
throw new Exception ( string . Format ( "无法获取对应的流程模板【{0}】" , code ) ) ;
}
}
else
{
throw new Exception ( string . Format ( "无法获取对应的流程模板【{0}】" , code ) ) ;
}
}
else if ( ! string . IsNullOrEmpty ( processId ) )
{
var processEntity = await GetEntity ( processId ) ;
if ( processEntity ! = null )
{
var data = await client . Queryable < WFScheme > ( ) . FirstAsync ( a = > a . Id = = processEntity . SchemeId ) ;
if ( data ! = null )
{
wfParams . Scheme = data . Content ;
wfParams . SchemeCode = processEntity . SchemeCode ;
wfParams . SchemeId = processEntity . SchemeId ;
wfParams . SchemeName = processEntity . SchemeName ;
wfParams . IsChild = processEntity . IsChild = = 1 ;
wfParams . ParentProcessId = processEntity . ParentProcessId ;
wfParams . ParentTaskId = processEntity . ParentTaskId ;
wfParams . ParentNodeId = processEntity . ParentNodeId ;
wfParams . ProcessId = processId ;
wfParams . HasInstance = true ;
wfParams . IsStart = processEntity . IsStart = = 1 ? 1 : 0 ;
wfParams . Title = processEntity . Title ;
wfParams . CreateUser = new WFUserInfo ( )
{
Id = processEntity . CreateUserId ,
Account = processEntity . CreateUserAccount ,
Name = processEntity . CreateUserName ,
CompanyId = processEntity . CreateUserCompanyId ,
DepartmentId = processEntity . CreateUserDepartmentId
} ;
}
else
{
throw new Exception ( string . Format ( "无法获取流程模板【{0}】" , processEntity . SchemeId ) ) ;
}
}
else if ( string . IsNullOrEmpty ( wfParams . Scheme ) )
{
throw new Exception ( string . Format ( "无法获取实例数据【{0}】" , processId ) ) ;
}
}
wfParams . NextUsers = nextUsers ;
// 注册委托方法
wfEngineConfig . GetAwaitTaskList = GetAwaitTaskList ;
wfEngineConfig . GetUserList = GetUserList ;
wfEngineConfig . GetSystemUserList = GetSystemUserList ;
wfEngineConfig . GetPrevTaskUserList = GetPrevTaskUserList ;
wfEngineConfig . IsCountersignAgree = IsCountersignAgree ;
wfEngineConfig . GetPrevUnitId = GetPrevUnitId ;
IWFEngine iwfEngine = new WFEngine ( wfEngineConfig , client ) ;
return iwfEngine ;
}
/// <summary>
/// 流程模板初始化
/// </summary>
/// <param name="code">流程模板</param>
/// <param name="processId">流程实例</param>
/// <param name="userInfo">提交人用户信息</param>
/// <param name="nextUsers">下一个节点审核人</param>
/// <returns></returns>
private async Task < IWFEngine > BootstraperWithUser ( string code , string processId , SysUser userInfo , Dictionary < string , string > nextUsers = null )
{
WFEngineConfig wfEngineConfig = new WFEngineConfig ( ) ;
WFParams wfParams = new WFParams ( ) ;
wfEngineConfig . Params = wfParams ;
var currentUser = userInfo ;
wfParams . CurrentUser = new WFUserInfo ( )
{
Id = currentUser . Id . ToString ( ) ,
Account = currentUser . Account ,
Name = currentUser . Name
//CompanyId = currentUser.F_CompanyId,
//DepartmentId = currentUser.F_DepartmentId
} ;
if ( ! string . IsNullOrEmpty ( code ) )
{
var schemeInfo = await client . Queryable < WFSchemeInfo > ( ) . FirstAsync ( a = > a . Code = = code ) ;
if ( schemeInfo ! = null )
{
var data = await client . Queryable < WFScheme > ( ) . FirstAsync ( a = > a . Id = = schemeInfo . SchemeId ) ;
if ( data ! = null )
{
wfParams . Scheme = data . Content ;
wfParams . SchemeCode = code ;
wfParams . SchemeId = schemeInfo . SchemeId ;
wfParams . SchemeName = schemeInfo . Name ;
wfParams . ProcessId = processId ;
wfParams . HasInstance = false ;
wfParams . CreateUser = new WFUserInfo ( )
{
Id = userInfo . Id . ToString ( ) ,
Account = userInfo . Account ,
Name = userInfo . Name
//CompanyId = userInfo.F_CompanyId,
//DepartmentId = userInfo.F_DepartmentId
} ;
}
else
{
throw new Exception ( string . Format ( "无法获取对应的流程模板【{0}】" , code ) ) ;
}
}
else
{
throw new Exception ( string . Format ( "无法获取对应的流程模板【{0}】" , code ) ) ;
}
}
else if ( ! string . IsNullOrEmpty ( processId ) )
{
var processEntity = await GetEntity ( processId ) ;
if ( processEntity ! = null )
{
var data = await client . Queryable < WFScheme > ( ) . FirstAsync ( a = > a . Id = = processEntity . SchemeId ) ;
if ( data ! = null )
{
wfParams . Scheme = data . Content ;
wfParams . SchemeCode = processEntity . SchemeCode ;
wfParams . SchemeId = processEntity . SchemeId ;
wfParams . SchemeName = processEntity . SchemeName ;
wfParams . IsChild = processEntity . IsChild = = 1 ;
wfParams . ParentProcessId = processEntity . ParentProcessId ;
wfParams . ParentTaskId = processEntity . ParentTaskId ;
wfParams . ParentNodeId = processEntity . ParentNodeId ;
wfParams . ProcessId = processId ;
wfParams . HasInstance = true ;
wfParams . IsStart = processEntity . IsStart = = 1 ? 1 : 0 ;
wfParams . Title = processEntity . Title ;
wfParams . CreateUser = new WFUserInfo ( )
{
Id = processEntity . CreateUserId ,
Account = processEntity . CreateUserAccount ,
Name = processEntity . CreateUserName ,
CompanyId = processEntity . CreateUserCompanyId ,
DepartmentId = processEntity . CreateUserDepartmentId
} ;
}
else
{
throw new Exception ( string . Format ( "无法获取流程模板【{0}】" , processEntity . SchemeId ) ) ;
}
}
else if ( string . IsNullOrEmpty ( wfParams . Scheme ) )
{
throw new Exception ( string . Format ( "无法获取实例数据【{0}】" , processId ) ) ;
}
}
wfParams . NextUsers = nextUsers ;
// 注册委托方法
wfEngineConfig . GetAwaitTaskList = GetAwaitTaskList ;
wfEngineConfig . GetUserList = GetUserList ;
wfEngineConfig . GetSystemUserList = GetSystemUserList ;
wfEngineConfig . GetPrevTaskUserList = GetPrevTaskUserList ;
wfEngineConfig . IsCountersignAgree = IsCountersignAgree ;
wfEngineConfig . GetPrevUnitId = GetPrevUnitId ;
IWFEngine iwfEngine = new WFEngine ( wfEngineConfig , client ) ;
return iwfEngine ;
}
/// <summary>
/// 获取等待任务
/// </summary>
/// <param name="processId">流程进程ID</param>
/// <param name="unitId">流程单元ID</param>
/// <returns></returns>
private async Task < List < WorkFlow . WFTask > > GetAwaitTaskList ( string processId , string unitId )
{
List < WorkFlow . WFTask > res = new List < WorkFlow . WFTask > ( ) ;
var list = await client . Queryable < WFTask > ( ) . Where ( t = > t . ProcessId = = processId & & t . UnitId = = unitId & & t . Type = = 21 & & t . State = = 1 ) . ToListAsync ( ) ;
foreach ( var item in list )
{
res . Add ( GetWFTask ( item ) ) ;
}
return res ;
}
/// <summary>
/// 获取设置人员
/// </summary>
/// <param name="auditorList">人员配置信息</param>
/// <param name="createUser">流程发起人</param>
/// <param name="processId">流程进程实例ID</param>
/// <param name="startNode">开始节点</param>
/// <returns></returns>
private async Task < List < WFUserInfo > > GetUserList ( List < WFAuditor > auditorList , WFUserInfo createUser , string processId , WFUnit startNode )
{
var res = new List < WFUserInfo > ( ) ;
List < string > userIds = new List < string > ( ) ;
foreach ( var item in auditorList )
{
switch ( item . Type )
{
//岗位
case "1" :
var rlist = await userManager . UserIdsByPosition ( "" , item . Id ) ;
foreach ( var ritem in rlist )
{
userIds . Add ( ritem ) ;
}
break ;
//角色
case "2" :
var rlist2 = await userManager . UserIdsByRole ( item . Id ) ;
List < string > userIds2 = new List < string > ( ) ;
foreach ( var ritem2 in rlist2 )
{
userIds2 . Add ( ritem2 ) ;
}
var userList2 = await GetListByKeyValues ( userIds2 . ToArray ( ) ) ;
var userOrgs = await userManager . UserOrgsByUserIds ( userIds2 ) ;
foreach ( var userOrg in userOrgs )
{
var user2 = userList2 . FirstOrDefault ( a = > a . Id . ToString ( ) = = userOrg . Key ) ;
switch ( item . Condition )
{
case "1" :
if ( ( userOrg . Value as List < string > ) . Contains ( createUser . DepartmentId ) )
{
res . Add ( GetWFUserInfo ( user2 ) ) ;
}
break ;
//case "2":
// if (user2.CompanyId == createUser.CompanyId)
// {
// res.Add(GetWFUserInfo(user2));
// }
// break;
case "3" :
//// 获取当前用户的岗位
var postList1 = await userManager . PositonsByUser ( createUser . Id ) ; // 发起人岗位
var postList2 = await userManager . PositonsByUser ( user2 . Id . ToString ( ) ) ; // 节点审核人岗位
//if (await _postIBLL.IsUp(postList1, postList2))
if ( await positionManager . IsUp ( postList1 , postList2 ) )
{
res . Add ( GetWFUserInfo ( user2 ) ) ;
}
break ;
case "4" :
// 获取当前用户的岗位
var postList3 = await userManager . PositonsByUser ( createUser . Id ) ; // 发起人岗位
var postList4 = await userManager . PositonsByUser ( user2 . Id . ToString ( ) ) ; // 节点审核人岗位
if ( await positionManager . IsDown ( postList3 , postList4 ) )
{
res . Add ( GetWFUserInfo ( user2 ) ) ;
}
break ;
default :
res . Add ( GetWFUserInfo ( user2 ) ) ;
break ;
}
}
break ;
//用户
case "3" :
userIds . Add ( item . Id ) ;
break ;
//上下级
case "4" :
var postIds = await userManager . PositonsByUser ( createUser . Id ) ; // 发起人岗位
int level = Convert . ToInt32 ( item . Id ) ;
List < string > postList ;
if ( level < 6 )
{
postList = ( await positionManager . GetUpIdList ( postIds , level ) ) . ToList ( ) ;
}
else
{
level = level - 5 ;
postList = ( await positionManager . GetDownIdList ( postIds , level ) ) . ToList ( ) ;
}
var userRelationList4 = await userManager . UserIdsByPositions ( postList ) ;
userIds . AddRange ( userRelationList4 ) ;
break ;
//节点执行人
case "5" :
if ( item . Id = = startNode . Id )
{
res . Add ( createUser ) ;
}
else
{
var taskList = await GetLastFinishTaskList ( item . Id , processId ) ;
foreach ( var task in taskList )
{
userIds . Add ( task . UserId ) ;
}
}
break ;
//数据库表字段
case "6" :
using ( var db = this . CodeClient ( item . DbCode , _configuration ) )
{
DataTable dt = await db . Ado . GetDataTableAsync ( string . Format ( "select {0} from {1} where {2} = @processId " , item . AuditorField , item . Table , item . Rfield ) , new { processId } ) ;
foreach ( DataRow row in dt . Rows )
{
var userIdString = row [ 0 ] . ToString ( ) ;
if ( ! string . IsNullOrEmpty ( userIdString ) )
{
var userIdList = userIdString . Split ( "," ) ;
foreach ( var userIdItem in userIdList )
{
userIds . Add ( userIdItem ) ;
}
}
}
break ;
}
//数据库表字段
case "7" :
using ( var db = this . CodeClient ( item . DbCode , _configuration ) )
{
//获取数据id
var process = await client . Queryable < WFProcess > ( ) . FirstAsync ( a = > a . Id = = processId ) ;
WFInstanceInfo instanceInfo = null ;
if ( process ! = null )
{
// instanceInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WFInstanceInfo>(process.InstanceInfo);
instanceInfo = process . InstanceInfo ;
}
DataTable dt = await db . Ado . GetDataTableAsync ( string . Format ( item . Sql ) , new { pkeyValue = instanceInfo . pkeyValue } ) ;
foreach ( DataRow row in dt . Rows )
{
var userIdString = row [ 0 ] . ToString ( ) ;
if ( ! string . IsNullOrEmpty ( userIdString ) )
{
var userIdList = userIdString . Split ( "," ) ;
foreach ( var userIdItem in userIdList )
{
userIds . Add ( userIdItem ) ;
}
}
}
break ;
}
}
}
var userList = await GetListByKeyValues ( userIds . ToArray ( ) ) ;
foreach ( var user in userList )
{
res . Add ( GetWFUserInfo ( user ) ) ;
}
return res ;
}
/// <summary>
/// 获取单元上一次的审核人
/// </summary>
/// <param name="processId">流程进程ID</param>
/// <param name="unitId">流程单元ID</param>
/// <returns></returns>
private async Task < List < WFUserInfo > > GetPrevTaskUserList ( string processId , string unitId )
{
var res = new List < WFUserInfo > ( ) ;
var list = await GetLastTaskList ( processId , unitId ) ;
foreach ( var item in list )
{
if ( ! string . IsNullOrEmpty ( item . UserId ) )
{
res . Add ( new WFUserInfo ( )
{
Id = item . UserId ,
Name = item . UserName ,
CompanyId = item . UserCompanyId ,
DepartmentId = item . UserDepartmentId ,
IsAgree = item . IsAgree = = 1 ,
//Sort = item,
State = ( int ) item . State
} ) ;
}
}
return res ;
}
/// <summary>
/// 获取系统管理员
/// </summary>
/// <returns></returns>
private async Task < List < WFUserInfo > > GetSystemUserList ( )
{
var res = new List < WFUserInfo > ( ) ;
var user = new SysUser
{
Id = - 1 ,
Account = Define . SYSTEM_USERNAME ,
Name = "超级管理员"
} ;
res . Add ( GetWFUserInfo ( user ) ) ;
return res ;
}
/// <summary>
/// 判断会签是否通过
/// </summary>
/// <param name="processId">流程进程ID</param>
/// <param name="unitId">流程单元ID</param>
/// <returns></returns>
private async Task < bool > IsCountersignAgree ( string processId , string unitId )
{
var list = ( List < WFTaskLog > ) await GetLogList ( processId , unitId ) ;
if ( list . Count = = 0 )
{
return false ;
}
return list [ 0 ] . IsAgree = = 1 ;
}
/// <summary>
/// 获取上一个流入节点(不是驳回流入的)
/// </summary>
/// <param name="processId"></param>
/// <param name="unitId"></param>
/// <returns></returns>
private async Task < string > GetPrevUnitId ( string processId , string unitId )
{
var data = await GetLastNotRejectTask ( processId , unitId ) ;
if ( data ! = null )
{
return data . PrevUnitId ;
}
else
{
return string . Empty ;
}
}
/// <summary>
/// 获取流程任务数据
/// </summary>
/// <param name="wfTaskEntity"></param>
/// <returns></returns>
private WorkFlow . WFTask GetWFTask ( WFTask wfTaskEntity )
{
var res = new WorkFlow . WFTask ( )
{
UnitId = wfTaskEntity . UnitId ,
Name = wfTaskEntity . UnitName ,
PrevUnitId = wfTaskEntity . PrevUnitId ,
PrevUnitName = wfTaskEntity . PrevUnitName ,
Token = wfTaskEntity . Token ,
Type = ( int ) wfTaskEntity . Type
} ;
return res ;
}
/// <summary>
/// 获取用户
/// </summary>
/// <param name="userEntity"></param>
/// <returns></returns>
private WFUserInfo GetWFUserInfo ( SysUser userEntity )
{
var res = new WFUserInfo ( )
{
Id = userEntity . Id . ToString ( ) ,
Name = userEntity . Name ,
Account = userEntity . Account ,
//DepartmentId = userEntity.F_DepartmentId,
//CompanyId = userEntity.F_CompanyId,
IsNew = true
} ;
return res ;
}
/// <summary>
/// 获取流程实例
/// </summary>
/// <param name="myParams">流程运行参数</param>
/// <param name="title">标题</param>
/// <returns></returns>
private WFProcess GetWFProcessEntity ( WFParams myParams , string title )
{
WFProcess wfProcessEntity = new WFProcess ( )
{
Id = myParams . ProcessId ,
SchemeCode = myParams . SchemeCode ,
SchemeId = myParams . SchemeId ,
SchemeName = myParams . SchemeName ,
Title = title ,
EnabledMark = 1 ,
IsAgain = 0 ,
IsFinished = 0 ,
IsChild = myParams . IsChild ? 1 : 0 ,
IsStart = 0 ,
IsCancel = 1 ,
ParentNodeId = myParams . ParentNodeId ,
ParentProcessId = myParams . ParentProcessId ,
ParentTaskId = myParams . ParentTaskId ,
CreateUserId = myParams . CreateUser . Id ,
CreateUserName = myParams . CreateUser . Name ,
CreateUserAccount = myParams . CreateUser . Account ,
CreateUserCompanyId = myParams . CreateUser . CompanyId ,
CreateUserDepartmentId = myParams . CreateUser . DepartmentId ,
UserId = _auth . GetUserId ( )
} ;
return wfProcessEntity ;
}
/// <summary>
/// 处理任务
/// </summary>
/// <param name="list">任务列表</param>
/// <param name="iWFEngine"></param>
/// <param name="processId">流程进程实例</param>
/// <param name="prevToken">任务Token</param>
/// <param name="taskId">任务id</param>
/// <returns></returns>
private async Task < List < WFTask > > ExecuteWFTaskEntity ( List < WorkFlow . WFTask > list , IWFEngine iWFEngine , string processId , string prevToken , string taskId = "" )
{
var res = new List < WFTask > ( ) ;
//单任务审核
var tlist = list . Where ( r = > r . Type = = 7 ) . ToList ( ) ;
if ( tlist . Count > 0 )
{
var group = tlist . GroupBy ( r = > r . UnitId ) . ToList ( ) ;
foreach ( var item in group )
{
var taskuser = new List < WFTaskUser > ( ) ;
var users = tlist . Where ( r = > r . UnitId = = item . Key ) . ToList ( ) ;
var userTask = new WFTask
{
Id = Guid . NewGuid ( ) . ToString ( ) ,
Type = users [ 0 ] . Type ,
ProcessId = processId ,
Token = users [ 0 ] . Token ,
UnitId = users [ 0 ] . UnitId ,
UnitName = users [ 0 ] . Name ,
PrevUnitId = users [ 0 ] . PrevUnitId ,
PrevUnitName = users [ 0 ] . PrevUnitName ,
PrevToken = prevToken ,
PrevTaskId = taskId ,
UserId = users [ 0 ] . User . Id ,
UserName = users [ 0 ] . User . Name ,
UserDepartmentId = users [ 0 ] . User . DepartmentId ,
UserCompanyId = users [ 0 ] . User . CompanyId ,
State = users [ 0 ] . User . IsAwait ? 2 : 1 ,
Sort = users [ 0 ] . User . Sort ,
IsReject = users [ 0 ] . IsReject ? 1 : 0 ,
ChildProcessId = users [ 0 ] . ChildSchemeInfoId ,
TimeoutInterval = users [ 0 ] . OvertimeMessageInterval ,
TimeoutStrategy = users [ 0 ] . OvertimeMessageType ,
IsBatchAudit = users [ 0 ] . IsBatchAudit ? 1 : 0 ,
ProcessUserId = iWFEngine . CreateUser . Id ,
ProcessUserName = iWFEngine . CreateUser . Name ,
ProcessCode = iWFEngine . Config . Params . SchemeCode ,
ProcessTitle = iWFEngine . Config . Params . Title ,
IsRetract = 0
} ;
if ( users [ 0 ] . IsOvertimeMessage )
{
if ( users [ 0 ] . OvertimeGo > 0 )
{
userTask . TimeoutAction = DateTime . Now . AddHours ( users [ 0 ] . OvertimeGo ) ;
}
if ( users [ 0 ] . OvertimeMessageStart > 0 )
{
userTask . TimeoutNotice = DateTime . Now . AddHours ( users [ 0 ] . OvertimeMessageStart ) ;
}
}
foreach ( var ts in users )
{
WFTaskUser tu = new WFTaskUser ( ) ;
tu . UserId = ts . User . Id ;
tu . TaskId = userTask . Id ;
taskuser . Add ( tu ) ;
}
userTask . WFTaskUser = taskuser ;
res . Add ( userTask ) ;
}
}
foreach ( var item in list )
{
if ( ! string . IsNullOrEmpty ( item . MessageType ) )
{
// 发送消息
var taskType = "" ;
switch ( item . Type )
{
case 1 :
case 5 :
case 7 :
taskType = "审核" ;
break ;
case 2 :
taskType = "查阅" ;
break ;
case 3 :
taskType = "提交" ;
break ;
case 4 :
taskType = "重新提交" ;
break ;
}
if ( ! string . IsNullOrEmpty ( taskType ) )
{
var msg = $"【{taskType}】{iWFEngine.Config.Params.Title},{item.Name}" ;
var userList = new List < string > ( ) ;
userList . Add ( item . User . Id ) ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, item.MessageType, item.Token);
}
}
string childSchemeInfoCode = "" ;
if ( item . Type = = 3 )
{
var schemeInfo = await this . Repository . ChangeRepository < SugarRepositiry < WFSchemeInfo > > ( ) . GetByIdAsync ( item . ChildSchemeInfoId ) ;
if ( schemeInfo ! = null )
{
childSchemeInfoCode = schemeInfo . Code ;
}
}
switch ( item . Type )
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
var userTask = new WFTask
{
Type = item . Type ,
ProcessId = processId ,
Token = item . Token ,
UnitId = item . UnitId ,
UnitName = item . Name ,
PrevUnitId = item . PrevUnitId ,
PrevUnitName = item . PrevUnitName ,
PrevToken = prevToken ,
PrevTaskId = taskId ,
UserId = item . User . Id ,
UserName = item . User . Name ,
UserDepartmentId = item . User . DepartmentId ,
UserCompanyId = item . User . CompanyId ,
State = item . User . IsAwait ? 2 : 1 ,
Sort = item . User . Sort ,
IsReject = item . IsReject ? 1 : 0 ,
ChildProcessId = item . ChildSchemeInfoId ,
ChildSchemeInfoCode = childSchemeInfoCode ,
TimeoutInterval = item . OvertimeMessageInterval ,
TimeoutStrategy = item . OvertimeMessageType ,
IsBatchAudit = item . IsBatchAudit ? 1 : 0 ,
ProcessUserId = iWFEngine . CreateUser . Id ,
ProcessUserName = iWFEngine . CreateUser . Name ,
ProcessCode = iWFEngine . Config . Params . SchemeCode ,
ProcessTitle = iWFEngine . Config . Params . Title ,
IsRetract = 0
} ;
if ( item . IsOvertimeMessage )
{
if ( item . OvertimeGo > 0 )
{
userTask . TimeoutAction = DateTime . Now . AddHours ( item . OvertimeGo ) ;
}
if ( item . OvertimeMessageStart > 0 )
{
userTask . TimeoutNotice = DateTime . Now . AddHours ( item . OvertimeMessageStart ) ;
}
}
res . Add ( userTask ) ;
break ;
case 10 :
// 执行脚本
res . Add ( new WFTask
{
Type = item . Type ,
ProcessId = processId ,
Token = item . Token ,
UnitId = item . UnitId ,
UnitName = item . Name ,
PrevUnitId = item . PrevUnitId ,
PrevUnitName = item . PrevUnitName ,
PrevToken = prevToken
} ) ;
break ;
case 21 :
res . Add ( new WFTask
{
Type = item . Type ,
ProcessId = processId ,
Token = item . Token ,
UnitId = item . UnitId ,
UnitName = item . Name ,
PrevUnitId = item . PrevUnitId ,
PrevUnitName = item . PrevUnitName ,
PrevToken = prevToken ,
State = 1 ,
} ) ;
break ;
case 22 :
await CloseTask ( processId , item . UnitId , 21 , taskId ) ;
break ;
case 23 :
case 24 :
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
Des = "系统任务" ,
TaskType = item . Type ,
Token = item . Token ,
ProcessId = processId ,
UnitId = item . UnitId ,
UnitName = item . Name ,
PrevUnitId = item . PrevUnitId ,
PrevUnitName = item . PrevUnitName
} ;
await AddLog ( wfTaskLogEntity ) ;
break ;
case 26 :
// 更新任务状态
await Update ( processId , item . UnitId ) ;
break ;
}
}
return res ;
}
public void AddOpenJob ( WFTask task , DateTime outtime , DateTime overtime )
{
try
{
AddOrUpdateOpenJobReq req = new AddOrUpdateOpenJobReq ( ) ;
req . JobName = $"超时通知 {task.Id}" ;
req . JobType = 0 ;
req . JobCallParams = "{\"TaskId\":\"" + task . Id + "\"}" ;
req . JobCall = "OpenAuth.App.BaseApp.Jobs.TaskTimeoutJob" ;
req . Status = 1 ;
req . Cron = GetCorn ( outtime ) ;
req . Remark = $"{task.ProcessUserId}--{task.UnitName}" ;
_job . AddStart ( req ) ;
AddOrUpdateOpenJobReq req1 = new AddOrUpdateOpenJobReq ( ) ;
req1 . JobName = $"严重超时通知 {task.Id}" ;
req1 . JobType = 0 ;
req1 . JobCallParams = "{\"TaskId\":\"" + task . Id + "\"}" ;
req1 . JobCall = "OpenAuth.App.BaseApp.Jobs.TaskOverTimeJob" ;
req1 . Status = 1 ;
req1 . Cron = GetCorn ( overtime ) ;
req1 . Remark = $"{task.ProcessUserId}--{task.UnitName}" ;
_job . AddStart ( req1 ) ;
}
catch
{
return ;
}
}
public string GetCorn ( DateTime time )
{
StringBuilder sb = new StringBuilder ( ) ;
sb . Append ( time . Second . ToString ( ) ) ;
sb . Append ( " " ) ;
sb . Append ( time . Minute . ToString ( ) ) ;
sb . Append ( " " ) ;
sb . Append ( time . Hour . ToString ( ) ) ;
sb . Append ( " " ) ;
sb . Append ( time . Day . ToString ( ) ) ;
sb . Append ( " " ) ;
sb . Append ( time . Month . ToString ( ) ) ;
sb . Append ( " " ) ;
sb . Append ( "?" ) ;
sb . Append ( " " ) ;
sb . Append ( time . Year . ToString ( ) ) ;
return sb . ToString ( ) ;
}
/// <summary>
/// 执行脚本
/// </summary>
/// <param name="task">脚本任务</param>
/// <param name="code"></param>
/// <param name="processId"></param>
/// <param name="prevTaskId"></param>
/// <param name="createUser"></param>
/// <param name="iWFEngine"></param>
/// <param name="preTask"></param>
/// <returns></returns>
private async Task < bool > ExecuteScript ( WFTask task , string code , string processId , string prevTaskId , string nextid , WFUserInfo createUser , IWFEngine iWFEngine , WFTask preTask , string des )
{
SysUser userInfo ;
if ( preTask = = null )
{
userInfo = new SysUser ( )
{
Id = long . Parse ( createUser . Id ) ,
Account = createUser . Account ,
//CompanyId = createUser.CompanyId,
//F_DepartmentId = createUser.DepartmentId
} ;
}
else
{
//userInfo = await this.CurrentUser(preTask.F_UserId);
userInfo = _auth . GetCurrentUser ( ) . User ;
}
string nextnode = "" ;
if ( ! string . IsNullOrEmpty ( nextid ) )
{
nextnode = iWFEngine . GetNode ( nextid ) . Name ;
}
var process = await client . Queryable < WFProcess > ( ) . FirstAsync ( a = > a . Id = = processId ) ;
WFInstanceInfo instanceInfo = null ;
if ( process ! = null )
{
// instanceInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WFInstanceInfo>(process.InstanceInfo);
instanceInfo = process . InstanceInfo ;
}
var param = new
{
processId ,
userId = createUser . Id ,
userAccount = createUser . Account ,
companyId = createUser . CompanyId ,
departmentId = createUser . DepartmentId ,
userName2 = userInfo . Name ,
userId2 = userInfo . Id . ToString ( ) ,
userAccount2 = userInfo . Account ,
//companyId2 = userInfo.F_CompanyId,
//departmentId2 = userInfo.F_DepartmentId,
code ,
nodeName = nextnode ,
pkeyValue = instanceInfo = = null ? "" : instanceInfo . pkeyValue ,
des = des
} ;
try
{
var node = iWFEngine . GetNode ( task . UnitId ) ;
switch ( node . ExecuteType )
{
case "1" :
if ( ! string . IsNullOrEmpty ( node . SqlDb ) & & ! string . IsNullOrEmpty ( node . SqlStr ) )
{
await client . Ado . ExecuteCommandAsync ( node . SqlStr , param ) ;
}
break ;
case "2" :
if ( ! string . IsNullOrEmpty ( node . Ioc ) & & IocManager . Instance . IsRegistered < WorkFlow . IWorkFlowMethod > ( node . Ioc ) )
{
WorkFlow . IWorkFlowMethod iWorkFlowMethod = IocManager . Instance . GetService < WorkFlow . IWorkFlowMethod > ( node . Ioc ) ;
WorkFlow . WfMethodParameter wfMethodParameter = new WorkFlow . WfMethodParameter ( )
{
ProcessId = processId ,
UnitName = task . UnitName ,
TaskId = prevTaskId ,
Code = code ,
UserId = createUser . Id ,
UserAccount = createUser . Account ,
CompanyId = createUser . CompanyId ,
DepartmentId = createUser . DepartmentId
} ;
await iWorkFlowMethod . Execute ( wfMethodParameter ) ;
}
break ;
case "3" :
if ( ! string . IsNullOrEmpty ( node . ApiUrl ) )
{
await HttpMethods . Post ( node . ApiUrl , Json . ToJson ( param ) ) ;
}
break ;
}
/*脚本执行成功*/
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
Des = "脚本执行成功" ,
TaskType = 99 ,
ProcessId = processId ,
TaskId = task . Id ,
UnitId = task . UnitId ,
UnitName = task . UnitName
} ;
await AddLog ( wfTaskLogEntity ) ;
return true ;
}
catch ( Exception ex )
{
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
Des = string . Format ( "脚本执行异常:{0}" , ex . Message ) ,
TaskType = 99 ,
ProcessId = processId ,
TaskId = task . Id ,
UnitId = task . UnitId ,
UnitName = task . UnitName
} ;
await AddLog ( wfTaskLogEntity ) ;
return false ;
}
}
/// <summary>
/// 执行脚本
/// </summary>
/// <param name="processId"></param>
/// <param name="code"></param>
/// <param name="createUser"></param>
/// <param name="executeType"></param>
/// <param name="sqlDb"></param>
/// <param name="sqlStr"></param>
/// <param name="apiUrl"></param>
/// <param name="iocName"></param>
/// <returns></returns>
private async Task < bool > ExecuteScript ( string processId , string code , WFUserInfo createUser , string executeType , string sqlDb , string sqlStr , string apiUrl , string iocName )
{
var param = new
{
processId ,
userId = createUser . Id ,
userAccount = createUser . Account ,
companyId = createUser . CompanyId ,
departmentId = createUser . DepartmentId ,
code
} ;
try
{
switch ( executeType )
{
case "1" :
if ( ! string . IsNullOrEmpty ( sqlDb ) & & ! string . IsNullOrEmpty ( sqlStr ) )
{
//await wfProcessSerive.BaseRepository(sqlDb).ExecuteSql(sqlStr, param);
await client . Ado . ExecuteCommandAsync ( sqlStr , param ) ;
}
break ;
case "2" :
if ( ! string . IsNullOrEmpty ( iocName ) & & IocManager . Instance . IsRegistered < WorkFlow . IWorkFlowMethod > ( iocName ) )
{
WorkFlow . IWorkFlowMethod iWorkFlowMethod = IocManager . Instance . GetService < WorkFlow . IWorkFlowMethod > ( iocName ) ;
WorkFlow . WfMethodParameter wfMethodParameter = new WorkFlow . WfMethodParameter ( )
{
ProcessId = processId ,
Code = code ,
UserId = createUser . Id ,
UserAccount = createUser . Account ,
CompanyId = createUser . CompanyId ,
DepartmentId = createUser . DepartmentId
} ;
await iWorkFlowMethod . Execute ( wfMethodParameter ) ;
}
break ;
case "3" :
if ( ! string . IsNullOrEmpty ( apiUrl ) )
{
await HttpMethods . Post ( apiUrl , Json . ToJson ( param ) ) ;
}
break ;
}
return true ;
}
catch ( Exception ex )
{
return false ;
}
}
/// <summary>
/// 执行脚本(撤销)
/// </summary>
/// <param name="unitId"></param>
/// <param name="unitName"></param>
/// <param name="processId"></param>
/// <param name="createUser"></param>
/// <param name="iWFEngine"></param>
/// <returns></returns>
private async Task ExecuteRevokeScript ( string unitId , string unitName , string processId , WFUserInfo createUser , IWFEngine iWFEngine )
{
var param = new
{
processId ,
userId = createUser . Id ,
userAccount = createUser . Account ,
companyId = createUser . CompanyId ,
departmentId = createUser . DepartmentId ,
code = "revoke" ,
} ;
try
{
var node = iWFEngine . GetNode ( unitId ) ;
switch ( node . ExecuteType )
{
case "1" :
if ( ! string . IsNullOrEmpty ( node . SqlDb ) & & ! string . IsNullOrEmpty ( node . SqlStrRevoke ) )
{
//await wfProcessSerive.BaseRepository(node.SqlDb).ExecuteSql(node.SqlStrRevoke, param);
await client . Ado . ExecuteCommandAsync ( node . SqlStrRevoke , param ) ;
}
break ;
case "2" :
if ( ! string . IsNullOrEmpty ( node . IocRevoke ) & & IocManager . Instance . IsRegistered < WorkFlow . IWorkFlowMethod > ( node . IocRevoke ) )
{
WorkFlow . IWorkFlowMethod iWorkFlowMethod = IocManager . Instance . GetService < WorkFlow . IWorkFlowMethod > ( node . IocRevoke ) ;
WorkFlow . WfMethodParameter wfMethodParameter = new WorkFlow . WfMethodParameter ( )
{
ProcessId = processId ,
UnitName = unitName ,
Code = "revoke" ,
UserId = createUser . Id ,
UserAccount = createUser . Account ,
CompanyId = createUser . CompanyId ,
DepartmentId = createUser . DepartmentId
} ;
await iWorkFlowMethod . Execute ( wfMethodParameter ) ;
}
break ;
case "3" :
if ( ! string . IsNullOrEmpty ( node . ApiUrlRevoke ) )
{
await HttpMethods . Post ( node . ApiUrlRevoke , Json . ToJson ( param ) ) ;
}
break ;
}
}
catch ( Exception ex )
{
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
Des = string . Format ( "脚本执行异常:{0}" , ex . Message ) ,
TaskType = 99 ,
ProcessId = processId ,
UnitId = unitId ,
UnitName = $"{unitName}-撤销"
} ;
await AddLog ( wfTaskLogEntity ) ;
}
}
/// <summary>
/// 普通审核
/// </summary>
/// <param name="iWFEngine"></param>
/// <param name="taskEntity"></param>
/// <param name="code"></param>
/// <param name="name"></param>
/// <param name="nextId">下一个节点</param>
/// <param name="des"></param>
/// <param name="stampImg"></param>
/// <returns></returns>
private async Task AuditNode ( IWFEngine iWFEngine , WFTask taskEntity , string code , string name , string des , string stampImg , string nextId = "" )
{
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( taskEntity . UnitId , code , nextId ) ;
if ( taskList . FindAll ( t = > t . Type ! = 10 ) . Count = = 0 )
{
throw ( new Exception ( "找不到下一个流转节点!" ) ) ;
}
List < WFTask > myTaskList ;
// 处理任务并更新数据
using ( var uwo = UnitWork . CreateContext ( ) )
{
var process = await uwo . WFProcess . GetByIdAsync ( taskEntity . ProcessId ) ;
await uwo . Db . Updateable < WFProcess > ( )
. SetColumns ( p = > new WFProcess { IsStart = 1 , IsCancel = 0 } )
. SetColumnsIF ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 , p = > p . IsFinished = = 1 )
. SetColumnsIF ( taskList . FindIndex ( t = > t . Type = = 4 ) ! = - 1 , p = > p . IsAgain = = 1 )
. Where ( p = > p . Id = = taskEntity . ProcessId )
. ExecuteCommandAsync ( ) ;
if ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 )
{
if ( process . IsChild = = 1 )
{
await ChildrenEndTask ( process . ParentProcessId , process . ParentNodeId , code , taskEntity , nextId ) ;
}
}
// 更新任务状态
taskEntity . IsAgree = code = = "disagree" ? 0 : 1 ;
taskEntity . State = 3 ;
if ( taskEntity . Type = = 7 )
{
var currentUser = _auth . GetCurrentUser ( ) . User ;
taskEntity . UserId = currentUser . Id . ToString ( ) ;
taskEntity . UserName = currentUser . Name ;
}
await uwo . WFTask . UpdateAsync ( taskEntity ) ;
// 更新上一个流转过来的任务,提示他无法被撤销
await CloseTaskLogCancel ( taskEntity . ProcessId , taskEntity . PrevTaskId ) ;
// 关闭同一个节点,其他人的任务
await CloseTask ( taskEntity . ProcessId , taskEntity . Token , taskEntity . Id ) ;
myTaskList = await ExecuteWFTaskEntity ( taskList , iWFEngine , taskEntity . ProcessId , taskEntity . Token , taskEntity . Id ) ;
foreach ( var item in myTaskList )
{
if ( item . Type = = 7 )
{
await uwo . WFTaskUser . InsertRangeAsync ( item . WFTaskUser ) ;
}
await Add ( item ) ;
}
await CreateTaskLog ( taskEntity , code , name , des , stampImg ) ;
uwo . Commit ( ) ;
}
// 脚本执行
var scriptTaskList = myTaskList . FindAll ( t = > t . Type = = 10 ) ;
foreach ( var item in scriptTaskList )
{
await ExecuteScript ( item , code , taskEntity . ProcessId , taskEntity . Id , nextId , iWFEngine . CreateUser , iWFEngine , taskEntity , des ) ;
}
}
/// <summary>
/// 子流程结束,获取父流程下一任务
/// </summary>
/// <param name="processId">父流程id</param>
/// <param name="unitId">父流程的节点id</param>
/// <param name="code">上一任务code( 类似agress, degress) </param>
/// <param name="taskEntity">任务</param>
/// <param name="nextId">下一节点</param>
/// <returns></returns>
private async Task ChildrenEndTask ( string processId , string unitId , string code , WFTask taskEntity , string nextId = "" )
{
var process = await GetEntity ( processId ) ;
var iWFEngine = await Bootstraper ( "" , processId , null , null ) ;
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( unitId , code , nextId ) ;
if ( taskList . FindAll ( t = > t . Type ! = 10 ) . Count = = 0 )
{
throw ( new Exception ( "找不到下一个流转节点!" ) ) ;
}
// 处理任务并更新数据
//wfProcessSerive.BeginTrans();
List < WFTask > myTaskList ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
try
{
// 更新流程状态
await uwo . Db . Updateable < WFProcess > ( )
. SetColumns ( p = > new WFProcess { IsStart = 1 , IsCancel = 0 } )
. SetColumnsIF ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 , p = > p . IsFinished = = 1 )
. SetColumnsIF ( taskList . FindIndex ( t = > t . Type = = 4 ) ! = - 1 , p = > p . IsAgain = = 1 )
. Where ( p = > p . Id = = processId )
. ExecuteCommandAsync ( ) ;
if ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 )
{
if ( process . IsChild = = 1 )
{
await ChildrenEndTask ( process . ParentProcessId , process . ParentNodeId , code , taskEntity , nextId ) ;
}
}
myTaskList = await ExecuteWFTaskEntity ( taskList , iWFEngine , processId , taskEntity . Token , taskEntity . Id ) ;
foreach ( var item in myTaskList )
{
if ( item . Type = = 7 )
{
await uwo . WFTaskUser . InsertRangeAsync ( item . WFTaskUser ) ;
}
await Add ( item ) ;
}
}
catch
{
throw ;
}
uwo . Commit ( ) ;
}
// 脚本执行
var scriptTaskList = myTaskList . FindAll ( t = > t . Type = = 10 ) ;
foreach ( var item in scriptTaskList )
{
await ExecuteScript ( item , code , processId , taskEntity . Id , nextId , iWFEngine . CreateUser , iWFEngine , taskEntity , "" ) ;
}
}
private async Task AuditNodeByCountersign ( IWFEngine iWFEngine , WFTask taskEntiy , string code , string name , string des , string stampImg )
{
taskEntiy . IsAgree = code = = "disagree" ? 0 : 1 ;
var node = iWFEngine . GetNode ( taskEntiy . UnitId ) ;
var list = ( List < WFTask > ) await GetLastTaskList ( taskEntiy . ProcessId , taskEntiy . UnitId ) ;
var myIndex = list . FindIndex ( t = > t . Id = = taskEntiy . Id ) ;
if ( myIndex = = - 1 )
{
throw ( new Exception ( "会签任务记录异常无法审核!" ) ) ;
}
if ( taskEntiy . IsAgree = = 0 )
{
if ( node . CountersignType = = "1" )
{
// 并行
if ( node . IsCountersignAll )
{
// 等待
if ( list . FindIndex ( t = > t . Id ! = taskEntiy . Id & & t . State = = 1 ) ! = - 1 )
{
// 表示还有人没有审核
// 表示还有任务没有完成
using ( var uwo = UnitWork . CreateContext ( ) )
{
WFProcess processEntity = new WFProcess ( )
{
Id = taskEntiy . ProcessId ,
IsStart = 1 ,
IsCancel = 0 ,
} ;
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
taskEntiy . State = 3 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
await CreateTaskLog ( taskEntiy , code , name , des , stampImg ) ;
uwo . Commit ( ) ;
}
}
else
{
var num = await GetTaskUserMaxNum ( taskEntiy . ProcessId , taskEntiy . UnitId ) ;
var fnum = list . FindAll ( t = > t . State = = 3 & & t . IsAgree = = 0 ) . Count + 1 ;
if ( ( num - fnum ) * 100 / num > = node . CountersignAllType )
{
await AuditNode ( iWFEngine , taskEntiy , "agree" , "同意" , des , stampImg ) ;
}
else
{
await AuditNode ( iWFEngine , taskEntiy , code , name , des , stampImg ) ;
}
}
}
else
{
// 不等待,每次都需要计算通过率
var num = await GetTaskUserMaxNum ( taskEntiy . ProcessId , taskEntiy . UnitId ) ;
var fnum = list . FindAll ( t = > t . State = = 3 & & t . IsAgree = = 0 ) . Count + 1 ;
if ( ( num - fnum ) * 100 / num > = node . CountersignAllType ) // 表示还有通过的希望
{
using ( var uwo = UnitWork . CreateContext ( ) )
{
WFProcess processEntity = new WFProcess ( )
{
Id = taskEntiy . ProcessId ,
IsStart = 1 ,
IsCancel = 0 ,
} ;
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
taskEntiy . State = 3 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
await CreateTaskLog ( taskEntiy , code , name , des , stampImg ) ;
uwo . Commit ( ) ;
}
}
else
{
await AuditNode ( iWFEngine , taskEntiy , code , name , des , stampImg ) ;
}
}
}
else
{
// 串行
await AuditNode ( iWFEngine , taskEntiy , code , name , des , stampImg ) ;
}
}
else
{
if ( node . CountersignType = = "1" )
{
// 并行
// 如果不等待,不同意直接跳转
if ( node . IsCountersignAll )
{
if ( list . FindIndex ( t = > t . Id ! = taskEntiy . Id & & t . State = = 1 ) ! = - 1 ) // 表示还有人没有处理完
{
// 表示还有任务没有完成
using ( var uwo = UnitWork . CreateContext ( ) )
{
WFProcess processEntity = new WFProcess ( )
{
Id = taskEntiy . ProcessId ,
IsStart = 1 ,
IsCancel = 0 ,
} ;
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
taskEntiy . State = 3 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
await CreateTaskLog ( taskEntiy , code , name , des , stampImg ) ;
uwo . Commit ( ) ;
}
}
else
{
var num = await GetTaskUserMaxNum ( taskEntiy . ProcessId , taskEntiy . UnitId ) ;
var fnum = list . FindAll ( t = > t . State = = 3 & & t . IsAgree = = 0 ) . Count ;
if ( ( num - fnum ) * 100 / num > = node . CountersignAllType )
{
await AuditNode ( iWFEngine , taskEntiy , "agree" , "同意" , des , stampImg ) ;
}
else
{
await AuditNode ( iWFEngine , taskEntiy , "disagree" , "不同意" , des , stampImg ) ;
}
}
}
else
{
var num = await GetTaskUserMaxNum ( taskEntiy . ProcessId , taskEntiy . UnitId ) ;
var snum = list . FindAll ( t = > t . State = = 3 & & t . IsAgree = = 1 ) . Count ;
if ( snum * 100 / num > = node . CountersignAllType )
{
await AuditNode ( iWFEngine , taskEntiy , "agree" , "同意" , des , stampImg ) ;
}
else
{
using ( var uwo = UnitWork . CreateContext ( ) )
{
WFProcess processEntity = new WFProcess ( )
{
Id = taskEntiy . ProcessId ,
IsStart = 1 ,
IsCancel = 0 ,
} ;
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
taskEntiy . State = 3 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
await CreateTaskLog ( taskEntiy , code , name , des , stampImg ) ;
uwo . Commit ( ) ;
}
}
}
}
else
{
// 串行
if ( myIndex = = list . Count - 1 ) // 表示最后一个人审核完成,然后往下执行
{
await AuditNode ( iWFEngine , taskEntiy , code , name , des , stampImg ) ;
}
else
{
// 表示还有任务没有完成
using ( var uwo = UnitWork . CreateContext ( ) )
{
WFProcess processEntity = new WFProcess ( )
{
Id = taskEntiy . ProcessId ,
IsStart = 1 ,
IsCancel = 0 ,
} ;
await uwo . WFProcess . UpdateAsync ( processEntity ) ;
taskEntiy . State = 3 ;
await uwo . WFTask . UpdateAsync ( taskEntiy ) ;
await CreateTaskLog ( taskEntiy , code , name , des , stampImg ) ;
if ( node . CountersignType = = "2" )
{
// 串行,更新上一个任务的撤销操作,开启下一个任务
if ( myIndex = = 0 )
{
await CloseTaskLogCancel ( taskEntiy . ProcessId , taskEntiy . PrevTaskId ) ;
}
else
{
await CloseTaskLogCancel ( list [ myIndex - 1 ] . Id ) ;
}
await uwo . WFTask . UpdateAsync ( new WFTask { Id = list [ myIndex + 1 ] . Id , State = 1 } ) ;
}
var flag = uwo . Commit ( ) ;
}
}
}
}
}
/// <summary>
/// 创建日志
/// </summary>
/// <param name="taskEntiy"></param>
/// <param name="code"></param>
/// <param name="name"></param>
/// <param name="des"></param>
/// <param name="stampImg"></param>
/// <returns></returns>
private async Task CreateTaskLog ( WFTask taskEntiy , string code , string name , string des , string stampImg )
{
WFTaskLog wfTaskLogEntity = new WFTaskLog ( )
{
Des = $"【{name}】{des}" ,
TaskType = taskEntiy . Type ,
ProcessId = taskEntiy . ProcessId ,
UnitId = taskEntiy . UnitId ,
UnitName = taskEntiy . UnitName ,
IsAgree = taskEntiy . IsAgree ,
OperationCode = code ,
OperationName = name ,
Token = taskEntiy . Token ,
PrevUnitId = taskEntiy . PrevUnitId ,
PrevUnitName = taskEntiy . PrevUnitName ,
TaskId = taskEntiy . Id ,
StampImg = stampImg ,
IsCancel = 1 ,
IsLast = 1
} ;
await UpdateLog ( taskEntiy . ProcessId , taskEntiy . UnitId ) ;
await AddLog ( wfTaskLogEntity ) ;
}
# endregion
public async Task < Response < bool > > Supervise ( string processId , int supervise = 1 )
{
// todo 实现督办
var iWFEngine = await Bootstraper ( string . Empty , processId , null , null ) ;
// 获取未完成的任务
var taskList = await GetUnFinishTaskList ( processId ) ;
using ( var uwo = UnitWork . CreateContext ( ) )
{
foreach ( var item in taskList )
{
if ( item . Type = = 1 | | item . Type = = 3 | | item . Type = = 5 | | item . Type = = 6 | | item . Type = = 7 )
{
// 督办时间督办标志
item . IsSupervise = supervise ;
item . SuperviseTime = DateTime . Now ;
item . SuperviseId = _auth . GetCurrentUser ( ) . User . Id ;
// 发送消息
var msg = $"【审核】【督办】{item.ProcessTitle},{item.UnitName}" ;
var userList = new List < string > ( ) ;
// todo 单体任务处理
userList . Add ( item . UserId ) ;
var node = iWFEngine . GetNode ( item . UnitId ) ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, node.MessageType, item.F_Token);
await uwo . WFTask . UpdateAsync ( item ) ;
}
}
//await wfProcessSerive.Update(new WFProcessEntity() { F_IsUrge = 1, F_Id = processId });
var wfTaskLogEntity = new WFTaskLog
{
Des = "督办审核" ,
TaskType = 98 ,
ProcessId = processId ,
UnitId = iWFEngine . StartNode . Id ,
UnitName = string . IsNullOrEmpty ( iWFEngine . StartNode . Name ) ? "开始节点" : iWFEngine . StartNode . Name ,
CreateDate = DateTime . Now ,
UserId = _auth . GetUserId ( ) ,
UserName = _auth . GetUserNickName ( ) ,
Id = Guid . NewGuid ( ) . ToString ( )
} ;
await uwo . WFTaskLog . InsertAsync ( wfTaskLogEntity ) ;
var flag = uwo . Commit ( ) ;
return new Response < bool >
{
Result = flag ,
Message = flag ? "success" : "error"
} ;
}
}
#region 撤回
/// <summary>
/// 撤回流程
/// </summary>
/// <param name="taskId">流程任务主键</param>
/// <param name="code">流程审批操作码agree 同意 disagree 不同意 lrtimeout 超时</param>
/// <param name="name">流程审批操名称</param>
/// <param name="des">审批意见</param>
/// <param name="nextUsers">下一节点指定审核人</param>
/// <param name="stampImg">盖章图片</param>
/// <param name="stampPassWord">盖章图片密码</param>
/// <param name="nextId">下一个审核节点</param>
public async Task RetractFlow ( string taskId , string code , string name , string des , Dictionary < string , string > nextUsers , string stampImg , string stampPassWord , string nextId )
{
var taskEntiy = await client . Queryable < WFTask > ( ) . Where ( a = > a . Id = = taskId ) . FirstAsync ( ) ;
if ( taskEntiy = = null )
{
throw ( new Exception ( "找不到对应流程任务!" ) ) ;
}
else if ( taskEntiy . State ! = 3 & & taskEntiy . State ! = 4 )
{
throw ( new Exception ( "该任务未完成!" ) ) ;
}
//后期改
stampImg = "" ;
//stampImg = await _wFStampIBLL.ToWfImg(stampImg, stampPassWord);
var iWFEngine = await Bootstraper ( "" , taskEntiy . ProcessId , null , nextUsers ) ;
// 1.判断任务类型 1 普通任务 5 会签任务
if ( taskEntiy . Type = = 1 | | taskEntiy . Type = = 7 )
{
await RetractNode ( iWFEngine , taskEntiy , code , name , des , stampImg , nextId ) ;
}
else
{
throw ( new Exception ( "该任务无法审核!" ) ) ;
}
//await _imMsgIBLL.VirtualDeleteByContentId(taskEntiy.F_Token); // 更新消息
// 发送消息
var msg = $"【提醒】{iWFEngine.Config.Params.Title},{taskEntiy.UnitName}已被撤回" ;
var userList = new List < string > ( ) ;
userList . Add ( iWFEngine . CreateUser . Id ) ;
var node = iWFEngine . StartNode ;
//await _imMsgIBLL.SendMsg("IMWF", userList, msg, node.MessageType, iWFEngine.Config.Params.ProcessId);
}
/// <summary>
/// 撤回
/// </summary>
/// <param name="iWFEngine"></param>
/// <param name="taskEntity"></param>
/// <param name="code"></param>
/// <param name="name"></param>
/// <param name="nextId">下一个节点</param>
/// <param name="des"></param>
/// <param name="stampImg"></param>
/// <returns></returns>
private async Task RetractNode ( IWFEngine iWFEngine , WFTask taskEntity , string code , string name , string des , string stampImg , string nextId = "" )
{
// 下一部需要执行的任务
var taskList = await iWFEngine . GetTask ( taskEntity . UnitId , code , nextId ) ;
List < WFTask > myTaskList ;
//修改原有任务的IsLast状态
await client . Updateable < WFTask > ( )
. SetColumns ( t = > new WFTask ( ) { IsLast = 0 } )
. Where ( t = > t . Id = = taskEntity . Id )
. ExecuteCommandAsync ( ) ;
//删除该节点之后生成的所有任务
var dellist = client . Queryable < WFTask > ( ) . Where ( r = > r . CreateDate > taskEntity . CreateDate & & r . ProcessId = = taskEntity . ProcessId ) . ToList ( ) ;
await client . Deleteable < WFTask > ( dellist ) . ExecuteCommandAsync ( ) ;
// 处理任务并更新数据
using ( var uwo = UnitWork . CreateContext ( ) )
{
var process = await uwo . WFProcess . GetByIdAsync ( taskEntity . ProcessId ) ;
await uwo . Db . Updateable < WFProcess > ( )
. SetColumns ( p = > new WFProcess { IsStart = 1 , IsCancel = 0 } )
. SetColumns ( p = > p . IsFinished = = 0 )
. SetColumnsIF ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 , p = > p . IsFinished = = 1 )
. SetColumnsIF ( taskList . FindIndex ( t = > t . Type = = 4 ) ! = - 1 , p = > p . IsAgain = = 1 )
. Where ( p = > p . Id = = taskEntity . ProcessId )
. ExecuteCommandAsync ( ) ;
if ( taskList . FindIndex ( t = > t . Type = = 100 ) ! = - 1 )
{
if ( process . IsChild = = 1 )
{
await ChildrenEndTask ( process . ParentProcessId , process . ParentNodeId , code , taskEntity , nextId ) ;
}
}
var newTask = new WFTask
{
Id = Guid . NewGuid ( ) . ToString ( ) ,
Type = taskEntity . Type ,
ProcessId = taskEntity . ProcessId ,
Token = Guid . NewGuid ( ) . ToString ( ) ,
UnitId = taskEntity . UnitId ,
UnitName = taskEntity . UnitName ,
PrevUnitId = taskEntity . PrevUnitId ,
PrevUnitName = taskEntity . PrevUnitName ,
PrevToken = taskEntity . Token ,
PrevTaskId = taskEntity . Id ,
UserId = taskEntity . UserId ,
UserName = taskEntity . UserName ,
UserDepartmentId = taskEntity . UserDepartmentId ,
UserCompanyId = taskEntity . UserCompanyId ,
State = 1 ,
Sort = taskEntity . Sort ,
IsReject = 0 ,
ChildProcessId = taskEntity . ChildProcessId ,
ChildSchemeInfoCode = taskEntity . ChildSchemeInfoCode ,
TimeoutInterval = taskEntity . TimeoutInterval ,
TimeoutStrategy = taskEntity . TimeoutStrategy ,
IsBatchAudit = taskEntity . IsBatchAudit ,
ProcessUserId = iWFEngine . CreateUser . Id ,
ProcessUserName = iWFEngine . CreateUser . Name ,
ProcessCode = iWFEngine . Config . Params . SchemeCode ,
ProcessTitle = iWFEngine . Config . Params . Title ,
CreateDate = DateTime . Now ,
CreateUserId = _auth . GetUserId ( ) ,
CreateUserName = _auth . GetUserName ( ) ,
IsLast = 1 ,
IsRetract = 1
} ;
await uwo . WFTask . InsertAsync ( newTask ) ;
// 更新上一个流转过来的任务,提示他无法被撤销
await CloseTaskLogCancel ( taskEntity . ProcessId , taskEntity . PrevTaskId ) ;
// 关闭同一个节点,其他人的任务
await CloseTask ( taskEntity . ProcessId , taskEntity . Token , taskEntity . Id ) ;
myTaskList = await ExecuteWFTaskEntity ( taskList , iWFEngine , taskEntity . ProcessId , taskEntity . Token , taskEntity . Id ) ;
foreach ( var item in myTaskList )
{
if ( item . Type = = 7 )
{
await uwo . WFTaskUser . InsertRangeAsync ( item . WFTaskUser ) ;
}
await Add ( item ) ;
}
await CreateTaskLog ( taskEntity , code , name , des , stampImg ) ;
uwo . Commit ( ) ;
}
// 脚本执行
var scriptTaskList = myTaskList . FindAll ( t = > t . Type = = 10 ) ;
foreach ( var item in scriptTaskList )
{
await ExecuteScript ( item , code , taskEntity . ProcessId , taskEntity . Id , nextId , iWFEngine . CreateUser , iWFEngine , taskEntity , des ) ;
}
}
# endregion
}
}