|
|
@@ -279,27 +279,22 @@ class ItemService extends Service
|
|
|
return [true, ''];
|
|
|
}
|
|
|
|
|
|
- public function fillData($data, $is_export = false){
|
|
|
+ public function fillData($data){
|
|
|
if(empty($data['data'])) return $data;
|
|
|
|
|
|
$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){
|
|
|
$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]['end_time'] = $value['end_time'] ? date('Y-m-d',$value['end_time']) : '';
|
|
|
$data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
|
|
|
$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;
|
|
|
}
|
|
|
|
|
|
- public function getDetailsMap($item_id){
|
|
|
+ public function getDetailsMap1($item_id){
|
|
|
// 1. 获取明细数据,注意一定要选出 item_id
|
|
|
$data = ItemDetails::where('del_time', 0)
|
|
|
->whereIn('item_id', $item_id)
|
|
|
@@ -351,4 +346,99 @@ class ItemService extends Service
|
|
|
|
|
|
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;
|
|
|
+ }
|
|
|
}
|