2021-07-29 13:55:18 +08:00
|
|
|
|
using AIStudio.Wpf.Flowchart.ViewModels;
|
|
|
|
|
|
using System;
|
2021-07-23 09:42:22 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
2021-07-27 16:15:30 +08:00
|
|
|
|
using System.Windows;
|
2021-07-26 22:37:54 +08:00
|
|
|
|
using System.Windows.Media;
|
2022-10-28 22:45:39 +08:00
|
|
|
|
using AIStudio.Wpf.DiagramDesigner;
|
2023-01-07 12:08:28 +08:00
|
|
|
|
using Microsoft.CSharp;
|
|
|
|
|
|
using System.CodeDom.Compiler;
|
|
|
|
|
|
using System.Reflection;
|
|
|
|
|
|
using System.Data;
|
2021-07-23 09:42:22 +08:00
|
|
|
|
|
2021-07-29 13:55:18 +08:00
|
|
|
|
namespace AIStudio.Wpf.Flowchart
|
2021-07-23 09:42:22 +08:00
|
|
|
|
{
|
|
|
|
|
|
public static class FlowchartService
|
|
|
|
|
|
{
|
|
|
|
|
|
static FlowchartService()
|
|
|
|
|
|
{
|
|
|
|
|
|
Users = new List<SelectOption>()
|
|
|
|
|
|
{
|
|
|
|
|
|
new SelectOption(){ value = "操作员1",text = "操作员1" },
|
|
|
|
|
|
new SelectOption(){ value = "操作员2",text = "操作员2" },
|
|
|
|
|
|
new SelectOption(){ value = "Admin",text = "Admin" },
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Roles = new List<SelectOption>()
|
|
|
|
|
|
{
|
|
|
|
|
|
new SelectOption(){ value = "操作员",text = "操作员" },
|
|
|
|
|
|
new SelectOption(){ value = "管理员",text = "管理员" },
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static List<SelectOption> _users;
|
|
|
|
|
|
public static List<SelectOption> Users
|
|
|
|
|
|
{
|
2023-01-08 09:22:37 +08:00
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _users;
|
|
|
|
|
|
}
|
2021-07-23 09:42:22 +08:00
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_users = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static List<SelectOption> _roles;
|
|
|
|
|
|
public static List<SelectOption> Roles
|
|
|
|
|
|
{
|
2023-01-08 09:22:37 +08:00
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _roles;
|
|
|
|
|
|
}
|
2021-07-23 09:42:22 +08:00
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
_roles = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-07-26 22:37:54 +08:00
|
|
|
|
|
2021-07-27 16:15:30 +08:00
|
|
|
|
|
2021-07-27 21:58:55 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 流程数据
|
|
|
|
|
|
/// </summary>
|
2021-08-02 18:08:43 +08:00
|
|
|
|
public static Dictionary<IDiagramViewModel, List<FlowNode>> FlowNodes { get; set; } = new Dictionary<IDiagramViewModel, List<FlowNode>>();
|
2021-07-27 16:15:30 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化数据
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="json"></param>
|
|
|
|
|
|
/// <param name="id"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2023-01-24 17:53:04 +08:00
|
|
|
|
public static void InitData(List<FlowNode> oASteps, List<ConnectionViewModel> connectors, IDiagramViewModel viewModel)
|
2021-07-27 16:15:30 +08:00
|
|
|
|
{
|
|
|
|
|
|
foreach (var edge in connectors)
|
|
|
|
|
|
{
|
2023-01-08 09:22:37 +08:00
|
|
|
|
if (edge.IsFullConnection == false) continue;
|
|
|
|
|
|
|
2021-07-27 16:15:30 +08:00
|
|
|
|
var source = oASteps.FirstOrDefault(p => p.BottomConnector == edge.SourceConnectorInfo || p.LeftConnector == edge.SourceConnectorInfo || p.RightConnector == edge.SourceConnectorInfo);
|
|
|
|
|
|
if (source != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (source.Kind == NodeKinds.Decide)
|
|
|
|
|
|
{
|
2023-01-08 09:22:37 +08:00
|
|
|
|
source.SelectNextStep.Add(edge.SinkConnectorInfoFully.DataItem.Id.ToString(), "data.Flag" + edge.Text);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
else if (source.Kind == NodeKinds.COBegin)
|
|
|
|
|
|
{
|
2023-01-08 09:22:37 +08:00
|
|
|
|
source.SelectNextStep.Add(edge.SinkConnectorInfoFully.DataItem.Id.ToString(), "True");
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2023-01-08 09:22:37 +08:00
|
|
|
|
source.NextStepId = edge.SinkConnectorInfoFully.DataItem.Id.ToString();
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var step in oASteps)
|
|
|
|
|
|
{
|
|
|
|
|
|
//恢复指向上一个节点
|
|
|
|
|
|
if (!string.IsNullOrEmpty(step.NextStepId))
|
|
|
|
|
|
{
|
|
|
|
|
|
var nextstep = oASteps.FirstOrDefault(p => p.Id.ToString() == step.NextStepId);
|
|
|
|
|
|
if (nextstep == null)
|
|
|
|
|
|
throw new Exception(string.Format("流程异常,无法找到{0}的下一个流程节点{1}", step.Id, step.NextStepId));
|
|
|
|
|
|
if (nextstep.Kind == NodeKinds.Decide)
|
|
|
|
|
|
{
|
|
|
|
|
|
var nsteps = oASteps.Where(p => nextstep.SelectNextStep.Any(q => p.Id.ToString() == q.Key));
|
|
|
|
|
|
if (nsteps == null || nsteps.Count() == 0)
|
|
|
|
|
|
throw new Exception(string.Format("流程异常,无法找到{0}的下一个流程节点{1}", step.Id, step.NextStepId));
|
|
|
|
|
|
|
|
|
|
|
|
//跳过Decide指向下面的子节点
|
|
|
|
|
|
foreach (var nstep in nsteps)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nstep.PreStepId == null)
|
|
|
|
|
|
nstep.PreStepId = new List<string>();
|
|
|
|
|
|
nstep.PreStepId.Add(step.Id.ToString());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nextstep.PreStepId == null)
|
|
|
|
|
|
nextstep.PreStepId = new List<string>();
|
|
|
|
|
|
nextstep.PreStepId.Add(step.Id.ToString());
|
|
|
|
|
|
}
|
2021-07-27 21:58:55 +08:00
|
|
|
|
}
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var oAStartStep = oASteps.Single(p => p.Kind == NodeKinds.Start);
|
|
|
|
|
|
if (string.IsNullOrEmpty(oAStartStep.NextStepId))
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new Exception("开始节点没有下一个节点");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string nextstepid = oAStartStep.NextStepId;
|
2021-08-02 18:08:43 +08:00
|
|
|
|
var nodes = InitStep(oASteps, nextstepid);
|
|
|
|
|
|
nodes.Insert(0, oAStartStep);
|
|
|
|
|
|
|
2023-01-08 09:22:37 +08:00
|
|
|
|
FlowNodes.Add(viewModel, nodes);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
|
|
|
|
|
|
Approve(oAStartStep, 100);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2021-07-27 21:58:55 +08:00
|
|
|
|
/// 初始化步骤
|
2021-07-27 16:15:30 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="oASteps"></param>
|
|
|
|
|
|
/// <param name="nextstepid"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static List<FlowNode> InitStep(List<FlowNode> oASteps, string nextstepid)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<FlowNode> outsteps = new List<FlowNode>();
|
|
|
|
|
|
List<string> nextids = new List<string>();
|
|
|
|
|
|
var step = oASteps.FirstOrDefault(p => p.Id.ToString() == nextstepid);
|
|
|
|
|
|
if (step != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!string.IsNullOrEmpty(step.NextStepId))
|
|
|
|
|
|
{
|
|
|
|
|
|
nextids.Add(step.NextStepId);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (step.SelectNextStep != null && step.SelectNextStep.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
nextids.AddRange(step.SelectNextStep.Keys);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
outsteps.Add(step);
|
|
|
|
|
|
oASteps.Remove(step);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int index = outsteps.IndexOf(step);
|
|
|
|
|
|
|
|
|
|
|
|
nextids.Reverse();
|
|
|
|
|
|
foreach (var next in nextids)
|
|
|
|
|
|
{
|
|
|
|
|
|
outsteps.InsertRange(index + 1, InitStep(oASteps, next));
|
|
|
|
|
|
}
|
|
|
|
|
|
return outsteps;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-27 21:58:55 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 审批动作,因为是客户端模拟,假设每次都是该节点的审批人进行的操作
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="flowNode"></param>
|
|
|
|
|
|
/// <param name="status"></param>
|
|
|
|
|
|
/// <param name="remark"></param>
|
2021-07-27 16:15:30 +08:00
|
|
|
|
public static void Approve(FlowNode flowNode, int status, string remark = null)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (status)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 100:
|
2021-07-27 21:58:55 +08:00
|
|
|
|
if (flowNode is MiddleFlowNode middleFlowNode)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(flowNode.Remark))
|
|
|
|
|
|
{
|
|
|
|
|
|
remark = "审批人:" + remark;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
remark = flowNode.Remark + "\r审批人:" + remark;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (middleFlowNode.ActType == "and")//如果是与签,那么要都审批通过
|
|
|
|
|
|
{
|
|
|
|
|
|
if (middleFlowNode.UserIds != null && middleFlowNode.UserIds.Count > 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
//实际情况不是这样的,这里只是演示,简化。
|
2022-10-28 22:45:39 +08:00
|
|
|
|
int count = remark.Split(new String[] { "审批人:" }, StringSplitOptions.RemoveEmptyEntries).Length;
|
2021-07-27 21:58:55 +08:00
|
|
|
|
if (middleFlowNode.UserIds.Count != count)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetStatus(flowNode, 1, remark);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (middleFlowNode.RoleIds != null && middleFlowNode.RoleIds.Count > 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
//实际情况不是这样的,这里只是演示,简化。
|
2022-10-28 22:45:39 +08:00
|
|
|
|
int count = remark.Split(new String[] { "审批人:" }, StringSplitOptions.RemoveEmptyEntries).Length;
|
2021-07-27 21:58:55 +08:00
|
|
|
|
if (middleFlowNode.RoleIds.Count != count)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetStatus(flowNode, 1, remark);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-01-08 09:22:37 +08:00
|
|
|
|
|
2021-07-27 21:58:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-27 16:15:30 +08:00
|
|
|
|
SetStatus(flowNode, status, remark);
|
|
|
|
|
|
if (!string.IsNullOrEmpty(flowNode.NextStepId))
|
|
|
|
|
|
{
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(flowNode.NextStepId, flowNode);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
else if (flowNode.SelectNextStep != null && flowNode.SelectNextStep.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var step in flowNode.SelectNextStep)
|
|
|
|
|
|
{
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(step.Key, flowNode);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2021-07-27 21:58:55 +08:00
|
|
|
|
case 2:
|
2021-07-27 16:15:30 +08:00
|
|
|
|
if (Pre(flowNode))
|
|
|
|
|
|
{
|
|
|
|
|
|
SetStatus(flowNode, status, remark);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show("该节点不支持驳回上一级");
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
SetStatus(flowNode, status, remark);
|
2023-01-24 16:20:39 +08:00
|
|
|
|
FlowNodes[flowNode.Root].ForEach(p => { if (p.Status == 100) p.Status = 0; });
|
|
|
|
|
|
Approve(FlowNodes[flowNode.Root][0], 100);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
MessageBox.Show("流程重新开始");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
SetStatus(flowNode, status, remark);
|
|
|
|
|
|
MessageBox.Show("流程否决");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-27 21:58:55 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 流向下一个节点
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="stepid"></param>
|
2021-08-02 18:08:43 +08:00
|
|
|
|
public static void Next(string stepid, FlowNode flowNode)
|
2021-07-27 16:15:30 +08:00
|
|
|
|
{
|
2023-01-24 16:20:39 +08:00
|
|
|
|
FlowNode nextNode = FlowNodes[flowNode.Root].FirstOrDefault(p => p.Id.ToString() == stepid);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
SetStatus(nextNode, 1);
|
|
|
|
|
|
|
|
|
|
|
|
switch (nextNode.Kind)
|
|
|
|
|
|
{
|
2021-07-27 21:58:55 +08:00
|
|
|
|
case NodeKinds.Start:
|
|
|
|
|
|
SetStatus(nextNode, 100);
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(nextNode.NextStepId, nextNode);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
break;
|
2021-07-27 21:58:55 +08:00
|
|
|
|
case NodeKinds.End:
|
|
|
|
|
|
SetStatus(nextNode, 100);
|
|
|
|
|
|
MessageBox.Show("流程完成");
|
2021-07-27 16:15:30 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case NodeKinds.Decide:
|
|
|
|
|
|
foreach (var step in nextNode.SelectNextStep)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2021-07-27 21:58:55 +08:00
|
|
|
|
//按条件选择一个分支
|
2023-01-07 12:08:28 +08:00
|
|
|
|
string expression = step.Value.Replace("data.Flag", nextNode.Text);
|
|
|
|
|
|
|
|
|
|
|
|
var result = new DataTable().Compute(expression, "");
|
|
|
|
|
|
if (result.Equals(true))
|
2021-07-27 21:58:55 +08:00
|
|
|
|
{
|
|
|
|
|
|
SetStatus(nextNode, 100);
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(step.Key, nextNode);
|
2021-07-27 21:58:55 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
2023-01-08 09:22:37 +08:00
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
2023-01-07 12:08:28 +08:00
|
|
|
|
}
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
2021-07-27 21:58:55 +08:00
|
|
|
|
//如果表达式错了,就按第一个处理
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(nextNode.SelectNextStep.FirstOrDefault().Key, nextNode);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case NodeKinds.COBegin:
|
2021-07-27 21:58:55 +08:00
|
|
|
|
foreach (var step in nextNode.SelectNextStep)//启动各个分支
|
2021-07-27 16:15:30 +08:00
|
|
|
|
{
|
|
|
|
|
|
SetStatus(nextNode, 100);
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(step.Key, nextNode);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case NodeKinds.COEnd:
|
|
|
|
|
|
foreach (var prestep in nextNode.PreStepId)
|
|
|
|
|
|
{
|
2023-01-24 16:20:39 +08:00
|
|
|
|
var step = FlowNodes[flowNode.Root].FirstOrDefault(p => p.Id.ToString() == prestep);
|
2021-07-27 21:58:55 +08:00
|
|
|
|
if (step.Status != 100)//如果并行分支没有都完成,那么并行结束节点也未完成
|
2021-07-27 16:15:30 +08:00
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
SetStatus(nextNode, 100);
|
2021-08-02 18:08:43 +08:00
|
|
|
|
Next(nextNode.NextStepId, nextNode);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-27 21:58:55 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 流向上一个节点
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="flowNode"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2021-07-27 16:15:30 +08:00
|
|
|
|
public static bool Pre(FlowNode flowNode)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (flowNode.PreStepId != null && flowNode.PreStepId.Count == 1)
|
|
|
|
|
|
{
|
2023-01-24 16:20:39 +08:00
|
|
|
|
FlowNode preNode = FlowNodes[flowNode.Root].FirstOrDefault(p => p.Id.ToString() == flowNode.PreStepId[0]);
|
2021-07-27 16:15:30 +08:00
|
|
|
|
if (preNode.Kind == NodeKinds.Middle)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetStatus(preNode, 1);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-27 21:58:55 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设置颜色
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="flowNode"></param>
|
|
|
|
|
|
/// <param name="status"></param>
|
|
|
|
|
|
/// <param name="remark"></param>
|
2021-07-27 16:15:30 +08:00
|
|
|
|
public static void SetStatus(FlowNode flowNode, int status, string remark = null)
|
2021-07-26 22:37:54 +08:00
|
|
|
|
{
|
|
|
|
|
|
flowNode.Status = status;
|
2021-07-27 16:15:30 +08:00
|
|
|
|
flowNode.Remark = remark;
|
2021-07-26 22:37:54 +08:00
|
|
|
|
switch (status)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 100:
|
2023-03-10 12:09:13 +08:00
|
|
|
|
flowNode.StatusColor = Colors.Green.ToString();
|
2021-07-27 16:15:30 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 0:
|
2023-03-10 12:09:13 +08:00
|
|
|
|
flowNode.StatusColor = Colors.Yellow.ToString();
|
2021-07-27 16:15:30 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
2023-03-10 12:09:13 +08:00
|
|
|
|
flowNode.StatusColor = Colors.Orange.ToString();
|
2021-07-26 22:37:54 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
2023-03-10 12:09:13 +08:00
|
|
|
|
flowNode.StatusColor = Colors.Red.ToString();
|
2021-07-26 22:37:54 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
2023-03-10 12:09:13 +08:00
|
|
|
|
flowNode.StatusColor = Colors.Red.ToString();
|
2021-07-26 22:37:54 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
2023-03-10 12:09:13 +08:00
|
|
|
|
flowNode.StatusColor = Colors.Red.ToString();
|
2021-07-26 22:37:54 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-08-03 18:19:47 +08:00
|
|
|
|
|
|
|
|
|
|
public static void DisposeData(IDiagramViewModel viewModel)
|
|
|
|
|
|
{
|
|
|
|
|
|
FlowNodes.Remove(viewModel);
|
2023-01-08 09:22:37 +08:00
|
|
|
|
}
|
2021-07-23 09:42:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|