• 通达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;
        }    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157

    父类

    
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

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

    
    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('

    序号%d:用品编号必须填写',$k+1); continue; } //实发数量必须为数字,且大于0 if($v_sf_shuliang<=0){ $msg=$msg.sprintf('

    序号%d:物料【%s】的实发数量:%s。实发数量填写要求:【1】实发数量必须为数字,注意空格。【2】实发数量必须大于0。【3】删除多余行。

    '
    ,$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('

    在金蝶云星空系统中未查询到物料编号【%s】的即时库存记录!

    '
    ,$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('

    在金蝶云星空系统中未查询到物料ID【%s】的即时库存记录!

    '
    ,$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('

    物料【%s】的申请总数量:%d,超出金蝶系统中的即时库存数量:%d

    '
    ,$v["FMaterialId.FName"],$sf_num,$v["FBaseQty"]); }else{ $msg=$msg.sprintf('

    物料【%s】的申请总数量:%d,超出金蝶系统中的即时库存数量。

    '
    ,$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; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335

    调用效果

    
    include_once 'inc/auth.inc.php';
    include_once 'TDOA_BF_BanGongYongPin.class.php';
    echo '
    ';
    $run_id='195057';
    $obj=new TDOA_BF_BanGongYongPin($run_id);
    $data=$obj->checkData();
    var_dump($data);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    表单样式

    在这里插入图片描述

    V1.0

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

    
    /**
     * 日期: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;
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256

    调用示例

    
    require_once 'inc/auth.inc.php';
    require_once 'zztdBpmClass.php';
    echo '
    ';
    $run_id=196444;
    //$data=$zztdBpmClass->getBpmTableAndColumn();
    $arr=array(
        'main',
        '公车出行费用明细',
        '自行出行费用明细'
    );
    $zztdBpmClass=new zztdBpmClass($arr,$run_id);
    $data=$zztdBpmClass->getBpmData();
    var_dump($data);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    在这里插入图片描述

  • 相关阅读:
    nginx配置实例-负载均衡
    使用Qt Designer为您的Qt for Python项目创建基于Qt Widgets的图形界面的两种方法
    Java学习笔记(十六)
    Java实现十进制与二进制互相转换
    目标检测YOLO实战应用案例100讲-基于改进YOLO v5的排水管网缺陷智能识别(续)
    Online JSON formatter for developers
    for深入学习
    Go 语言如何读取 excel 测试数据,简单易学
    【探索AI】二十四 深度学习之第7周:深度学习在实际应用中的案例
    【论】Balancing bike sharing systems with constraint programming
  • 原文地址:https://blog.csdn.net/newMan67/article/details/133928488