流程管理

基本思路:

一人发起一个流程,该流程由其他几个人(即节点)来分别审核。就像请假流程,分别有不同领导通过,最后通过,改流程结束。

前期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");
?>

 

posted @ 2017-01-18 14:29  88旧港  阅读(624)  评论(0编辑  收藏  举报