通达OA-通用版-V12,流程及表单自定义好用的类

V2.0

说明:对V1.0版本进行重构了,拆分为两个类:根类、父类

根类

 <?php
/**
 * 日期:2023年10月24日
 * 说明:整合定制开发过程中常用的功能
 * 版本:V2.0
 * 适用版本:通用版V12/PHP 7.2.34
 * 依赖:OA系统数据库连接。include_once 'inc/auth.inc.php';或include_once 'inc/conn.php';
 */
class TDOA_BpmForm{
    //具体流程的表名前缀
    var $tbNamePre='bpm_data_';
    var $mainAndList;
    var $flow_id;
    var $dataMkey;
    /**
     * 
     * 参数说明
     * $mainAndList=array(//此参数必须。
     *  'main',//表示当前表单,固定的,必须的
     *  '列表控件名称1',
     *  '列表控件名称2'
     * )
     * $flow_id,查询流程数据表名称及表中的字段。传入$run_id时,可不填此参数
     */
    function __construct($flow_id,$mainAndList=array('main')){
        $this->flow_id=$flow_id;
        $this->mainAndList=$mainAndList;
    }    
    /**
     *getSortAndDesc
     * @return 
        array(
            'main'=>'表单名称',
            'detail_828'=>'列表控件名称'
        ) 
     */
    public function getSortAndDesc(){
        $data=array();
        $sql=sprintf('select * from bpm_variable_sort where FLOW_ID=%d',$this->flow_id);
        $res=exequery(TD::conn(),$sql);
        while ($row=mysqli_fetch_assoc($res)) {
            if($row['TYPE']=='main'){
                $type='main';
            }else{
                $type=$row['TYPE'].'_'.$row['ID'];
            }
            $data[$type]=$row['DESC'];
        }
        return $data;
    }

    /**
     * getBpmTableAndColumn
     * 说明:根据流程flow_id,获取流程的表名及字段名、列表控件的表名及字段名
     * @return 
        array(
               0=>array(//main的键值
                    'desc'=>'表单名称',
                    'tableNameArr'=>array(
                        'bpm_data_537',
                        'bpm_data_537_child'//如果表单中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18951'=>'申请日期',
                        'data_m18954'=>'报销人'
                    )
                ),
                1=>array(//列表控件名称1键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_828',//如果存在列表控件
                        'bpm_data_537_list_828_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18984'=>'派车单号',
                        'data_m18985'=>'报告编号'
                    )
                ),
                2=>array(//列表控件名称2键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_829',//如果存在列表控件
                        'bpm_data_537_list_829_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m19004'=>'派车单号',
                        'data_m19005'=>'报告编号'
                    )
                )
        )
     */
    public function getBpmTableAndColumn(){
        //表名前缀
        $tbPre=$this->tbNamePre.$this->flow_id;
        //返回数据
        $data=array();
        $sql=sprintf('select * from bpm_variable_sort where FLOW_ID=%d',$this->flow_id);
        $res=exequery(TD::conn(),$sql);
        while ($row=mysqli_fetch_assoc($res)) {
            $tableName='';
            $tableNameArr=array();
            $tableColumnArr=array();
            if($row['TYPE']=='main'){
                $type=array_search('main',$this->mainAndList);
                $tableName=$tbPre;
            }else{
                $type=array_search($row['DESC'],$this->mainAndList);
                $tableName=$tbPre.'_list_'.$row['ID'];
            }
            if($type===false){
                continue;
            }
            array_push($tableNameArr,$tableName);
            $sql2=sprintf('select * from bpm_variable where SORT_ID =%d',$row['ID']);    
            $res2=exequery(TD::conn(),$sql2);
            $i=0;
            while ($row2=mysqli_fetch_assoc($res2)) {
                $tableColumnArr[$row2['NAME']]=$row2['DESC'];
                if($i===0&&$row2['TYPE']=='text'){ //如果有一个控件类型为text,则存在xx_child子表
                   $tableName=$tableName.'_child';
                   array_push($tableNameArr,$tableName);
                   $i++;
                }
            }
            asort($tableNameArr);//确保子表_child在主表后面
            ksort($tableColumnArr);//字段名升序。
            $tmp_keyArr=array();
            $tmpArr=array();
            if(isset($this->dataMkey[$type])&&!empty($this->dataMkey[$type])){
                //方案一 没找到则返回空字符串,则数组值可能都是空字符串
                foreach($this->dataMkey[$type] as $k=>$v){
                    $key=array_search($v,$tableColumnArr);
                    if($key===false){
                        $tmpArr[$k]='';
                    }else{
                        $tmpArr[$k]=$key;
                    }
                }
                /* 方案二 会过滤掉找不到的,找到的都是有效的,但可能返回空数组
                $tmp_keyArr=array_intersect($tableColumnArr,$this->dataMkey[$type]);
                foreach($tmp_keyArr as $k=>$v){
                    $key=array_search($v,$this->dataMkey[$type]);
                    $tmpArr[$key]=$k;
                }
                */

            }
            $data[$type]=array(
                'desc'=>$row['DESC'],
                'table'=>$tableNameArr,
                'cols'=>$tableColumnArr,
                'keys'=>$tmpArr
            );
        }
        return $data;
    }    
}

