添加项目文件。

This commit is contained in:
2023-03-13 15:00:34 +08:00
parent 42bf06ca3e
commit 1d73df3235
1205 changed files with 185078 additions and 0 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,218 @@
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.Message;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.Message.Interfaces.Message;
using JNPF.Systems.Interfaces.Permission;
using JNPF.Systems.Interfaces.System;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Entitys.Model.Conifg;
using JNPF.WorkFlow.Interfaces.Repository;
using Newtonsoft.Json.Linq;
namespace JNPF.WorkFlow.Manager;
public class FlowTaskMsgUtil
{
private readonly ISendMessageService _sendMessageService;
private readonly IDataInterfaceService _dataInterfaceService;
public readonly IFlowTaskRepository _flowTaskRepository;
public readonly IUserManager _userManager;
public readonly IUsersService _usersService;
public FlowTaskMsgUtil(ISendMessageService sendMessageService, IFlowTaskRepository flowTaskRepository, IUserManager userManager, IUsersService usersService, IDataInterfaceService dataInterfaceService)
{
_sendMessageService = sendMessageService;
_flowTaskRepository = flowTaskRepository;
_userManager = userManager;
_usersService = usersService;
_dataInterfaceService = dataInterfaceService;
}
#region
/// <summary>
/// 通过消息模板获取消息通知.
/// </summary>
/// <param name="msgConfig">消息配置.</param>
/// <param name="users">通知人员.</param>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="enCode">默认站内信编码.</param>
/// <param name="bodyDic">跳转数据.</param>
/// <returns></returns>
public async Task Alerts(MsgConfig msgConfig, List<string> users, FlowTaskParamter flowTaskParamter, string enCode, Dictionary<string, object> bodyDic = null)
{
//自定义消息
if (msgConfig.on == 1 || msgConfig.on == 2)
{
foreach (var item in msgConfig.templateJson)
{
item.toUser = users;
GetMsgContent(item.paramJson, flowTaskParamter);
await _sendMessageService.SendMessage(item, bodyDic);
}
}
//默认消息
if (msgConfig.on == 3)
{
await _sendMessageService.SendMessageDefult(enCode, users, flowTaskParamter.flowTaskEntity.FullName, bodyDic);
}
}
/// <summary>
/// 获取消息模板内容.
/// </summary>
/// <param name="templateJsonItems">消息模板json.</param>
/// <param name="flowTaskParamter">任务参数.</param>
public Dictionary<string, string> GetMsgContent(List<MessageSendParam> templateJsonItems, FlowTaskParamter flowTaskParamter)
{
var jObj = flowTaskParamter.flowTaskEntity.FlowFormContentJson.ToObject<JObject>();
var dic = new Dictionary<string, string>();
foreach (var item in templateJsonItems)
{
var value = string.Empty;
if (item.relationField.Equals("@flowOperatorUserId"))
{
value = _userManager.UserId;
}
else if (item.relationField.Equals("@taskId"))
{
value = flowTaskParamter.flowTaskEntity.Id;
}
else if (item.relationField.Equals("@taskNodeId"))
{
value = flowTaskParamter.flowTaskNodeEntity.Id;
}
else if (item.relationField.Equals("@taskFullName"))
{
value = flowTaskParamter.flowTaskEntity.FullName;
}
else if (item.relationField.Equals("@launchUserId"))
{
value = flowTaskParamter.flowTaskEntity.CreatorUserId;
}
else if (item.relationField.Equals("@launchUserName"))
{
value = _usersService.GetInfoByUserId(flowTaskParamter.flowTaskEntity.CreatorUserId).RealName;
}
else if (item.relationField.Equals("@flowOperatorUserName"))
{
value = _userManager.User.RealName;
}
else if (item.relationField.Equals("@flowId"))
{
value = flowTaskParamter.flowTaskEntity.FlowId;
}
else if (item.relationField.Equals("@flowFullName"))
{
value = flowTaskParamter.flowTaskEntity.FlowName;
}
else
{
if (item.isSubTable)
{
var fields = item.relationField.Split("-").ToList();
// 子表键值
var tableField = fields[0];
// 子表字段键值
var keyField = fields[1];
if (jObj.ContainsKey(tableField) && jObj[tableField] is JArray)
{
var jar = jObj[tableField] as JArray;
value = jar.Where(x => x.ToObject<JObject>().ContainsKey(keyField)).Select(x => x.ToObject<JObject>()[keyField]).ToJsonString();
}
}
else
{
value = jObj.ContainsKey(item.relationField) ? jObj[item.relationField].ToString() : string.Empty;
}
}
item.value = value;
dic.Add(item.field, value);
}
templateJsonItems.Add(new MessageSendParam
{
field = "@taskFullName",
value = flowTaskParamter.flowTaskEntity.FullName
});
return dic;
}
/// <summary>
/// 组装消息跳转详情参数.
/// </summary>
/// <param name="flowEngineEntity">流程实例</param>
/// <param name="taskNodeId">节点id.</param>
/// <param name="userList">通知人员.</param>
/// <param name="flowTaskOperatorEntities">经办实例.</param>
/// <param name="type">1:发起2待办3抄送</param>
/// <param name="taskOperatorId"></param>
/// <returns></returns>
public Dictionary<string, object> GetMesBodyText(FlowTaskParamter flowTaskParamter, List<string> userList, List<FlowTaskOperatorEntity> flowTaskOperatorEntities, int type, string remark = "")
{
var dic = new Dictionary<string, object>();
if (flowTaskOperatorEntities.IsNotEmptyOrNull() && flowTaskOperatorEntities.Count > 0)
{
foreach (var item in flowTaskOperatorEntities)
{
var value = new
{
enCode = flowTaskParamter.flowTaskEntity.FlowCode,
flowId = flowTaskParamter.flowTaskEntity.FlowId,
status = type == 1 ? 0 : 1,
processId = item.TaskId,
taskNodeId = item.TaskNodeId,
taskOperatorId = item.Id,
type = type,
remark = remark
};
dic.Add(item.HandleId, value);
if (type == 2)
{
var toUserId = _flowTaskRepository.GetToUserId(item.HandleId, flowTaskParamter.flowTaskEntity.TemplateId);
toUserId.ForEach(u => dic[u + "-delegate"] = value);
}
}
}
else
{
var value = new
{
enCode = flowTaskParamter.flowTaskEntity.FlowCode,
flowId = flowTaskParamter.flowTaskEntity.FlowId,
status = type == 1 ? 0 : 1,
processId = flowTaskParamter.flowTaskEntity.Id,
taskNodeId = flowTaskParamter.flowTaskNodeEntity?.Id,
taskOperatorId = flowTaskParamter.flowTaskOperatorEntity?.Id,
type = type,
remark = remark
};
userList.ForEach(u => dic.Add(u, value));
}
return dic;
}
/// <summary>
/// 事件请求.
/// </summary>
/// <param name="funcConfig">事件配置.</param>
/// <param name="formdata">表单数据.</param>
/// <returns></returns>
public async Task RequestEvents(FuncConfig funcConfig, FlowTaskParamter flowTaskParamter)
{
if (funcConfig.IsNotEmptyOrNull() && funcConfig.on && funcConfig.interfaceId.IsNotEmptyOrNull())
{
var parameters = GetMsgContent(funcConfig.templateJson, flowTaskParamter);
await _dataInterfaceService.GetResponseByType(funcConfig.interfaceId, 3, _userManager.TenantId, null, parameters);
}
}
#endregion
}

View File

