You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

935 lines
38 KiB
C#

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Data;
using DocumentFormat.OpenXml.Office2010.Excel;
using Infrastructure;
using Infrastructure.Extensions;
using JetBrains.Annotations;
using Microsoft.Extensions.Configuration;
using Moq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.SS.Formula.Functions;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.BaseApp.WFTask.Response;
using OpenAuth.App.FormScheme;
using OpenAuth.App.FormScheme.Response;
using OpenAuth.App.Interface;
using OpenAuth.App.Request;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
namespace OpenAuth.App.BaseApp.WFTask
{
public class WFTaskApp : SqlSugarBaseApp<Repository.Domain.WFTask, SugarDbContext>
{
ISqlSugarClient client;
private readonly FormSchemeApp _formSchemeApp;
private readonly WFProcessApp _processApp;
private WFSchemeInfoApp _schemeInfoApp;
private readonly IConfiguration _configuration;
public WFTaskApp(ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<Repository.Domain.WFTask> repository,
IAuth auth,
FormSchemeApp formSchemeApp,
WFProcessApp processApp,
WFSchemeInfoApp schemeInfoAppApp,
IConfiguration configuration
) :
base(unitWork, repository, auth)
{
client = base.Repository.AsSugarClient();
_formSchemeApp = formSchemeApp;
_processApp = processApp;
_schemeInfoApp = schemeInfoAppApp;
_configuration = configuration;
}
#region 任务
/// <summary>
/// 获取我的代办任务列表
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <param name="isBatchAudit">是否允许批量审核</param>
/// <returns></returns>
public async Task<PageInfo<List<Repository.Domain.WFTask>>> GetMyUncompletedPageList(PageReq pageReq,
WFProcessSearchDto searchParams, string category, bool isBatchAudit = false)
{
RefAsync<int> totalCount = 0;
var userId = _auth.GetUserId();
var expression = Expressionable.Create<Repository.Domain.WFTask>()
//.And(t => t.UserId == userId)
.And(t => t.State == 1)
.And(t => t.Type != 2)
.AndIF(!string.IsNullOrEmpty(searchParams.Keyword),
t => t.ProcessTitle.Contains(searchParams.Keyword) || t.UnitName.Contains(searchParams.Keyword))
.AndIF(!string.IsNullOrEmpty(searchParams.Code), t => t.ProcessCode == searchParams.Code)
.AndIF(searchParams.StartDate != null && searchParams.EndDate != null,
t => t.CreateDate >= searchParams.StartDate && t.CreateDate <= searchParams.EndDate)
.AndIF(isBatchAudit, t => t.IsBatchAudit == 1);
var list = await client.Queryable<Repository.Domain.WFTask>()
.Where(expression.ToExpression())
.LeftJoin<WFTaskUser>((t, u) => t.Id == u.TaskId && u.UserId == userId)
.Where((t, u) => u.UserId == userId || t.UserId == userId)
.LeftJoin<WFProcess>((t, u, p) => t.ProcessId == p.Id)
.LeftJoin<WFScheme>((t, u, p, s) => p.SchemeId == s.Id)
.LeftJoin<WFSchemeInfo>((t, u, p, s, i) => s.SchemeInfoId == i.Id)
.WhereIF(!string.IsNullOrEmpty(category), (t, u, p, s, i) => i.Category == category)
.OrderByDescending((t, u, p, s, i) => t.CreateDate)
.Select((t, u, p, s, i) => new Repository.Domain.WFTask()
{
Id = t.Id.SelectAll(),
SchemeContent = s.Content,
InstanceInfo = p.InstanceInfo
})
.ToPageListAsync(pageReq.page, pageReq.limit, totalCount);
// 遍历补充信息
foreach (var wfTask in list)
{
// 获取表单数据
var unitId = wfTask.UnitId; // 当前节点id
//var process = await _processApp.GetEntity(wfTask.ProcessId);
//var scheme = await _schemeInfoApp.GetSchemeEntity(process.SchemeId);
//var content = (JObject)JsonConvert.DeserializeObject(scheme.Content);
var content = (JObject)JsonConvert.DeserializeObject(wfTask.SchemeContent);
var wfData = (JArray)content["wfData"];
//
var instanceInfo = wfTask.InstanceInfo;
var processId = instanceInfo.pkeyValue;
var pkey = instanceInfo.pkey;
foreach (var jToken in wfData)
{
var id = jToken["id"]?.ToString();
if (id != null && id.Equals(unitId))
{
var first = jToken;
// fromVersion 为 schemeId
var formVersion = first["formVerison"]?.ToString();
if (!string.IsNullOrEmpty(formVersion))
{
var authFields = (JArray)jToken["authFields"];
var showFields = new Dictionary<string, ExtendInfo>();
foreach (var authField in authFields)
{
var label = authField["label"].ToString();
var field = authField["field"].ToString();
var fieldName = authField["fieldName"]?.ToString();
if (authField["upShow"].ToBool().Equals(true))
{
showFields.Add(field,
new ExtendInfo() { Field = field, Label = label, FieldName = fieldName });
}
}
var sql = "select ";
var selectFields = "";
foreach (var showField in showFields)
{
selectFields += $"\"{showField.Value.FieldName}\"" + " as " + showField.Value.Field +
",";
}
selectFields = selectFields.TrimEnd(',');
var formScheme = await _formSchemeApp.GetScheme(formVersion);
FormSchemeNewModel formSchemeModel = formScheme.Scheme.ToObject<FormSchemeNewModel>();
FormDbTableInfo mainTable = formSchemeModel.Db.Find(t => t.Type == "main");
sql += selectFields + $" FROM \"{mainTable.Name}\" t where \"{pkey}\" = @Id";
var dataList = await client.Ado.GetDataTableAsync(sql, new { Id = processId });
// 实现一个新的查询方法
// var dataList = await _formSchemeApp.GetFormDataNew(formVersion, "Id", processId);
// var data = dataList.FirstOrDefault().Value;
// 实际只有一行数据
foreach (DataRow dataRow in dataList.Rows)
{
foreach (var showField in showFields)
{
var field = showField.Key;
var value = dataRow[field];
showField.Value.Value = value;
}
}
wfTask.ExtendInfo = showFields.Values;
}
}
}
wfTask.SchemeContent = null;
wfTask.InstanceInfo = null;
}
return new PageInfo<List<Repository.Domain.WFTask>>
{
Items = list,
Total = totalCount
};
}
/// <summary>
/// 获取我的已办任务列表
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <returns></returns>
public async Task<PageInfo<List<Repository.Domain.WFTask>>> GetMyCompletedPageList(PageReq pageReq,
WFProcessSearchDto searchParams, string category)
{
RefAsync<int> totalCount = 0;
var userId = _auth.GetUserId();
var queryable = client.Queryable<Repository.Domain.WFTask>()
.LeftJoin<WFTaskLog>((t, t1) => t.Id == t1.TaskId)
.LeftJoin<WFProcess>((t, t1, t2) => t.ProcessId == t2.Id)
.LeftJoin<WFScheme>((t, t1, t2, t3) => t2.SchemeId == t3.Id)
.LeftJoin<WFSchemeInfo>((t, t1, t2, t3, t4) => t3.SchemeInfoId == t4.Id);
var exp = Expressionable.Create<Repository.Domain.WFTask, WFTaskLog>()
.And((t, t1) => t1.IsLast == 1)
.And((t, t1) => t.State == 3 || t.State == 5)
.And((t, t1) => t.Type == 1 || t.Type == 3 || t.Type == 5 || t.Type == 6||t.Type==7)
.And((t, t1) => t.UserId == userId || t1.UserId == userId)
.AndIF(!string.IsNullOrEmpty(searchParams.Keyword),
(t, t1) => t.ProcessTitle.Contains(searchParams.Keyword) ||
t.UnitName.Contains(searchParams.Keyword))
.AndIF(!string.IsNullOrEmpty(searchParams.Code), (t, t1) => t.ProcessCode == searchParams.Code)
.AndIF(searchParams.StartDate != null && searchParams.EndDate != null,
(t, t1) => t.CreateDate >= searchParams.StartDate && t.CreateDate <= searchParams.EndDate)
.ToExpression();
var list = await queryable.Where(exp)
.WhereIF(!string.IsNullOrEmpty(category), (t, t1, t2, t3, t4) => t4.Category == category).Select(
(t, t1, t2, t3, t4) => new Repository.Domain.WFTask()
{
Id = t.Id,
Type = t.Type,
ProcessTitle = t.ProcessTitle,
ProcessCode = t.ProcessCode,
ProcessId = t.ProcessId,
ChildProcessId = t.ChildProcessId,
ProcessUserId = t.ProcessUserId,
ProcessUserName = t.ProcessUserName,
Token = t.Token,
UnitId = t.UnitId,
UnitName = t.UnitName,
PrevUnitId = t.PrevUnitId,
PrevUnitName = t.PrevUnitName,
PrevToken = t.PrevToken,
UserId = t.UserId,
UserName = t.UserName,
UserDepartmentId = t.UserDepartmentId,
UserCompanyId = t.UserCompanyId,
State = t.State,
IsAgree = t.IsAgree,
IsLast = t.IsLast,
Sort = t.Sort,
TimeoutAction = t.TimeoutAction,
TimeoutNotice = t.TimeoutNotice,
TimeoutInterval = t.TimeoutInterval,
TimeoutStrategy = t.TimeoutStrategy,
CreateUserId = t.CreateUserId,
CreateUserName = t.CreateUserName,
IsUrge = t.IsUrge,
UrgeTime = t.UrgeTime,
FirstId = t.FirstId,
IsBatchAudit = t.IsBatchAudit,
IsReject = t.IsReject,
PrevTaskId = t.PrevTaskId,
UpdateTaskId = t.UpdateTaskId,
IsCancel = t1.IsCancel,
CreateDate = t1.CreateDate,
OperationName = t1.OperationName,
MakeUserId = t1.UserId,
IsFinished = t2.IsFinished
}).ToPageListAsync(pageReq.page, pageReq.limit, totalCount);
return new PageInfo<List<Repository.Domain.WFTask>>
{
Items = list,
Total = totalCount
};
}
/// <summary>
/// 获取可撤回的任务
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <returns></returns>
public PageInfo<List<dynamic>> GetRetractPageList(PageReq pageReq,
WFProcessSearchDto searchParams, string category)
{
int totalCount = 0;
var userId = _auth.GetUserId();
var query = client.Queryable<Repository.Domain.WFTask>()
.Where(t => t.IsLast == 1)
.Where(t => t.State == 3 || t.State == 5)
.Where(t => t.Type == 1 || t.Type == 3 || t.Type == 5 || t.Type == 6 || t.Type == 7)
.Where(t => t.CreateDate != null)
.WhereIF(!string.IsNullOrEmpty(searchParams.Keyword), t => t.ProcessTitle.Contains(searchParams.Keyword) || t.UnitName.Contains(searchParams.Keyword))
.WhereIF(!string.IsNullOrEmpty(searchParams.Code), t => t.ProcessCode == searchParams.Code)
.WhereIF(searchParams.StartDate != null && searchParams.EndDate != null, t => t.CreateDate >= searchParams.StartDate && t.CreateDate <= searchParams.EndDate)
.Select(t => new
{
index2 = SqlFunc.RowNumber($"{t.CreateDate} desc ", t.ProcessId),
ProcessTitle = t.ProcessTitle,
UnitId = t.UnitId,
Id = t.Id,
ProcessId = t.ProcessId,
UnitName = t.UnitName,
UserId = t.UserId,
UserName = t.UserName,
State = t.State,
CreateDate = t.CreateDate,
Type = t.Type,
ProcessCode = t.ProcessCode
})
.MergeTable()
.Where(it => it.index2 == 1)
.Where(r => r.UserId == userId)
.OrderByDescending(r => r.CreateDate)
.Select<dynamic>(r => new
{
r.Id,
r.ProcessTitle,
r.ProcessId,
r.UnitId,
r.UnitName,
r.UserId,
r.UserName,
r.State,
r.CreateDate,
r.Type,
r.ProcessCode,
});
var result = query.ToPageList(pageReq.page, pageReq.limit);
totalCount = query.Count();
return new PageInfo<List<dynamic>>
{
Items = result,
Total = totalCount
};
}
/// <summary>
/// 获取我的传阅任务列表
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <returns></returns>
public async Task<PageInfo<List<Repository.Domain.WFTask>>> GetMyReadPageList(PageReq pageReq,
WFProcessSearchDto searchParams,
string category)
{
RefAsync<int> totalCount = 0;
var userId = _auth.GetUserId();
var expression = Expressionable.Create<Repository.Domain.WFTask>()
.And(t => t.UserId == userId)
.And(t => t.Type == 2)
.AndIF(!string.IsNullOrEmpty(searchParams.Keyword),
t => t.ProcessTitle.Contains(searchParams.Keyword) || t.UnitName.Contains(searchParams.Keyword))
.AndIF(!string.IsNullOrEmpty(searchParams.Code), t => t.ProcessCode == searchParams.Code)
.AndIF(searchParams.StartDate != null && searchParams.EndDate != null,
t => t.CreateDate >= searchParams.StartDate && t.CreateDate <= searchParams.EndDate);
var list = await client.Queryable<Repository.Domain.WFTask>()
.Where(expression.ToExpression())
.LeftJoin<WFProcess>((t, p) => t.ProcessId == p.Id)
.LeftJoin<WFScheme>((t, p, s) => p.SchemeId == s.Id)
.LeftJoin<WFSchemeInfo>((t, p, s, i) => s.SchemeInfoId == i.Id)
.WhereIF(!string.IsNullOrEmpty(category), (t, p, s, i) => i.Category == category)
.OrderByDescending((t, p, s, i) => t.CreateDate)
.ToPageListAsync(pageReq.page, pageReq.limit, totalCount);
return new PageInfo<List<Repository.Domain.WFTask>>
{
Items = list,
Total = totalCount
};
}
/// <summary>
/// 获取我的委托任务列表
/// </summary>
/// <param name="pagination">分页参数</param>
/// <param name="searchParams">查询参数</param>
/// <returns></returns>
public async Task<PageInfo<List<Repository.Domain.WFTask>>> GetMyDelegatePageList(PageReq pageReq,
WFProcessSearchDto searchParams, string category)
{
RefAsync<int> totalCount = 0;
var pageInfo = new PageInfo<List<Repository.Domain.WFTask>>();
string userId = _auth.GetUserId();
DateTime datetime = DateTime.Now;
var expression = Expressionable.Create<Repository.Domain.WFTask>();
var delegateList = await client.Queryable<WFDelegateRule>()
.Where(t => t.ToUserId == userId && t.BeginDate >= datetime && t.EndDate <= datetime && t.Type == 0)
.ToListAsync();
if (delegateList.Count == 0)
{
pageInfo.Total = 0;
return pageInfo;
}
foreach (var item in delegateList)
{
var relationList = await client.Queryable<WFDelegateRelation>()
.Where(a => a.DelegateRuleId == item.Id).ToListAsync();
string relation = "";
foreach (var relationItem in relationList)
{
relation += $"'{relationItem.SchemeInfoId}'";
}
expression = expression.Or(t =>
t.UserId == item.CreateUserId && relation.Contains("'" + t.ProcessCode + "'"));
}
var exp = Expressionable.Create<Repository.Domain.WFTask>()
.And(t => t.UserId != userId)
.And(t => t.State == 1)
.And(t => t.Type != 2)
.AndIF(!string.IsNullOrEmpty(searchParams.Keyword),
t => t.ProcessTitle.Contains(searchParams.Keyword) || t.UnitName.Contains(searchParams.Keyword))
.AndIF(!string.IsNullOrEmpty(searchParams.Code), t => t.ProcessCode == searchParams.Code)
.AndIF(searchParams.StartDate != null && searchParams.EndDate != null,
t => t.CreateDate >= searchParams.StartDate && t.CreateDate <= searchParams.EndDate);
exp = exp.And(expression.ToExpression());
var list = await client.Queryable<Repository.Domain.WFTask>()
.Where(expression.ToExpression())
.LeftJoin<WFProcess>((t, p) => t.ProcessId == p.Id)
.LeftJoin<WFScheme>((t, p, s) => p.SchemeId == s.Id)
.LeftJoin<WFSchemeInfo>((t, p, s, i) => s.SchemeInfoId == i.Id)
.WhereIF(!string.IsNullOrEmpty(category), (t, p, s, i) => i.Category == category)
.OrderByDescending((t, p, s, i) => t.CreateDate)
.ToPageListAsync(pageReq.page, pageReq.limit, totalCount);
return new PageInfo<List<Repository.Domain.WFTask>>
{
Items = list,
Total = totalCount
};
}
/// <summary>
/// 获取流程任务实体
/// </summary>
/// <param name="token">密钥</param>
/// <param name="userId">用户id</param>
/// <returns></returns>
public async Task<Repository.Domain.WFTask> GetEntityByToken(string token, string userId)
{
return await base.Repository.GetFirstAsync(t => t.Token == token && t.UserId == userId && t.State == 1);
}
/// <summary>
/// 获取流程任务实体
/// </summary>
/// <param name="keyValue">主键</param>
/// <returns></returns>
public Repository.Domain.WFTask GetEntity(string keyValue)
{
return base.Repository.GetFirst(a => a.Id == keyValue);
}
/// <summary>
/// 获取任务关联的用户
/// </summary>
/// <param name="keyValue">主键</param>
/// <returns></returns>
public List<string> GetUsers(string keyValue)
{
List<string> users = new List<string>();
var us = client.Queryable<WFTaskUser>().Where(r => r.TaskId == keyValue).ToList();
if (us.Count > 0)
{
users = us.Select(r => r.UserId).ToList();
}
return users;
}
/// <summary>
/// 获取任务列表
/// </summary>
/// <param name="processId">流程实例主键</param>
/// <param name="type">任务类型</param>
/// <param name="prevTaskId">上一个任务Id值</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetList(string processId, int type, string prevTaskId)
{
return await base.Repository.GetListAsync(t =>
t.ProcessId == processId && t.Type == type && t.PrevTaskId == prevTaskId);
}
/// <summary>
/// 获取任务列表
/// </summary>
/// <param name="processId">流程实例主键</param>
/// <param name="prevToken">上一个任务token值</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetList(string processId, string prevToken)
{
return await base.Repository.GetListAsync(t => t.ProcessId == processId && t.PrevToken == prevToken);
}
/// <summary>
/// 获取未完成的任务
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetUnFinishTaskList(string processId)
{
return await base.Repository.GetListAsync(t =>
t.ProcessId == processId && t.State == 1 && (t.Type == 1 || t.Type == 2 || t.Type == 3 || t.Type == 4 ||
t.Type == 5 || t.Type == 6||t.Type==7));
}
/// <summary>
/// 获取等待任务列表(用于网关判断是否所有支路都执行完毕)
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <param name="unitId">流程单元节点Id</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetAwaitTaskList(string processId, string unitId)
{
return await base.Repository.GetListAsync(t =>
t.ProcessId == processId && t.UnitId == unitId && t.Type == 21 && t.State == 1);
}
/// <summary>
/// 获取最近的任务
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <param name="unitId">流程单元节点Id</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetLastTaskList(string processId, string unitId)
{
return await client.Queryable<Repository.Domain.WFTask>()
.Where(t => t.ProcessId == processId && t.UnitId == unitId && t.IsLast == 1 &&
(t.Type == 1 || t.Type == 3 || t.Type == 4 || t.Type == 5||t.Type==7))
.OrderBy(t => t.Sort)
.ToListAsync();
}
/// <summary>
/// 获取最近的不是驳回产生的任务
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <param name="unitId">流程单元节点Id</param>
/// <returns></returns>
public Task<Repository.Domain.WFTask> GetLastNotRejectTask(string processId, string unitId)
{
return null;
}
/// <summary>
/// 获取最近的完成任务
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <param name="unitId">流程单元节点Id</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetLastFinishTaskList(string processId, string unitId)
{
return await base.Repository.GetListAsync(t =>
t.ProcessId == processId && t.UnitId == unitId && (t.Type == 1||t.Type==7) && t.IsLast == 1 && t.State == 3);
}
/// <summary>
/// 获取完成任务
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <returns></returns>
public async Task<IEnumerable<Repository.Domain.WFTask>> GetFinishTaskList(string processId, List<string> ids)
{
return await base.Repository.GetListAsync(t => t.ProcessId == processId && !ids.Contains(t.Id));
}
/// <summary>
/// 获取节点任务的最大人数
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <param name="unitId">流程单元节点Id</param>
/// <returns></returns>
public Task<int> GetTaskUserMaxNum(string processId, string unitId)
{
return null;
}
/// <summary>
/// 保存任务
/// </summary>
/// <param name="wfTaskEntity">任务日志</param>
public async Task<Response<bool>> Add(Repository.Domain.WFTask wfTaskEntity)
{
wfTaskEntity.CreateDate = DateTime.Now;
wfTaskEntity.CreateUserId = _auth.GetUserId();
wfTaskEntity.CreateUserName = _auth.GetUserName();
wfTaskEntity.Id = Guid.NewGuid().ToString();
wfTaskEntity.IsLast = 1;
var flag = await base.Repository.InsertAsync(wfTaskEntity);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 更新任务状态
/// </summary>
/// <param name="processId"></param>
/// <param name="unitId"></param>
/// <returns></returns>
public async Task<Response<bool>> Update(string processId, string unitId)
{
var flag = await base.Repository.UpdateSetColumnsTrueAsync(a => new Repository.Domain.WFTask { IsLast = 0 },
a => a.ProcessId == processId && a.UnitId == unitId);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 更新任务
/// </summary>
/// <param name="wfTaskEntity">任务日志</param>
public Response<bool> Update(Repository.Domain.WFTask wfTaskEntity)
{
var flag = base.Repository.Update(wfTaskEntity);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 关闭任务
/// </summary>
/// <param name="processId">流程主键</param>
/// <param name="token">任务令牌</param>
/// <param name="taskId">任务id除去该任务不关闭</param>
/// <returns></returns>
public async Task<Response<bool>> CloseTask(string processId, string token, string taskId = "")
{
var expression = Expressionable.Create<Repository.Domain.WFTask>()
.And(t => t.ProcessId == processId && t.Token == token)
.AndIF(!string.IsNullOrEmpty(taskId), t => t.Id != taskId).ToExpression();
var flag = await base.Repository.UpdateSetColumnsTrueAsync(t => new Repository.Domain.WFTask { State = 4 },
expression);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 关闭任务
/// </summary>
/// <param name="processId">流程进程</param>
/// <param name="unitId">单元节点id</param>
/// <param name="type">任务类型</param>
/// <param name="taskId">任务id</param>
/// <returns></returns>
public async Task<Response<bool>> CloseTask(string processId, string unitId, int type, string taskId)
{
var flag = await base.Repository.UpdateSetColumnsTrueAsync(
t => new Repository.Domain.WFTask { State = 4, UpdateTaskId = taskId },
t => t.ProcessId == processId && t.UnitId == unitId && t.Type == type);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 打开任务
/// </summary>
/// <param name="processId">流程进程</param>
/// <param name="unitId">单元节点id</param>
/// <param name="type">任务类型</param>
/// <param name="taskId">任务id</param>
/// <returns></returns>
public async Task<Response<bool>> OpenTask(string processId, string unitId, int type, string taskId)
{
var flag = await base.Repository.UpdateSetColumnsTrueAsync(
t => new Repository.Domain.WFTask { State = 1, UpdateTaskId = taskId },
t => t.ProcessId == processId && t.UnitId == unitId && t.Type == type);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 删除任务
/// </summary>
/// <param name="processId">流程进程</param>
/// <returns></returns>
public async Task<Response<bool>> Delete(string processId)
{
var flag = await base.Repository.DeleteAsync(t => t.ProcessId == processId);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 删除任务
/// </summary>
/// <param name="processId">流程进程</param>
/// <param name="prevTaskId">来源任务ID</param>
/// <returns></returns>
public async Task<Response<bool>> Delete(string processId, string prevTaskId)
{
var flag = await base.Repository.DeleteAsync(t => t.ProcessId == processId && t.PrevTaskId == prevTaskId);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 删除任务
/// </summary>
/// <param name="id">任务主键</param>
/// <returns></returns>
public async Task<Response<bool>> DeleteByFirstId(string id)
{
var flag = await base.Repository.DeleteAsync(t => t.FirstId == id);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
/// <summary>
/// 作废任务
/// </summary>
/// <param name="processId">流程进程</param>
/// <returns></returns>
public async Task<Response<bool>> VirtualDelete(string processId)
{
var flag = await base.Repository.UpdateSetColumnsTrueAsync(t => new Repository.Domain.WFTask { State = 7 },
t => t.ProcessId == processId && t.State == 1);
return new Response<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
#endregion
#region 日志
/// <summary>
/// 获取流程进程的任务处理日志
/// </summary>
/// <param name="processId">流程进程主键</param>
/// <returns></returns>
public async Task<List<WFTaskLog>> GetLogList(string processId)
{
return await client.Queryable<WFTaskLog>().Where(a => a.ProcessId == processId).OrderBy(r => r.CreateDate)
.ToListAsync();
}
/// <summary>
/// 获取任务日志列表
/// </summary>
/// <param name="processId">流程实例Id</param>
/// <param name="unitId">流程单元节点Id</param>
/// <returns></returns>
public async Task<IEnumerable<WFTaskLog>> GetLogList(string processId, string unitId)
{
return await client.Queryable<WFTaskLog>().Where(a => a.ProcessId == processId && a.UnitId == unitId)
.OrderByDescending(t => t.CreateDate).ToListAsync();
}
/// <summary>
/// 获取任务日志列表
/// </summary>
/// <param name="taskId">任务Id</param>
/// <returns></returns>
public async Task<WFTaskLog> GetLogEntity(string taskId)
{
return await client.Queryable<WFTaskLog>().Where(t => t.TaskId == taskId).FirstAsync();
}
/// <summary>
/// 更新任务日志状态为不是最近处理的
/// </summary>
/// <param name="processId"></param>
/// <param name="unitId"></param>
/// <returns></returns>
public async Task<Response<bool>> UpdateLog(string processId, string unitId)
{
var userId = _auth.GetUserId();
var count = await client.Updateable<WFTaskLog>()
.SetColumns(a => new WFTaskLog() { IsLast = 0 })
.Where(a => a.ProcessId == processId && a.UnitId == unitId && a.IsLast == 1 && a.UserId == userId)
.ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
/// <summary>
/// 关闭任务日志撤销
/// </summary>
/// <param name="processId">流程主键</param>
/// <param name="taskId">任务主键</param>
/// <returns></returns>
public async Task<Response<bool>> CloseTaskLogCancel(string processId, string taskId)
{
var count = await client.Updateable<WFTaskLog>()
.SetColumns(a => new WFTaskLog() { IsCancel = 0 })
.Where(a => a.ProcessId == processId && a.TaskId == taskId)
.ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
/// <summary>
/// 关闭任务日志撤销
/// </summary>
/// <param name="taskId">流程任务Id</param>
/// <returns></returns>
public async Task<Response<bool>> CloseTaskLogCancel(string taskId)
{
var count = await client.Updateable<WFTaskLog>()
.SetColumns(a => new WFTaskLog() { IsCancel = 0 })
.Where(a => a.TaskId == taskId)
.ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
/// <summary>
/// 保存任务日志
/// </summary>
/// <param name="wfTaskLogEntity">任务日志</param>
public async Task<Response<bool>> AddLog(WFTaskLog wfTaskLogEntity)
{
wfTaskLogEntity.CreateDate = DateTime.Now;
wfTaskLogEntity.UserId = _auth.GetUserId();
wfTaskLogEntity.UserName = _auth.GetUserNickName();
wfTaskLogEntity.Id = Guid.NewGuid().ToString();
var count = await client.Insertable(wfTaskLogEntity).ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
/// <summary>
/// 删除任务日志
/// </summary>
/// <param name="processId">流程进程</param>
/// <returns></returns>
public async Task<Response<bool>> DeleteLog(string processId)
{
var count = await client.Deleteable<WFTaskLog>()
.Where(a => a.ProcessId == processId)
.ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
/// <summary>
/// 删除任务日志
/// </summary>
/// <param name="processId">流程进程</param>
/// <param name="token">来源任务密钥</param>
/// <returns></returns>
public async Task<Response<bool>> DeleteLog(string processId, string taskId)
{
var count = await client.Deleteable<WFTaskLog>()
.Where(a => a.ProcessId == processId && a.TaskId == taskId && a.IsLast == 1)
.ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
/// <summary>
/// 删除任务日志
/// </summary>
/// <param name="taskId">任务主键</param>
/// <returns></returns>
public async Task<Response<bool>> DeleteLogByTaskId(string taskId)
{
var count = await client.Deleteable<WFTaskLog>()
.Where(a => a.TaskId == taskId)
.ExecuteCommandAsync();
return new Response<bool>
{
Result = count > 0,
Message = count > 0 ? "success" : "error"
};
}
#endregion
public Repository.Domain.WFTask GetNodeByProcessId(string id)
{
return Repository.GetFirst(a => a.ProcessId == id);
}
public void OriginalAdd(Repository.Domain.WFTask node)
{
Repository.AsInsertable(node).IgnoreColumnsNull().ExecuteCommand();
}
}
}