父类

<?php
include_once 'TDOA_BpmForm.class.php';

class TDOA_BpmRun extends TDOA_BpmForm{
	var $flow_id;
	var $mainAndList=array('main');
	var $dataMkey;
	var $run_id;
	public function __construct($run_id,$flow_id=0){
		$this->run_id=$run_id;
		if(isset($flow_id)&&$flow_id>0){
			$this->flow_id=$flow_id;
		}else{
			$data=$this->getBpmRun();
			$this->flow_id=$data['FLOW_ID'];
		}
		parent::__construct($this->flow_id,$this->mainAndList);
	}
	/**
     * getBpmRun
     * 说明:根据流水号run_id,获取流程的信息
     * @return array 一维数组
     */
    public function getBpmRun(){
        $data=array();
        $sql=sprintf('select * from bpm_run where RUN_ID=%d',$this->run_id);
        $res=exequery(TD::conn(),$sql);
        $data=mysqli_fetch_assoc($res);
        return $data;
    }
    /**
     * 根据run_id,获取当前流程的表单数据
     * @return 
        array(
               0=>array(//main的键值
                    'desc'=>'表单名称',
                    'tableNameArr'=>array(
                        'bpm_data_537',
                        'bpm_data_537_child'//如果表单中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18951'=>'申请日期',
                        'data_m18954'=>'报销人'
                    ),
                    'data'=>array(
                        0=>array(
                            'data_m18951'=>'2023年10月19日',
                            'data_m18954'=>'张三'
                        )
                    )
                ),
                1=>array(//列表控件名称1键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_828',//如果存在列表控件
                        'bpm_data_537_list_828_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18984'=>'派车单号',
                        'data_m18985'=>'报告编号'
                    ),
                    'data'=>array(
                        0=>array(
                            'data_m18984'=>'PCDBH-001',
                            'data_m18985'=>'BGBH-001'
                        )
                    )
                ),
                2=>array(//列表控件名称2键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_829',//如果存在列表控件
                        'bpm_data_537_list_829_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m19004'=>'姓名',
                        'data_m19005'=>'开始日期'
                    ),
                    'data'=>array(
                        0=>array(
                            'data_m19004'=>'李四',
                            'data_m19005'=>'2023年10月19日'
                        )
                    )
                )
        )
     * 
     */
    public function getBpmData(){
        $data=$this->getBpmTableAndColumn();
        $tbArr=array();
        foreach($data as $k=>$v){
            $tbArr=$v['table'];
            $tmp_data=array();            
            //查询数据
            $cTbArr=count($tbArr);
            if($cTbArr==1){
              $sql=sprintf('select * from %s where run_id=%d',$tbArr[0],$this->run_id);
            }else if($cTbArr==2){
              $sql=sprintf('select * from %s as a join %s as b on a.id=b.id where a.run_id=%d',$tbArr[0],$tbArr[1],$this->run_id);
            }
            $res=exequery(TD::conn(),$sql);
            while ($rows=mysqli_fetch_assoc($res)) {
                foreach($rows as $k2=>$v2){
                    if($v2===null){//重置值为null的空字符串
                        $rows[$k2]='';
                    }
                }
                $tmp_data[]=$rows;
            }
            $data[$k]['data']=$tmp_data;
        }
        return $data;
    }
}