@@ -0,0 +1,387 @@
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Enum;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Interfaces.Repository;
namespace JNPF.WorkFlow.Manager;
public class FlowTaskNodeUtil
{
private readonly IFlowTaskRepository _flowTaskRepository;
public FlowTaskNodeUtil(IFlowTaskRepository flowTaskRepository)
{
_flowTaskRepository = flowTaskRepository;
}
#region
/// <summary>
/// 判断分流节点是否完成
/// (因为分流节点最终只能是一个 所以只需判断下一节点中的其中一个的上节点完成情况).
/// </summary>
/// <param name="flowTaskNodeEntityList">所有节点.</param>
/// <param name="nextNodeCode">下一个节点编码.</param>
/// <param name="flowTaskNodeEntity">当前节点.</param>
/// <returns></returns>
public bool IsShuntNodeCompletion(List<FlowTaskNodeEntity> flowTaskNodeEntityList, string nextNodeCode, FlowTaskNodeEntity flowTaskNodeEntity)
{
var shuntNodeCodeList = flowTaskNodeEntityList.FindAll(x => x.NodeNext.IsNotEmptyOrNull() &&
x.NodeCode != flowTaskNodeEntity.NodeCode && x.NodeNext.Contains(nextNodeCode) && x.Completion == 0);
return shuntNodeCodeList.Count == 0;
}
/// <summary>
/// 替换审批同意任务当前节点.
/// </summary>
/// <param name="flowTaskNodeEntityList">所有节点.</param>
/// <param name="nextNodeCodeList">替换数据.</param>
/// <param name="thisStepId">源数据.</param>
/// <returns></returns>
public string GetThisStepId(List<FlowTaskNodeEntity> flowTaskNodeEntityList, List<string> nextNodeCodeList, string thisStepId)
{
var replaceNodeCodeList = new List<string>();
nextNodeCodeList.ForEach(item =>
{
var nodeCode = new List<string>();
var nodeEntityList = flowTaskNodeEntityList.FindAll(x => x.NodeNext.IsNotEmptyOrNull() && x.NodeNext.Contains(item));
nodeCode = nodeEntityList.Select(x => x.NodeCode).ToList();
replaceNodeCodeList = replaceNodeCodeList.Union(nodeCode).ToList();
});
var thisNodeList = new List<string>();
if (thisStepId.IsNotEmptyOrNull())
{
thisNodeList = thisStepId.Split(",").ToList();
}
//去除当前审批节点并添加下个节点
var list = thisNodeList.Except(replaceNodeCodeList).Union(nextNodeCodeList);
return string.Join(",", list.ToArray());
}
/// <summary>
/// 替换审批撤回当前任务节点.
/// </summary>
/// <param name="nextNodeCodeList">下一节点编码.</param>
/// <param name="thisStepId">当前待处理节点.</param>
/// <returns></returns>
public string GetRecallThisStepId(List<FlowTaskNodeEntity> nextNodeCodeList, string thisStepId)
{
var replaceNodeCodeList = new List<string>();
foreach (var item in nextNodeCodeList)
{
var nodeCode = item.NodeNext.Split(",").ToList();
replaceNodeCodeList = replaceNodeCodeList.Union(nodeCode).ToList();
}
var thisNodeList = new List<string>();
if (thisStepId.IsNotEmptyOrNull())
{
thisNodeList = thisStepId.Split(",").ToList();
}
//去除当前审批节点并添加下个节点
var list = thisNodeList.Except(replaceNodeCodeList).Union(nextNodeCodeList.Select(x => x.NodeCode));
return string.Join(",", list.ToArray());
}
/// <summary>
/// 驳回替换任务当前节点.
/// </summary>
/// <param name="flowTaskNodeEntityList">驳回节点下所有节点.</param>
/// <param name="upNodeCodes">当前节点.</param>
/// <param name="thisStepId">当前待处理节点.</param>
/// <returns></returns>
public string GetRejectThisStepId(List<FlowTaskNodeEntity> flowTaskNodeEntityList, List<string> upNodeCodes, string thisStepId)
{
// 驳回节点下所有节点编码
var removeNodeCodeList = flowTaskNodeEntityList.Select(x => x.NodeCode).ToList();
var ids = thisStepId.Split(",").ToList();
var thisNodes = ids.Except(removeNodeCodeList).Union(upNodeCodes).ToList();
return string.Join(",", thisNodes);
}
/// <summary>
/// 根据当前节点编码获取节点名称.
/// </summary>
/// <param name="flowTaskNodeEntityList">所有节点.</param>
/// <param name="thisStepId">当前待处理节点.</param>
/// <returns></returns>
public string GetThisStep(List<FlowTaskNodeEntity> flowTaskNodeEntityList, string thisStepId)
{
var ids = thisStepId.Split(",").ToList();
var nextNodeNameList = new List<string>();
foreach (var item in ids)
{
var name = flowTaskNodeEntityList.Find(x => x.NodeCode.Equals(item)).NodeName;
nextNodeNameList.Add(name);
}
return string.Join(",", nextNodeNameList);
}
/// <summary>
/// 获取驳回节点.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <returns></returns>
public List<FlowTaskNodeEntity> GetRejectNode(FlowTaskParamter flowTaskParamter)
{
//驳回节点(除了上一节点,所有驳回节点都是单节点)
var upflowTaskNodeEntityList = new List<FlowTaskNodeEntity>();
if (flowTaskParamter.flowTaskNodeEntity.NodeUp == "1")
{
upflowTaskNodeEntityList = flowTaskParamter.flowTaskNodeEntityList.FindAll(x => x.NodeNext.IsNotEmptyOrNull() && x.NodeNext.Contains(flowTaskParamter.flowTaskNodeEntity.NodeCode));
}
else
{
var upflowTaskNodeEntity = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.NodeCode == flowTaskParamter.rejectStep);
upflowTaskNodeEntityList.Add(upflowTaskNodeEntity);
}
return upflowTaskNodeEntityList;
}
/// <summary>
/// 修改节点完成状态.
/// </summary>
/// <param name="taskNodeList">修改节点.</param>
/// <param name="state">状态.</param>
/// <returns></returns>
public async Task RejectUpdateTaskNode(List<FlowTaskNodeEntity> taskNodeList, int state)
{
foreach (var item in taskNodeList)
{
item.Completion = state;
await _flowTaskRepository.UpdateTaskNode(item);
}
}
/// <summary>
/// 处理并保存节点.
/// </summary>
/// <param name="entitys">节点list.</param>
public void UpdateNodeSort(List<FlowTaskNodeEntity> entitys)
{
var startNodes = entitys.FindAll(x => x.NodeType.Equals("start"));
if (startNodes.Count > 0)
{
var startNode = startNodes[0].NodeCode;
long num = 0L;
long maxNum = 0L;
var max = new List<long>();
var _treeList = new List<FlowTaskNodeEntity>();
NodeList(entitys, startNode, _treeList, num, max);
max.Sort();
if (max.Count > 0)
{
maxNum = max[max.Count - 1];
}
var nodeNext = "end";
foreach (var item in entitys)
{
var type = item.NodeType;
var node = _treeList.Find(x => x.NodeCode.Equals(item.NodeCode));
if (item.NodeNext.IsEmpty())
{
item.NodeNext = nodeNext;
}
if (node.IsNotEmptyOrNull())
{
item.SortCode = node.SortCode;
item.State = "0";
if (item.NodeNext.IsEmpty())
{
item.NodeNext = nodeNext;
}
}
}
entitys.Add(new FlowTaskNodeEntity()
{
Id = SnowflakeIdHelper.NextId(),
NodeCode = nodeNext,
NodeName = "结束",
Completion = 0,
CreatorTime = DateTime.Now,
SortCode = maxNum + 1,
TaskId = _treeList[0].TaskId,
NodePropertyJson = startNodes[0].NodePropertyJson,
NodeType = "endround",
State = "0"
});
}
}
/// <summary>
/// 递归获取经过的节点.
/// </summary>
/// <param name="dataAll">所有节点.</param>
/// <param name="nodeCode">节点编码.</param>
/// <param name="_treeList">节点集合(容器).</param>
/// <param name="num">递归次数.</param>
/// <param name="max">递归次数值.</param>
public void NodeList(List<FlowTaskNodeEntity> dataAll, string nodeCode, List<FlowTaskNodeEntity> _treeList, long num, List<long> max)
{
num++;
max.Add(num);
foreach (var item in dataAll)
{
if (item.NodeCode.Contains(nodeCode))
{
item.SortCode = num;
item.State = "0";
_treeList.Add(item);
foreach (var nodeNext in item.NodeNext.Split(","))
{
long nums = _treeList.FindAll(x => x.NodeCode.Equals(nodeNext)).Count;
if (nodeNext.IsNotEmptyOrNull() && nums == 0)
{
NodeList(dataAll, nodeNext, _treeList, num, max);
}
}
}
}
}
/// <summary>
/// 递归节点下所有节点.
/// </summary>
/// <param name="flowTaskNodeList">所有节点.</param>
/// <param name="nodeNext">下一节点.</param>
/// <param name="flowTaskNodeEntities">指定节点下所有节点.</param>
public async Task GetAllNextNode(List<FlowTaskNodeEntity> flowTaskNodeList, string nodeNext, List<FlowTaskNodeEntity> flowTaskNodeEntities)
{
var nextNodes = nodeNext.Split(",").ToList();
var flowTaskNodeEntityList = flowTaskNodeList.FindAll(x => nextNodes.Contains(x.NodeCode));
flowTaskNodeEntities.AddRange(flowTaskNodeEntityList);
foreach (var item in flowTaskNodeEntityList)
{
if (!FlowTaskNodeTypeEnum.end.ParseToString().Equals(item.NodeCode))
{
await GetAllNextNode(flowTaskNodeList, item.NodeNext, flowTaskNodeEntities);
}
}
}
/// <summary>
/// 递归节点.
/// </summary>
/// <param name="flowTaskNodeList">所有节点.</param>
/// <param name="nodeCode">当前节点.</param>
/// <param name="flowTaskNodeEntities">指定节点下所有节点.</param>
/// <param name="isUp">向上递归.</param>
public async Task RecursiveNode(List<FlowTaskNodeEntity> flowTaskNodeList, string nodeCode, List<FlowTaskNodeEntity> flowTaskNodeEntities, bool isUp = false)
{
var thisNodeEntity = flowTaskNodeList.Find(x => x.NodeCode == nodeCode);
var flowTaskNodeEntityList = new List<FlowTaskNodeEntity>();
var nodeType = string.Empty;
if (isUp)
{
flowTaskNodeEntityList = flowTaskNodeList.FindAll(x => !FlowTaskNodeTypeEnum.end.ParseToString().Equals(x.NodeCode) && x.NodeNext.Contains(nodeCode));
nodeType = FlowTaskNodeTypeEnum.start.ParseToString();
}
else
{
var nextNodes = thisNodeEntity.NodeNext.Split(",").ToList();
flowTaskNodeEntityList = flowTaskNodeList.FindAll(x => nextNodes.Contains(x.NodeCode));
nodeType = FlowTaskNodeTypeEnum.end.ParseToString();
}
foreach (var item in flowTaskNodeEntityList)
{
if (!flowTaskNodeEntities.Any(x => x.Id == item.Id))
{
flowTaskNodeEntities.Add(item);
}
if (!nodeType.Equals(item.NodeCode))
{
await RecursiveNode(flowTaskNodeList, item.NodeCode, flowTaskNodeEntities, isUp);
}
}
}
/// <summary>
/// 根据选择分支变更节点.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
public async Task ChangeNodeListByBranch(FlowTaskParamter flowTaskParamter)
{
if (flowTaskParamter.branchList.IsNotEmptyOrNull() && flowTaskParamter.branchList.Count > 0)
{
flowTaskParamter.flowTaskNodeEntityList.RemoveAll(x => FlowTaskNodeTypeEnum.end.ParseToString().Equals(x.NodeCode));
foreach (var item in flowTaskParamter.flowTaskNodeEntityList)
{
if (flowTaskParamter.flowTaskNodeEntity.Id.IsNotEmptyOrNull() && flowTaskParamter.flowTaskNodeEntity.Id.Equals(item.Id))
{
item.NodeNext = string.Join(",", flowTaskParamter.branchList);
}
item.State = "1";
item.SortCode = null;
}
UpdateNodeSort(flowTaskParamter.flowTaskNodeEntityList);
await _flowTaskRepository.UpdateTaskNode(flowTaskParamter.flowTaskNodeEntityList);
//重新获取当前节点
flowTaskParamter.flowTaskNodeEntity = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.Id == flowTaskParamter.flowTaskNodeEntity.Id);
}
}
/// <summary>
/// 驳回处理.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="rejectNodeList">驳回节点.</param>
/// <param name="rejectNodeCodeList">驳回节点编码.</param>
/// <param name="rejectNodeCompletion">驳回节点完成度.</param>
/// <returns></returns>
public async Task<List<FlowTaskNodeEntity>> RejectManager(FlowTaskParamter flowTaskParamter, List<FlowTaskNodeEntity> rejectNodeList, List<string> rejectNodeCodeList, List<int> rejectNodeCompletion)
{
if (!rejectNodeList.Any()) throw Oops.Oh(ErrorCode.WF0032);
// 保存驳回现有数据.
if (flowTaskParamter.approversProperties.rejectType == 2)
{
flowTaskParamter.flowTaskEntity.RejectDataId = await _flowTaskRepository.CreateRejectData(flowTaskParamter.flowTaskEntity.Id, flowTaskParamter.flowTaskEntity.ThisStepId);
}
// 驳回节点下所有节点.
var rejectNodeNextAllList = new List<FlowTaskNodeEntity>();
await GetAllNextNode(flowTaskParamter.flowTaskNodeEntityList, rejectNodeList.FirstOrDefault().NodeNext, rejectNodeNextAllList);
// 驳回到发起
if (rejectNodeList.Any(x => FlowTaskNodeTypeEnum.start.ParseToString().Equals(x.NodeType)))
{
flowTaskParamter.flowTaskEntity.ThisStepId = rejectNodeList.FirstOrDefault().NodeCode;
flowTaskParamter.flowTaskEntity.ThisStep = "开始";
flowTaskParamter.flowTaskEntity.Completion = 0;
flowTaskParamter.flowTaskEntity.FlowUrgent = 0;
flowTaskParamter.flowTaskEntity.Status = FlowTaskStatusEnum.Reject.ParseToInt();
}
else
{
// 清空驳回节点下所有节点候选人/异常节点处理人
if (flowTaskParamter.approversProperties.rejectType == 1)
{
_flowTaskRepository.DeleteFlowCandidates(x => rejectNodeNextAllList.Select(x => x.Id).Contains(x.TaskNodeId));
}
flowTaskParamter.flowTaskEntity.Completion = rejectNodeCompletion.Min();
if (flowTaskParamter.flowTaskNodeEntity.NodeUp == "1")
{
flowTaskParamter.flowTaskEntity.ThisStepId = GetRejectThisStepId(rejectNodeNextAllList, rejectNodeCodeList, flowTaskParamter.flowTaskEntity.ThisStepId);
flowTaskParamter.flowTaskEntity.ThisStep = GetThisStep(flowTaskParamter.flowTaskNodeEntityList, flowTaskParamter.flowTaskEntity.ThisStepId);
}
else
{
flowTaskParamter.flowTaskEntity.ThisStep = string.Join(",", rejectNodeCodeList);
flowTaskParamter.flowTaskEntity.ThisStepId = string.Join(",", rejectNodeList.Select(x => x.NodeCode).ToArray());
}
var rejectNodeIds = rejectNodeList.Union(rejectNodeNextAllList).ToList().Select(x => x.Id).ToList();
await RejectUpdateTaskNode(rejectNodeList.Union(rejectNodeNextAllList).ToList(), 0);
// 删除驳回节点下所有经办
var rejectList = (await _flowTaskRepository.GetTaskOperatorList(x => x.TaskId == flowTaskParamter.flowTaskEntity.Id && rejectNodeIds.Contains(x.TaskNodeId))).OrderBy(x => x.HandleTime).Select(x => x.Id).ToList();
await _flowTaskRepository.DeleteTaskOperator(rejectList);
//删除驳回节点经办记录
var rejectRecodeList = (await _flowTaskRepository.GetTaskOperatorRecordList(x => x.TaskId == flowTaskParamter.flowTaskEntity.Id && rejectNodeIds.Contains(x.TaskNodeId))).OrderBy(x => x.HandleTime).Select(x => x.Id).ToList();
await _flowTaskRepository.DeleteTaskOperatorRecord(rejectRecodeList);
}
return rejectNodeNextAllList.FindAll(x => FlowTaskNodeTypeEnum.subFlow.Equals(x.NodeType));
}
#endregion
}

View File

