cqp преди 3 месеца
родител
ревизия
46906d4a46

+ 2 - 2
app/Model/ItemDetails.php

@@ -13,7 +13,7 @@ class ItemDetails extends DataScopeBaseModel
     const type_one = 1;
     const type_one = 1;
     const type_two = 2;
     const type_two = 2;
     public static $type_name = [
     public static $type_name = [
-        self::type_one => '研发人',
-        self::type_two => '研发设备',
+        self::type_one => '人',
+        self::type_two => '设备',
     ];
     ];
 }
 }

+ 85 - 4
app/Service/EmployeeService.php

@@ -317,6 +317,80 @@ class EmployeeService extends Service
         return [true, $resultMap];
         return [true, $resultMap];
     }
     }
 
 
+    public function fillDataForExport($data, $column, $user, &$return)
+    {
+        if (empty($data)) return;
+
+        $dataArray = is_array($data) ? $data : $data->toArray();
+        $mainIds = array_column($dataArray, 'id');
+
+        // 1. 获取详情映射 [员工ID => [ [部门编码, 部门名称], [部门编码, 部门名称] ]]
+        $detailsMap = $this->getEmployeeDetailsMap($mainIds, $user);
+
+        // 枚举映射
+        $sexMap   = \App\Model\Employee::SEX_TYPE;
+        $eduMap   = \App\Model\Employee::Education;
+        $stateMap = \App\Model\Employee::State_Type;
+
+        foreach ($dataArray as $main) {
+            $empId = $main['id'];
+            $details = $detailsMap[$empId] ?? [];
+
+            // 2. 格式化主表信息(这些是这一人所有行共有的内容)
+            $mainInfo = $main;
+            $mainInfo['sex_title']       = $sexMap[$main['sex']] ?? '';
+            $mainInfo['education_title'] = $eduMap[$main['education']] ?? '';
+            $mainInfo['state_title']     = $stateMap[$main['state']] ?? '';
+
+            if (empty($details)) {
+                // 如果没部门,保底出一行
+                $tempRow = [];
+                foreach ($column as $col) {
+                    $tempRow[] = $mainInfo[$col] ?? '';
+                }
+                $return[] = $tempRow;
+            } else {
+                // 3. 核心拆分点:遍历部门明细,每一个部门都产生一个新的 $tempRow
+                foreach ($details as $sub) {
+                    // 将员工基本信息与“当前这一个”部门信息合并
+                    $fullRowData = array_merge($mainInfo, $sub);
+
+                    $tempRow = [];
+                    // 严格按配置顺序取值
+                    foreach ($column as $col) {
+                        $tempRow[] = $fullRowData[$col] ?? '';
+                    }
+
+                    // 【重点】这里是追加,不是覆盖!
+                    // 如果张三有2个部门,这里会先后 push 两次,Excel 就会多出两行
+                    $return[] = $tempRow;
+                }
+            }
+        }
+    }
+
+    public function getEmployeeDetailsMap($empIds, $user)
+    {
+        // 关联查询权限表和部门档案
+        $list = DB::table('employee_depart_permission as p')
+            ->join('depart as d', 'p.depart_id', '=', 'd.id')
+            ->whereIn('p.employee_id', $empIds)
+            ->where('p.top_depart_id', $user['top_depart_id'])
+            ->where('d.del_time', 0)
+            ->select('p.employee_id', 'd.code as depart_code', 'd.title as depart_title')
+            ->get();
+
+        $res = [];
+        foreach ($list as $item) {
+            // 【重点】注意这里的 [],它保证了同一个 employee_id 下可以挂载多个部门数组
+            $res[$item->employee_id][] = [
+                'depart_code'  => $item->depart_code,
+                'depart_title' => $item->depart_title,
+            ];
+        }
+        return $res;
+    }
+
     public function employeeRule(&$data, $user,$is_add = true){
     public function employeeRule(&$data, $user,$is_add = true){
         if(empty($data['number'])) return [false,'工号不存在'];
         if(empty($data['number'])) return [false,'工号不存在'];
         if(empty($data['title'])) return [false,'姓名不存在'];
         if(empty($data['title'])) return [false,'姓名不存在'];
@@ -596,12 +670,19 @@ class EmployeeService extends Service
         if($is_export){
         if($is_export){
             $map = Depart::where('del_time',0)
             $map = Depart::where('del_time',0)
                 ->whereIn('id', array_column($list['data'], 'parent_id'))
                 ->whereIn('id', array_column($list['data'], 'parent_id'))
-                ->pluck('code','id')
-                ->toArray();
+                ->select('code','id', 'title')
+                ->get()->toArray();
+            $map = array_column($map,null,'id');
             foreach ($list['data'] as $key => $value){
             foreach ($list['data'] as $key => $value){
-                $code = $map[$value['parent_id']] ?? "";
-                if($code == $user['top_depart_code']) $code = "" ;
+                $tmp = $map[$value['parent_id']] ?? "";
+                if($tmp['code'] == $user['top_depart_code']) {
+                    $code = $title = "";
+                }else{
+                    $code = $tmp['code'];
+                    $title = $tmp['title'];
+                }
                 $list['data'][$key]['parent_code'] = $code;
                 $list['data'][$key]['parent_code'] = $code;
+                $list['data'][$key]['parent_title'] = $title;
             }
             }
         }
         }
 
 

+ 20 - 7
app/Service/ExportFileService.php

@@ -87,6 +87,23 @@ class ExportFileService extends Service
         $return[] = $tmp;
         $return[] = $tmp;
     }
     }
 
 