正常开发过程使用的类,继承父类即可

<?php
include_once 'TDOA_BpmRun.class.php';
include_once 'erkai/jindie/apiclass/JinDie_BD_Empinfo.class.php';
include_once 'erkai/jindie/apiclass/JinDie_STK_Inventory.class.php';
include_once 'erkai/jindie/apiclass/JinDie_STK_MisDelivery.class.php';

class TDOA_BF_BanGongYongPin extends TDOA_BpmRun{
    var $explodeStr='```';
    var $mainAndList=array(
            'main'=>'main',
            'list'=>'出库内容'
        );
    var $dataMkey=array(
        'main'=>array(
            'lingyong'=>'申请日期',
            'sqr'=>'领用申请人',
            'bumen'=>'领料部门'
        ),
        'list'=>array(
            'ypid'=>'用品ID',
            'ypcode'=>'用品编号',
            'ypname'=>'用品名称',
            'sq_shuliang'=>'申请数量',
            'sf_shuliang'=>'实发数量',
            'note'=>'备注'
        )
    );
    var $run_id;
    var $formData;
    var $mainData;
    var $mainKeys;
    var $listData;
    var $listKeys;
    
    var $JinDie_BD_Empinfo;
    var $JinDie_STK_Inventory;
    var $JinDie_STK_MisDelivery;
    public function __construct($run_id){
        $this->run_id=$run_id;
        parent::__construct($run_id);
        $this->formData=$this->getBpmData();

        $this->mainData=$this->formData['main']['data'];
        $this->mainKeys=$this->formData['main']['keys'];
        $this->listData=$this->formData['list']['data'];
        $this->listKeys=$this->formData['list']['keys'];

        $this->JinDie_BD_Empinfo=new JinDie_BD_Empinfo();
        $this->JinDie_STK_Inventory=new JinDie_STK_Inventory();
        $this->JinDie_STK_MisDelivery=new JinDie_STK_MisDelivery();

        //测试
        $this->mainData[0][$this->mainKeys['sqr']]='王凤英';
    }
    //验证部门必填
    public function checkBuMen(){
        $returnData=array(
            'status'=>true,
            'msg'=>'',
            'data'=>array()
        );
        $bumen=$this->mainData[0][$this->mainKeys['bumen']];
        try{
            if(empty($bumen)){
                $msg='领料部门必填!';
                throw new Exception($msg); 
            }else{
                $arr=explode($this->explodeStr,$bumen);
                $returnData=array(
                    'status'=>true,
                    'msg'=>'',
                    'data'=>array(
                        'bumen'=>$arr[0],
                        'number'=>$arr[1]
                    )
                ); 
            }
        }catch(Exception $e){
            $returnData=array(
                'status'=>false,
                'msg'=>$e->getMessage(),
                'data'=>array()
            );
            throw new Exception($e->getMessage);
        }
        return $returnData;
    }
    //验证发起人必须在金蝶系统员工表中
    public function checkJinDieYuanGong(){
        $returnData=array(
            'status'=>true,
            'msg'=>'',
            'data'=>array()
        );
        $sqr=$this->mainData[0][$this->mainKeys['sqr']];
        try{
            $searchData=array("FName"=>$sqr);
            $sqRdata=$this->JinDie_BD_Empinfo->queryBill($searchData);
            if(count($sqRdata)!=1||$sqr!=$sqRdata[0]["FName"]){
                $msg=sprintf('【%s】,在金蝶系统员工表中没有查找到对应的信息!请联系相关人员处理。',$sqr);
                throw new Exception($msg);
            }else{
               $returnData=array(
                    'status'=>true,
                    'msg'=>'',
                    'data'=>array(
                        'name'=>$name,
                        'number'=>$sqRdata[0]['FStaffNumber']
                    )
                ); 
            }
        }catch(Exception $e){
            $returnData=array(
                'status'=>false,
                'msg'=>$e->getMessage(),
                'data'=>array()
            );
        }
        return $returnData;
    }
    //验证物料数据
    public function checkWuLiao($show_kcsl=false){
        $returnData=array(
            'status'=>true,
            'msg'=>'',
            'data'=>array()
        );
        try{
            //物料行数
            if(count($this->listData)==0){
                $msg='物料总行数必须大于0!';
                throw new Exception($msg); 
            }
            //按物料编号的,记录并累加数量
            $sumArr=array();
            $noteArr=array();
            foreach ($this->listData as $k => $v) {
                $v_ypname=$v[$this->listKeys['ypname']];
                $v_ypcode=$v[$this->listKeys['ypcode']];
                $v_sf_shuliang=floatval($v[$this->listKeys['sf_shuliang']]);
                //物料编号必须填写
                if(empty($v_ypcode)){
                    $msg=$msg.sprintf('<p>序号%d:用品编号必须填写',$k+1);
                    continue;
                }
                //实发数量必须为数字,且大于0
                if($v_sf_shuliang<=0){
                    $msg=$msg.sprintf('<p>序号%d:物料【%s】的实发数量:%s。实发数量填写要求:【1】实发数量必须为数字,注意空格。【2】实发数量必须大于0。【3】删除多余行。</p>',$k+1,$v_ypname,$v[$this->listKeys['sf_shuliang']]);
                    continue;
                }else{                    
                    //如果存在重复物料编号,则累加相同物料编号的数量
                    if(array_key_exists($v_ypcode,$sumArr)){
                        $sumArr[$v_ypcode]=$sumArr[$v_ypcode]+$v_sf_shuliang;
                    }else{
                        $sumArr[$v_ypcode]=$v_sf_shuliang;
                    }
                    $noteArr[$v_ypcode]=$v[$this->listKeys['note']];
                }
            }
            if(empty($sumArr)){
               throw new Exception($msg);
            }
            //按查询金蝶系统的对应的即时库存
            $codeArr=array_keys($sumArr);
            $codeStr=implode(",",$codeArr);
            $searchData=array("FMaterialId_FNumber"=>$codeStr);
            $materialData=$this->JinDie_STK_Inventory->queryBill($searchData);
            if($materialData==false){//按物料编号,在金蝶系统中查询不到对应库存的记录
                 $msg=$msg.sprintf('<p>在金蝶云星空系统中未查询到物料编号【%s】的即时库存记录!</p>',$codeStr);
                 throw new Exception($msg);
            }
            //部分物料编号在金蝶系统中查询不到对应库存的记录
            $tmpKeyArr=array_column($materialData, "FMaterialId.FNumber");
            $valDiff=array_diff($codeArr,$tmpKeyArr);
            if(count($valDiff)>0){
                $codes=implode(",",$valDiff);
                $msg=$msg.sprintf('<p>在金蝶云星空系统中未查询到物料ID【%s】的即时库存记录!</p>',$codes);
                throw new Exception($msg);
            }
            //实发数量,必须小于等于即时库存
            foreach($materialData as $k=>$v){
              $sf_num=$sumArr[$v["FMaterialId.FNumber"]];
              $note=$noteArr[$v["FMaterialId.FNumber"]];
              //申请的数量大于即时库存数量
              if($sf_num>$v["FBaseQty"]){
                if($show_kcsl){
                    $msg=$msg.sprintf('<p>物料【%s】的申请总数量:%d,超出金蝶系统中的即时库存数量:%d</p>',$v["FMaterialId.FName"],$sf_num,$v["FBaseQty"]);
                }else{
                    $msg=$msg.sprintf('<p>物料【%s】的申请总数量:%d,超出金蝶系统中的即时库存数量。</p>',$v["FMaterialId.FName"],$sf_num); 
                }
              }else{
                //往数组追加元素
                $v['sf_num']=$sf_num;
                $v['note']=$note;
                $returnData['data'][]=$v;
              }
            }
            if(!empty($msg)){                
                throw new Exception($msg);
            }     
        }catch(Exception $e){
            $returnData=array(
                'status'=>false,
                'msg'=>$e->getMessage(),
                'data'=>array()
            );
        }
        return $returnData;
    }
    //验证表单数据
    public function checkFormData($show_kcsl=false){
        $returnData=array(
            'status'=>true,
            'msg'=>'',
            'data'=>array(),
            'main'=>array(),
            'list'=>array()
        );
        try{
            $retData=$this->checkBuMen();
            if($retData['status']==false){
                 throw new Exception($retData['msg']);
            }
            $returnData['main']['bmNumber']=$retData['data']['number'];

            //检查发起人在金蝶系统员工表是否存在
            $retData=$this->checkJinDieYuanGong();
            if($retData['status']==false){
                 throw new Exception($retData['msg']);
            }
            $returnData['main']['sqrNumber']=$retData['data']['number'];

            $retData=$this->checkWuLiao($show_kcsl);
            if($retData['status']==false){
                 throw new Exception($retData['msg']);
            }
            $returnData['list']=$retData['data'];

        }catch(Exception $e){
            $returnData=array(
                'status'=>false,
                'msg'=>$e->getMessage(),
                'data'=>array()
            );
        }
        return $returnData;
    }
    //传输数据到金蝶系统
    public function putDataToJinDie(){
        $returnData=array(
            'status'=>true,
            'msg'=>'',
            'data'=>array()
        );
        try{
            $data=$this->checkFormData(true);
            //组装model
            $model=array(
                //2023年8月28日新增 //备注
                "FNote"=>"OA流水号:".$this->run_id.",推送时间:".date("Y-m-d H:i:s"),
                //领料人  //员工表 员工编号 //2023年8月30日新增
                "FPickerId"=>array(
                  "FStaffNumber"=>$data['main']['sqrNumber'],
                ),
                //领料部门  //部门表 部门编号 //2023年8月30日新增    
                "FDeptId"=>array(
                    "FNumber"=>$data['main']['bmNumber'],
                ),
                "FDate"=>date("Y-m-d",time()),//2023年9月2日 由单据日期,调整为传输日期
                "FBillTypeID"=>array(
                  "FNumber"=>"QTCKD01_SYS"
                ),
                "FStockDirect"=>"GENERAL",
                "FOwnerTypeIdHead"=>"BD_OwnerOrg",
                "FStockOrgId"=>array(
                  "FNumber"=>"GJB01"
                ),
                "FBizType"=>"0",
              );
            $FEntity=array();
            foreach($data['list'] as $k=>$v){
                $FEntity[]=array(
                      "FQty"=>$v['sf_num'],//实发数量
                      "FBaseQty"=>$v['sf_num'],//实发数量(基本单位)
                      "FKeeperId"=>array(
                        "FNumber"=>$v["FKeeperId.FNumber"]
                      ),
                      "FUnitID"=>array(
                        "FNumber"=>$v["FBaseUnitId.FNumber"]
                      ),
                      "FStockStatusId"=>array(
                        "FNumber"=>$v["FStockStatusId.FNumber"]
                      ),
                      "FOwnerId"=>array(
                        "FNumber"=>$v["FOwnerId.FNumber"]
                      ),
                      "FKeeperTypeId"=>"BD_KeeperOrg",
                      "FBaseUnitId"=>array(
                        "FNumber"=>$v["FBaseUnitId.FNumber"]
                      ),
                      "FMaterialId"=>array(
                        "FNumber"=>$v["FMaterialId.FNumber"]
                      ),
                      "FOwnerTypeId"=>"BD_OwnerOrg",
                      "FStockId"=>array(
                        "FNumber"=>$v["FStockId.FNumber"]
                      ),
                      "FEntryNote"=>$v['note']
                    );
            }
            $model["FEntity"]=$FEntity;
            /*
            //保存     
            $ret=$this->JinDie_STK_MisDelivery->save($model);
            $b_save=$ret->Result->ResponseStatus->IsSuccess;
            //提交审核
            $sub_data=array(
              "Ids"=>$ret->Result->Id
            );
            $jdNumber=$ret->Result->Number;
            $ret=$this->JinDie_STK_MisDelivery->submit($sub_data); 
            */

        }catch(Exception $e){
            $returnData=array(
                'status'=>false,
                'msg'=>$e->getMessage(),
                'data'=>array()
            );
        }
        return $returnData;
    }
    

}

