V2.0 - 工作流使用教程
yoyocmf 2020-12-08 18:13:29

1、需要使用工作的模块,首先,需要一个wfid字段,smallint,5,工作流ID,这里可以参考一下,文档管理 - 分类管理

2、需要一个is_qf字段,tinyint,1,是否签发信息,1为签发信息,0为非签发信息,这里可以参考一下,文字管理 - 默认文章

3、在信息提交时,获取该信息关联的wfid,工作流,然后将该信息的is_qf字段设为true

4、最后一个节点,切记,记得设置为结束编号100

1.png

 

2021-09-16

1、model 加入afterSave钩子函数:

PHP Code复制内容到剪贴板
  1.     public function afterSave($insert$changedAttributes)  
  2.     {  
  3.         parent::afterSave($insert$changedAttributes);  
  4.         if ($insert) {  
  5.             //这里是新增数据  
  6.             if ($this->is_qf) {  
  7.                 try {  
  8.                     // 2021-02-04更新,可以上传用户手写签名图片signPic,这里要注意有没有user_sign这个字段  
  9.                     Yii::$app->services->workflowService->infoInsertToWorkflow(__CLASS__$this->id, $this->wfid, "investment""contract"$this->title, $this->user_sign);  
  10.   
  11.                     // 如果已经写入工作流信息,并且有下一审核人  
  12.                     // 给下一审核人发推送  
  13.                     if($this->wfinfo && $this->wfinfo->userids){  
  14. //                        p2("给审核人发推送:" . $this->wfinfo->userids);  
  15.                         Yii::$app->services->workflowService->pushAuditUsers($this->wfinfo->userids,__CLASS__$this->id);  
  16.                     }  
  17.   
  18.                 } catch (\Exception $e) {  
  19.   
  20.                 }  
  21.             }  
  22.         }  
  23.     }  

 

PS:如果是新加的entity 类型,到WorkflowService里面看一下 pushAuditUsers 方法

 

2、和工作流的信息表,添加关联关系

PHP Code复制内容到剪贴板
  1. /** 
  2.  * 获取签发信息以及签发用户 
  3.  * @return \yii\db\ActiveQuery 
  4.  */  
  5. public function getWfinfo()  
  6. {  
  7.     return $this->hasOne(Enewswfinfo::className(), ["entity_id" => "id"])->andOnCondition(["entity" => __CLASS__]);  
  8. }  

 

3、API人工签发,审核