+    public function employee($ergs,$user){
+        // 导出数据
+        $return = [];
+        $header_default = $user['e_header_default'];
+        $column = array_column($header_default,'export');
+        $header = array_column($header_default,'value');
+
+        $service = new EmployeeService();
+        $model = $service->employeeCommon($ergs, $user);
+
+        $model->chunk(500,function ($data) use(&$return, $service, $column, $user){
+            $service->fillDataForExport($data, $column, $user, $return);
+        });
+
+        return [true, $this->saveExportData($return,$header)];
+    }
+
     public function depart($ergs,$user){
     public function depart($ergs,$user){
         // 导出数据
         // 导出数据
         $return = [];
         $return = [];
@@ -143,13 +160,9 @@ class ExportFileService extends Service
 
 
         $service = new ItemService();
         $service = new ItemService();
         $model = $service->itemCommon($ergs, $user);
         $model = $service->itemCommon($ergs, $user);
-        $model->chunk(500,function ($data) use(&$return,$column,$service){
-            $data = $data->toArray();
-
-            $list['data'] = $data;
-            $list = $service->fillData($list, true);
-
-            $this->fillData($list['data'], $column, $return);
+        $model->chunk(500,function ($data) use(&$return,$column,$service, $user){
+            // 调用 Service 层的填充方法
+            $service->fillDataForExport($data, $column, $user, $return);
         });
         });
 
 
         return [true, $this->saveExportData($return,$header)];
         return [true, $this->saveExportData($return,$header)];

+ 7 - 3
app/Service/FeeService.php

@@ -93,16 +93,20 @@ class FeeService extends Service
         return [true,['data' => $list,'tree' => $list_tree]];
         return [true,['data' => $list,'tree' => $list_tree]];
     }
     }
 
 
-    public function fillFeeList($list,$user, $is_export = false){
+    public function fillFeeList($list, $user, $is_export = false){
         if(empty($list)) return $list;
         if(empty($list)) return $list;
 
 
         if($is_export){
         if($is_export){
             $map = Fee::where('del_time',0)
             $map = Fee::where('del_time',0)
                 ->whereIn('id', array_column($list['data'], 'parent_id'))
                 ->whereIn('id', array_column($list['data'], 'parent_id'))
-                ->pluck('code','id')
+                ->select('code','id', 'title')
+                ->get()
                 ->toArray();
                 ->toArray();
+            $map = array_column($map, null, 'id');
             foreach ($list['data'] as $key => $value){
             foreach ($list['data'] as $key => $value){
-                $list['data'][$key]['parent_code'] = $map[$value['parent_id']] ?? "";
+                $tmp = $map[$value['parent_id']] ?? "";
+                $list['data'][$key]['parent_code'] = $tmp['code'] ?? "";
+                $list['data'][$key]['parent_title'] = $tmp['title'] ?? "";
             }
             }
         }
         }
 
 

Файловите разлики са ограничени, защото са твърде много
+ 548 - 187
app/Service/ImportService.php


+ 97 - 7
app/Service/ItemService.php

@@ -279,27 +279,22 @@ class ItemService extends Service
         return [true, ''];
         return [true, ''];
     }
     }
 
 