调用效果

<?php
include_once 'inc/auth.inc.php';
include_once 'TDOA_BF_BanGongYongPin.class.php';
echo '<pre>';
$run_id='195057';
$obj=new TDOA_BF_BanGongYongPin($run_id);
$data=$obj->checkData();
var_dump($data);

表单样式

在这里插入图片描述

V1.0

日期:2023年10月19日
新建类文件,将下面代码复制到文件中即可。
功能说明:
1、根据flow_id,可以获取流程表单相关的表名、及字段名。
2、根据run_id,可以获取流程表单相关的的表名、字段名、及流程表单中用户数据。

<?php
/**
 * 日期:2023年10月19日
 * 说明:整合定制开发过程中常用的功能
 * 版本:V1.0
 * 适用版本:通用版V12/PHP 7.2.34
 * 依赖:OA系统数据库连接。include_once 'inc/auth.inc.php';或include_once 'inc/conn.php';
 */
class zztdBpmClass{
    //具体流程的表名前缀
    var $tbNamePre='bpm_data_';
    var $mainAndList=array();
    var $flow_id=0;
    var $run_id=0;
    /**
     * 
     * 参数说明
     * $mainAndList=array(//此参数必须。
     *  'main',//表示当前表单,固定的,必须的
     *  '列表控件名称1',
     *  '列表控件名称2'
     * )
     * $run_id,查询流程表单的具体数据,则此参数必须。
     * $flow_id,查询流程数据表名称及表中的字段。传入$run_id时,可不填此参数
     */
    function __construct(){//$mainAndList,$run_id=0,$flow_id=0
        $args=func_get_args();
        $argsnum=func_num_args();
        switch ($argsnum) {
            case 1:
                $this->mainAndList=$args[0];
                break;
            case 2:
                $this->mainAndList=$args[0];
                $this->run_id=$args[1];
                $data=$this->getBpmRun();
                $this->flow_id=$data['FLOW_ID'];
                break;
            case 3:
                $this->mainAndList=$args[0];
                $this->run_id=$args[1];
                $this->flow_id=$args[2];
                break;
            default:
                
                break;
        }
    }

