3163 lines
129 KiB
C#
3163 lines
129 KiB
C#
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;
|
||
using OpenAuth.App.BaseApp.Base;
|
||
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,
|
||
parentprocessId=process.ParentProcessId,
|
||
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
|
||
}
|
||
}
|