添加项目文件。
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
public class VerificationExtend : NodeDesignateEntity
|
||||
{
|
||||
public string F_FlowInstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 1:同意;2:不同意;3:驳回
|
||||
/// </summary>
|
||||
public string F_VerificationFinally { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 审核意见
|
||||
/// </summary>
|
||||
public string F_VerificationOpinion { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 驳回的步骤,即驳回到的节点ID
|
||||
/// </summary>
|
||||
public string NodeRejectStep { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 驳回类型。null:使用节点配置的驳回类型/0:前一步/1:第一步/2:指定节点,使用NodeRejectStep
|
||||
/// </summary>
|
||||
public string NodeRejectType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 新的表单数据
|
||||
/// 如果该节点有可以修改的表单项时,会提交表单数据信息
|
||||
/// </summary>
|
||||
public string F_FrmData { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <autogenerated>
|
||||
// This code was generated by a CodeSmith Template.
|
||||
//
|
||||
// DO NOT MODIFY contents of this file. Changes to this
|
||||
// file will be lost if the code is regenerated.
|
||||
// Author:Yubao Li
|
||||
// </autogenerated>
|
||||
//------------------------------------------------------------------------------
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
/// <summary>
|
||||
/// 工作流实例操作记录
|
||||
/// </summary>
|
||||
[SugarTable("oms_flowinstanceinfo")]
|
||||
public class FlowInstanceOperationHistory
|
||||
{
|
||||
/// <summary>
|
||||
/// 主键Id
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true, ColumnDescription = "主键Id")]
|
||||
public string F_Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 实例进程Id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false, ColumnName = "F_InstanceId", ColumnDataType = "nvarchar(50)", ColumnDescription = "实例进程Id")]
|
||||
public string F_InstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作内容
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_Content", ColumnDataType = "nvarchar(200)", ColumnDescription = "操作内容")]
|
||||
public string F_Content { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "类别名称")]
|
||||
public DateTime? F_CreatorTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户主键
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserId", ColumnDataType = "nvarchar(50)", ColumnDescription = "创建用户主键")]
|
||||
public string F_CreatorUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserName", ColumnDataType = "nvarchar(50)", ColumnDescription = "创建用户")]
|
||||
public string F_CreatorUserName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单数据
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FrmData", ColumnDataType = "longtext", ColumnDescription = "表单数据")]
|
||||
public string F_FrmData { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <autogenerated>
|
||||
// This code was generated by a CodeSmith Template.
|
||||
//
|
||||
// DO NOT MODIFY contents of this file. Changes to this
|
||||
// file will be lost if the code is regenerated.
|
||||
// Author:Yubao Li
|
||||
// </autogenerated>
|
||||
//------------------------------------------------------------------------------
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
/// <summary>
|
||||
/// 工作流实例流转历史记录
|
||||
/// </summary>
|
||||
[SugarTable("oms_flowinstancehis")]
|
||||
public class FlowInstanceTransitionHistory
|
||||
{
|
||||
/// <summary>
|
||||
/// 主键Id
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true, ColumnDescription = "主键Id")]
|
||||
public string F_Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 实例Id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false, ColumnName = "F_InstanceId", ColumnDataType = "nvarchar(50)", ColumnDescription = "实例Id")]
|
||||
public string F_InstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始节点Id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FromNodeId", ColumnDataType = "nvarchar(50)", ColumnDescription = "开始节点Id")]
|
||||
public string F_FromNodeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始节点类型
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnDescription = "开始节点类型")]
|
||||
public int? F_FromNodeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始节点名称
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FromNodeName", ColumnDataType = "nvarchar(200)", ColumnDescription = "开始节点名称")]
|
||||
public string F_FromNodeName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 结束节点Id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_ToNodeId", ColumnDataType = "nvarchar(50)", ColumnDescription = "结束节点Id")]
|
||||
public string F_ToNodeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 结束节点类型
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnDescription = "结束节点类型")]
|
||||
public int? F_ToNodeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 结束节点名称
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_ToNodeName", ColumnDataType = "nvarchar(200)", ColumnDescription = "结束节点名称")]
|
||||
public string F_ToNodeName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 转化状态
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "转化状态")]
|
||||
public bool F_TransitionSate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否结束
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "是否结束")]
|
||||
public bool F_IsFinish { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 转化时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "转化时间")]
|
||||
public DateTime F_CreatorTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户主键
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserId", ColumnDataType = "nvarchar(50)", ColumnDescription = "创建用户主键")]
|
||||
public string F_CreatorUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserName", ColumnDataType = "nvarchar(50)", ColumnDescription = "创建用户")]
|
||||
public string F_CreatorUserName { get; set; }
|
||||
}
|
||||
}
|
||||
530
WaterCloud.Domain/Entity/FlowManage/FlowRuntime.cs
Normal file
530
WaterCloud.Domain/Entity/FlowManage/FlowRuntime.cs
Normal file
@@ -0,0 +1,530 @@
|
||||
// <summary>
|
||||
// 一个正在运行中的流程实例
|
||||
//</summary>
|
||||
// ***********************************************************************
|
||||
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using WaterCloud.Code;
|
||||
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
public class FlowRuntime
|
||||
{
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
public FlowRuntime(FlowinstanceEntity instance)
|
||||
{
|
||||
dynamic schemeContentJson = instance.F_SchemeContent.ToObject();//获取工作流模板内容的json对象;
|
||||
|
||||
InitLines(schemeContentJson);
|
||||
InitNodes(schemeContentJson);
|
||||
|
||||
currentNodeId = (string.IsNullOrEmpty(instance.F_ActivityId) ? startNodeId : instance.F_ActivityId);
|
||||
currentNodeType = GetNodeType(currentNodeId);
|
||||
FrmData = instance.F_FrmData;
|
||||
title = schemeContentJson.title;
|
||||
initNum = schemeContentJson.initNum ?? 0;
|
||||
previousId = GetPreviousNodeId(currentNodeId);
|
||||
flowInstanceId = instance.F_Id;
|
||||
|
||||
//会签开始节点和流程结束节点没有下一步
|
||||
if (currentNodeType == 0 || currentNodeType == 4)
|
||||
{
|
||||
nextNodeId = "-1";
|
||||
nextNodeType = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
nextNodeId = GetNextNodeId();//下一个节点
|
||||
nextNodeType = GetNodeType(nextNodeId);
|
||||
}
|
||||
}
|
||||
|
||||
#region 私有方法
|
||||
|
||||
/// <summary>
|
||||
/// 获取工作流节点的字典列表:key节点id
|
||||
/// </summary>
|
||||
/// <param name="schemeContentJson"></param>
|
||||
/// <returns></returns>
|
||||
private void InitNodes(dynamic schemeContentJson)
|
||||
{
|
||||
Nodes = new Dictionary<string, FlowNode>();
|
||||
foreach (JObject item in schemeContentJson.nodes)
|
||||
{
|
||||
var node = item.ToObject<FlowNode>();
|
||||
if (!Nodes.ContainsKey(node.id))
|
||||
{
|
||||
Nodes.Add(node.id, node);
|
||||
}
|
||||
if (node.type == FlowNode.START)
|
||||
{
|
||||
this.startNodeId = node.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void InitLines(dynamic schemeContentJson)
|
||||
{
|
||||
Lines = new List<FlowLine>();
|
||||
FromNodeLines = new Dictionary<string, List<FlowLine>>();
|
||||
ToNodeLines = new Dictionary<string, List<FlowLine>>();
|
||||
foreach (JObject item in schemeContentJson.lines)
|
||||
{
|
||||
var line = item.ToObject<FlowLine>();
|
||||
Lines.Add(line);
|
||||
|
||||
if (!FromNodeLines.ContainsKey(line.from))
|
||||
{
|
||||
List<FlowLine> d = new List<FlowLine> { line };
|
||||
FromNodeLines.Add(line.from, d);
|
||||
}
|
||||
else
|
||||
{
|
||||
FromNodeLines[line.from].Add(line);
|
||||
}
|
||||
|
||||
if (!ToNodeLines.ContainsKey(line.to))
|
||||
{
|
||||
List<FlowLine> d = new List<FlowLine> { line };
|
||||
ToNodeLines.Add(line.to, d);
|
||||
}
|
||||
else
|
||||
{
|
||||
ToNodeLines[line.to].Add(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下一个节点
|
||||
/// </summary>
|
||||
private string GetNextNodeId(string nodeId = null)
|
||||
{
|
||||
var lines = nodeId == null ? FromNodeLines[currentNodeId] : FromNodeLines[nodeId];
|
||||
if (lines.Count == 0)
|
||||
{
|
||||
throw new Exception("无法寻找到下一个节点");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(FrmData)) return lines[0].to;
|
||||
|
||||
FrmData = FrmData.ToLower();//统一转小写
|
||||
var frmDataJson = FrmData.ToJObject();//获取数据内容
|
||||
|
||||
foreach (var l in lines)
|
||||
{
|
||||
if (l.Compares == null)
|
||||
{
|
||||
l.Compares = new List<DataCompare>();
|
||||
}
|
||||
if (l.Compares.Count > 0 && l.Compare(frmDataJson))
|
||||
{
|
||||
return l.to;
|
||||
}
|
||||
}
|
||||
|
||||
return lines[0].to;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取上一个节点
|
||||
/// </summary>
|
||||
private string GetPreviousNodeId(string nodeId = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var lines = nodeId == null ? ToNodeLines[currentNodeId] : ToNodeLines[nodeId];
|
||||
if (lines.Count == 0)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
if (FrmData == "") return lines[0].from;
|
||||
|
||||
FrmData = FrmData.ToLower();//统一转小写
|
||||
var frmDataJson = FrmData.ToJObject();//获取数据内容
|
||||
|
||||
foreach (var l in lines)
|
||||
{
|
||||
if (l.Compares == null)
|
||||
{
|
||||
l.Compares = new List<DataCompare>();
|
||||
}
|
||||
if (l.Compares.Count > 0 && l.Compare(frmDataJson))
|
||||
{
|
||||
return l.from;
|
||||
}
|
||||
}
|
||||
|
||||
return lines[0].from;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion 私有方法
|
||||
|
||||
#region 共有方法
|
||||
|
||||
//获取下一个节点
|
||||
public FlowNode GetNextNode(string nodeId = null)
|
||||
{
|
||||
return Nodes[GetNextNodeId(nodeId)];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取实例接下来运行的状态
|
||||
/// </summary>
|
||||
/// <returns>-1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束</returns>
|
||||
public int GetNextNodeType()
|
||||
{
|
||||
if (nextNodeId != "-1")
|
||||
{
|
||||
return GetNodeType(nextNodeId);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取节点类型 0会签开始,1会签结束,2一般节点,开始节点,4流程运行结束
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
/// <returns></returns>
|
||||
public int GetNodeType(string nodeId)
|
||||
{
|
||||
switch (Nodes[nodeId].type)
|
||||
{
|
||||
//会签开始节点
|
||||
case FlowNode.FORK:
|
||||
return 0;
|
||||
//会签结束节点
|
||||
case FlowNode.JOIN:
|
||||
return 1;
|
||||
//结束节点
|
||||
case FlowNode.END:
|
||||
return 4;
|
||||
//开始节点
|
||||
case FlowNode.START:
|
||||
return 3;
|
||||
|
||||
default:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveNode(string nodeId)
|
||||
{
|
||||
var node = Nodes[nodeId];
|
||||
if (node != null && node.setInfo != null)
|
||||
{
|
||||
node.setInfo.Taged = null;
|
||||
node.setInfo.UserName = null;
|
||||
node.setInfo.UserId = null;
|
||||
node.setInfo.Description = null;
|
||||
node.setInfo.TagedTime = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveNodes()
|
||||
{
|
||||
foreach (var item in Nodes)
|
||||
{
|
||||
var node = item.Value;
|
||||
if (node != null && node.setInfo != null)
|
||||
{
|
||||
node.setInfo.Taged = null;
|
||||
node.setInfo.UserName = null;
|
||||
node.setInfo.UserId = null;
|
||||
node.setInfo.Description = null;
|
||||
node.setInfo.TagedTime = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 节点会签审核
|
||||
/// </summary>
|
||||
/// <param name="nodeId">会签时,currentNodeId是会签开始节点。这个表示当前正在处理的节点</param>
|
||||
/// <param name="tag"></param>
|
||||
/// <returns>-1不通过,1等待,其它通过</returns>
|
||||
public string NodeConfluence(string nodeId, Tag tag)
|
||||
{
|
||||
var forkNode = Nodes[currentNodeId]; //会签开始节点
|
||||
FlowNode nextNode = GetNextNode(nodeId); //获取当前处理的下一个节点
|
||||
|
||||
int forkNumber = FromNodeLines[currentNodeId].Count; //直接与会签节点连接的点,即会签分支数目
|
||||
string res = string.Empty; //记录会签的结果,默认正在会签
|
||||
if (forkNode.setInfo.NodeConfluenceType == "one") //有一个步骤通过即可
|
||||
{
|
||||
if (tag.Taged == (int)TagState.Ok)
|
||||
{
|
||||
if (nextNode.type == FlowNode.JOIN) //下一个节点是会签结束,则该线路结束
|
||||
{
|
||||
res = GetNextNodeId(nextNode.id);
|
||||
}
|
||||
}
|
||||
else if (tag.Taged == (int)TagState.No)
|
||||
{
|
||||
if (forkNode.setInfo.ConfluenceNo == null)
|
||||
{
|
||||
forkNode.setInfo.ConfluenceNo = 1;
|
||||
}
|
||||
else if (forkNode.setInfo.ConfluenceNo == (forkNumber - 1))
|
||||
{
|
||||
res = TagState.No.ToString("D");
|
||||
}
|
||||
else
|
||||
{
|
||||
bool isFirst = true; //是不是从会签开始到现在第一个
|
||||
var preNode = GetPreNode(nodeId);
|
||||
while (preNode.id != forkNode.id) //反向一直到会签开始节点
|
||||
{
|
||||
if (preNode.setInfo != null && preNode.setInfo.Taged == (int)TagState.No)
|
||||
{
|
||||
isFirst = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isFirst)
|
||||
{
|
||||
forkNode.setInfo.ConfluenceNo++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else //默认所有步骤通过
|
||||
{
|
||||
if (tag.Taged == (int)TagState.No) //只要有一个不同意,那么流程就结束
|
||||
{
|
||||
res = TagState.No.ToString("D");
|
||||
}
|
||||
else if (tag.Taged == (int)TagState.Ok)
|
||||
{
|
||||
if (nextNode.type == FlowNode.JOIN) //这种模式下只有坚持到【会签结束】节点之前才有意义,是否需要判定这条线所有的节点都通过,不然直接执行这个节点??
|
||||
{
|
||||
if (forkNode.setInfo.ConfluenceOk == null)
|
||||
{
|
||||
forkNode.setInfo.ConfluenceOk = 1;
|
||||
}
|
||||
else if (forkNode.setInfo.ConfluenceOk == (forkNumber - 1)) //会签成功
|
||||
{
|
||||
res = GetNextNodeId(nextNode.id);
|
||||
}
|
||||
else
|
||||
{
|
||||
forkNode.setInfo.ConfluenceOk++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (res == TagState.No.ToString("D"))
|
||||
{
|
||||
tag.Taged = (int)TagState.No;
|
||||
MakeTagNode(nextNode.id, tag);
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(res)) //会签结束,标记合流节点
|
||||
{
|
||||
tag.Taged = (int)TagState.Ok;
|
||||
MakeTagNode(nextNode.id, tag);
|
||||
nextNodeId = res;
|
||||
nextNodeType = GetNodeType(res);
|
||||
}
|
||||
else
|
||||
{
|
||||
nextNodeId = nextNode.id;
|
||||
nextNodeType = GetNodeType(nextNode.id);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
//获取上一个节点
|
||||
private FlowNode GetPreNode(string nodeId = null)
|
||||
{
|
||||
var lines = nodeId == null ? ToNodeLines[currentNodeId] : ToNodeLines[nodeId];
|
||||
if (lines.Count == 0)
|
||||
{
|
||||
throw new Exception("无法找到上一个点");
|
||||
}
|
||||
return Nodes[lines[0].from];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 驳回
|
||||
/// </summary>
|
||||
/// <param name="rejectType">驳回类型。null:使用节点配置的驳回类型/0:前一步/1:第一步/2:指定节点,使用NodeRejectStep</param>
|
||||
/// <returns></returns>
|
||||
public string RejectNode(string rejectType)
|
||||
{
|
||||
dynamic node = Nodes[currentNodeId];
|
||||
if (node.setInfo != null && string.IsNullOrEmpty(rejectType))
|
||||
{
|
||||
rejectType = node.setInfo.NodeRejectType;
|
||||
}
|
||||
|
||||
if (rejectType == "0")
|
||||
{
|
||||
return previousId;
|
||||
}
|
||||
if (rejectType == "1")
|
||||
{
|
||||
return startNodeId;
|
||||
}
|
||||
return previousId;
|
||||
}
|
||||
|
||||
///<summary>
|
||||
/// 标记节点1通过,2不通过,3驳回
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
public void MakeTagNode(string nodeId, Tag tag)
|
||||
{
|
||||
foreach (var item in Nodes)
|
||||
{
|
||||
if (item.Key == nodeId)
|
||||
{
|
||||
if (item.Value.setInfo == null)
|
||||
{
|
||||
item.Value.setInfo = new Setinfo();
|
||||
}
|
||||
item.Value.setInfo.Taged = tag.Taged;
|
||||
item.Value.setInfo.UserId = tag.UserId;
|
||||
item.Value.setInfo.UserName = tag.UserName;
|
||||
item.Value.setInfo.Description = tag.Description;
|
||||
item.Value.setInfo.TagedTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public object ToSchemeObj()
|
||||
{
|
||||
return new
|
||||
{
|
||||
title = this.title,
|
||||
initNum = this.initNum,
|
||||
lines = Lines,
|
||||
nodes = Nodes.Select(u => u.Value),
|
||||
areas = new string[0]
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通知三方系统,节点执行情况
|
||||
/// </summary>
|
||||
public void NotifyThirdParty(HttpClient client, Tag tag)
|
||||
{
|
||||
if (currentNode.setInfo == null || string.IsNullOrEmpty(currentNode.setInfo.ThirdPartyUrl))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var postData = new
|
||||
{
|
||||
flowInstanceId,
|
||||
nodeName = currentNode.name,
|
||||
nodeId = currentNodeId,
|
||||
userId = tag.UserId,
|
||||
userName = tag.UserName,
|
||||
result = tag.Taged, //1:通过;2:不通过;3驳回
|
||||
description = tag.Description,
|
||||
execTime = tag.TagedTime,
|
||||
isFinish = currentNodeType == 4
|
||||
};
|
||||
HttpContent httpContent = new StringContent(postData.ToJson(), Encoding.UTF8);
|
||||
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
|
||||
client.PostAsync(currentNode.setInfo.ThirdPartyUrl, httpContent);
|
||||
}
|
||||
|
||||
#endregion 共有方法
|
||||
|
||||
#region 属性
|
||||
|
||||
public string title { get; set; }
|
||||
|
||||
public int initNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 运行实例的Id
|
||||
/// </summary>
|
||||
public string flowInstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始节点的ID
|
||||
/// </summary>
|
||||
public string startNodeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点的ID
|
||||
/// </summary>
|
||||
public string currentNodeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点类型 0会签开始,1会签结束,2一般节点,开始节点,4流程运行结束
|
||||
/// </summary>
|
||||
public int currentNodeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点的对象
|
||||
/// </summary>
|
||||
public FlowNode currentNode => Nodes[currentNodeId];
|
||||
|
||||
/// <summary>
|
||||
/// 下一个节点
|
||||
/// </summary>
|
||||
public string nextNodeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 下一个节点类型 -1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束
|
||||
/// </summary>
|
||||
/// <value>The type of the next node.</value>
|
||||
public int nextNodeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 下一个节点对象
|
||||
/// </summary>
|
||||
public FlowNode nextNode => Nodes[nextNodeId];
|
||||
|
||||
/// <summary>
|
||||
/// 上一个节点
|
||||
/// </summary>
|
||||
public string previousId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 实例节点集合
|
||||
/// </summary>
|
||||
public Dictionary<string, FlowNode> Nodes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程实例中所有的线段
|
||||
/// </summary>
|
||||
public List<FlowLine> Lines { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 从节点发出的线段集合
|
||||
/// </summary>
|
||||
public Dictionary<string, List<FlowLine>> FromNodeLines { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 到达节点的线段集合
|
||||
/// </summary>
|
||||
public Dictionary<string, List<FlowLine>> ToNodeLines { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单数据
|
||||
/// </summary>
|
||||
public string FrmData { get; set; }
|
||||
|
||||
#endregion 属性
|
||||
}
|
||||
}
|
||||
233
WaterCloud.Domain/Entity/FlowManage/FlowinstanceEntity.cs
Normal file
233
WaterCloud.Domain/Entity/FlowManage/FlowinstanceEntity.cs
Normal file
@@ -0,0 +1,233 @@
|
||||
using SqlSugar;
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
/// <summary>
|
||||
/// 创 建:超级管理员
|
||||
/// 日 期:2020-07-14 09:18
|
||||
/// 描 述:我的流程实体类
|
||||
/// </summary>
|
||||
[SugarTable("oms_flowinstance")]
|
||||
public class FlowinstanceEntity : IEntity<FlowinstanceEntity>, ICreationAudited
|
||||
{
|
||||
/// <summary>
|
||||
/// 主键Id
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true, ColumnDescription = "主键Id")]
|
||||
public string F_Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程实例模板Id
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = false, ColumnName = "F_InstanceSchemeId", ColumnDataType = "nvarchar(50)", ColumnDescription = "流程实例模板Id")]
|
||||
public string F_InstanceSchemeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 实例编号
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[Required(ErrorMessage = "编号不能为空")]
|
||||
[SugarColumn(IsNullable = false, ColumnName = "F_Code", ColumnDataType = "nvarchar(200)", ColumnDescription = "实例编号", UniqueGroupNameList = new string[] { "oms_flowinstance" })]
|
||||
public string F_Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 自定义名称
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CustomName", ColumnDataType = "nvarchar(200)", ColumnDescription = "自定义名称")]
|
||||
public string F_CustomName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点ID
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_ActivityId", ColumnDataType = "nvarchar(50)", ColumnDescription = "当前节点ID")]
|
||||
public string F_ActivityId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点类型(0会签节点)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnDescription = "当前节点类型")]
|
||||
public int? F_ActivityType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前节点名称
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_ActivityName", ColumnDataType = "nvarchar(200)", ColumnDescription = "当前节点名称")]
|
||||
public string F_ActivityName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 前一个ID
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_PreviousId", ColumnDataType = "nvarchar(50)", ColumnDescription = "前一个ID")]
|
||||
public string F_PreviousId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程模板内容
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_SchemeContent", ColumnDataType = "longtext", ColumnDescription = "流程模板内容")]
|
||||
public string F_SchemeContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程模板ID
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[Required(ErrorMessage = "模板不能为空")]
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_SchemeId", ColumnDataType = "nvarchar(50)", ColumnDescription = "流程模板ID")]
|
||||
public string F_SchemeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据库名称
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_DbName", ColumnDataType = "nvarchar(50)", ColumnDescription = "数据库名称")]
|
||||
public string F_DbName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FrmData", ColumnDataType = "longtext", ColumnDescription = "表单数据")]
|
||||
public string F_FrmData { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单类型
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "表单类型")]
|
||||
public int? F_FrmType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单中的字段
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FrmContentData", ColumnDataType = "longtext", ColumnDescription = "表单中的字段")]
|
||||
public string F_FrmContentData { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单字段(冗余)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FrmContentParse", ColumnDataType = "longtext", ColumnDescription = "表单字段")]
|
||||
public string F_FrmContentParse { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单参数
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FrmContent", ColumnDataType = "longtext", ColumnDescription = "表单参数")]
|
||||
public string F_FrmContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表单ID
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FrmId", ColumnDataType = "nvarchar(50)", ColumnDescription = "表单ID")]
|
||||
public string F_FrmId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程类型
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_SchemeType", ColumnDataType = "nvarchar(50)", ColumnDescription = "流程类型")]
|
||||
public string F_SchemeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 等级
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "等级")]
|
||||
public int F_FlowLevel { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 实例备注
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_Description", ColumnDataType = "nvarchar(200)", ColumnDescription = "实例备注")]
|
||||
public string F_Description { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否完成
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = false, ColumnDescription = "是否完成")]
|
||||
public int F_IsFinish { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 执行人
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_MakerList", ColumnDataType = "longtext", ColumnDescription = "执行人")]
|
||||
public string F_MakerList { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属部门
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_OrganizeId", ColumnDataType = "nvarchar(50)", ColumnDescription = "所属部门")]
|
||||
public string F_OrganizeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 有效
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnDescription = "有效")]
|
||||
public bool? F_EnabledMark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
//[SugarColumn(IsNullable = true,ColumnDescription = "创建时间")]
|
||||
public DateTime? F_CreatorTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户主键
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserId", ColumnDataType = "nvarchar(50)", ColumnDescription = "创建用户主键")]
|
||||
public string F_CreatorUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建用户
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserName", ColumnDataType = "nvarchar(50)", ColumnDescription = "创建用户")]
|
||||
public string F_CreatorUserName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 如果下个执行节点是运行时指定执行者。需要传指定的类型
|
||||
/// <para>取值为RUNTIME_SPECIAL_ROLE、RUNTIME_SPECIAL_USER</para>
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string NextNodeDesignateType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 如果下个执行节点是运行时指定执行者。该值表示具体的执行者
|
||||
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_ROLE,则该值为指定的角色</para>
|
||||
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_USER,则该值为指定的用户</para>
|
||||
/// </summary>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string[] NextNodeDesignates { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string NextMakerName { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string CurrentMakerName { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string CurrentNodeDesignateType { get; set; }
|
||||
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public string[] CanWriteFormItems { get; set; }
|
||||
}
|
||||
}
|
||||
49
WaterCloud.Domain/Entity/FlowManage/FormTestEntity.cs
Normal file
49
WaterCloud.Domain/Entity/FlowManage/FormTestEntity.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
/*******************************************************************************
|
||||
* Copyright © 2020 WaterCloud.Framework 版权所有
|
||||
* Author: WaterCloud
|
||||
* Description: WaterCloud快速开发平台
|
||||
* Website:
|
||||
*********************************************************************************/
|
||||
|
||||
using SqlSugar;
|
||||
using System;
|
||||
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
[SugarTable("oms_formtest")]
|
||||
public class FormTestEntity : IEntity<FormTestEntity>, ICreationAudited
|
||||
{
|
||||
[SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true, ColumnDescription = "主键Id")]
|
||||
public string F_Id { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = false, ColumnName = "F_UserName", ColumnDataType = "nvarchar(10)")]
|
||||
public string F_UserName { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = false)]
|
||||
public string F_RequestType { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? F_StartTime { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? F_EndTime { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_RequestComment", ColumnDataType = "longtext")]
|
||||
public string F_RequestComment { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_Attachment", ColumnDataType = "longtext")]
|
||||
public string F_Attachment { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_FlowInstanceId", ColumnDataType = "nvarchar(50)")]
|
||||
public string F_FlowInstanceId { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? F_CreatorTime { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserId", ColumnDataType = "nvarchar(50)")]
|
||||
public string F_CreatorUserId { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true, ColumnName = "F_CreatorUserName", ColumnDataType = "nvarchar(50)")]
|
||||
public string F_CreatorUserName { get; set; }
|
||||
}
|
||||
}
|
||||
18
WaterCloud.Domain/Entity/FlowManage/NodeDesignateEntity.cs
Normal file
18
WaterCloud.Domain/Entity/FlowManage/NodeDesignateEntity.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
namespace WaterCloud.Domain.FlowManage
|
||||
{
|
||||
public class NodeDesignateEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 如果下个执行节点是运行时指定执行者。需要传指定的类型
|
||||
/// <para>取值为RUNTIME_SPECIAL_ROLE、RUNTIME_SPECIAL_USER</para>
|
||||
/// </summary>
|
||||
public string NodeDesignateType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 如果下个执行节点是运行时指定执行者。该值表示具体的执行者
|
||||
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_ROLE,则该值为指定的角色</para>
|
||||
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_USER,则该值为指定的用户</para>
|
||||
/// </summary>
|
||||
public string[] NodeDesignates { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user