    /**
     * getBpmRun
     * 说明:根据流水号run_id,获取流程的信息
     * @return array 一维数组
     */
    public function getBpmRun(){
        $data=array();
        $sql=sprintf('select * from bpm_run where RUN_ID=%d',$this->run_id);
        $res=exequery(TD::conn(),$sql);
        $data=mysqli_fetch_assoc($res);
        return $data;
    }
    /**
     *getSortAndDesc
     * @return 
        array(
            'main'=>'表单名称',
            'detail_828'=>'列表控件名称'
        ) 
     */
    public function getSortAndDesc(){
        $data=array();
        $sql=sprintf('select * from bpm_variable_sort where FLOW_ID=%d',$this->flow_id);
        $res=exequery(TD::conn(),$sql);
        while ($row=mysqli_fetch_assoc($res)) {
            if($row['TYPE']=='main'){
                $type='main';
            }else{
                $type=$row['TYPE'].'_'.$row['ID'];
            }
            $data[$type]=$row['DESC'];
        }
        return $data;
    }

    /**
     * getBpmTableAndColumn
     * 说明:根据流程flow_id,获取流程的表名及字段名、列表控件的表名及字段名
     * @return 
        array(
               0=>array(//main的键值
                    'desc'=>'表单名称',
                    'tableNameArr'=>array(
                        'bpm_data_537',
                        'bpm_data_537_child'//如果表单中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18951'=>'申请日期',
                        'data_m18954'=>'报销人'
                    )
                ),
                1=>array(//列表控件名称1键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_828',//如果存在列表控件
                        'bpm_data_537_list_828_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18984'=>'派车单号',
                        'data_m18985'=>'报告编号'
                    )
                ),
                2=>array(//列表控件名称2键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_829',//如果存在列表控件
                        'bpm_data_537_list_829_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m19004'=>'派车单号',
                        'data_m19005'=>'报告编号'
                    )
                )
        )
     */
    public function getBpmTableAndColumn(){
        //表名前缀
        $tbPre=$this->tbNamePre.$this->flow_id;
        //返回数据
        $data=array();
        $sql=sprintf('select * from bpm_variable_sort where FLOW_ID=%d',$this->flow_id);
        $res=exequery(TD::conn(),$sql);
        while ($row=mysqli_fetch_assoc($res)) {
            $tableName='';
            $tableNameArr=array();
            $tableColumArr=array();
            if($row['TYPE']=='main'){
                $type=array_search('main',$this->mainAndList);
                $tableName=$tbPre;
            }else{
                $type=array_search($row['DESC'],$this->mainAndList);
                $tableName=$tbPre.'_list_'.$row['ID'];
            }
            if($type===false){
                continue;
            }
            array_push($tableNameArr,$tableName);
            $sql2=sprintf('select * from bpm_variable where SORT_ID =%d',$row['ID']);    
            $res2=exequery(TD::conn(),$sql2);
            $i=0;
            while ($row2=mysqli_fetch_assoc($res2)) {
                $tableColumArr[$row2['NAME']]=$row2['DESC'];
                if($i===0&&$row2['TYPE']=='text'){ //如果有一个控件类型为text,则存在xx_child子表
                   $tableName=$tableName.'_child';
                   array_push($tableNameArr,$tableName);
                   $i++;
                }
            }
            asort($tableNameArr);//确保子表_child在主表后面
            ksort($tableColumArr);//字段名升序。
            $data[$type]=array(
                'desc'=>$row['DESC'],
                'table'=>$tableNameArr,
                'cols'=>$tableColumArr
            );
        }
        ksort($data);
        return $data;
    }