PHP Code复制内容到剪贴板
  1. /** 
  2.  * @api {post} /investment/contract/audit 合同签发/审核 
  3.  * @apiVersion 1.0.0 
  4.  * @apiName InvestmentContractAudit 
  5.  * @apiGroup 投资分析管理 
  6.  * @apiPermission user 
  7.  * 
  8.  * @apiDescription 只有指定人才有审核权限,后端也会判断的 
  9.  * 
  10.  * @apiHeader {String} access-token 登录接口返回的access token. 
  11.  * 
  12.  * @apiParam {int}   contract_id     合同ID 
  13.  * @apiParam {int}   doing     操作,1为通过,2为返工,3为否决,0为送审 
  14.  * @apiParam {String}   user_sign     签发人签名 
  15.  * @apiParam {String}   check_text     签发人评语 
  16.  * 
  17.  * @apiSuccess {Int}   code              200正常,非200错误,401token过期,需要重新登录 
  18.  * @apiSuccess {String}   message           当code!=200的时候,message有意义 
  19.  * @apiSuccess {Int}   data             信息 
  20.  * 
  21.  *@apiParamExample {json} request-example 
  22.  * { 
  23.  *      "id":1, 
  24.  *      "doing":1, 
  25.  *      "check_text":"同意", 
  26.  *      "user_sign":"http://v2.zckj.ademo.ccc/storage/upload/20201211RLtpsowsWfV1aOXqSqanwCBZDwC46857OrZEr3Ec.jpg", 
  27.  * } 
  28.  * @apiError message Only authenticated Admins can access the data. 
  29.  * 
  30.  * @apiErrorExample Response (example): 
  31.  *     HTTP/1.1 401 Not Authenticated 
  32.  *     { 
  33.  *       "code":401, 
  34.  *       "message": "Your request was made with invalid credentials.", 
  35.  *       "data":{ 
  36.  * 
  37.  *       } 
  38.  *     } 
  39.  * 
  40.  */  
  41.   
  42.     public function actionAudit()  
  43.     {  
  44.         $entity_id = (string)\Yii::$app->request->post("contract_id"); // 合同ID  
  45.         $model = InvestmentContract::find()->where(['id' => $entity_id])->one();  
  46.         if ($model === null) {  
  47.             throw new NotFoundHttpException('合同台帐不存在,请联系管理员');  
  48.         }  
  49.         if ($model->is_qf == 0) {  
  50.             return ResultHelper::json("error""该合同台帐无需签发");  
  51.         }  
  52.   
  53.         // 提交签发结果  
  54.         $doing = (int)Yii::$app->request->post("doing");  
  55.         $checkText = Yii::$app->request->post("check_text");  
  56.         $entity = \common\modules\investment\models\InvestmentContract::className();  
  57.         $currentUserId = Yii::$app->user->id;  
  58.         $signPic = Yii::$app->request->post("user_sign");  
  59.         $res = Yii::$app->services->workflowService->doWfInfo($entity$entity_id$currentUserId$doing$signPic$checkText"backend");  
  60.   
  61.         // tno=100表示完成,完成之后【在工作流里面会发通知的】,这里无需再发一次  
  62.         // 完成后,工作流里面也会发送通知的  
  63.   
  64.         return ResultHelper::json($res["code"], $res["message"]);  
  65.     }  

 

 4、被打回后,API重新送审

PHP Code复制内容到剪贴板
  1. /** 
  2.  * @api {get} /investment/contract/update-audit 合同重新送审 
  3.  * @apiVersion 1.0.0 
  4.  * @apiName InvestmentUpdateAudit 
  5.  * @apiGroup 投资分析管理 
  6.  * @apiPermission user 
  7.  * @apiDescription 当详情info.check_tno = 101表示只能操作重新送审,不允许再次签发 
  8.  * 
  9.  * @apiHeader {String} access-token 登录接口返回的access token. 
  10.  * @apiParam {Int} id  唯一标识,合同的id 
  11.  * 
  12.  * @apiSuccess {Int}   code              200正常,非200错误,401token过期,需要重新登录 
  13.  * @apiSuccess {String}   message           当code!=200的时候,message有意义 
  14.  * @apiSuccess {Int}   data             信息 
  15.  * 
  16.  * @apiError message Only authenticated Admins can access the data. 
  17.  * 
  18.  * @apiErrorExample Response (example): 
  19.  *     HTTP/1.1 401 Not Authenticated 
  20.  *     { 
  21.  *       "code":401, 
  22.  *       "message": "Your request was made with invalid credentials.", 
  23.  *       "data":{ 
  24.  * 
  25.  *       } 
  26.  *     } 
  27.  * 
  28.  */  
  29.   
  30.     public function actionUpdateAudit()  
  31.     {  
  32.         $entity_id = (string)\Yii::$app->request->get("id");  
  33.         $model = InvestmentContract::find()->where(['id' => $entity_id])->one();  
  34.         if ($model === null) {  
  35.             throw new NotFoundHttpException('合同台帐不存在,请联系管理员');  
  36.         }  
  37.         $entity = \common\modules\investment\models\InvestmentContract::className();  
  38.         $currentUserId = Yii::$app->user->id;  
  39.         return Yii::$app->services->workflowService->infoUpdateToWorkflow($entity$entity_id$currentUserId);  
  40.   
  41.     }  

 

 

 

 


 

 