@@ -0,0 +1,494 @@
using JNPF.Common.Core.Manager;
using JNPF.Common.Extension;
using JNPF.Common.Models.WorkFlow;
using JNPF.Common.Security;
using JNPF.Systems.Interfaces.Permission;
using JNPF.TaskScheduler;
using JNPF.VisualDev.Interfaces;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Enum;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Entitys.Model.Conifg;
using JNPF.WorkFlow.Entitys.Model.Item;
using JNPF.WorkFlow.Entitys.Model.Properties;
using JNPF.WorkFlow.Interfaces.Repository;
namespace JNPF.WorkFlow.Manager;
public class FlowTaskOtherUtil
{
private readonly IFlowTaskRepository _flowTaskRepository;
private readonly IUsersService _usersService;
private readonly IRunService _runService;
private readonly IUserManager _userManager;
public FlowTaskOtherUtil(IFlowTaskRepository flowTaskRepository, IUsersService usersService, IRunService runService, IUserManager userManager)
{
_flowTaskRepository = flowTaskRepository;
_usersService = usersService;
_runService = runService;
_userManager = userManager;
}
/// <summary>
/// 修改当前节点经办数据.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="handleStatus">审批类型0拒绝1同意.</param>
/// <returns></returns>
public async Task UpdateFlowTaskOperator(FlowTaskParamter flowTaskParamter, int handleStatus)
{
var updateOperatorList = new List<FlowTaskOperatorEntity>();// 要修改的经办
// 加签
if (flowTaskParamter.freeApproverUserId.IsNotEmptyOrNull())
{
#region
var freeApproverOperatorEntity = flowTaskParamter.flowTaskOperatorEntity.Copy();
freeApproverOperatorEntity.Id = SnowflakeIdHelper.NextId();
freeApproverOperatorEntity.ParentId = flowTaskParamter.flowTaskOperatorEntity.Id;
freeApproverOperatorEntity.HandleType = flowTaskParamter.flowTaskOperatorEntity.Id;
freeApproverOperatorEntity.HandleId = flowTaskParamter.freeApproverUserId;
freeApproverOperatorEntity.CreatorTime = DateTime.Now;
freeApproverOperatorEntity.Completion = 0;
freeApproverOperatorEntity.RollbackId = flowTaskParamter.freeApproverType == "1" ? flowTaskParamter.flowTaskOperatorEntity.Id : flowTaskParamter.flowTaskOperatorEntity.RollbackId;
await _flowTaskRepository.CreateTaskOperator(freeApproverOperatorEntity);
flowTaskParamter.flowTaskOperatorEntityList.Add(freeApproverOperatorEntity);
#endregion
flowTaskParamter.flowTaskOperatorEntity.State = "1";
flowTaskParamter.flowTaskOperatorEntity.HandleStatus = handleStatus;
flowTaskParamter.flowTaskOperatorEntity.Completion = 1;
flowTaskParamter.flowTaskOperatorEntity.HandleTime = DateTime.Now;
if (flowTaskParamter.freeApproverType == "1")
{
handleStatus = 10;
}
else
{
#region
await CreateOperatorRecode(flowTaskParamter, 6);
#endregion
}
}
else
{
// 当前经办非加签经办或不存在前签
if (flowTaskParamter.flowTaskOperatorEntity.ParentId.IsNullOrEmpty() || flowTaskParamter.flowTaskOperatorEntity.RollbackId.IsNullOrEmpty() || handleStatus == 0)
{
if (flowTaskParamter.approversProperties.counterSign == 0 || IsAchievebilProportion(flowTaskParamter, handleStatus))
{
//未审批经办
updateOperatorList = GetNotCompletion(flowTaskParamter.thisFlowTaskOperatorEntityList);
}
}
else
{
flowTaskParamter.flowTaskOperatorEntity.State = "1";
// 前签发起人是否为初始经办人
var rollBackOprtator = await _flowTaskRepository.GetTaskOperatorInfo(flowTaskParamter.flowTaskOperatorEntity.RollbackId);
if (rollBackOprtator.IsNotEmptyOrNull())
{
//rollBackOprtator.State = "0";
//await _flowTaskRepository.UpdateTaskOperator(rollBackOprtator);
rollBackOprtator.Id = SnowflakeIdHelper.NextId();
rollBackOprtator.State = "0";
rollBackOprtator.Completion = 0;
rollBackOprtator.HandleStatus = 0;
rollBackOprtator.HandleType = flowTaskParamter.flowTaskOperatorEntity.Id;
rollBackOprtator.HandleTime = null;
await _flowTaskRepository.CreateTaskOperator(rollBackOprtator);
}
//else
//{
// rollBackOprtator.Id = SnowflakeIdHelper.NextId();
// rollBackOprtator.State = "0";
// rollBackOprtator.Completion = 0;
// rollBackOprtator.HandleStatus = 0;
// rollBackOprtator.HandleTime = null;
// await _flowTaskRepository.CreateTaskOperator(rollBackOprtator);
//}
}
flowTaskParamter.flowTaskOperatorEntity.HandleStatus = handleStatus;
flowTaskParamter.flowTaskOperatorEntity.Completion = 1;
flowTaskParamter.flowTaskOperatorEntity.HandleTime = DateTime.Now;
}
updateOperatorList.Add(flowTaskParamter.flowTaskOperatorEntity);
await _flowTaskRepository.UpdateTaskOperator(updateOperatorList);
// 经办记录
await CreateOperatorRecode(flowTaskParamter, handleStatus);
}
/// <summary>
/// 获取未审经办并修改完成状态.
/// </summary>
/// <param name="thisFlowTaskOperatorEntityList">当前节点所有经办.</param>
/// <returns></returns>
public List<FlowTaskOperatorEntity> GetNotCompletion(List<FlowTaskOperatorEntity> thisFlowTaskOperatorEntityList)
{
var notCompletion = thisFlowTaskOperatorEntityList.FindAll(x => x.Completion == 0);
notCompletion.ForEach(item =>
{
item.Completion = 1;
});
return notCompletion;
}
/// <summary>
/// 对审批人节点分组.
/// </summary>
/// <param name="flowTaskOperatorEntities">所有经办.</param>
/// <returns></returns>
public Dictionary<string, List<FlowTaskOperatorEntity>> GroupByOperator(List<FlowTaskOperatorEntity> flowTaskOperatorEntities)
{
var dic = new Dictionary<string, List<FlowTaskOperatorEntity>>();
foreach (var item in flowTaskOperatorEntities.GroupBy(x => x.TaskNodeId))
{
dic.Add(item.Key, flowTaskOperatorEntities.FindAll(x => x.TaskNodeId == item.Key));
}
return dic;
}
/// <summary>
/// 保存当前未完成节点下个候选人节点的候选人.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
public List<FlowCandidatesEntity> SaveNodeCandidates(FlowTaskParamter flowTaskParamter)
{
var flowCandidateList = new List<FlowCandidatesEntity>();
if (flowTaskParamter.candidateList.IsNotEmptyOrNull())
{
foreach (var item in flowTaskParamter.candidateList.Keys)
{
var node = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.NodeCode == item);
if (node != null)
{
flowCandidateList.Add(new FlowCandidatesEntity()
{
Id = SnowflakeIdHelper.NextId(),
TaskId = node.TaskId,
TaskNodeId = node.Id,
HandleId = _userManager.UserId,
Account = _userManager.Account,
Candidates = string.Join(",", flowTaskParamter.candidateList[item]),
TaskOperatorId = flowTaskParamter.flowTaskOperatorEntity.Id
});
}
}
_flowTaskRepository.CreateFlowCandidates(flowCandidateList);
}
if (flowTaskParamter.errorRuleUserList.IsNotEmptyOrNull())
{
flowCandidateList.Clear();
foreach (var item in flowTaskParamter.errorRuleUserList.Keys)
{
var node = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.NodeCode == item);
if (node != null)
{
flowCandidateList.Add(new FlowCandidatesEntity()
{
Id = SnowflakeIdHelper.NextId(),
TaskId = node.TaskId,
TaskNodeId = node.Id,
HandleId = _userManager.UserId,
Account = _userManager.Account,
Candidates = string.Join(",", flowTaskParamter.errorRuleUserList[item]),
TaskOperatorId = flowTaskParamter.flowTaskOperatorEntity.Id
});
}
}
_flowTaskRepository.CreateFlowCandidates(flowCandidateList);
}
return flowCandidateList;
}
/// <summary>
/// 获取子流程继承父流程的表单数据.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="childTaskProperties">子流程属性.</param>
/// <returns></returns>
public async Task<object> GetSubFlowFormData(FlowTaskParamter flowTaskParamter, ChildTaskProperties childTaskProperties)
{
var childFlowEngine = _flowTaskRepository.GetFlowTemplateInfo(childTaskProperties.flowId);
var thisFormId = flowTaskParamter.flowTaskNodeEntity.FormId;
var nextFormId = childFlowEngine.flowTemplateJson.ToObject<FlowTemplateJsonModel>().properties.ToObject<StartProperties>().formId;
var mapRule = GetMapRule(childTaskProperties.assignList, flowTaskParamter.flowTaskNodeEntity.NodeCode);
var childFormData = await _runService.SaveDataToDataByFId(thisFormId, nextFormId, mapRule, flowTaskParamter.formData.ToObject<Dictionary<string, object>>(), true);
return childFormData;
}
/// <summary>
/// 获取流程任务名称.
/// </summary>
/// <param name="flowTaskSubmitModel">提交参数.</param>
/// <returns></returns>
public async Task GetFlowTitle(FlowTaskSubmitModel flowTaskSubmitModel)
{
var flowTemplateJsonModel = flowTaskSubmitModel.flowJsonModel.ToObject<FlowJsonModel>().flowTemplateJson.ToObject<FlowTemplateJsonModel>();
var startProp = flowTemplateJsonModel.properties.ToObject<StartProperties>();
var userName = flowTaskSubmitModel.crUser.IsNotEmptyOrNull() ? await _usersService.GetUserName(flowTaskSubmitModel.crUser, false) : _userManager.User.RealName;
if (startProp.titleType == 1)
{
var formDataDic = flowTaskSubmitModel.formData.ToObject<Dictionary<string, object>>();
formDataDic.Add("@flowFullName", flowTaskSubmitModel.flowJsonModel.fullName);
formDataDic.Add("@flowFullCode", flowTaskSubmitModel.flowJsonModel.enCode);
formDataDic.Add("@launchUserName", userName);
formDataDic.Add("@launchTime", DateTime.Now.ToString("yyyy-MM-dd"));
foreach (var item in startProp.titleContent.Substring3())
{
if (formDataDic.ContainsKey(item) && formDataDic[item] != null)
{
startProp.titleContent = startProp.titleContent?.Replace("{" + item + "}", formDataDic[item].ToString());
}
else
{
startProp.titleContent = startProp.titleContent?.Replace("{" + item + "}", string.Empty);
}
}
flowTaskSubmitModel.flowTitle = startProp.titleContent;
}
else
{
flowTaskSubmitModel.flowTitle = string.Format("{0}的{1}", userName, flowTaskSubmitModel.flowJsonModel.fullName);
}
}
/// <summary>
/// 添加经办记录.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="handleStatus">审批类型0拒绝1同意.</param>
/// <returns></returns>
public async Task CreateOperatorRecode(FlowTaskParamter flowTaskParamter, int handleStatus)
{
FlowTaskOperatorRecordEntity flowTaskOperatorRecordEntity = new FlowTaskOperatorRecordEntity();
flowTaskOperatorRecordEntity.HandleTime = DateTime.Now;
flowTaskOperatorRecordEntity.HandleId = handleStatus == 2 ? flowTaskParamter.flowTaskEntity.CreatorUserId : _userManager.UserId;
flowTaskOperatorRecordEntity.HandleStatus = handleStatus;
flowTaskOperatorRecordEntity.HandleOpinion = flowTaskParamter.handleOpinion;
flowTaskOperatorRecordEntity.SignImg = flowTaskParamter.signImg;
flowTaskOperatorRecordEntity.Status = 0;
flowTaskOperatorRecordEntity.FileList = flowTaskParamter.fileList.ToJsonString();
flowTaskOperatorRecordEntity.TaskId = flowTaskParamter.flowTaskEntity.Id;
flowTaskOperatorRecordEntity.NodeCode = flowTaskParamter.flowTaskEntity.ThisStepId;
flowTaskOperatorRecordEntity.NodeName = flowTaskParamter.flowTaskEntity.ThisStep;
flowTaskOperatorRecordEntity.OperatorId = flowTaskParamter.freeApproverUserId;
if (flowTaskParamter.flowTaskOperatorEntity.IsNotEmptyOrNull())
{
if (handleStatus == 0 || handleStatus == 1)
{
flowTaskOperatorRecordEntity.Status = flowTaskParamter.flowTaskOperatorEntity.ParentId.IsNotEmptyOrNull() ? 1 : 0;
}
flowTaskOperatorRecordEntity.NodeCode = flowTaskParamter.flowTaskOperatorEntity.NodeCode;
flowTaskOperatorRecordEntity.NodeName = flowTaskParamter.flowTaskOperatorEntity.NodeName;
flowTaskOperatorRecordEntity.TaskOperatorId = flowTaskParamter.flowTaskOperatorEntity.Id;
flowTaskOperatorRecordEntity.TaskNodeId = flowTaskParamter.flowTaskOperatorEntity.TaskNodeId;
}
else if (flowTaskParamter.flowTaskNodeEntity.IsNotEmptyOrNull())
{
flowTaskOperatorRecordEntity.NodeCode = flowTaskParamter.flowTaskNodeEntity.NodeCode;
flowTaskOperatorRecordEntity.NodeName = flowTaskParamter.flowTaskNodeEntity.NodeName;
flowTaskOperatorRecordEntity.TaskNodeId = flowTaskParamter.flowTaskNodeEntity.Id;
}
await _flowTaskRepository.CreateTaskOperatorRecord(flowTaskOperatorRecordEntity);
}
/// <summary>
/// 判断会签人数是否达到会签比例.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="handleStatus">审批类型0拒绝1同意.</param>
/// <returns></returns>
public bool IsAchievebilProportion(FlowTaskParamter flowTaskParamter, int handleStatus)
{
var index = flowTaskParamter.approversProperties.countersignRatio;
if (flowTaskParamter.thisFlowTaskOperatorEntityList.Count == 0)
return true;
if (handleStatus == 0)
index = 100 - index;
//完成人数(加上当前审批人)
var comIndex = flowTaskParamter.thisFlowTaskOperatorEntityList.FindAll(x => x.HandleStatus == handleStatus && x.Completion == 1 && x.State == "0").Count.ParseToDouble();
if (flowTaskParamter.freeApproverUserId.IsNullOrEmpty())
{
++comIndex;
}
//完成比例
var comProportion = (comIndex / flowTaskParamter.thisFlowTaskOperatorEntityList.Count.ParseToDouble() * 100).ParseToInt();
return comProportion >= index;
}
/// <summary>
/// 获取cron表达式.
/// </summary>
/// <param name="overTimeDuring">间隔.</param>
/// <param name="startingTime">起始时间.</param>
/// <param name="type">0小时 1分钟.</param>
/// <returns></returns>
public string GetCron(int overTimeDuring, DateTime startingTime, int type = 0)
{
if (type == 0)
{
return string.Format("{0} {1} 0/{2} * * ?", startingTime.Second, startingTime.Minute, overTimeDuring);
}
else
{
return string.Format("{0} 0/{1} * * * ?", startingTime.Second, overTimeDuring);
}
}
/// <summary>
/// 获取起始时间.
/// </summary>
/// <param name="timeOutConfig">限时配置.</param>
/// <param name="receiveTime">接收时间.</param>
/// <param name="createTime">发起时间.</param>
/// <param name="formData">表单数据.</param>
/// <returns></returns>
public DateTime GetStartingTime(TimeOutConfig timeOutConfig, DateTime receiveTime, DateTime createTime, string formData)
{
var dt = DateTime.Now;
switch (timeOutConfig.nodeLimit)
{
case 0:
dt = receiveTime;
break;
case 1:
dt = createTime;
break;
case 2:
var jobj = formData.ToObject();
if (jobj.ContainsKey(timeOutConfig.formField))
{
try
{
if (jobj[timeOutConfig.formField] is long)
{
dt = jobj[timeOutConfig.formField].ParseToLong().TimeStampToDateTime();
}
else
{
dt = jobj[timeOutConfig.formField].ToString().ParseToDateTime();
}
}
catch (Exception)
{
break;
}
}
break;
}
return dt;
}
/// <summary>
/// 获取下一节点表单初始数据并保存.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="nextNodeList">下一节点.</param>
/// <returns></returns>
public async Task<Dictionary<string, object>> GetNextFormData(FlowTaskParamter flowTaskParamter, List<FlowTaskNodeEntity> nextNodeList)
{
var nextNodeData = new Dictionary<string, object>();
var mapRule = new List<Dictionary<string, string>>();
var thisFormId = flowTaskParamter.flowTaskNodeEntity.FormId;
foreach (var item in nextNodeList)
{
if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(item.NodeType))
{
var approversPro = item.NodePropertyJson.ToObject<ApproversProperties>();
var nextFormId = item.FormId;
if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(flowTaskParamter.flowTaskNodeEntity.NodeType))
{
// 传递节点
var extendNode = approversPro.assignList.Select(x => x.nodeId).ToList();
// 最后审批节点
var lastHandleNode = (await _flowTaskRepository.GetTaskOperatorRecordList(x => x.TaskId == flowTaskParamter.flowTaskEntity.Id && (x.HandleStatus == 1 || x.HandleStatus == 2), o => o.HandleTime, SqlSugar.OrderByType.Desc)).FirstOrDefault();
if (extendNode.Any())
{
lastHandleNode = (await _flowTaskRepository.GetTaskOperatorRecordList(x => extendNode.Contains(x.NodeCode) && x.TaskId == flowTaskParamter.flowTaskEntity.Id && (x.HandleStatus == 1 || x.HandleStatus == 2), o => o.HandleTime, SqlSugar.OrderByType.Desc)).FirstOrDefault();
}
if (lastHandleNode.IsNotEmptyOrNull() && lastHandleNode.NodeCode.IsNotEmptyOrNull())
{
thisFormId = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.Id == lastHandleNode.TaskNodeId)?.FormId;
mapRule = GetMapRule(approversPro.assignList, lastHandleNode.NodeCode);
}
}
else
{
mapRule = GetMapRule(approversPro.assignList, flowTaskParamter.flowTaskNodeEntity.NodeCode);
}
var data =await _runService.GetFlowFormDataDetails(thisFormId, flowTaskParamter.flowTaskEntity.Id);
var nextFormData = await _runService.SaveDataToDataByFId(thisFormId, nextFormId, mapRule, data);
nextNodeData[item.NodeCode] = nextFormData;
}
}
return nextNodeData;
}
/// <summary>
/// 获取表单传递字段.
/// </summary>
/// <param name="assignItems">传递规则.</param>
/// <param name="nodeCode">传递节点编码.</param>
/// <returns></returns>
private List<Dictionary<string, string>> GetMapRule(List<AssignItem> assignItems, string nodeCode)
{
if (!assignItems.Any()) return null;
var ruleList = assignItems.Find(x => x.nodeId == nodeCode)?.ruleList;
var mapRule = new List<Dictionary<string, string>>();
if (ruleList.IsNotEmptyOrNull())
{
foreach (var item in ruleList)
{
if (item.parentField.IsNotEmptyOrNull())
{
var dic = new Dictionary<string, string>();
dic.Add(item.parentField, item.childField);
mapRule.Add(dic);
}
}
}
return mapRule;
}
/// <summary>
/// 终止任务(包含子流程任务).
/// </summary>
/// <param name="flowTaskEntity">当前任务.</param>
/// <returns></returns>
public async Task CancelTask(FlowTaskEntity flowTaskEntity)
{
flowTaskEntity.Status = FlowTaskStatusEnum.Cancel.ParseToInt();
flowTaskEntity.EndTime = DateTime.Now;
await _flowTaskRepository.UpdateTask(flowTaskEntity);
foreach (var item in await _flowTaskRepository.GetTaskNodeList(x => x.TaskId == flowTaskEntity.Id))
{
SpareTime.Cancel("CS_" + item.Id);
SpareTime.Cancel("TX_" + item.Id);
}
var childTaskList = await _flowTaskRepository.GetTaskList(x => flowTaskEntity.Id == x.ParentId && x.DeleteMark == null);
foreach (var item in childTaskList)
{
await CancelTask(item);
}
}
/// <summary>
/// 同步发起配置.
/// </summary>
/// <param name="approversPro"></param>
/// <param name="startPro"></param>
/// <returns></returns>
public ApproversProperties SyncApproProCofig(ApproversProperties approversPro, StartProperties startPro)
{
approversPro.timeLimitConfig = approversPro.timeLimitConfig.on == 2 ? startPro.timeLimitConfig : approversPro.timeLimitConfig;//限时配置
approversPro.noticeConfig = approversPro.noticeConfig.on == 2 ? startPro.noticeConfig : approversPro.noticeConfig;//提醒配置
approversPro.overTimeConfig = approversPro.overTimeConfig.on == 2 ? startPro.overTimeConfig : approversPro.overTimeConfig;//超时配置
approversPro.approveMsgConfig = approversPro.approveMsgConfig.on == 2 ? startPro.approveMsgConfig : approversPro.approveMsgConfig;//同意
approversPro.rejectMsgConfig = approversPro.rejectMsgConfig.on == 2 ? startPro.rejectMsgConfig : approversPro.rejectMsgConfig;//退回
approversPro.copyMsgConfig = approversPro.copyMsgConfig.on == 2 ? startPro.copyMsgConfig : approversPro.copyMsgConfig;//抄送
approversPro.overTimeMsgConfig = approversPro.overTimeMsgConfig.on == 2 ? startPro.overTimeMsgConfig : approversPro.overTimeMsgConfig;//超时
approversPro.noticeMsgConfig = approversPro.noticeMsgConfig.on == 2 ? startPro.noticeMsgConfig : approversPro.noticeMsgConfig;//提醒
return approversPro;
}
}