    /**
     * 根据run_id,获取当前流程的表单数据
     * @return 
        array(
               0=>array(//main的键值
                    'desc'=>'表单名称',
                    'tableNameArr'=>array(
                        'bpm_data_537',
                        'bpm_data_537_child'//如果表单中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18951'=>'申请日期',
                        'data_m18954'=>'报销人'
                    ),
                    'data'=>array(
                        0=>array(
                            'data_m18951'=>'2023年10月19日',
                            'data_m18954'=>'张三'
                        )
                    )
                ),
                1=>array(//列表控件名称1键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_828',//如果存在列表控件
                        'bpm_data_537_list_828_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m18984'=>'派车单号',
                        'data_m18985'=>'报告编号'
                    ),
                    'data'=>array(
                        0=>array(
                            'data_m18984'=>'PCDBH-001',
                            'data_m18985'=>'BGBH-001'
                        )
                    )
                ),
                2=>array(//列表控件名称2键值
                    'desc'=>'列表控件名称',
                    'tableNameArr'=>array(
                        'bpm_data_537_list_829',//如果存在列表控件
                        'bpm_data_537_list_829_child'//如果列表控件中有多行文本框时,则有子表
                    ),
                    'tableColumArr'=>array(
                        'data_m19004'=>'姓名',
                        'data_m19005'=>'开始日期'
                    ),
                    'data'=>array(
                        0=>array(
                            'data_m19004'=>'李四',
                            'data_m19005'=>'2023年10月19日'
                        )
                    )
                )
        )
     * 
     */
    public function getBpmData(){
        $data=$this->getBpmTableAndColumn();
        $tbArr=array();
        foreach($data as $k=>$v){
            $tbArr=$v['table'];
            $tmp_data=array();
            
            //查询数据
            $cTbArr=count($tbArr);
            if($cTbArr==1){
              $sql=sprintf('select * from %s where run_id=%d',$tbArr[0],$this->run_id);
            }else if($cTbArr==2){
              $sql=sprintf('select * from %s as a join %s as b on a.id=b.id where a.run_id=%d',$tbArr[0],$tbArr[1],$this->run_id);
            }
            $res=exequery(TD::conn(),$sql);
            while ($rows=mysqli_fetch_assoc($res)) {
                foreach($rows as $k2=>$v2){
                    if($v2===null){//重置值为null的空字符串
                        $rows[$k2]='';
                    }
                }
                $tmp_data[]=$rows;
            }
            $data[$k]['data']=$tmp_data;
        }
        return $data;
    }
    
}

调用示例

<?php
require_once 'inc/auth.inc.php';
require_once 'zztdBpmClass.php';
echo '<pre>';
$run_id=196444;
//$data=$zztdBpmClass->getBpmTableAndColumn();
$arr=array(
    'main',
    '公车出行费用明细',
    '自行出行费用明细'
);
$zztdBpmClass=new zztdBpmClass($arr,$run_id);
$data=$zztdBpmClass->getBpmData();
var_dump($data);

内容绝对原创,希望对您有帮助。您的打赏,是让我持续更新的牛奶和面包

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值