PHP Code复制内容到剪贴板
  1. public function afterSave($insert$changedAttributes)  
  2. {  
  3.     parent::afterSave($insert$changedAttributes);  
  4.     if ($insert) {  
  5.         //这里是新增数据  
  6.         if ($this->is_qf) {  
  7.             try {  
  8.                 // 2021-02-04更新,可以上传用户手写签名图片signPic,这里要注意有没有user_sign这个字段  
  9.                 WorkflowService::infoInsertToWorkflow(__CLASS__$this->id, $this->wfid, "investment""contract"$this->title, $this->user_sign);  
  10.             } catch (Exception $e) {  
  11.   
  12.             }  
  13.   
  14.             $this->pushNextAuditUsers(); // 给下一审核人发推送  
  15.         }  
  16.     }  
  17. }  
  18.   
  19. // 删除后对应删除副表,信息表,日志表  
  20. public function afterDelete()  
  21. {  
  22.     // delete dependencies  
  23.     Enewswfinfo::deleteAll(["entity" => __CLASS__"entity_id" => $this->id]);  
  24.     Enewswfinfolog::deleteAll(["entity" => __CLASS__"entity_id" => $this->id]);  
  25.   
  26.     // 删除待办事项  
  27.     $ids = Notify::find()->select("id")->where(["target_type"=>"investment","action"=>"contract","target_id"=>$this->id])->column();  
  28.     NotifyMember::deleteAll(["notify_id"=>$ids]);  
  29.     Notify::deleteAll(["id"=>$ids]);  
  30.   
  31.     parent::afterDelete();  
  32. }  
  33.   
  34. /** 
  35.  * 获取签发信息以及签发用户 
  36.  * @return \yii\db\ActiveQuery 
  37.  */  
  38. public function getWfinfo()  
  39. {  
  40.     return $this->hasOne(Enewswfinfo::className(), ["entity_id" => "id"])->andOnCondition(["entity" => __CLASS__]);  
  41. }  
  42.   
  43. /** 
  44.  * 需要签发时给下一签发人发推送,不需要签发时给联系人发推送 
  45.  * @return bool 
  46.  */  
  47. public function pushNextAuditUsers()  
  48. {  
  49.     $packageName = \Yii::$app->config->get("APP_ANDROID_PACKAGE"); //app的Android包名  
  50.     if (!$packageName) {  
  51.         return false;  
  52.     }  
  53.     $title = "待办事项";  
  54.     $content = $this->title . "待审批"// 为了与工作流命名一致  
  55.     $payload = ['type' => 'contract''id' => $this->id];  
  56.     if ($this->is_qf) {  
  57.         // 如果是签发信息  
  58.         // 给下一签发人发推送  
  59.         if ($this->wfinfo) {  
  60.             // 如果有Android的包名并且有签发信息  
  61.             $userids = explode(","$this->wfinfo->userids);  
  62.             foreach ($userids as $userid) {  
  63.                 \Yii::$app->services->geTui->pushSingle($packageName$title$content$payload, [$userid]);  
  64.             }  
  65.         }  
  66.     } else {  
  67.         // 如果不用签发  
  68.         // 给发起人发送app通知提醒  
  69.         $title = $this->title;  
  70.         $content = "审批通过";  
  71.         $this->pushContactUser($title$content);  
  72.     }  
  73. }  
  74.   
  75. public function pushContactUser($title$content)  
  76. {  
  77.     $packageName = \Yii::$app->config->get("APP_ANDROID_PACKAGE"); //app的Android包名  
  78.     if (!$packageName) {  
  79.         return false;  
  80.     }  
  81.     $payload = ['type' => 'purchase''id' => $this->id];  
  82.     $userid = $this->user_id;  
  83.     \Yii::$app->services->geTui->pushSingle($packageName$title$content$payload, [$userid]);  
  84. }  

 

如果在index中需要添加签发的按钮:

PHP Code复制内容到剪贴板
  1. [  
  2.     'class' => 'backend\widgets\grid\ActionColumnLayer',  
  3.     'template' => '{view} {update} {qianfa} {delete}',  
  4.     'buttons' => [  
  5.         'view' => function ($url$model$key) {  
  6.             return Html::createLayer(['view''id' => $model->id], '<i class="icon wb-eye"></i>', [  
  7.                 'data-ajax' => 1,  
  8.                 'data-target' => '_blank',  
  9.                 'data-toggle' => 'tooltip',  
  10.                 'data-original-title' => '查看',  
  11.                 'data-width' => '80%',  
  12.                 'data-height' => '90%'  
  13.             ]);  
  14.         },  
  15.         'update' => function ($url$model$key) {  
  16.             return Html::createLayer(['update''id' => $model->id], '<i class="icon wb-edit"></i>', [  
  17.                 'class' => 'btn btn-sm btn-flat',  
  18.                 'target' => '_blank',  
  19.                 'data-toggle' => 'tooltip',  
  20.                 'data-original-title' => '修改',  
  21.                 'data-width' => '80%',  
  22.                 'data-height' => '90%'  
  23.             ]);  
  24.         },  
  25.         'qianfa' => function ($url$model$key) {  
  26.             if ($model->is_qf) {  
  27.                 $entity = common\modules\document\models\Document::className();  
  28.                 $entityId = $model->id;  
  29.                 $wfinfo = $model->wfinfo;  
  30.                 if ($wfinfo) {  
  31.                     $currentAuditUser = $wfinfo->userTrueNames;  
  32.                     $html = Html::createLayer(["/workflow/info/audit""entity" => $entity"entity_id" => $entityId], "待" . $currentAuditUser . "签发", ['class' => 'btn btn-warning btn-xs','data-title'=>'签发信息']);  
  33.   
  34.                     if($wfinfo->check_tno == 101){  
  35.                         $html .= " " . Html::createAjaxBtn(["/workflow/info/update-audit""entity" => $entity"entity_id" => $entityId], "重新送审", ['class' => 'btn btn-warning btn-xs']);  
  36.                     }  
  37.                     return $html;  
  38.   
  39.                 } else {  
  40.                     return "<span class='btn btn-xs btn-danger'>签发信息丢失</span>";  
  41.                 }  
  42.             } else {  
  43.                 return "";  
  44.             }  
  45.         },  
  46.     ]  
  47. ],  

 

 

 

4、表单提交签发信息,返回的是json格式的

PHP Code复制内容到剪贴板
  1. // 提交签发结果  
  2. $doing = Yii::$app->request->post("doing");  
  3. $doing = (int) $doing;  
  4. $currentUserId = Yii::$app->user->id;  
  5. $currentUserId = (int) $currentUserId;  
  6. return WorkflowService::doWfInfo($entity,$entity_id,$currentUserId,$doing,Yii::$app->request->post("check_text"));  

 

 5、相关查询方法:

PHP Code复制内容到剪贴板
  1. // 根据当前model命名空间和主键id,获取工作流信息  
  2. $info = Enewswfinfo::find()->where(["entity" => $entity"entity_id" => $entity_id])->with(["workflow","workflow.items","workflowlog","workflowlog.profile"])->one();  
  3.   
  4.         $workflow = $info->workflow;  // 工作流信息所属工作流  
  5.         $items = $info->workflow->items; // 工作流下面的所有子节点  
  6.   
  7.   
  8. // 获取工作流信息所有审核记录  
  9. $infoLog = $info->workflowlog;  

 

隐藏获取属性:

当前签发信息签发状态(通过、返工、否决):$info->checktnoTxt 

当前签发信息详情:$info->detail

签发信息获取签发用户的真实姓名:$info->userTrueNames

 

签发日志的签发用户真实姓名:$infoLog->userTrueName

签发日志的签发状态:$infoLog->checktTypeTxt 

 

这里的打回操作,指的是用户重新送审时,步骤从哪一步继续开始,重新送审后继续从下一个签发用户开始

 


API说明:

 

1、审核通过 / 不通过:

传参:ID / doing(操作,1为通过,2为返工,3为否决,0为送审) / check_text(签发人评语) / user_sign(签发人签名图片url)

