cqp 9 mesi fa
parent
commit
06bfc38509

+ 1 - 0
app/Http/Controllers/Api/CheckController.php

@@ -14,6 +14,7 @@ class CheckController extends BaseController
         list($status,$data) = $service->checkAll($request->all(),$userData);
 
         if($status){
+            if($status == -1) return $this->json_return(202, $data);
             return $this->json_return(200,'',$data);
         }else{
             return $this->json_return(201,$data);

+ 1 - 0
app/Http/Controllers/Api/WorkFlowController.php

@@ -61,6 +61,7 @@ class WorkFlowController extends BaseController
         list($status,$data) = $service->create($request->all(),$user);
 
         if($status){
+            if($status == -1) return $this->json_return(202,$data);
             return $this->json_return(200,'',$data);
         }else{
             return $this->json_return(201,$data);

+ 14 - 0
app/Model/WorkFlowGenerated.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class WorkFlowGenerated extends Model
+{
+    protected $table = "workflow_generated"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 14 - 0
app/Model/WorkFlowGeneratedSub.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class WorkFlowGeneratedSub extends Model
+{
+    protected $table = "workflow_generated_sub"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 14 - 0
app/Model/WorkFlowGeneratedSubDetail.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class WorkFlowGeneratedSubDetail extends Model
+{
+    protected $table = "workflow_generated_sub_detail"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 14 - 0
app/Model/WorkFlowGeneratedSubDetailCondition.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class WorkFlowGeneratedSubDetailCondition extends Model
+{
+    protected $table = "workflow_generated_sub_detail_condition"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 6 - 0
app/Model/WorkFlowSubDetail.php

@@ -11,4 +11,10 @@ class WorkFlowSubDetail extends Model
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
 
+    // 0 发起人 1审批 2抄送 3条件 4路由
+    const type_zero = 0;
+    const type_one = 1;
+    const type_two = 2;
+    const type_three = 3;
+    const type_four = 4;
 }

+ 12 - 12
app/Service/CheckService.php

@@ -274,27 +274,27 @@ class CheckService extends Service
                     return [false, $msg];
                 }
 
-                //创建审批流
-                $args = [
-                    'order_no' => $data['order_number'],
-                    'menu_id' => $data['menu_id'] ?? 0,
-                    'opt_case' => $data['opt_case'],
-                    'order' => $msg,
-                ];
-
-                $oa = new OaService($user);
-                list($bool,$msg) = $oa->createOaOrder($args);
+                //生成审批流
+                $data['option_data'] = $msg; // 操作数据信息
+                $workFlowService = new WorkFlowService();
+                list($bool,$msg) = $workFlowService->create($data, $user);
                 if(! $bool) {
                     DB::rollBack();
+
+                    list($s, $m) = $msg;
+                    if($s == -1) return [-1, $m];
                     if($msg) return [false,$msg];
+
+                    // 指向下个需要审批人的流程
+                    $workFlowService->runWorkFlow($data['order_number']);
                 }
             }
 
             DB::commit();
             return [true, ''];
-        }catch (\Throwable $exception){
+        }catch (\Throwable $e){
             DB::rollBack();
-            return [false, $exception->getMessage() . $exception->getFile(). $exception->getLine()];
+            return [false, $e->getFile() . '|' . $e->getLine() . '|' . $e->getMessage()];
         }
     }
 

+ 199 - 1
app/Service/WorkFlowService.php

@@ -5,6 +5,10 @@ namespace App\Service;
 use App\Model\Employee;
 use App\Model\SysMenu;
 use App\Model\WorkFlow;
+use App\Model\WorkFlowGenerated;
+use App\Model\WorkFlowGeneratedSub;
+use App\Model\WorkFlowGeneratedSubDetail;
+use App\Model\WorkFlowGeneratedSubDetailCondition;
 use App\Model\WorkFlowSub;
 use App\Model\WorkFlowSubDetail;
 use App\Model\WorkFlowSubDetailCondition;
@@ -496,6 +500,10 @@ class WorkFlowService extends Service
         try {
             //生成
             list($status, $msg) = $this->createWorkFlowDetail($data, $user);
+            if(! $status){
+                DB::rollBack();
+                return [false, $msg];
+            }
 
             DB::commit();
         } catch (\Exception $e) {
@@ -515,14 +523,204 @@ class WorkFlowService extends Service
         if(empty($oa)) return [false, '工作流配置未设置,请联系开发者'];
         $menu_id = array_column($oa,'menu_id');
         if(! in_array($data['menu_id'], $menu_id)) return [false, '该菜单暂不支持工作流'];
+
+        return [true, ''];
     }
 
     public function createWorkFlowDetail($data, $user){
+        list($status, $msg) = $this->createWorkFlowDetailRule($data, $user);
+        if(! $status) {
+            if(isset($data['is_check'])){
+                //因为工作流不存在,或者点击的人不触发工作流,所以直接成功返回
+                list($status, $msg) = $this->callCheck($data, CheckService::TYPE_ONE,  $user);
+                return [$status, $msg];
+            }
+
+            return [false, $msg];
+        }
+
+        //创建审批流根据工作流
+        list($status, $msg) = $this->createWorkFlow($data, $user, $msg);
+        if(! $status) return [false, $msg];
+
+        return [true, ''];
+    }
+
+    public function createWorkFlowDetailRule($data, $user){
         $workFlow = WorkFlow::where('del_time',0)
             ->where('menu_id', $data['menu_id'])
             ->first();
-        if(empty($workFlow)) return [true, ''];
+        if(empty($workFlow)) return [false, [-1, '菜单工作流不存在、已被删除或未新建']];
+        $workFlow = $workFlow->toArray();
+
+        //判断是否创建工作流
+        list($status, $msg) = $this->getStartWorkFlow($workFlow['id'], $user);
+        if(! $status) return [false, $msg];
+
+        return [true, $workFlow];
+    }
+
+    //获取工作流的开始 判断是否激活审批流
+    public function getStartWorkFlow($workFlowId = 0, $user){
+        //用户的部门
+        $depart_user = $user['depart_range'] ?? [];
+
+        //工作流开始节点数据
+        $list = WorkFlowSubDetail::where('del_time',0)
+            ->where('workflow_id',$workFlowId)
+            ->where('type', WorkFlowSubDetail::type_zero)
+            ->get()->toArray();
+
+        //工作流的部门 人
+        $workflow_depart = $workflow_man = [];
+        foreach ($list as $value){
+            if($value['p_id'] > 0 && ! in_array($value['p_id'], $workflow_man)) $workflow_man[] = $value['p_id'];
+            if($value['d_id'] > 0 && ! in_array($value['d_id'], $workflow_depart)) $workflow_depart[] = $value['d_id'];
+        }
+        //所有人都能触发审批流
+        if(empty($workflow_depart) && empty($workflow_man)) return [true, ''];
+
+        if(! empty($workflow_depart)){
+            $d = array_intersect($depart_user, $workflow_depart);
+            if(! empty($d)) return [true, ''];
+        }
+
+        if(! empty($workflow_man)){
+            $p = array_intersect([$user['id']], $workflow_man);
+            if(! empty($p)) return [true, ''];
+        }
+
+        return [false, [-1, '触发人不在工作流发起者内']];
+    }
+
+    //创建审批流根据工作流
+    public function createWorkFlow($data, $user, $workFlow){
+        try {
+            DB::beginTransaction();
+
+            $time = time();
+            $model = new WorkFlowGenerated();
+            $model->title = $workFlow['title'];
+            $model->menu_id = $workFlow['menu_id'];
+            $model->vue_param = $workFlow['vue_param'];
+            $model->my_param = $workFlow['my_param'];
+            $model->order_number = $data['order_number'];
+            $model->crt_id = $user['id'];
+            $model->save();
+            $id = $model->id;
+
+            $this->insertSonModel2($workFlow['id'], $id, $time);
 
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            if (str_contains($e->getMessage(), '1062') || str_contains($e->getMessage(), 'Duplicate entry')) {
+                return [false, '审批流程已存在'];
+            }
+            return [false, $e->getFile() . '|' . $e->getLine() . '|' . $e->getMessage()];
+        }
+
+        return [true, $id];
+    }
+
+    public function insertSonModel2($workFlowId = 0, $workFlowGeneratedId = 0, $time){
+        $insert = [];
+        $workFlowSub = WorkFlowSub::where('del_time',0)
+            ->where('workflow_id', $workFlowId)
+            ->select('id','menu_id','m_id')
+            ->get()->toArray();
+        $keys = [];
+        foreach ($workFlowSub as $value){
+            $insert[] = [
+                'menu_id' => $value['menu_id'],
+                'm_id' => $value['m_id'],
+                'workflow_generated_id' => $workFlowGeneratedId,
+                'crt_time' => $time,
+            ];
+            $keys[] = $value['id'];
+        }
+        WorkFlowGeneratedSub::insert($insert);
+
+        //获取上一次插入订单的所有id
+        $last_insert_id = WorkFlowGeneratedSub::where('workflow_generated_id', $workFlowGeneratedId)
+            ->where('crt_time', $time)
+            ->where('del_time', 0)
+            ->select('id')->get()->toArray();
+        $last_insert_id = array_column($last_insert_id,'id');
+        $map = array_combine($keys, $last_insert_id);
+
+        $workFlowSubDetail = WorkFlowSubDetail::where('del_time',0)
+            ->where('workflow_id', $workFlowId)
+            ->select('id','menu_id','m_id','workflow_sub_id','type','p_id','d_id','settype','selectMode','selectRange','examineMode','priorityLevel')
+            ->get()->toArray();
+        $insert2 = [];
+        $keys = [];
+        foreach ($workFlowSubDetail as $value){
+            $keys[] = $value['id'];
+            $workflow_generated_sub_id = $map[$value['workflow_sub_id']] ?? 0;
+            unset($value['id']);unset($value['workflow_sub_id']);
+            $value['workflow_generated_id'] = $workFlowGeneratedId;
+            $value['workflow_generated_sub_id'] = $workflow_generated_sub_id;
+            $value['crt_time'] = $time;
+            $insert2[] = $value;
+        }
+        WorkFlowGeneratedSubDetail::insert($insert2);
+
+        //获取上一次插入订单的所有id
+        $last_insert_id = WorkFlowGeneratedSubDetail::where('workflow_generated_id', $workFlowGeneratedId)
+            ->where('crt_time', $time)
+            ->where('del_time', 0)
+            ->get()->toArray();
+        $last_map = array_column($last_insert_id,null,'id');
+        $last_insert_id = array_column($last_insert_id,'id');
+        $map = array_combine($keys, $last_insert_id);
+
+        $insert3 = [];
+        $workFlowSubDetailCondition = WorkFlowSubDetailCondition::where('del_time',0)
+            ->where('workflow_id', $workFlowId)
+            ->select('menu_id','workflow_sub_detail_id','column','opt1','opt2','opt_type','zdy1','zdy2')
+            ->get()->toArray();
+        if(! empty($workFlowSubDetailCondition)){
+            foreach ($workFlowSubDetailCondition as $value){
+                $workflow_generated_sub_detail_id = $map[$value['workflow_sub_detail_id']] ?? 0;
+                unset($value['workflow_sub_detail_id']);
+                $tmp = $last_map[$workflow_generated_sub_detail_id] ?? [];
+                $value['workflow_generated_id'] = $tmp['workflow_generated_id'];
+                $value['workflow_generated_sub_id'] = $tmp['workflow_generated_sub_id'];
+                $value['workflow_generated_sub_detail_id'] = $workflow_generated_sub_detail_id;
+                $value['crt_time'] = $time;
+                $insert3[] = $value;
+            }
+            WorkFlowGeneratedSubDetailCondition::insert($insert3);
+        }
+    }
+
+    //运行工作流
+    public function runWorkFlow($order_number = "", $workFlowGeneratedId = 0){
+        $workFlowGenerated = WorkFlowGenerated::where('del_time', 0)
+            ->when(! empty($order_number), function ($query) use ($order_number) {
+                return $query->where('order_number', $order_number);
+            })
+            ->when(! empty($workFlowGeneratedId), function ($query) use ($workFlowGeneratedId) {
+                return $query->where('id', $workFlowGeneratedId);
+            })
+            ->first();
+        if(empty($workFlowGenerated)) return [false, '工作流不存在或已被删除'];
+        $workFlowGenerated = $workFlowGenerated->toArray();
+
+//        if($workFlowGenerated['node_id'])
+    }
 
+    //调用审批
+    public function callCheck($data, $type, $user)
+    {
+        $service = new CheckService();
+        list($bool, $msg) = $service->createRecordAndInventory([
+            'order_number' => $data['order_number'],
+            'type' => $type,
+            'opt_case' => $data['opt_case'],
+            'user_data' => $user,
+        ]);
+        return [$bool, $msg];
     }
 }