基本思路:
一人发起一个流程,该流程由其他几个人(即节点)来分别审核。就像请假流程,分别有不同领导通过,最后通过,改流程结束。
前期session起到很重要的作用,session把每个节点的人员信息保存,通过与数组的来回转换,实现取值与赋值。
把人员信息——流程节点存到session
1.用户选择节点,输出单选框,单选框显示人员名称,并把人员代号存到value中,定义class名,为下边的添加节点按钮选择时用。 查询的是用户表
请选择流程节点:<br><br> <?php session_start(); include("../gongju/DBDA.class.php"); $db=new DBDA(); $user="select * from lc_user"; $auser=$db->Query($user); $str=""; foreach($auser as $v) { echo "<input type='radio' class='us' name='us' value='{$v[0]}'>".$v[2]; } ?> <br> <input type="button" value="添加节点" id="tianjia">
2.给tianjia按钮添加点击事件,通过class名取单选框中所有元素 var us=$(".us");,用eq()方法分别判断每个元素的选中状态,如果选中,赋值给uid,传到处理界面
$("#tianjia").click(function(){ //取选中的用户名 var uid=""; var us=$(".us"); for(var i=0;i<us.length;i++) { if(us.eq(i).prop("checked")) { uid=us.eq(i).val(); } } $.ajax({ type:"post", url:"lcjiedianchuli.php", async:true, data:{uid:uid,type:0}, dataType:"TEXT", success:function(data) { window.location.href="lc_main.php"; } }); })
3.处理界面,如果使用一个处理界面,用switch($type){case 0:.........},
开启session,把取到的uid值存到session里面,
判断session里面有没有值,如果没有,就建一个带有传递过来uid值的数组,存到session,
如果session有值,把session赋值给一个数组,然后给这个数组添加传递过来的uid值,最后把session再赋给数组,
$attr=$_SESSION["user"];
$attr[]=$uid;
$_SESSION["user"]=$attr;
这样数组中就存了所有选择的人员信息。
session_start(); include("../gongju/DBDA.class.php"); $db=new DBDA(); $type=$_POST["type"]; switch($type) { case 0: $uid=$_POST["uid"]; if(empty($_SESSION["user"])) { $_SESSION["user"]=array($uid); }else { $attr=$_SESSION["user"]; $attr[]=$uid; $_SESSION["user"]=$attr; } break;
4.经过处理界面处理,session里面就存了含有选择的人员信息,ajax中成功返回的话就window.location.href="",相当于刷新页面,
返回选择节点页面,取session里面的值
把session赋给一个数组,数组中存放人员代号,遍历这个数组,并取数组的索引号和人员代号,进行显示,
取到索引是为了删除时,再把数组进行重新索引
添加删除按钮,给删除按钮一个标示,点击时,取到这个标示。
<div id="jiedian"> <?php $attr=array(); if(!empty($_SESSION["user"])) { $attr=$_SESSION["user"]; foreach($attr as $k=>$v) { $sname="select name from lc_user where uid='{$v}'"; $name=$db->StrQuery($sname); echo "<div>{$k}--{$name}--<input type='button' value='删除' bs='{$k}' class='shanchu'></div>"; } } ?> </div>
5.删除,取到索引,并设置变量type=1,传递到处理界面
$(".shanchu").click(function(){ var suoyin=$(this).attr("bs"); $.ajax({ type:"post", url:"lcjiedianchuli.php", async:true, data:{suoyin:suoyin,type:1}, dataType:"TEXT", success:function(data) { window.location.href="lc_main.php"; } }); })
6.删除的处理界面,取到传递的索引,
因为人员信息是存到session里面,所以把session赋给一个数组,删除索引为传递过来索引的元素
unset()方法是删除数组中的某个元素,array_values()方法,是把数组重新索引。
case 1: $sy=$_POST["suoyin"]; $attr=$_SESSION["user"]; unset($attr[$sy]); $attr=array_values($attr); $_SESSION["user"]=$attr; break;
到此,选择人员作为事件的节点结束。接下来做事件的流程
1.需要登陆者输入流程名称
<div>
请输入流程名称:
<input type="text" id="name" />
<input type="button" id="xinjian" value="保存" />
</div>
2.点击保存,进行两项操作。第一项:把流程代号和流程名称添加到流程表,第二项:把该流程中所有节点人员的信息添加到节点表
3.给保存加事件,上面两张表中,code可以取时间戳,name是用户输入的内容,uids和orders分别是session的值和索引,所以只需传name值即可。
$("#xinjian").click(function(){ var name=$("#name").val(); $.ajax({ type:"post", url:"lcjiedianchuli.php", async:true, data:{name:name,type:2}, dataType:"TEXT", success:function(data) { window.location.href="lc_main.php"; } }); })
4.处理界面,先插入流程表中信息,
把session赋给一个数组,遍历数组,取到数组的索引和值,分别是orders和uids,因为取索引和值,
所以可以用foreach($attr as $k=>$v)这样的形式
case 2: $name=$_POST["name"]; $code=time(); $slc="insert into liucheng values('{$code}','{$name}')"; $db->Query($sql,0); $attr=array(); if(!empty($_SESSION["user"])) { $attr=$_SESSION["user"]; } foreach($attr as $k=>$v) { $sql="insert into lc_flowpath values('','{$code}','{$v}','{$k}')"; $db->Query($sql,0); } break;
接下来做发起流程的过程
1.登陆者发起一个流程,先在下拉中填充流程列表,从流程表中查出数据显示
<h1>发起流程</h1> <div>请选择要发起的流程: <select id="sel"> <?php include("../gongju/DBDA.class.php"); $db=new DBDA(); $sql="select * from liucheng"; $attr=$db->Query($sql); foreach($attr as $v) { echo "<option value='{$v[0]}'>{$v[1]}</option>"; } ?> </select> </div> <div>请输入流程的详细信息 <textarea id="xq"> </textarea> </div> <input type="button" value="发起" id="btn"/>
2.点击发起,要把流程名称和流程内容添加到用户流程表中
$("#btn").click(function(){ var code=$("#sel").val(); var nr=$("#xq").val(); $.ajax({ type:"post", url:"lcjiedianchuli.php", async:true, data:{code:code,nr:nr,type:3}, dataType:"TEXT", success:function(data) { window.location.href="lc_liucheng.php"; } }); })
3.处理界面代码如下:把流程代号、流程内容,登陆者,发起日期添加到用户流程表
case 3: $code=$_POST["code"]; $nr=$_POST["nr"]; $uid=$_SESSION["uid"]; $rq=time(); $sql="insert into lc_userflow values('','{$code}','{$uid}','{$nr}','0','{$rq}','0')"; $db->Query($sql,0); break;
接下来做登录界面:如果登录者,在一个流程的节点中,如果流程到了他的一个节点,他可以改变此流程的状态,
如果流程还没有到此登陆者的节点,即不显示,
结束的流程也显示。
1.登陆界面和登录处理,比较简单,大体一写,注意:要把登录者的用户名存到新建的session里,用来判断流程的order与该用户名是否对应。
如果对应,则让流程显示,并让该登陆者改变状态,如果不对应,则不显示
<form action="lc_loginchuli.php" method="post"> <input type="text" name="uid" /> <input type="text" name="pwd" /> <input type="submit" value="登录" /> </form>
session_start(); include("../gongju/DBDA.class.php"); $db=new DBDA(); $uid=$_POST["uid"]; $pwd=$_POST["pwd"]; $sql="select pwd from lc_user where uid='{$uid}'"; $mm=$db->StrQuery($sql); if($mm==$pwd &&$pwd!="") { $_SESSION["uid"]=$uid; header("location:lc_liucheng.php"); }else { echo "登录失败"; }
2.显示流程的信息:取登陆者的用户名、查询用户流程表查到流程代号和流程到哪里(towhere)、根据用户流程表查询,满足流程代号和当前登陆者的有关数据,
如果有数据,则查到该数据的order,通过用户流程表中的towhere和order做比较,
如果towhere等于order,那说明这个流程正好走到该登陆者,所以显示带有“通过”的流程信息
如果towhere大于order,说明已经处理过,显示“已通过”的流程信息。每次节点中人员处理一次,让towhere每次加1。
<table border="1" cellspacing="0" cellpadding="0"> <tr><th>发起者</th><th>发起时间</th><th>流程名称</th><th>流程内容</th><th>是否结束</th><th>操作</th></tr> <?php session_start(); include("../gongju/DBDA.class.php"); $db = new DBDA(); $uid = $_SESSION["uid"]; $sql = "select * from lc_userflow"; $attr = $db->Query($sql); foreach($attr as $v) { $v[1];//流程代号 $v[6]; //流程走到哪了 //根据流程代号和当前登录者用户名查orders $szai="select count(*) from lc_flowpath where code='{$v[1]}' and uids='{$uid}'"; $n = $db->StrQuery($szai); //该人员在该流程下 if($n>0) { $sorder = "select orders from lc_flowpath where code='{$v[1]}' and uids='{$uid}'"; $order = $db->StrQuery($sorder); if($v[6]>=$order) { $str =""; if($v[6]==$order) { $str = "<a href='lc_tongguo.php?ids={$v[0]}'>通过</a>"; } else { $str = "<span style='color:green'>已处理</span>"; } echo "<tr><td>{$v[2]}</td> <td>{$v[5]}</td> <td>{$v[1]}</td> <td>{$v[3]}</td> <td>{$v[4]}</td> <td>{$str}</td></tr>"; } } } ?> </table>
3.做通过的处理:取到准备通过的人员流程表的ids值,通过一次,就让towhere+1、
取到表中的code和towhere的值,根据code值,到流程节点表中查询该流程共有几个节点或者节点的数量,
如果towhere的值大于等于流程节点的数量的话,就让isok的值改为1,表示该流程结束。
<?php session_start(); include("../gongju/DBDA.class.php"); $db = new DBDA(); $ids = $_GET["ids"]; $sql = "update lc_userflow set towhere = towhere+1 where ids='{$ids}'"; $db->Query($sql,0); $stw = "select code,towhere from lc_userflow where ids='{$ids}'"; $atw = $db->Query($stw); $lcdaihao = $atw[0][0]; $towhere = $atw[0][1]; $jiedian = "select count(*) from lc_flowpath where code='{$lcdaihao}'"; $shuliang = $db->StrQuery($jiedian); if($towhere>=$shuliang) { $su = "update lc_userflow set isok =1 where ids='{$ids}' "; $db->Query($su,0); } header("location:lc_liucheng.php"); ?>