cqp 3 周之前
父节点
当前提交
d83cc49647
共有 2 个文件被更改,包括 49 次插入12 次删除
  1. 7 0
      app/Model/WorkFlowInstancesNodes.php
  2. 42 12
      app/Service/WorkFlowService.php

+ 7 - 0
app/Model/WorkFlowInstancesNodes.php

@@ -17,4 +17,11 @@ class WorkFlowInstancesNodes extends DataScopeBaseModel
     protected $casts = [
         'assignees' => 'array',
     ];
+
+    const approval_type_one = 1;
+    const approval_type_two = 2;
+    const approval_type = [
+        self::approval_type_one => '会签',
+        self::approval_type_two => '或签',
+    ];
 }

+ 42 - 12
app/Service/WorkFlowService.php

@@ -254,40 +254,70 @@ class WorkFlowService extends Service
         $topDepartId = $user['top_depart_id'];
 
         // 1. 构造查询对象
-        $model = WorkFlowInstancesNodes::where('del_time',0)
+        $model = WorkFlowInstancesNodes::where('del_time', 0)
             ->where('top_depart_id', $topDepartId)
-            ->where('status', 1) // 1 = 审批中
-            ->whereRaw('JSON_CONTAINS(assignees, JSON_OBJECT("id", ?))', [(int)$userId])
-            // 如果我是“或签”,只要我还没审,节点状态就是1,我能看到;
-            // 如果我是“会签”,我审过了但别人没审,节点状态还是1,但通过这个排除条件,我看不到了。
+            ->where('status', 1)
+            ->whereRaw('JSON_CONTAINS(assignees, JSON_OBJECT("id", ?))', [$userId])
             ->whereRaw('NOT JSON_CONTAINS(assignees, JSON_OBJECT("id", ?, "is_pass", 1))', [$userId])
+            ->select('*')
             ->orderBy('id', 'desc');
+
         $pageData = $this->limit($model, '', $data);
 
         if (empty($pageData['data'])) return [true, $pageData];
 
-        // 3. 提取当前页的所有 instance_id
+        // 2. 提取当前页的所有流程实例 ID
         $instanceIds = array_unique(array_column($pageData['data'], 'instance_id'));
 
-        // 4. 获取关联信息
+        // 3. 获取流程实例及其关联的模板
         $instances = WorkFlowInstances::with(['template'])
             ->whereIn('id', $instanceIds)
             ->get()
             ->keyBy('id');
 
-        // 5. 组装返回数据 (遍历当前页的数据进行填充)
+        // --- 处理动态业务单据数据 ---
+        // 4. 按业务类型分组,批量查出单据的 code 和 title
+        $documentGroups = [];
+        foreach ($instances as $ins) {
+            $documentGroups[$ins->document_type][] = $ins->document_id;
+        }
+
+        $documentDataMap = []; // 存储结构: [type][id] => ['code' => ..., 'title' => ...]
+        foreach ($documentGroups as $type => $ids) {
+            // 这里根据你的 document_type (如 'item') 动态查询
+            // 假设你的业务表都有 code 和 title 字段
+            $docs = DB::table($type)
+                ->whereIn('id', array_unique($ids))
+                ->select('id', 'code', 'title')
+                ->get()
+                ->keyBy('id')
+                ->toArray();
+            $documentDataMap[$type] = $docs;
+        }
+
+        // 5. 组装最终返回数据
         foreach ($pageData['data'] as $key => $node) {
             $instance = $instances[$node['instance_id']] ?? null;
 
+            // 获取关联业务表的具体数据
+            $docDetail = null;
+            if ($instance) {
+                $docDetail = $documentDataMap[$instance->document_type][$instance->document_id] ?? null;
+            }
+
             $pageData['data'][$key] = [
                 'node_instance_id' => $node['id'],
                 'instance_id'      => $node['instance_id'],
                 'node_label'       => $node['label'],
-                'document_id'      => $instance->document_id ?? 0, //业务单据id
-                'document_type'    => $instance->document_type ?? '', //业务单据类型
-                'flow_title'       => $instance->template->title ?? '未知流程',
-                'apply_time_fmt'   => isset($instance->crt_time->timestamp) ? date('Y-m-d H:i:s', $instance->crt_time->timestamp) : '',
+                'document_id'      => $instance->document_id ?? 0,
+                'document_type'    => $instance->document_type ?? '',
+                // --- 新增字段 ---
+                'document_code'    => $docDetail->code ?? '',  // 业务单据编号
+                'document_title'   => $docDetail->title ?? '', // 业务单据标题
+                'workflow_title'       => $instance->template->title ?? '', // 审批模板名
+                'crt_time'   => !empty($instance->crt_time->timestamp) ? date('Y-m-d H:i:s', $instance->crt_time->timestamp) : '',
                 'approval_type'    => $node['approval_type'],
+                'approval_type_title'    => WorkFlowInstancesNodes::approval_type[$node['approval_type']] ?? '',
             ];
         }