-    public function fillData($data, $is_export = false){
+    public function fillData($data){
         if(empty($data['data'])) return $data;
         if(empty($data['data'])) return $data;
 
 
         $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'crt_id')));
         $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'crt_id')));
-        $map = [];
-        if($is_export) $map = $this->getDetailsMap(array_column($data['data'],'id'));
         foreach ($data['data'] as $key => $value){
         foreach ($data['data'] as $key => $value){
             $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
             $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
             $data['data'][$key]['start_time'] = $value['start_time'] ? date('Y-m-d',$value['start_time']) : '';
             $data['data'][$key]['start_time'] = $value['start_time'] ? date('Y-m-d',$value['start_time']) : '';
             $data['data'][$key]['end_time'] = $value['end_time'] ? date('Y-m-d',$value['end_time']) : '';
             $data['data'][$key]['end_time'] = $value['end_time'] ? date('Y-m-d',$value['end_time']) : '';
             $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
             $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
             $data['data'][$key]['state_title'] = Item::State_Type[$value['state']] ?? "";
             $data['data'][$key]['state_title'] = Item::State_Type[$value['state']] ?? "";
-            $tmp = $map[$value['id']] ?? [];
-            $data['data'][$key]['man_list'] = $tmp['man'] ?? "";
-            $data['data'][$key]['device_list'] = $tmp['device'] ?? "";
         }
         }
 
 
         return $data;
         return $data;
     }
     }
 
 
-    public function getDetailsMap($item_id){
+    public function getDetailsMap1($item_id){
         // 1. 获取明细数据,注意一定要选出 item_id
         // 1. 获取明细数据,注意一定要选出 item_id
         $data = ItemDetails::where('del_time', 0)
         $data = ItemDetails::where('del_time', 0)
             ->whereIn('item_id', $item_id)
             ->whereIn('item_id', $item_id)
@@ -351,4 +346,99 @@ class ItemService extends Service
 
 
         return $result;
         return $result;
     }
     }