View File

@@ -0,0 +1,759 @@
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Manager;
using JNPF.Common.Models.User;
using JNPF.Common.Models.WorkFlow;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.RemoteRequest.Extensions;
using JNPF.Systems.Entitys.Dto.User;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Interfaces.Permission;
using JNPF.UnifyResult;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Enum;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Entitys.Model.Properties;
using JNPF.WorkFlow.Interfaces.Repository;
using Mapster;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace JNPF.WorkFlow.Manager;
public class FlowTaskUserUtil
{
private readonly IFlowTaskRepository _flowTaskRepository;
private readonly IUsersService _usersService;
private readonly IOrganizeService _organizeService;
private readonly IDepartmentService _departmentService;
private readonly IUserRelationService _userRelationService;
private readonly IUserManager _userManager;
private readonly ICacheManager _cacheManager;
public FlowTaskUserUtil(IFlowTaskRepository flowTaskRepository, IUsersService usersService, IOrganizeService organizeService, IDepartmentService departmentService, IUserRelationService userRelationService, IUserManager userManager, ICacheManager cacheManager)
{
_flowTaskRepository = flowTaskRepository;
_usersService = usersService;
_organizeService = organizeService;
_departmentService = departmentService;
_userRelationService = userRelationService;
_userManager = userManager;
_cacheManager = cacheManager;
}
/// <summary>
/// 获取节点审批人员id.
/// </summary>
/// <param name="flowTaskParamter">当前任务参数.</param>
/// <param name="approversProperties">节点属性.</param>
/// <param name="flowTaskNodeEntity">节点实体.</param>
/// <returns></returns>
public async Task<List<string>> GetFlowUserId(FlowTaskParamter flowTaskParamter, ApproversProperties approversProperties, FlowTaskNodeEntity flowTaskNodeEntity)
{
var userIdList = new List<string>();
// 获取全部用户id
var userList1 = await _usersService.GetUserListByExp(x => x.DeleteMark == null && x.EnabledMark == 1, u => new UserEntity() { Id = u.Id });
// 发起者本人.
var userEntity = _usersService.GetInfoByUserId(flowTaskParamter.flowTaskEntity.CreatorUserId);
switch (approversProperties.assigneeType)
{
// 发起者主管
case (int)FlowTaskOperatorEnum.LaunchCharge:
var crDirector = await GetManagerByLevel(userEntity.ManagerId, approversProperties.managerLevel);
if (crDirector.IsNotEmptyOrNull())
userIdList.Add(crDirector);
break;
// 发起者本人
case (int)FlowTaskOperatorEnum.InitiatorMe:
userIdList.Add(userEntity.Id);
break;
// 部门主管
case (int)FlowTaskOperatorEnum.DepartmentCharge:
var organizeEntity = await _organizeService.GetInfoById(userEntity.OrganizeId);
if (organizeEntity.IsNotEmptyOrNull() && organizeEntity.OrganizeIdTree.IsNotEmptyOrNull())
{
var orgTree = organizeEntity.OrganizeIdTree.Split(",").Reverse().ToList();
if (orgTree.Count >= approversProperties.departmentLevel)
{
var orgId = orgTree[approversProperties.departmentLevel - 1];
var organize = await _organizeService.GetInfoById(orgId);
if (organize.IsNotEmptyOrNull() && organize.ManagerId.IsNotEmptyOrNull())
{
userIdList.Add(organize.ManagerId);
}
}
}
break;
// 表单变量
case (int)FlowTaskOperatorEnum.VariableApprover:
var jd = flowTaskParamter.formData.ToObject<JObject>();
var fieldValueList = new List<string>();
var formField = approversProperties.formField;
if (approversProperties.assignList.Any() && flowTaskParamter.flowTaskNodeEntity.IsNotEmptyOrNull())
{
var ruleList = approversProperties.assignList.Find(x => x.nodeId == flowTaskParamter.flowTaskNodeEntity.NodeCode)?.ruleList;
if (ruleList.IsNotEmptyOrNull() && ruleList.Any(x => x.childField == approversProperties.formField))
{
formField = ruleList.Find(x => x.childField == approversProperties.formField)?.parentField;
}
}
if (jd.ContainsKey(formField))
{
if (jd[formField] is JArray)
{
fieldValueList = jd[formField].ToObject<List<string>>();
}
else
{
if (jd[formField].ToString().IsNotEmptyOrNull())
{
fieldValueList = jd[formField].ToString().Split(",").ToList();
}
}
}
userIdList = _userRelationService.GetUserId(fieldValueList, string.Empty);
break;
// 环节(提交时下个节点是环节就跳过,审批则看环节节点是否是当前节点的上级)
case (int)FlowTaskOperatorEnum.LinkApprover:
if (flowTaskParamter.flowTaskNodeEntityList.Any(x => x.NodeCode.Equals(approversProperties.nodeId) && x.SortCode < flowTaskNodeEntity.SortCode))
{
// 环节节点所有经办人(过滤掉加签人)
userIdList = (await _flowTaskRepository.GetTaskOperatorRecordList(x =>
x.TaskId == flowTaskNodeEntity.TaskId && !SqlFunc.IsNullOrEmpty(x.NodeCode)
&& x.NodeCode.Equals(approversProperties.nodeId) && x.HandleStatus == 1 && x.Status == 0))
.Where(x => HasFreeApprover(x.TaskOperatorId).Result).Where(x => x.HandleId.IsNotEmptyOrNull()).Select(x => x.HandleId).Distinct().ToList();
}
break;
// 接口(接口结构为{"code":200,"data":{"handleId":"admin"},"msg":""})
case (int)FlowTaskOperatorEnum.ServiceApprover:
try
{
var Token = _userManager.ToKen.IsNotEmptyOrNull() ? _userManager.ToKen : _cacheManager.Get<List<UserOnlineModel>>(CommonConst.CACHEKEYONLINEUSER + _userManager.TenantId).Find(x => x.userId == _userManager.UserId).token;
var data = await approversProperties.getUserUrl.SetHeaders(new { Authorization = Token }).GetAsStringAsync();
var result = data.ToObject<RESTfulResult<object>>();
if (result.IsNotEmptyOrNull())
{
var resultJobj = result.data.ToObject<JObject>();
if (result.code == 200)
{
var handleId = resultJobj["handleId"].ToString();
var handleIdList = handleId.Split(",").ToList();
var userList2 = await _usersService.GetUserListByExp(x => x.DeleteMark == null, u => new UserEntity() { Id = u.Id });
// 利用list交集方法过滤非用户数据
userIdList = userList2.Select(x => x.Id).Intersect(handleIdList).ToList();
}
}
}
catch (AppFriendlyException ex)
{
break;
}
break;
// 候选人
case (int)FlowTaskOperatorEnum.CandidateApprover:
userIdList = _flowTaskRepository.GetFlowCandidates(flowTaskNodeEntity.Id);
break;
default:
userIdList = (await GetUserDefined(approversProperties));
userIdList = await GetExtraRuleUsers(userIdList, approversProperties.extraRule, flowTaskNodeEntity.TaskId);
break;
}
userIdList = userList1.Select(x => x.Id).Intersect(userIdList).ToList();// 过滤掉作废人员和非用户人员
if (userIdList.Count == 0)
{
userIdList = _flowTaskRepository.GetFlowCandidates(flowTaskNodeEntity.Id);
}
return userIdList.Distinct().ToList();
}
/// <summary>
/// 附加条件过滤.
/// </summary>
/// <param name="userList">过滤用户.</param>
/// <param name="extraRule">过滤规则.</param>
/// <param name="taskId">任务id.</param>
/// <returns></returns>
private async Task<List<string>> GetExtraRuleUsers(List<string> userList, string extraRule, string taskId)
{
var flowUserEntity = _flowTaskRepository.GetFlowUserEntity(taskId);
if (flowUserEntity.IsNullOrEmpty())
{
var subordinate = (await _usersService.GetUserListByExp(u => u.EnabledMark == 1 && u.DeleteMark == null && u.ManagerId == _userManager.UserId)).Select(u => u.Id).ToList().ToJsonString();
flowUserEntity = new FlowUserEntity()
{
OrganizeId = _userManager.User.OrganizeId,
PositionId = _userManager.User.PositionId,
ManagerId = _userManager.User.ManagerId,
Subordinate = subordinate
};
}
switch (extraRule)
{
case "2":
userList = _userRelationService.GetUserId("Organize", flowUserEntity.OrganizeId).Intersect(userList).ToList();
break;
case "3":
userList = _userRelationService.GetUserId("Position", flowUserEntity.PositionId).Intersect(userList).ToList();
break;
case "4":
userList = new List<string> { flowUserEntity.ManagerId }.Intersect(userList).ToList();
break;
case "5":
userList = flowUserEntity.Subordinate.ToObject<List<string>>().Intersect(userList).ToList();
break;
case "6":
// 直属公司id
var companyId = _departmentService.GetCompanyId(flowUserEntity.OrganizeId);
var objIdList = (await _departmentService.GetCompanyAllDep(companyId)).Select(x => x.Id).ToList();
objIdList.Add(companyId);
userList = _userRelationService.GetUserId(objIdList, "Organize").Intersect(userList).ToList();
break;
}
return userList;
}
/// <summary>
/// 根据类型获取审批人.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="nextFlowTaskNodeEntity">下个审批节点数据.</param>
/// <param name="type">操作标识0提交1审批3:变更).</param>
/// <param name="isShuntNodeCompletion">是否分流合流已完成.</param>
/// <returns></returns>
public async Task AddFlowTaskOperatorEntityByAssigneeType(FlowTaskParamter flowTaskParamter, FlowTaskNodeEntity nextFlowTaskNodeEntity, int type = 1, bool isShuntNodeCompletion = true)
{
try
{
if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(nextFlowTaskNodeEntity.NodeType))
{
var approverPropertiers = nextFlowTaskNodeEntity.NodePropertyJson.ToObject<ApproversProperties>();
var errorUserId = new List<string>();
if (flowTaskParamter.errorRuleUserList.IsNotEmptyOrNull() && flowTaskParamter.errorRuleUserList.ContainsKey(nextFlowTaskNodeEntity.NodeCode))
{
errorUserId = flowTaskParamter.errorRuleUserList[nextFlowTaskNodeEntity.NodeCode];
}
var startProperties = flowTaskParamter.startProperties;
if (type == 3)
{
startProperties.errorRule = "3";
}
// 创建人
var userId = type == 0 ? _userManager.UserId : flowTaskParamter.flowTaskEntity.CreatorUserId;
var handleIds = await GetFlowUserId(flowTaskParamter, approverPropertiers, nextFlowTaskNodeEntity);
if (handleIds.Count == 0 && isShuntNodeCompletion)
{
switch (startProperties.errorRule)
{
case "1":
handleIds.Add("admin");
break;
case "2":
if ((await _usersService.GetUserListByExp(x => startProperties.errorRuleUser.Contains(x.Id) && x.DeleteMark == null && x.EnabledMark == 1)).Any())
{
handleIds = startProperties.errorRuleUser;
}
else
{
handleIds.Add("admin");
}
break;
case "3":
if (errorUserId.IsNotEmptyOrNull() && errorUserId.Count > 0)
{
handleIds = errorUserId;
}
else
{
if (!flowTaskParamter.errorNodeList.Select(x => x.nodeId).Contains(nextFlowTaskNodeEntity.NodeCode))
{
flowTaskParamter.errorNodeList.Add(new FlowTaskCandidateModel { nodeId = nextFlowTaskNodeEntity.NodeCode, nodeName = nextFlowTaskNodeEntity.NodeName });
}
}
break;
case "4":
// 异常节点下一节点是否存在候选人节点.
var falag = flowTaskParamter.flowTaskNodeEntityList.
Any(x => nextFlowTaskNodeEntity.NodeNext.Split(",").Contains(x.NodeCode)
&& FlowTaskNodeTypeEnum.approver.ParseToString().Equals(x.NodeType)
&& x.NodePropertyJson.ToObject<ApproversProperties>().assigneeType == 7);
if (falag)
{
handleIds.Add("admin");
}
else
{
handleIds.Add("jnpf");
}
break;
case "5":
throw Oops.Oh(ErrorCode.WF0035);
}
}
var index = 0;
var isAnyOperatorUser = !_flowTaskRepository.AnyTaskOperatorUser(x => x.TaskNodeId == nextFlowTaskNodeEntity.Id && x.State == "0");// 不存在依次审批插入.
var OperatorUserList = new List<FlowTaskOperatorUserEntity>();
foreach (var item in handleIds)
{
if (item.IsNotEmptyOrNull())
{
if (approverPropertiers.counterSign == 2 && isAnyOperatorUser)
{
FlowTaskOperatorUserEntity flowTaskOperatorUserEntity = new FlowTaskOperatorUserEntity();
flowTaskOperatorUserEntity.Id = SnowflakeIdHelper.NextId();
flowTaskOperatorUserEntity.NodeCode = nextFlowTaskNodeEntity.NodeCode;
flowTaskOperatorUserEntity.NodeName = nextFlowTaskNodeEntity.NodeName;
flowTaskOperatorUserEntity.TaskNodeId = nextFlowTaskNodeEntity.Id;
flowTaskOperatorUserEntity.TaskId = nextFlowTaskNodeEntity.TaskId;
flowTaskOperatorUserEntity.CreatorTime = GetTimerDate(approverPropertiers, flowTaskParamter.flowTaskNodeEntity.NodeCode);
flowTaskOperatorUserEntity.Completion = 0;
flowTaskOperatorUserEntity.State = "0";
flowTaskOperatorUserEntity.Type = approverPropertiers.assigneeType.ToString();
flowTaskOperatorUserEntity.HandleId = item;
flowTaskOperatorUserEntity.SortCode = index++;
OperatorUserList.Add(flowTaskOperatorUserEntity);
if (index == 1)
{
flowTaskParamter.flowTaskOperatorEntityList.Add(OperatorUserList.FirstOrDefault().Adapt<FlowTaskOperatorEntity>());
}
}
else
{
FlowTaskOperatorEntity flowTaskOperatorEntity = new FlowTaskOperatorEntity();
flowTaskOperatorEntity.Id = SnowflakeIdHelper.NextId();
flowTaskOperatorEntity.NodeCode = nextFlowTaskNodeEntity.NodeCode;
flowTaskOperatorEntity.NodeName = nextFlowTaskNodeEntity.NodeName;
flowTaskOperatorEntity.TaskNodeId = nextFlowTaskNodeEntity.Id;
flowTaskOperatorEntity.TaskId = nextFlowTaskNodeEntity.TaskId;
flowTaskOperatorEntity.CreatorTime = GetTimerDate(approverPropertiers, flowTaskParamter.flowTaskNodeEntity.NodeCode);
flowTaskOperatorEntity.Completion = 0;
flowTaskOperatorEntity.State = "0";
flowTaskOperatorEntity.Type = approverPropertiers.assigneeType.ToString();
flowTaskOperatorEntity.HandleId = item;
flowTaskOperatorEntity.SortCode = index++;
flowTaskParamter.flowTaskOperatorEntityList.Add(flowTaskOperatorEntity);
}
}
}
await _flowTaskRepository.CreateTaskOperatorUser(OperatorUserList);
}
}
catch (AppFriendlyException ex)
{
throw Oops.Oh(ex.ErrorCode);
}
}
/// <summary>
/// 获取抄送人.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="handleStatus">审批类型0拒绝1同意.</param>
public async Task GetflowTaskCirculateEntityList(FlowTaskParamter flowTaskParamter, int handleStatus)
{
var circulateUserList = flowTaskParamter.copyIds.IsNotEmptyOrNull() ? flowTaskParamter.copyIds.Split(",").ToList() : new List<string>();
#region
if (handleStatus == 1)
{
var userList = await GetUserDefined(flowTaskParamter.approversProperties, 1);
userList = await GetExtraRuleUsers(userList, flowTaskParamter.approversProperties.extraCopyRule, flowTaskParamter.flowTaskOperatorEntity.TaskId);
circulateUserList = circulateUserList.Union(userList).ToList();
}
foreach (var item in circulateUserList.Distinct())
{
flowTaskParamter.flowTaskCirculateEntityList.Add(new FlowTaskCirculateEntity()
{
Id = SnowflakeIdHelper.NextId(),
ObjectType = flowTaskParamter.flowTaskOperatorEntity.Type,
ObjectId = item,
NodeCode = flowTaskParamter.flowTaskOperatorEntity.NodeCode,
NodeName = flowTaskParamter.flowTaskOperatorEntity.NodeName,
TaskNodeId = flowTaskParamter.flowTaskOperatorEntity.TaskNodeId,
TaskId = flowTaskParamter.flowTaskOperatorEntity.TaskId,
CreatorTime = DateTime.Now,
});
}
#endregion
}
/// <summary>
/// 获取自定义人员名称.
/// </summary>
/// <param name="approversProperties">节点属性.</param>
/// <param name="userNameList">用户名称容器.</param>
/// <param name="userIdList">用户id容器.</param>
/// <returns></returns>
public async Task GetUserNameDefined(ApproversProperties approversProperties, List<string> userNameList, List<string> userIdList = null)
{
if (userIdList == null)
{
userIdList = (await GetUserDefined(approversProperties)).Distinct().ToList();
}
foreach (var item in userIdList)
{
var name = await _usersService.GetUserName(item);
if (name.IsNotEmptyOrNull())
userNameList.Add(name);
}
}
/// <summary>
/// 获取候选人节点信息.
/// </summary>
/// <param name="flowTaskCandidateModels">返回参数.</param>
/// <param name="nextNodeEntities">下一节点集合.</param>
/// <param name="nodeEntities">所有节点.</param>
/// <returns></returns>
public async Task GetCandidates(List<FlowTaskCandidateModel> flowTaskCandidateModels, List<FlowTaskNodeEntity> nextNodeEntities, List<FlowTaskNodeEntity> nodeEntities)
{
foreach (var item in nextNodeEntities)
{
ApproversProperties approverPropertiers = null;
var isSubFlow = false;//是否子流程节点.
if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(item.NodeType))
approverPropertiers = item.NodePropertyJson.ToObject<ApproversProperties>();
if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(item.NodeType))
{
approverPropertiers = item.NodePropertyJson.ToObject<ChildTaskProperties>().Adapt<ApproversProperties>();
isSubFlow = true;
}
if (approverPropertiers.IsNotEmptyOrNull())
{
if (approverPropertiers.assigneeType == 7 || approverPropertiers.isBranchFlow)
{
var candidateItem = new FlowTaskCandidateModel();
candidateItem.nodeId = item.NodeCode;
candidateItem.nodeName = item.NodeName;
candidateItem.isBranchFlow = approverPropertiers.isBranchFlow;
candidateItem.isCandidates = approverPropertiers.assigneeType == 7;
var objIds = approverPropertiers.approverRole
.Union(approverPropertiers.approverPos)
.Union(approverPropertiers.approverOrg)
.Union(approverPropertiers.approverGroup).ToList();
var flag = false;//是否有数据
var input = new UserConditionInput()
{
departIds = objIds,
userIds = approverPropertiers.approvers,
pagination = new PageInputBase()
};
_userRelationService.GetUserPage(input, ref flag);
candidateItem.hasCandidates = flag;
flowTaskCandidateModels.Add(candidateItem);
}
}
// 子流程节点则要看下一节点是否存在候选人或选择分支
if (isSubFlow)
{
var subFlowNextNodes = nodeEntities.FindAll(m => item.NodeNext.Contains(m.NodeCode));
await GetCandidates(flowTaskCandidateModels, subFlowNextNodes, nodeEntities);
}
}
}
/// <summary>
/// 候选人员列表.
/// </summary>
/// <param name="nextNodeEntity">下一节点.</param>
/// <param name="flowHandleModel">审批参数.</param>
/// <param name="hasCandidates">是否存在候选人.</param>
/// <returns></returns>
public dynamic GetCandidateItems(FlowTaskNodeEntity nextNodeEntity, FlowHandleModel flowHandleModel, bool hasCandidates = true)
{
var approverPropertiers = nextNodeEntity.NodePropertyJson.ToObject<ApproversProperties>();
if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(nextNodeEntity.NodeType))
{
approverPropertiers = nextNodeEntity.NodePropertyJson.ToObject<ChildTaskProperties>().Adapt<ApproversProperties>();
}
var objIds = approverPropertiers.approverRole
.Union(approverPropertiers.approverPos)
.Union(approverPropertiers.approverOrg)
.Union(approverPropertiers.approverGroup).ToList();
var input = new UserConditionInput()
{
departIds = objIds,
userIds = approverPropertiers.approvers,
pagination = flowHandleModel
};
return _userRelationService.GetUserPage(input, ref hasCandidates);
}
/// <summary>
/// 获取子流程下异常节点信息.
/// </summary>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="nextNodeEntities">下一节点集合.</param>
/// <returns></returns>
public async Task GetErrorNode(FlowTaskParamter flowTaskParamter, List<FlowTaskNodeEntity> nextNodeEntities)
{
try
{
foreach (var item in nextNodeEntities)
{
if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(item.NodeType))
{
var approverPropertiers = item.NodePropertyJson.ToObject<ApproversProperties>();
var list = await GetFlowUserId(flowTaskParamter, approverPropertiers, item);
if (list.Count == 0)
{
if (flowTaskParamter.startProperties.errorRule == "3" && !flowTaskParamter.errorNodeList.Select(x => x.nodeId).Contains(item.NodeCode))
{
var candidateItem = new FlowTaskCandidateModel();
candidateItem.nodeId = item.NodeCode;
candidateItem.nodeName = item.NodeName;
flowTaskParamter.errorNodeList.Add(candidateItem);
}
if (flowTaskParamter.startProperties.errorRule == "5")
throw Oops.Oh(ErrorCode.WF0035);
}
}
else if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(item.NodeType))
{
var subFlowNextNodes = flowTaskParamter.flowTaskNodeEntityList.FindAll(m => item.NodeNext.Contains(m.NodeCode));
await GetErrorNode(flowTaskParamter, subFlowNextNodes);
}
}
}
catch (AppFriendlyException ex)
{
throw Oops.Oh(ex.ErrorCode);
}
}
/// <summary>
/// 获取子流程发起人.
/// </summary>
/// <param name="childTaskProperties">子流程属性.</param>
/// <param name="flowTaskParamter">当前任务参数.</param>
/// <param name="flowTaskNodeEntity">子流程节点.</param>
/// <returns></returns>
public async Task<List<string>> GetSubFlowCrUser(ChildTaskProperties childTaskProperties, FlowTaskParamter flowTaskParamter, FlowTaskNodeEntity flowTaskNodeEntity)
{
var approverPropertiers = childTaskProperties.Adapt<ApproversProperties>();
var childTaskCrUserList = await GetFlowUserId(flowTaskParamter, approverPropertiers, flowTaskNodeEntity);
if (childTaskCrUserList.Count == 0)
{
switch (childTaskProperties.errorRule)
{
case "2":
if ((await _usersService.GetUserListByExp(x => childTaskProperties.errorRuleUser.Contains(x.Id) && x.DeleteMark == null && x.EnabledMark == 1)).Any())
{
childTaskCrUserList = childTaskProperties.errorRuleUser;
}
else
{
childTaskCrUserList.Add("admin");
}
break;
case "6":
childTaskCrUserList.Add(flowTaskParamter.flowTaskEntity.CreatorUserId);
break;
default:
childTaskCrUserList.Add("admin");
break;
}
}
return childTaskCrUserList;
}
/// <summary>
/// 获取审批人名称.
/// </summary>
/// <param name="flowTaskNodeModel">当前节点.</param>
/// <param name="flowTaskParamter">任务参数.</param>
/// <param name="flowJsonModel">流程实体.</param>
/// <returns></returns>
public async Task<string> GetApproverUserName(FlowTaskNodeModel flowTaskNodeModel, FlowTaskParamter flowTaskParamter, FlowJsonModel flowJsonModel)
{
var userNameList = new List<string>();
var userName = await _usersService.GetUserName(flowTaskParamter.flowTaskEntity.CreatorUserId);
if (flowTaskNodeModel.nodeType.Equals(FlowTaskNodeTypeEnum.start.ParseToString()))
{
if (flowJsonModel.visibleType == 0)
{
userNameList.Add(userName);
}
else
{
await GetUserNameDefined(flowTaskParamter.startProperties.Adapt<ApproversProperties>(), userNameList);
}
}
else if (flowTaskNodeModel.nodeType.Equals(FlowTaskNodeTypeEnum.subFlow.ParseToString()))
{
var subFlowProperties = flowTaskNodeModel.nodePropertyJson.ToObject<ChildTaskProperties>();
var userIdList = (await _flowTaskRepository.GetTaskList(x => subFlowProperties.childTaskId.Contains(x.Id))).Select(x => x.CreatorUserId).ToList();
var approverProperties = subFlowProperties.Adapt<ApproversProperties>();
if (userIdList.Count == 0)
{
userIdList = await GetFlowUserId(flowTaskParamter, approverProperties, flowTaskNodeModel.Adapt<FlowTaskNodeEntity>());
}
await GetUserNameDefined(approverProperties, userNameList, userIdList);
}
else
{
var approverProperties = flowTaskNodeModel.nodePropertyJson.ToObject<ApproversProperties>();
var userIdList = (await _flowTaskRepository.GetTaskOperatorList(x => x.TaskNodeId == flowTaskNodeModel.id && SqlFunc.IsNullOrEmpty(x.ParentId) && !x.State.Equals("-1"))).Select(x => x.HandleId).Distinct().ToList();
if (approverProperties.counterSign == 2)
{
userIdList = (await _flowTaskRepository.GetTaskOperatorUserList(x => x.TaskId == flowTaskNodeModel.taskId && x.TaskNodeId == flowTaskNodeModel.id)).Select(x => x.HandleId).ToList();
}
if (!userIdList.Any())
{
userIdList = await GetFlowUserId(flowTaskParamter, approverProperties, flowTaskNodeModel.Adapt<FlowTaskNodeEntity>());
}
await GetUserNameDefined(approverProperties, userNameList, userIdList);
}
return string.Join(",", userNameList.Distinct());
}
/// <summary>
/// 获取级别主管.
/// </summary>
/// <param name="managerId">主管id.</param>
/// <param name="level">级别.</param>
/// <returns></returns>
public async Task<string> GetManagerByLevel(string managerId, int level)
{
--level;
if (level == 0)
{
return managerId;
}
else
{
var manager = await _usersService.GetInfoByUserIdAsync(managerId);
return manager.IsNullOrEmpty() ? string.Empty : await GetManagerByLevel(manager.ManagerId, level);
}
}
/// <summary>
/// 判断经办记录人是否加签且加签是否完成.
/// </summary>
/// <param name="id">经办id.</param>
/// <returns></returns>
public async Task<bool> HasFreeApprover(string id)
{
var entityList = await GetOperator(id, new List<FlowTaskOperatorEntity>());
if (entityList.Count == 0)
{
return true;
}
else
{
return !entityList.Any(x => x.HandleStatus.IsEmpty() || x.HandleStatus == 0);
}
}
/// <summary>
/// 递归获取加签人.
/// </summary>
/// <param name="id">经办id.</param>
/// <param name="flowTaskOperatorEntities">所有经办.</param>
/// <returns></returns>
public async Task<List<FlowTaskOperatorEntity>> GetOperator(string id, List<FlowTaskOperatorEntity> flowTaskOperatorEntities)
{
var childEntity = await _flowTaskRepository.GetTaskOperatorInfo(x => x.ParentId == id && !x.State.Equals("-1"));
if (childEntity.IsNotEmptyOrNull())
{
childEntity.State = "-1";
flowTaskOperatorEntities.Add(childEntity);
return await GetOperator(childEntity.Id, flowTaskOperatorEntities);
}
else
{
return flowTaskOperatorEntities;
}
}
/// <summary>
/// 递归获取加签人.
/// </summary>
/// <param name="id">经办id.</param>
/// <param name="flowTaskOperatorEntities">所有经办.</param>
/// <returns></returns>
public async Task<List<FlowTaskOperatorEntity>> GetOperatorNew(string id, List<FlowTaskOperatorEntity> flowTaskOperatorEntities)
{
var childEntity = await _flowTaskRepository.GetTaskOperatorInfo(x => x.HandleType == id && !x.State.Equals("-1"));
if (childEntity.IsNotEmptyOrNull())
{
childEntity.State = "-1";
flowTaskOperatorEntities.Add(childEntity);
return await GetOperatorNew(childEntity.Id, flowTaskOperatorEntities);
}
else
{
return flowTaskOperatorEntities;
}
}
/// <summary>
/// 获取自定义人员.
/// </summary>
/// <param name="approversProperties">节点属性.</param>
/// <param name="userType">0审批人员1抄送人员.</param>
/// <returns></returns>
public async Task<List<string>> GetUserDefined(ApproversProperties approversProperties, int userType = 0)
{
var userIdList = new List<string>();
var objIdList = new List<string>();
if (userType == 0)
{
userIdList = approversProperties.approvers;
objIdList = approversProperties.approverRole
.Union(approversProperties.approverPos)
.Union(approversProperties.approverOrg)
.Union(approversProperties.approverGroup).ToList();
}
else
{
userIdList = approversProperties.circulateUser;
objIdList = approversProperties.circulateRole
.Union(approversProperties.circulatePosition)
.Union(approversProperties.circulateOrg)
.Union(approversProperties.circulateGroup).ToList();
}
userIdList = userIdList.Union(_userRelationService.GetUserId(objIdList, string.Empty)).ToList();
return userIdList;
}
/// <summary>
/// 获取定时器节点定时结束时间.
/// </summary>
/// <param name="approverPropertiers">定时器节点属性.</param>
/// <param name="nodeCode">定时器节点编码.</param>
/// <returns></returns>
public DateTime GetTimerDate(ApproversProperties approverPropertiers, string nodeCode)
{
var nowTime = DateTime.Now;
if (approverPropertiers.timerList.Count > 0)
{
string upNodeStr = string.Join(",", approverPropertiers.timerList.Select(x => x.upNodeCode).ToArray());
if (upNodeStr.Contains(nodeCode))
{
foreach (var item in approverPropertiers.timerList)
{
var result = DateTime.Now.AddDays(item.day).AddHours(item.hour).AddMinutes(item.minute).AddSeconds(item.second);
if (result > nowTime)
{
nowTime = result;
}
}
}
}
return nowTime;
}
}