PHP Code复制内容到剪贴板
  1. public function actionAudit()  
  2. {  
  3.     $entity_id = (string) \Yii::$app->request->post("id");  
  4.       
  5.     // 提交签发结果  
  6.     $entity = Object::className();  
  7.     $doing = (int) Yii::$app->request->post("doing");  
  8.     $checkText = Yii::$app->request->post("check_text");  
  9.     $currentUserId = Yii::$app->user->id;  
  10.     $signPic = Yii::$app->request->post("user_sign");  
  11.     return WorkflowService::doWfInfo($entity$entity_id$currentUserId$doing$signPic$checkText);  
  12.   
  13. }  

 

2、当被否决或返回提交者时,需要重新送审

PHP Code复制内容到剪贴板
  1. public function actionUpdateAudit()  
  2. {  
  3.     $entity_id = (string) \Yii::$app->request->get("id");  
  4.     $entity = Object::className();  
  5.     $currentUserId = Yii::$app->user->id;  
  6.     return WorkflowService::infoUpdateToWorkflow($entity,$entity_id,$currentUserId);  
  7.   
  8. }  

 

 在API的model中返回签发信息和和签发日志

PHP Code复制内容到剪贴板
  1. // 签发详情  
  2.             'info' => function ($model) {  
  3.                 if (!$model->is_qf) {  
  4.                     // 非签发信息  
  5.                     return [];  
  6.                 }  
  7.                 $wfinfo = $model->wfinfo;  
  8.                 if ($wfinfo) {  
  9.                     return [  
  10.                         "userids" => $wfinfo->userids,  
  11.                         "usernames" => $wfinfo->userTrueNames,  
  12.                         "check_num" => $wfinfo->check_num,  
  13.                         "tstatus" => $wfinfo->tstatus,  
  14.                         "check_tno" => $wfinfo->check_tno,  
  15.                     ];  
  16.                 } else {  
  17.                     return [  
  18. //                        "userids" => "",  
  19. //                        "usernames" => "",  
  20. //                        "check_num" => 0,  
  21. //                        "tstatus" => "",  
  22. //                        "check_tno" => 0,  
  23.                     ];  
  24.                 }  
  25.             },  

 

 

PHP Code复制内容到剪贴板
  1. // 签发日志  
  2.             'audit' => function ($model) {  
  3.                 if(!$model->wfinfo){  
  4.                     // 如果有签发流程  
  5.                     return [];  
  6.                 }  
  7.                 $workflowlog = $model->wfinfo->workflowlog;  
  8.                 $res = [];  
  9.                 foreach ($workflowlog as $k => $log) {  
  10.                     $res[] = [  
  11.                         "id" => $log->id,  
  12.                         "wfid" => $log->wfid,  
  13.                         "tid" => $log->tid,  
  14.                         "user_id" => $log->user_id,  
  15.                         "user_name" => $log->userTrueName,  
  16.                         "user_sign" => $log->user_sign,  
  17.                         "check_text" => $log->check_text,  
  18.                         "check_num" => $log->check_num,  
  19.                         "check_type" => $log->check_type,  
  20.                         "created_at" => date("Y-m-d H:i:s"$log->created_at),  
  21.                     ];  
  22.                 }  
  23.                 return $res;  
  24.             },  

 

 

