工作流插件

61 阅读1分钟
<?php

namespace app\flow\plug;

use app\common\bpm\exception\FlowErrorException;
use app\common\bpm\logic\FlowRun;
use app\common\bpm\logic\FlowRunPrcs;
use app\common\bpm\logic\manager\DeleteWork;
use app\common\bpm\logic\manager\FlowMsg;
use app\common\bpm\Scope;
use app\common\bpm\traits\FlowAction;
use app\lowcode\plug\Base;
use think\Db;
use think\Exception;
use think\exception\HttpResponseException;

//转来信
class TransferLetter extends Base
{
    public $data;//数据
    public $type = 1;//1有错误返回报错信息0报错不影响原先的转交
    public function execute()
    {

        $data = $this->data;//原流程表单数据
        $d9 = $data['d9'];//提案委意见 立案/不立案
        if (empty($d9) || $d9 == '立案') {
            return true;//立案,则不转来信,直接返回
        }
        $newFlowId = 458;//新建流程的ID
        Scope::getInstance("flow");//初始化流程模块,如果是应用中心flow换为lowcode
        $user = auth()->user();//获取当前用户信息
        $prcsId = null;//当前流程节点,新建流程时为null
        $flowData = [//新建流程相关数据
            'flow_id' => $newFlowId,//流程ID
            'flowData' => [//流程数据
                'flow_id' => $newFlowId,//需包含流程ID
                'd1' => $data['d1'],//以下则为表单数据
                'd2' => $data['d2'],
                'd4' => $data['d4'],
                'd5' => $data['d5'],
                'd6' => $data['d6'],
                'd7' => $data['d7'],
                'd12' => $data['d12'],
                'd12_array' => $data['d12_array']
            ]
        ];
        $FlowRun = new FlowRun($user);//实例化流程,传入用户信息,为发起人
        Db::startTrans();//开启事务
        try {
            //先调用保存接口 保存数据  没有runId 则为新建的数据
            $runData = $FlowRun->createWork($flowData);
            $runId = $runData['id'];//创建完成后取得runId
            if (!$runData) {
                throw  new FlowErrorException('流程不存在');
            }
            //保存表单数据,传入流程数据,传入runId,prcsId,flowId
            $FlowRun->saveData($flowData, $runId, $prcsId, $runData['flow_id']);

            //获取流程信息,传入runId,用户信息,当前步骤号,返回流程数据
            $FlowMsg = new FlowMsg();
            $flowData2 = $FlowMsg->getDataFromRunId($runId, $user, false, "FL-01");
            //转交下一节点,传入ID,当前步骤号,用户信息
            $FlowRunPrcs =  FlowRunPrcs::getInstance($flowData2['id'], null, 'FL-01',$user);
            if(isset($this->isMonitor)){
                $FlowRunPrcs->isMonitor=$this->isMonitor;
            }
            $toNextPrcsData = [
                'notice'=>[//通知信息,title为内容,type为通知类型,to_user为接收人
                    'title'=>'请办理流程!流水号:'.$runId.',标题: '.$flowData2['run_name'].',转交人:'.$user['real_name'].',当前步骤:发起',
                    'type'=>[1],
                    'to_user'=>['635'],
                ],
                'prcs_id'=>'FL-01',//当前步骤号
                'run_id'=>$runId,
                'user_id'=>$user['id'],
                'flow_id'=>$newFlowId,
                'to_prcs'=>[//转交步骤信息
                    [
                        'prcs_id'=>'FL-02',//下一个节点
                        'toUser'=>[
                            'handle'=>[],//协办
                            'host'=>'635',//主办人ID
                        ]
                    ]
                ],
                'volume_up_user'=>[],//传阅
            ];

            $FlowRunPrcs->toNextPrcs($toNextPrcsData);
            //删除本流程,有权限校验,传入flow_run_id,用户ID(删除人)
            DeleteWork::DeleteWork($data['flow_run_id'],1,false);
            Db::commit();
        } catch (\Exception $e) {
            Db::rollback();
            error($e->getMessage(), config("app_trace") ? $e->getTrace() : null);
        }
        return true;
    }

}