View File

@@ -0,0 +1,785 @@
using System.Text;
using JNPF.Common.Core.Manager;
using JNPF.Common.Extension;
using JNPF.Common.Models.WorkFlow;
using JNPF.Common.Security;
using JNPF.Extras.Thirdparty.JSEngine;
using JNPF.FriendlyException;
using JNPF.Systems.Interfaces.Permission;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Enum;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Entitys.Model.Item;
using JNPF.WorkFlow.Entitys.Model.Properties;
using JNPF.WorkFlow.Interfaces.Repository;
using Mapster;
using Newtonsoft.Json.Linq;
namespace JNPF.WorkFlow.Manager;
public class FlowTemplateUtil
{
private readonly IDataBaseManager _dataBaseManager;
private readonly IUserManager _userManager;
private readonly IFlowTaskRepository _flowTaskRepository;
private readonly IUsersService _usersService;
/// <summary>
/// 可用节点.
/// </summary>
public List<FlowTaskNodeEntity> flowTaskNodeEntityList { get; set; } = new List<FlowTaskNodeEntity>();
/// <summary>
/// 所有节点.
/// </summary>
public List<TaskNodeModel> taskNodeList { get; set; } = new List<TaskNodeModel>();
/// <summary>
/// 开始节点.
/// </summary>
public FlowTaskNodeEntity startNode { get; set; } = new FlowTaskNodeEntity();
/// <summary>
/// 开始节点属性.
/// </summary>
public StartProperties startPro { get; set; } = new StartProperties();
public FlowTemplateUtil(IDataBaseManager dataBaseManager, IUserManager userManager, IFlowTaskRepository flowTaskRepository,
IUsersService usersService)
{
_dataBaseManager = dataBaseManager;
_userManager = userManager;
_flowTaskRepository = flowTaskRepository;
_usersService = usersService;
}
/// <summary>
/// 加载参数.
/// </summary>
/// <param name="flowEngineEntity"></param>
/// <param name="formData"></param>
/// <param name="taskId"></param>
public void Load(FlowJsonModel flowJsonModel, string formData, string taskId, bool isDeleteCondition = true)
{
this.flowTaskNodeEntityList.Clear();
this.taskNodeList.Clear();
var flowTemplateJsonModel = flowJsonModel.flowTemplateJson.ToObject<FlowTemplateJsonModel>();
#region
var flowTemplateJsonModelList = new List<FlowTemplateJsonModel>();
var childNodeIdList = new List<string>();
GetChildNodeIdList(flowTemplateJsonModel, childNodeIdList);
GetFlowTemplateList(flowTemplateJsonModel, flowTemplateJsonModelList);
#endregion
GetFlowTemplateAll(flowTemplateJsonModel, this.taskNodeList, flowTemplateJsonModelList, childNodeIdList, taskId);
if (isDeleteCondition)
{
DeleteConditionTaskNodeModel(taskNodeList, formData, taskId);
var defaultFormId = this.taskNodeList.Find(m => FlowTaskNodeTypeEnum.start.ParseToString().Equals(m.type)).propertyJson.formId;
foreach (var item in this.taskNodeList)
{
var flowTaskNodeEntity = new FlowTaskNodeEntity();
flowTaskNodeEntity.Id = SnowflakeIdHelper.NextId();
flowTaskNodeEntity.CreatorTime = DateTime.Now;
flowTaskNodeEntity.TaskId = item.taskId;
flowTaskNodeEntity.NodeCode = item.nodeId;
flowTaskNodeEntity.NodeType = item.type;
flowTaskNodeEntity.Completion = FlowTaskNodeTypeEnum.start.ParseToString().Equals(item.type) ? 1 : 0;
flowTaskNodeEntity.NodeName = FlowTaskNodeTypeEnum.start.ParseToString().Equals(item.type) ? "开始" : item.propertyJson.title;
flowTaskNodeEntity.NodeUp = !FlowTaskNodeTypeEnum.approver.ParseToString().Equals(item.type) ? null : item.propertyJson.rejectStep;
flowTaskNodeEntity.NodeNext = item.nextNodeId;
flowTaskNodeEntity.NodePropertyJson = JsonHelper.ToJsonString(item.propertyJson);
flowTaskNodeEntity.State = "1";
if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(item.type))
{
string subFlowId = item.propertyJson.flowId;//子流程流程id
var jsonInfo = _flowTaskRepository.GetFlowTemplateJsonInfo(x => x.Id == subFlowId && x.DeleteMark == null);
flowTaskNodeEntity.FormId = jsonInfo.FlowTemplateJson.ToObject<FlowTemplateJsonModel>().properties.ToObject<StartProperties>().formId;
}
else
{
string formId = item.propertyJson.formId;
flowTaskNodeEntity.FormId = formId.IsNotEmptyOrNull() ? formId : defaultFormId;
}
flowTaskNodeEntityList.Add(flowTaskNodeEntity);
}
DeleteTimerTaskNode(this.flowTaskNodeEntityList);
this.startNode = this.flowTaskNodeEntityList.Find(m => FlowTaskNodeTypeEnum.start.ParseToString().Equals(m.NodeType));
this.startPro = this.startNode.NodePropertyJson.ToObject<StartProperties>();
}
}
/// <summary>
/// 递归获取流程模板最外层childNode中所有nodeid.
/// </summary>
/// <param name="template">流程模板实例.</param>
/// <param name="childNodeIdList">子节点id.</param>
private void GetChildNodeIdList(FlowTemplateJsonModel template, List<string> childNodeIdList)
{
if (template.IsNotEmptyOrNull() && template.childNode.IsNotEmptyOrNull())
{
childNodeIdList.Add(template.childNode.nodeId);
GetChildNodeIdList(template.childNode, childNodeIdList);
}
}
/// <summary>
/// 递归获取流程模板数组.
/// </summary>
/// <param name="template">流程模板.</param>
/// <param name="templateList">流程模板数组.</param>
private void GetFlowTemplateList(FlowTemplateJsonModel template, List<FlowTemplateJsonModel> templateList)
{
if (template.IsNotEmptyOrNull())
{
var haschildNode = template.childNode.IsNotEmptyOrNull();
var hasconditionNodes = template.conditionNodes.IsNotEmptyOrNull() && template.conditionNodes.Count > 0;
templateList.Add(template);
if (hasconditionNodes)
{
foreach (var conditionNode in template.conditionNodes)
{
GetFlowTemplateList(conditionNode, templateList);
}
}
if (haschildNode)
{
GetFlowTemplateList(template.childNode, templateList);
}
}
}
/// <summary>
/// 递归审批模板获取所有节点.
/// </summary>
/// <param name="template">当前审批流程json.</param>
/// <param name="nodeList">流程节点数组.</param>
/// <param name="templateList">流程模板数组.</param>
private void GetFlowTemplateAll(FlowTemplateJsonModel template, List<TaskNodeModel> nodeList, List<FlowTemplateJsonModel> templateList, List<string> childNodeIdList, string taskId = "")
{
try
{
if (template.IsNotEmptyOrNull())
{
var taskNodeModel = template.Adapt<TaskNodeModel>();
taskNodeModel.taskId = taskId;
taskNodeModel.propertyJson = GetPropertyByType(template.type, template.properties);
if (taskNodeModel.isBranchFlow)
{
taskNodeModel.propertyJson.isBranchFlow = taskNodeModel.isBranchFlow;
}
var haschildNode = template.childNode.IsNotEmptyOrNull();
var hasconditionNodes = template.conditionNodes.IsNotEmptyOrNull() && template.conditionNodes.Count > 0;
List<string> nextNodeIdList = new List<string> { string.Empty };
if (templateList.Count > 1)
{
nextNodeIdList = GetNextNodeIdList(templateList, template, childNodeIdList);
}
taskNodeModel.nextNodeId = string.Join(',', nextNodeIdList.ToArray());
nodeList.Add(taskNodeModel);
if (hasconditionNodes)
{
foreach (var conditionNode in template.conditionNodes)
{
GetFlowTemplateAll(conditionNode, nodeList, templateList, childNodeIdList, taskId);
}
}
if (haschildNode)
{
taskNodeModel.childNodeId = template.childNode.nodeId;
GetFlowTemplateAll(template.childNode, nodeList, templateList, childNodeIdList, taskId);
}
}
}
catch (AppFriendlyException ex)
{
throw Oops.Oh(ex.ErrorCode);
}
}
/// <summary>
/// 根据类型获取不同属性对象.
/// </summary>
/// <param name="type">属性类型.</param>
/// <param name="jd">数据.</param>
/// <returns></returns>
private dynamic GetPropertyByType(string type, JObject jd)
{
switch (type)
{
case "approver":
return jd.ToObject<ApproversProperties>();
case "timer":
return jd.ToObject<TimerProperties>();
case "start":
return jd.ToObject<StartProperties>();
case "condition":
return jd.ToObject<ConditionProperties>();
case "subFlow":
return jd.ToObject<ChildTaskProperties>();
default:
return jd;
}
}
/// <summary>
/// 获取当前模板的下一节点
/// 下一节点数据来源conditionNodes和childnode (conditionNodes优先级大于childnode)
/// conditionNodes非空下一节点则为conditionNodes数组中所有nodeID
/// conditionNodes非空childNode非空下一节点则为childNode的nodeId
/// conditionNodes空childNode空则为最终节点(两种情况当前模板属于conditionNodes的最终节点或childNode的最终节点)
/// conditionNodes的最终节点:下一节点为与conditionNodes同级的childNode的nodeid,没有则继续递归直到最外层的childNode
/// childNode的最终节点直接为"".
/// </summary>
/// <param name="templateList">模板数组</param>
/// <param name="template">当前模板</param>
/// <param name="childNodeIdList">最外层childnode的nodeid集合</param>
/// <returns></returns>
private List<string> GetNextNodeIdList(List<FlowTemplateJsonModel> templateList, FlowTemplateJsonModel template, List<string> childNodeIdList)
{
List<string> nextNodeIdList = new List<string>();
if (template.conditionNodes.IsNotEmptyOrNull() && template.conditionNodes.Count > 0)
{
nextNodeIdList = template.conditionNodes.Select(x => x.nodeId).ToList();
}
else
{
if (template.childNode.IsNotEmptyOrNull())
{
nextNodeIdList.Add(template.childNode.nodeId);
}
else
{
//判断是否是最外层的节点
if (childNodeIdList.Contains(template.nodeId))
{
nextNodeIdList.Add(string.Empty);
}
else
{
//conditionNodes中最终节点
nextNodeIdList.Add(GetChildId(templateList, template, childNodeIdList));
}
}
}
return nextNodeIdList;
}
/// <summary>
/// 递归获取conditionNodes最终节点下一节点.
/// </summary>
/// <param name="templateList">流程模板数组.</param>
/// <param name="template">当前模板.</param>
/// <param name="childNodeIdList">最外层childNode的节点数据.</param>
/// <returns></returns>
private string GetChildId(List<FlowTemplateJsonModel> templateList, FlowTemplateJsonModel template, List<string> childNodeIdList)
{
var prevModel = new FlowTemplateJsonModel();
if (template.prevId.IsNotEmptyOrNull())
{
prevModel = templateList.Find(x => x.nodeId.Equals(template.prevId));
if (prevModel.childNode.IsNotEmptyOrNull() && prevModel.childNode.nodeId != template.nodeId)
{
return prevModel.childNode.nodeId;
}
if (childNodeIdList.Contains(prevModel.nodeId))
{
return prevModel.childNode.IsNullOrEmpty() ? string.Empty : prevModel.childNode.nodeId;
}
else
{
return GetChildId(templateList, prevModel, childNodeIdList);
}
}
else
{
return string.Empty;
}
}
/// <summary>
/// 删除条件节点
/// 将条件的上非条件的节点的nextnode替换成当前条件的nextnode.
/// </summary>
/// <param name="taskNodeModelList">所有节点数据.</param>
/// <param name="formDataJson">填写表单数据.</param>
/// <param name="taskId">任务id.</param>
/// <returns></returns>
private void DeleteConditionTaskNodeModel(List<TaskNodeModel> taskNodeModelList, string formDataJson, string taskId)
{
var conditionTaskNodeModelList = taskNodeModelList.FindAll(x => FlowTaskNodeTypeEnum.condition.ParseToString().Equals(x.type));
var dic = new Dictionary<string, List<TaskNodeModel>>();
foreach (var item in conditionTaskNodeModelList.GroupBy(x => x.upNodeId))
{
dic.Add(item.Key, taskNodeModelList.FindAll(x => x.upNodeId == item.Key && FlowTaskNodeTypeEnum.condition.ParseToString().Equals(x.type)));
}
//条件的默认情况判断(同层条件的父节点是一样的,只要非默认的匹配成功则不需要走默认的)
var isDefault = new List<string>();
foreach (var nodeId in dic.Keys)
{
var index = 0;
foreach (var item in dic[nodeId])
{
++index;
//条件节点的父节点且为非条件的节点
var upTaskNodeModel = taskNodeModelList.Find(x => x.nodeId == nodeId);
if (FlowTaskNodeTypeEnum.condition.ParseToString().Equals(upTaskNodeModel.type))
{
// 父级条件不满足则子级条件则不需要验证
if (!upTaskNodeModel.propertyJson.isDefault && !ConditionNodeJudge(formDataJson, upTaskNodeModel.propertyJson, taskId))
{
break;
}
upTaskNodeModel = GetUpTaskNodeModelIsNotCondition(taskNodeModelList, upTaskNodeModel);
// 如果父节点下一节点存在某个审批节点则不需要判断了
if (taskNodeModelList.Where(x => upTaskNodeModel.nextNodeId.Contains(x.nodeId)).Any(y => FlowTaskNodeTypeEnum.approver.ParseToString().Equals(y.type)))
{
break;
}
}
if (!item.propertyJson.isDefault && ConditionNodeJudge(formDataJson, item.propertyJson, taskId))
{
upTaskNodeModel.nextNodeId = item.nextNodeId;
isDefault.Add(item.upNodeId);
break;
}
else
{
if (!isDefault.Contains(item.upNodeId) && item.propertyJson.isDefault)
{
upTaskNodeModel.nextNodeId = item.nextNodeId;
}
else
{
if (index == dic[nodeId].Count)
{
upTaskNodeModel.nextNodeId = upTaskNodeModel.childNodeId.IsNotEmptyOrNull() ? upTaskNodeModel.childNodeId : FlowTaskNodeTypeEnum.end.ParseToString();
}
}
}
}
}
if (formDataJson.IsNotEmptyOrNull())
{
taskNodeModelList.RemoveAll(x => FlowTaskNodeTypeEnum.condition.ParseToString().Equals(x.type));
}
}
/// <summary>
/// 向上递获取非条件的节点.
/// </summary>
/// <param name="taskNodeModelList">所有节点数据.</param>
/// <param name="taskNodeModel">当前节点.</param>
/// <returns></returns>
private TaskNodeModel GetUpTaskNodeModelIsNotCondition(List<TaskNodeModel> taskNodeModelList, TaskNodeModel taskNodeModel)
{
var preTaskNodeModel = taskNodeModelList.Find(x => x.nodeId == taskNodeModel.upNodeId);
if (FlowTaskNodeTypeEnum.condition.ParseToString().Equals(preTaskNodeModel.type))
{
return GetUpTaskNodeModelIsNotCondition(taskNodeModelList, preTaskNodeModel);
}
else
{
return preTaskNodeModel;
}
}
/// <summary>
/// 条件判断.
/// </summary>
/// <param name="formDataJson">表单填写数据.</param>
/// <param name="conditionPropertie">条件属性.</param>
/// <param name="taskId">任务id.</param>
/// <returns></returns>
private bool ConditionNodeJudge(string formDataJson, ConditionProperties conditionPropertie, string taskId)
{
try
{
bool flag = false;
StringBuilder expression = new StringBuilder();
expression.AppendFormat("select * from base_user where ");
var formData = formDataJson.ToObject<JObject>();
int i = 0;
foreach (ConditionsItem flowNodeWhereModel in conditionPropertie.conditions)
{
var logic = flowNodeWhereModel.logic;
var symbol = flowNodeWhereModel.symbol.Equals("==") ? "=" : flowNodeWhereModel.symbol;
// 条件值
var formValue = GetConditionValue(flowNodeWhereModel.fieldType.ParseToInt(), formData, flowNodeWhereModel.field, taskId, flowNodeWhereModel.jnpfKey);
// 匹配值
var value = " ";
if (flowNodeWhereModel.fieldValueType.ParseToInt() == 2)
{
//数组类型控件
var jnpfKeyList = new List<string>() { "cascader", "comSelect", "address", "currOrganize" };
if (jnpfKeyList.Contains(flowNodeWhereModel.jnpfKey) && flowNodeWhereModel.fieldValue.Count > 0)
{
if (flowNodeWhereModel.jnpfKey.Equals("currOrganize"))
{
value = flowNodeWhereModel.fieldValue[flowNodeWhereModel.fieldValue.Count - 1];
}
else
{
value = string.Join(",", flowNodeWhereModel.fieldValue);
}
}
else
{
value = flowNodeWhereModel.fieldValue.ToString();
}
if ("currentUser".Equals(value))
{
value = _userManager.UserId;
}
if ("time".Equals(flowNodeWhereModel.jnpfKey))
{
formValue = formValue.Replace(":", string.Empty);
value = value.Replace(":", string.Empty);
}
}
else
{
value = GetConditionValue(flowNodeWhereModel.fieldValueType.ParseToInt(), formData, flowNodeWhereModel.fieldValue, taskId, flowNodeWhereModel.jnpfKey);
}
if (symbol.Equals("=") || symbol.Equals("<>"))
{
expression.AppendFormat("('{0}'{1}'{2}')", formValue, symbol, value);
}
else if (symbol.Equals("like"))
{
expression.AppendFormat("('{0}' {1} '%{2}%')", formValue, symbol, value);
}
else if (symbol.Equals("notLike"))
{
expression.AppendFormat("('{0}' {1} '%{2}%')", formValue, "not like", value);
}
else
{
if (string.IsNullOrWhiteSpace(formValue) || string.IsNullOrWhiteSpace(value))
{
expression.Append("(1=2)");
}
else
{
expression.AppendFormat("({0}{1}{2})", formValue, symbol, value);
}
}
if (logic.IsNotEmptyOrNull() && i != conditionPropertie.conditions.Count - 1)
{
expression.Append(" " + logic.Replace("&&", " and ").Replace("||", " or ") + " ");
}
i++;
}
var link = _dataBaseManager.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName);
flag = _dataBaseManager.WhereDynamicFilter(link, expression.ToString());
return flag;
}
catch (Exception e)
{
return false;
}
}
/// <summary>
/// 获取条件匹配值.
/// </summary>
/// <param name="type">条件类型 1、字段 2、自定义 3、聚合函数.</param>
/// <param name="formData">表单数据.</param>
/// <param name="field">关联字段.</param>
/// <param name="taskId">任务id.</param>
/// <param name="jnpfKey">控件key.</param>
/// <returns></returns>
private string GetConditionValue(int type, JObject formData, string field, string taskId, string jnpfKey)
{
var conditionValue = " ";
if (type == 1)
{
if (formData.ContainsKey(field))
{
if (formData[field] is JArray)
{
try
{
var jar = formData[field].ToObject<List<string>>();
if (jar.Count > 0)
{
conditionValue = string.Join(",", jar);
}
}
catch (Exception e)
{
var arr = formData[field].ToObject<List<List<string>>>();
conditionValue = string.Join(",", arr.Select(x => string.Join(",", x)).ToList());
}
}
else
{
if (formData[field].IsNotEmptyOrNull())
{
conditionValue = formData[field].ToString();
SysWidgetFormValue(taskId, jnpfKey, ref conditionValue);
}
}
}
}
else
{
// 获取聚合函数要替换的参数key
foreach (var item in field.Substring3())
{
if (formData.ContainsKey(item))
{
field = field.Replace("{" + item + "}", "'" + formData[item] + "'");
}
else if (item.Contains("tableField") && item.Contains("-"))
{
var fields = item.Split("-").ToList();
var tableField = fields[0];
var keyField = fields[1];
if (formData.ContainsKey(tableField) && formData[tableField] is JArray)
{
var jar = formData[tableField] as JArray;
var tableValue = jar.Where(x => x.ToObject<JObject>().ContainsKey(keyField)).Select(x => x.ToObject<JObject>()[keyField]).ToObject<List<string>>();
var valueStr = string.Join("','", tableValue);
field = field.Replace("{" + item + "}", "'" + valueStr + "'");
}
}
else
{
field = field.Replace("{" + item + "}", "''");
}
}
// 执行函数获取值
conditionValue = JsEngineUtil.AggreFunction(field).ToString();
}
return conditionValue;
}
/// <summary>
/// 系统控件条件匹配数据转换.
/// </summary>
/// <param name="taskId">任务id</param>
/// <param name="jnpfKey">条件匹配字段类型</param>
/// <param name="formValue">条件匹配值</param>
private void SysWidgetFormValue(string taskId, string jnpfKey, ref string formValue)
{
var taskEntity = _flowTaskRepository.GetTaskFirstOrDefault(taskId);
if (taskEntity.IsNotEmptyOrNull())
{
var creatorUser = _usersService.GetInfoByUserId(taskEntity.CreatorUserId);
switch (jnpfKey)
{
case "createUser":
formValue = taskEntity.CreatorUserId;
break;
case "modifyUser":
if (taskEntity.LastModifyUserId.IsNotEmptyOrNull())
{
formValue = _userManager.UserId;
}
break;
case "currOrganize":
if (creatorUser.OrganizeId.IsNotEmptyOrNull())
{
formValue = creatorUser.OrganizeId;
}
break;
case "createTime":
formValue = ((DateTime)taskEntity.CreatorTime).ParseToUnixTime().ToString();
break;
case "modifyTime":
if (taskEntity.LastModifyTime.IsNotEmptyOrNull())
{
formValue = DateTime.Now.ParseToUnixTime().ToString();
}
break;
case "currPosition":
if (creatorUser.PositionId.IsNotEmptyOrNull())
{
formValue = creatorUser.PositionId;
}
break;
}
}
else
{
switch (jnpfKey)
{
case "createUser":
formValue = _userManager.UserId;
break;
case "modifyUser":
formValue = " ";
break;
case "currOrganize":
if (_userManager.User.OrganizeId.IsNotEmptyOrNull())
{
formValue = _userManager.User.OrganizeId;
}
break;
case "createTime":
formValue = DateTime.Now.ParseToUnixTime().ToString();
break;
case "modifyTime":
formValue = "0";
break;
case "currPosition":
if (_userManager.User.PositionId.IsNotEmptyOrNull())
{
formValue = _userManager.User.PositionId;
}
break;
}
}
}
/// <summary>
/// 删除定时器.
/// </summary>
/// <param name="flowTaskNodeEntityList">所有节点</param>
private void DeleteTimerTaskNode(List<FlowTaskNodeEntity> flowTaskNodeEntityList)
{
foreach (var item in flowTaskNodeEntityList)
{
if ("timer".Equals(item.NodeType))
{
// 下一节点为Timer类型节点的节点集合
var taskNodeList = flowTaskNodeEntityList.FindAll(x => x.NodeNext.Contains(item.NodeCode));
// Timer类型节点的下节点集合
var nextTaskNodeList = flowTaskNodeEntityList.FindAll(x => item.NodeNext.Contains(x.NodeCode));
// 保存定时器节点的上节点编码到属性中
var timerProperties = item.NodePropertyJson.ToObject<TimerProperties>();
timerProperties.upNodeCode = string.Join(",", taskNodeList.Select(x => x.NodeCode).ToArray());
item.NodePropertyJson = timerProperties.ToJsonString();
// 上节点替换NodeNext
foreach (var taskNode in taskNodeList)
{
var flowTaskNodeEntity = flowTaskNodeEntityList.Where(x => x.NodeCode == taskNode.NodeCode).FirstOrDefault();
flowTaskNodeEntity.NodeNext = item.NodeNext;
}
// 下节点添加定时器属性
nextTaskNodeList.ForEach(nextNode =>
{
var flowTaskNodeEntity = flowTaskNodeEntityList.Where(x => x.NodeCode == nextNode.NodeCode).FirstOrDefault();
if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(flowTaskNodeEntity.NodeType))
{
var properties = flowTaskNodeEntity.NodePropertyJson.ToObject<ApproversProperties>();
properties.timerList.Add(item.NodePropertyJson.ToObject<TimerProperties>());
flowTaskNodeEntity.NodePropertyJson = JsonHelper.ToJsonString(properties);
}
});
}
}
flowTaskNodeEntityList.RemoveAll(x => FlowTaskNodeTypeEnum.timer.ParseToString().Equals(x.NodeType));
UpdateNodeSort(flowTaskNodeEntityList);
}
/// <summary>
/// 处理并保存节点.
/// </summary>
/// <param name="entitys">节点list.</param>
private void UpdateNodeSort(List<FlowTaskNodeEntity> entitys)
{
var startNodes = entitys.FindAll(x => x.NodeType.Equals("start"));
if (startNodes.Count > 0)
{
var startNode = startNodes[0].NodeCode;
long num = 0L;
long maxNum = 0L;
var max = new List<long>();
var _treeList = new List<FlowTaskNodeEntity>();
NodeList(entitys, startNode, _treeList, num, max);
max.Sort();
if (max.Count > 0)
{
maxNum = max[max.Count - 1];
}
var nodeNext = "end";
foreach (var item in entitys)
{
var type = item.NodeType;
var node = _treeList.Find(x => x.NodeCode.Equals(item.NodeCode));
if (item.NodeNext.IsEmpty())
{
item.NodeNext = nodeNext;
}
if (node.IsNotEmptyOrNull())
{
item.SortCode = node.SortCode;
item.State = "0";
if (item.NodeNext.IsEmpty())
{
item.NodeNext = nodeNext;
}
}
}
entitys.Add(new FlowTaskNodeEntity()
{
Id = SnowflakeIdHelper.NextId(),
NodeCode = nodeNext,
NodeName = "结束",
Completion = 0,
CreatorTime = DateTime.Now,
SortCode = maxNum + 1,
TaskId = _treeList[0].TaskId,
NodePropertyJson = startNodes[0].NodePropertyJson,
NodeType = "endround",
State = "0"
});
}
}
/// <summary>
/// 递归获取经过的节点.
/// </summary>
/// <param name="dataAll"></param>
/// <param name="nodeCode"></param>
/// <param name="_treeList"></param>
/// <param name="num"></param>
/// <param name="max"></param>
private void NodeList(List<FlowTaskNodeEntity> dataAll, string nodeCode, List<FlowTaskNodeEntity> _treeList, long num, List<long> max)
{
num++;
max.Add(num);
foreach (var item in dataAll)
{
if (item.NodeCode.Contains(nodeCode))
{
item.SortCode = num;
item.State = "0";
_treeList.Add(item);
foreach (var nodeNext in item.NodeNext.Split(","))
{
long nums = _treeList.FindAll(x => x.NodeCode.Equals(nodeNext)).Count;
if (nodeNext.IsNotEmptyOrNull() && nums == 0)
{
NodeList(dataAll, nodeNext, _treeList, num, max);
}
}
}
}
}
}