+
+    /**
+     * 填充项目导出数据(主表与明细平铺)
+     */
+    public function fillDataForExport($data, $column, $user, &$return)
+    {
+        if (empty($data)) return;
+
+        $dataArray = is_array($data) ? $data : $data->toArray();
+        $mainIds = array_column($dataArray, 'id');
+
+        // 1. 获取详情映射 [item_id => [ [type_title=>..., code_2=>..., title=>...], ... ]]
+        $detailsMap = $this->getDetailsMap($mainIds, $user);
+
+        // 2. 获取主表状态映射
+        $stateMap = \App\Model\Item::State_Type;
+
+        foreach ($dataArray as $main) {
+            $itemId = $main['id'];
+            $details = $detailsMap[$itemId] ?? [];
+
+            // 3. 提取并格式化主表信息
+            $mainInfo = $main;
+            $mainInfo['state_title'] = $stateMap[$main['state'] ?? ''] ?? '未知';
+            // 日期格式化
+            $mainInfo['start_time'] = !empty($main['start_time']) ? date('Y-m-d', $main['start_time']) : '';
+            $mainInfo['end_time']   = !empty($main['end_time']) ? date('Y-m-d', $main['end_time']) : '';
+
+            if (empty($details)) {
+                // 如果单据没有明细,保底出一行
+                $tempRow = [];
+                foreach ($column as $col) {
+                    $tempRow[] = $mainInfo[$col] ?? '';
+                }
+                $return[] = $tempRow;
+            } else {
+                // 4. 核心平铺逻辑:每一行明细都带上主表信息
+                foreach ($details as $sub) {
+                    // 合并主表数据和详情数据(sub 中包含 type_title, code_2, title 等)
+                    $fullRowData = array_merge($mainInfo, $sub);
+
+                    $tempRow = [];
+                    foreach ($column as $col) {
+                        $tempRow[] = $fullRowData[$col] ?? '';
+                    }
+                    $return[] = $tempRow;
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取明细聚合映射表
+     */
+    public function getDetailsMap($mainIds, $user)
+    {
+        $details = ItemDetails::where('del_time', 0)
+            ->whereIn('item_id', $mainIds)
+            ->where('top_depart_id', $user['top_depart_id'])
+            ->get();
+
+        if ($details->isEmpty()) return [];
+
+        // 1. 批量提取关联 ID
+        $empIds = $details->where('type', ItemDetails::type_one)->pluck('data_id')->unique();
+        $devIds = $details->where('type', ItemDetails::type_two)->pluck('data_id')->unique();
+
+        // 2. 批量获取档案 Map
+        $empMap = Employee::whereIn('id', $empIds)->get()->keyBy('id');
+        $devMap = Device::whereIn('id', $devIds)->get()->keyBy('id');
+
+        $typeNames = ItemDetails::$type_name;
+
+        $res = [];
+        foreach ($details as $item) {
+            $detailRow = [];
+            $detailRow['type_title'] = $typeNames[$item->type] ?? '';
+
+            // 根据类型处理影子列 code_2 和 名称 title
+            if ($item->type == ItemDetails::type_one) {
+                $emp = $empMap[$item->data_id] ?? null;
+                $detailRow['code_2'] = $emp ? $emp->number : '';
+                $detailRow['title']  = $emp ? $emp->title : '';
+            } else {
+                $dev = $devMap[$item->data_id] ?? null;
+                $detailRow['code_2'] = $dev ? $dev->code : '';
+                $detailRow['title']  = $dev ? $dev->title : '';
+            }
+
+            // 归档到对应的主表 ID 下
+            $res[$item->item_id][] = $detailRow;
+        }
+
+        return $res;
+    }
 }
 }

+ 12 - 1
config/excel/depart.php

@@ -27,7 +27,7 @@ return [
         [
         [
             'key' =>'parent_id',
             'key' =>'parent_id',
             'export' =>'parent_code',
             'export' =>'parent_code',
-            'value' => '上级部门',
+            'value' => '上级部门编码',
             'required' => false,
             'required' => false,
             'is_main' => true,
             'is_main' => true,
             'default' => "",
             'default' => "",
@@ -35,5 +35,16 @@ return [
             'enums' => [],
             'enums' => [],
             'comments' => '选填(填写编码)'
             'comments' => '选填(填写编码)'
         ],
         ],
+        [
+            'key' =>'parent_title',
+            'export' =>'parent_title',
+            'value' => '上级部门名称',
+            'required' => false,
+            'is_main' => true,
+            'default' => "",
+            'unique' => false,
+            'enums' => [],
+            'comments' => '选填(便于操作人查看编码对应的名称)'
+        ],
     ]
     ]
 ];
 ];

+ 24 - 13
config/excel/employee.php

@@ -9,7 +9,7 @@ return [
             'required' => true,
             'required' => true,
             'is_main' => true,
             'is_main' => true,
             'default' => "",
             'default' => "",
-            'unique' => true,
+            'unique' => false,
             'enums' => [],
             'enums' => [],
             'comments' => '必填'
             'comments' => '必填'
         ],
         ],
@@ -42,7 +42,7 @@ return [
             'required' => true,
             'required' => true,
             'is_main' => true,
             'is_main' => true,
             'default' => "",
             'default' => "",
-            'unique' => true,
+            'unique' => false,
             'enums' => [],
             'enums' => [],
             'comments' => '必填'
             'comments' => '必填'
         ],
         ],
