关于流程引擎的工作进度条的实现
关键字:驰骋工作流引擎 工作进度条实现 工作进度条接口 ccflow
简洁的效果图:
调用接口:BP.WF. Dev2Interface.DB_JobSchedule(int64 workid) ; 根据当前的workid获得流程的进度信息。
返回值说明:调用该接口后系统返回4个表,也就说4个json数据。
中文名 |
英文名 |
概要介绍 |
流程信息表 |
WF_GenerWorkFlow |
只有一条记录,标识流程运行运行的信息,流程的状态,是否结束,运行到那个节点上了。 您可能用到的节点: FK_Node 流程运行到的节点. WFState 流程的状态 2=运行中,3=已完成,5退回. |
流程节点表 |
WF_Node |
返回是一个集合,当前流程的所有节点的信息。NodeID,Name是重要的两个字段。 |
方向表 |
WF_Direction |
返回是一个集合,节点的先后顺序,就是节点的连接线. 您可能用到的字段: Node , 从节点ID. ToNode,到节点ID |
运动轨迹表 |
Track |
返回的是一个集合,节点运动过程中的参与人,时间。 您可能用到的字段: FK_Node, 发生的节点ID. NodeName,节点名称。 EmpNo, 人员编号 EmpName, 人员名称 RDT, 发生日期时间 IsPass, 是否完成.
|
产生的JSONS结构截图:
流程信息表:
节点集合:
节点连接线:
运动轨迹表
附件完整的代码(可以不看实现过程):
string sql = ""; DataSet ds = new DataSet();
/* * 流程控制主表, 可以得到流程状态,停留节点,当前的执行人. * 该表里有如下字段是重点: * 0. WorkID 流程ID. * 1. WFState 字段用于标识当前流程的状态.. * 2. FK_Node 停留节点. * 3. NodeName 停留节点名称. * 4. TodoEmps 停留的待办人员. */ GenerWorkFlow gwf = new GenerWorkFlow(workID); ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow"));
/*节点信息: 节点信息表,存储每个环节的节点信息数据. * NodeID 节点ID. * Name 名称. * X,Y 节点图形位置,如果使用进度图就不需要了. */ NodeSimples nds = new NodeSimples(gwf.FK_Flow); ds.Tables.Add(nds.ToDataTableField("WF_Node"));
/* * 节点的连接线. */ Directions dirs = new Directions(gwf.FK_Flow); ds.Tables.Add(dirs.ToDataTableField("WF_Direction"));
#region 运动轨迹 /* * 运动轨迹: 构造的一个表,用与存储运动轨迹. * */ DataTable dtHistory = new DataTable(); dtHistory.TableName = "Track"; dtHistory.Columns.Add("FK_Node"); //节点ID. dtHistory.Columns.Add("NodeName"); //名称. dtHistory.Columns.Add("EmpNo"); //人员编号. dtHistory.Columns.Add("EmpName"); //名称 dtHistory.Columns.Add("RDT"); //记录日期. dtHistory.Columns.Add("SDT"); //应完成日期(可以不用.) dtHistory.Columns.Add("IsPass"); //是否通过?
//执行人. if (gwf.WFState == WFState.Complete) { //历史执行人. sql = "SELECT * FROM ND" + int.Parse(gwf.FK_Flow) + "Track WHERE WorkID=" + workID + " AND (ActionType=1 OR ActionType=0) ORDER BY RDT DESC"; DataTable dtTrack = BP.DA.DBAccess.RunSQLReturnTable(sql);
foreach (DataRow drTrack in dtTrack.Rows) { DataRow dr = dtHistory.NewRow(); dr["FK_Node"] = drTrack["NDFrom"]; //dr["ActionType"] = drTrack["NDFrom"]; dr["NodeName"] = drTrack["NDFromT"]; dr["EmpNo"] = drTrack["EmpFrom"]; dr["EmpName"] = drTrack["EmpFromT"]; dr["RDT"] = drTrack["RDT"]; dr["SDT"] = ""; dr["IsPass"] = 1; // gwl.IsPassInt; //是否通过. dtHistory.Rows.Add(dr); } } else { GenerWorkerLists gwls = new GenerWorkerLists(workID); foreach (GenerWorkerList gwl in gwls) { DataRow dr = dtHistory.NewRow(); dr["FK_Node"] = gwl.FK_Node; dr["NodeName"] = gwl.FK_NodeText; dr["EmpNo"] = gwl.FK_Emp; dr["EmpName"] = gwl.FK_EmpText; dr["RDT"] = gwl.RDT; dr["SDT"] = gwl.SDT; dr["IsPass"] = gwl.IsPassInt; //是否通过. dtHistory.Rows.Add(dr); } }
if (dtHistory.Rows.Count == 0) { DataRow dr = dtHistory.NewRow(); dr["FK_Node"] = gwf.FK_Node; dr["NodeName"] = gwf.NodeName; dr["EmpNo"] = gwf.Starter; dr["EmpName"] = gwf.StarterName; dr["RDT"] = gwf.RDT; dr["SDT"] = gwf.SDTOfNode; dtHistory.Rows.Add(dr); }
ds.Tables.Add(dtHistory); #endregion 运动轨迹
return ds; |