PHP Code复制内容到剪贴板
  1.     /** 
  2.      * 采购单签发/审核 
  3.      * @return array|mixed 
  4.      * @throws NotFoundHttpException 
  5.      * @throws \Throwable 
  6.      * @throws \yii\db\Exception 
  7.      * @throws \yii\db\StaleObjectException 
  8.      */  
  9.     public function actionAudit()  
  10.     {  
  11.         $entity_id = (string)\Yii::$app->request->post("purchase_id");  
  12.         $model = Purchase::find()->where(['purchase_id' => $entity_id])->one();  
  13.         if ($model === null) {  
  14.             throw new NotFoundHttpException('采购单不存在,请联系管理员');  
  15.         }  
  16.         if($model->is_qf == 0){  
  17.             return ResultHelper::json("error""该采购单无需签发");  
  18.         }  
  19.   
  20.         // 提交签发结果  
  21.         $doing = (int)Yii::$app->request->post("doing");  
  22.         $checkText = Yii::$app->request->post("check_text");  
  23.         $entity = \common\modules\material\models\Purchase::className();  
  24.         $currentUserId = Yii::$app->user->id;  
  25.         $signPic = Yii::$app->request->post("user_sign");  
  26.         $res = Yii::$app->services->workflowService->doWfInfo($entity$entity_id$currentUserId$doing$signPic$checkText,"backend");  
  27.   
  28.         // tno=100表示完成,完成之后在工作流里面会发通知的,这里无需再发一次  
  29.         if(($res["code"] == 201 || $res["code"] == 200) && $res["data"]["tno"] != 100){  
  30.             // 给发起人发送app通知提醒  
  31.             $title = $model->title;  
  32.             $content = $res["message"];  
  33.             $model->pushContactUser($title,$content);  
  34.         }  
  35.   
  36.         // 写入日志变动记录  
  37.         $recordModel = new Record();  
  38.         $recordModel->type = "purchase";  
  39.         $recordModel->action = "audit";  
  40. //        $recordModel->content = "签发采购申请单";  
  41.         $recordModel->content = $res["message"];  
  42.         $recordModel->link_id = $model->purchase_id;  
  43.         $recordModel->project_id = $model->project_id;  
  44.         if (!$recordModel->save()) {  
  45.             throw new HttpException(400, current($recordModel->getFirstErrors()));  
  46.         }  
  47.         return ResultHelper::json($res["code"],$res["message"]);  
  48.     }  
  49.   
  50.     /** 
  51.      * 重新送审 
  52.      * @return array|mixed 
  53.      * @throws NotFoundHttpException 
  54.      * @throws \yii\db\Exception 
  55.      */  
  56.     public function actionUpdateAudit()  
  57.     {  
  58.         $entity_id = (string)\Yii::$app->request->get("id");  
  59.         $model = Purchase::find()->where(['purchase_id' => $entity_id])->one();  
  60.         if ($model === null) {  
  61.             throw new NotFoundHttpException('采购单不存在,请联系管理员');  
  62.         }  
  63.   
  64.         // 写入日志变动记录  
  65.         $recordModel = new Record();  
  66.         $recordModel->type = "purchase";  
  67.         $recordModel->action = "audit";  
  68.         $recordModel->content = "重新送审采购申请单";  
  69.         $recordModel->link_id = $model->purchase_id;  
  70.         $recordModel->project_id = $model->project_id;  
  71.         if (!$recordModel->save()) {  
  72.             throw new HttpException(400, current($recordModel->getFirstErrors()));  
  73.         }  
  74.   
  75.         $entity = \common\modules\material\models\Purchase::className();  
  76.         $currentUserId = Yii::$app->user->id;  
  77.         return Yii::$app->services->workflowService->infoUpdateToWorkflow($entity$entity_id$currentUserId);  
  78.   
  79.     }  
  80.   
  81.     /** 
  82.      * 获取审核流程,获取签发流程 
  83.      * @return array 
  84.      */  
  85.     public function actionAuditSetting()  
  86.     {  
  87.         $projectId = Yii::$app->request->get("project_id");  
  88.         $wfid = Purchase::getWfid($projectId);  
  89.         if (!$wfid) {  
  90.             return [];  
  91.         }  
  92.         $items = Enewsworkflowitem::find()->where(["wfid" => $wfid])->all();  
  93.         $res = [];  
  94.         foreach ($items as $k => $item) {  
  95.             $res[] = [  
  96.                 "tid" => $item->tid,  
  97.                 "wfid" => $item->wfid,  
  98.                 "tname" => $item->tname,  
  99.                 "tno" => $item->tno,  
  100.                 "ttext" => $item->ttext,  
  101.                 "userids" => $item->userids,  
  102.                 "usernames" => $item->userTrueNames,  
  103.                 "tbdo" => $item->tbdo,  
  104.                 "tddo" => $item->tddo,  
  105.                 "tstatus" => $item->tstatus,  
  106.             ];  
  107.         }  
  108.         return $res;  
  109.     }  

 

 

 

本文来自于:http://www.yoyo88.cn/note/yoyocmf/556.html

Powered by yoyo苏ICP备15045725号