@@ -85,32 +85,43 @@ return [
             'value' => '身份证号',
             'value' => '身份证号',
             'required' => true,
             'required' => true,
             'is_main' => true,
             'is_main' => true,
-            'unique' => true,
+            'unique' => false,
             'enums' => [],
             'enums' => [],
             'default' => "",
             'default' => "",
             'comments' => "必填"
             'comments' => "必填"
         ],
         ],
         [
         [
-            'key' =>'depart_list',
-            'export' =>'depart_list',
-            'value' => '部门',
+            'key' =>'state',
+            'export' =>'state_title',
+            'value' => '状态',
+            'required' => true,
+            'is_main' => true,
+            'unique' => false,
+            'enums' => array_values(\App\Model\Employee::State_Type),
+            'default' => "",
+            'comments' => '必填'
+        ],
+        [
+            'key' =>'depart_code',
+            'export' =>'depart_code',
+            'value' => '部门编码',
             'required' => true,
             'required' => true,
             'default' => "",
             'default' => "",
             'is_main' => false,
             'is_main' => false,
             'unique' => false,
             'unique' => false,
             'enums' => [],
             'enums' => [],
-            'comments' => '必填(部门编码,多部门用英文逗号隔开,如 001,002,003,004)'
+            'comments' => '必填(部门编码,多部门分行)'
         ],
         ],
         [
         [
-            'key' =>'state',
-            'export' =>'state_title',
-            'value' => '状态',
+            'key' =>'depart_title',
+            'export' =>'depart_title',
+            'value' => '部门名称',
             'required' => true,
             'required' => true,
+            'default' => "",
             'is_main' => false,
             'is_main' => false,
             'unique' => false,
             'unique' => false,
-            'enums' => array_values(\App\Model\Employee::State_Type),
-            'default' => "",
-            'comments' => '必填'
+            'enums' => [],
+            'comments' => '选填(便于操作人查看编码对应的名称)'
         ],
         ],
     ]
     ]
 ];
 ];

+ 12 - 1
config/excel/fee.php

@@ -27,7 +27,7 @@ return [
         [
         [
             'key' =>'parent_id',
             'key' =>'parent_id',
             'export' =>'parent_code',
             'export' =>'parent_code',
-            'value' => '上级费用',
+            'value' => '上级费用编码',
             'required' => false,
             'required' => false,
             'is_main' => true,
             'is_main' => true,
             'default' => "",
             'default' => "",
@@ -35,5 +35,16 @@ return [
             'enums' => [],
             'enums' => [],
             'comments' => '选填(填写编码)'
             'comments' => '选填(填写编码)'
         ],
         ],
+        [
+            'key' =>'parent_title',
+            'export' =>'parent_title',
+            'value' => '上级费用名称',
+            'required' => false,
+            'is_main' => true,
+            'default' => "",
+            'unique' => false,
+            'enums' => [],
+            'comments' => '选填(便于操作人查看编码对应的名称)'
+        ],
     ]
     ]
 ];
 ];

+ 22 - 11
config/excel/item.php

@@ -9,7 +9,7 @@ return [
             'required' => true,
             'required' => true,
             'is_main' => true,
             'is_main' => true,
             'default' => "",
             'default' => "",
-            'unique' => true,
+            'unique' => false,
             'enums' => [],
             'enums' => [],
             'comments' => '必填'
             'comments' => '必填'
         ],
         ],
@@ -69,26 +69,37 @@ return [
             'comments' => ""
             'comments' => ""
         ],
         ],
         [
         [
-            'key' =>'man_list',
-            'export' =>'man_list',
-            'value' => '人员',
+            'key' =>'type',
+            'export' =>'type_title',
+            'value' => '明细类型',
             'required' => true,
             'required' => true,
             'is_main' => false,
             'is_main' => false,
+            'default' => 0,
             'unique' => false,
             'unique' => false,
-            'enums' => [],
-            'default' => "",
-            'comments' => '必填(人员工号,多人员用英文逗号隔开,如 001,002,003,004)'
+            'enums' => array_values(\App\Model\ItemDetails::$type_name),
+            'comments' => '必填'
         ],
         ],
         [
         [
-            'key' =>'device_list',
-            'export' =>'device_list',
-            'value' => '设备',
+            'key' =>'code_2',
+            'export' =>'code_2',
+            'value' => '编码',
             'required' => true,
             'required' => true,
+            'is_main' => false,
             'default' => "",
             'default' => "",
+            'unique' => false,
+            'enums' => [],
+            'comments' => '必填(人员的工号或设备的资产编码)'
+        ],
+        [
+            'key' =>'title',
+            'export' =>'title',
+            'value' => '名称',
+            'required' => false,
             'is_main' => false,
             'is_main' => false,
+            'default' => "",
             'unique' => false,
             'unique' => false,
             'enums' => [],
             'enums' => [],
-            'comments' => '必填(资产编码,多设备用英文逗号隔开,如 001,002,003,004)'
+            'comments' => '选填(便于操作人查看编码对应的名称)'
         ],
         ],
     ]
     ]
 ];
 ];

Някои файлове не бяха показани, защото твърде много файлове са промени