validateData($request, [ 'date_type' => 'required|in:1,2,3,4', 'start_time' => 'nullable', 'end_time' => 'nullable', 'type_id' => 'required|integer', 'deal_status' => 'required|integer', 'department_id' => 'required|integer', 'category_id' => 'required|integer', 'suggestion' => 'nullable', ], [ 'date_type' => '日期类型', 'start_time' => '开始日期', 'end_time' => '结束日期', 'type_id' => '来源id', 'deal_status' => '办理状态', 'department_id' => '部门id', 'category_id' => '分类id', 'suggestion' => '建议', ]); $suggestion = $request->get('suggestion', ''); $title = ''; switch ($data['date_type']) { case 1: //当天 $data['start_time'] = Carbon::now()->startOfDay()->toDateTimeString(); $data['end_time'] = false; //$title = date('Y-m-d') . '日'; $title = '分析研判日'; break; case 2: //本周 $data['start_time'] = Carbon::now()->startOfWeek()->toDateTimeString(); $data['end_time'] = false; //$title = Carbon::now()->startOfWeek()->toDateString() . '~' . Carbon::now()->endOfWeek()->toDateString() . '周'; $title = '分析研判周'; break; case 3: //本月 $data['start_time'] = Carbon::now()->startOfMonth()->toDateTimeString(); $data['end_time'] = false; //$title = Carbon::now()->format('Y-m') . '月'; $title = '分析研判月'; break; case 4: //自定义 $this->validateData($request, [ 'start_time' => 'required|date', 'end_time' => 'required|date', ]); //$title = "{$data['start_time']}~{$data['end_time']}时间段"; $title = "分析研判"; break; } $arr = []; if ($data['category_id']) $arr = Category::byCategoryIdGetCategoryArr($data['category_id']); $category_1_id = 0; $category_2_id = 0; $category_3_id = 0; $category_4_id = 0; $category_5_id = 0; if (count($arr) >= 1) $category_1_id = $arr[0]; if (count($arr) >= 2) $category_2_id = $arr[1]; if (count($arr) >= 3) $category_3_id = $arr[2]; if (count($arr) >= 4) $category_3_id = $arr[3]; if (count($arr) >= 5) $category_3_id = $arr[4]; $model = Message::query() ->where('created_at', '>=', $data['start_time']) ->whereIn('deal_department_id', Department::statistics()) ->when($data['end_time'], function ($query) use ($data) { return $query->where('created_at', '<', $data['end_time']); }) ->when($data['type_id'], function ($query) use ($data) { return $query->where('type_id', '=', $data['type_id']); }) ->when($data['deal_status'], function ($query) use ($data) { return $query->where('deal_status', '=', $data['deal_status']); }) ->when($data['department_id'], function ($query) use ($data) { return $query->where('deal_department_id', '=', $data['department_id']); }) ->when($category_1_id, function ($query) use ($category_1_id) { return $query->where('category_1_id', '=', $category_1_id); }) ->when($category_2_id, function ($query) use ($category_2_id) { return $query->where('category_2_id', '=', $category_2_id); }) ->when($category_3_id, function ($query) use ($category_3_id) { return $query->where('category_3_id', '=', $category_3_id); }) ->when($category_4_id, function ($query) use ($category_4_id) { return $query->where('category_4_id', '=', $category_4_id); }) ->when($category_5_id, function ($query) use ($category_5_id) { return $query->where('category_5_id', '=', $category_5_id); }); //事件总数 $model_temp = $model->clone(); $numS = $model_temp->count(); //部门统计 $model_department = $model->clone(); $dataDepartments = $model_department->selectRaw('count(*) as nums,deal_department_id')->groupBy('deal_department_id')->with(['deal_department'])->get(); $departmentsS = []; foreach ($dataDepartments as $dataDepartment) { $departmentsS[] = [ 'name' => $dataDepartment['deal_department'] ? $dataDepartment['deal_department']['name'] : '未知', 'nums' => $dataDepartment['nums'] ]; } $departmentsS = arraySort($departmentsS, 'nums'); $departmentsSS = word_arr2str($departmentsS); //分类统计 // $categories = Category::getLast(); // $categoriesS = []; // foreach ($categories as $category) { // $model_category = $model->clone(); // $level = $category['level']; // $nums = $model_category->where("category_{$level}_id", $category['id'])->count(); // if (!$nums) continue; // $categoriesS[] = [ // 'nums' => $nums, // 'name' => arr2str(Category::byIdGetParentName($category['id']), '/') // ]; // } // $categoriesS = arraySort($categoriesS, 'nums'); // $categoriesSS = word_arr2str($categoriesS); $categoriesA = $this->statisticsArr($model->clone()); $table = new Table([ 'borderSize' => 6, 'alignment' => \PhpOffice\PhpWord\SimpleType\JcTable::CENTER, 'alignMent' => 'center' ]); foreach ($categoriesA as $r => $da) { if (!$r) { $table->addRow(); $table->addCell(500)->addText('序号', null, ['align' => 'center']); $table->addCell(8000, ['gridSpan' => '4', 'valign' => 'center'])->addText('类别及数量', null, ['align' => 'center']); } $table->addRow(); if ($da[0]) { $table->addCell(500, ['vMerge' => 'restart', 'valign' => 'center'])->addText($da[0]['name'], null, ['align' => 'center']); } else { $table->addCell(500, ['vMerge' => 'continue'])->addText('--'); } if ($da[1]) { $table->addCell(2000, ['vMerge' => 'restart', 'valign' => 'center'])->addText("{$da[1]['name']}({$da[1]['nums']})", null, ['align' => 'center']); } else { $table->addCell(2000, ['vMerge' => 'continue']); } if ($da[2]) { $table->addCell(2000, ['vMerge' => 'restart', 'valign' => 'center'])->addText("{$da[2]['name']}({$da[2]['nums']})", null, ['align' => 'center']); } else { $table->addCell(2000, ['vMerge' => 'continue'])->addText('--'); } if ($da[3]) { $table->addCell(2000, ['vMerge' => 'restart', 'valign' => 'center'])->addText("{$da[3]['name']}({$da[3]['nums']})", null, ['align' => 'center']); } else { $table->addCell(2000, ['vMerge' => 'continue'])->addText('--'); } if ($da[4]) { $table->addCell(2000)->addText("{$da[4]['name']}({$da[4]['nums']})", null, ['align' => 'center']); } else { $table->addCell(2000)->addText('--', null, ['align' => 'center']); } } $categoriesSS = $table; //办理状态 $model_deal_status = $model->clone(); $dataDeals = $model_deal_status->selectRaw('count(*) as nums,deal_status')->groupBy('deal_status')->get(); $dealS = []; foreach ($dataDeals as $dataDeal) { $dealS[] = [ 'name' => DealStatusEnum::getDescription($dataDeal['deal_status']), 'nums' => $dataDeal['nums'] ]; } $dealSS = word_arr2str($dealS); //行业 $model_type = $model->clone(); $dataTypes = $model_type->selectRaw('count(*) as nums,type_id')->groupBy('type_id')->with(['type'])->get(); $typeS = []; foreach ($dataTypes as $dataType) { $typeS[] = [ 'name' => $dataType['type'] ? $dataType['type']['name'] : '', 'nums' => $dataType['nums'] ]; } $typeSS = word_arr2str($typeS); //乡镇 $model_address = $model->clone(); $dataAddress = $model_address->selectRaw('count(*) as nums,address_id')->groupBy('address_id')->with(['address'])->get(); $addressS = []; foreach ($dataAddress as $address) { $addressS[] = [ 'name' => $address['address'] ? $address['address']['name'] : '未知', 'nums' => $address['nums'] ]; } $addressS = arraySort($addressS, 'nums'); $addressSS = word_arr2str($addressS); $path = base_path("public/template/manage/2023.docx"); $is = file_exists($path); if (!$is) { return $this->error('模板文件找不到'); } try { $template = new TemplateProcessor($path); $template->setValue('title', $title); $template->setValue('numS', $numS); $template->setValue('departmentsSS', $departmentsSS); $template->setComplexBlock('categorySS', $categoriesSS); $template->setValue('dealSS', $dealSS); $template->setValue('addressSS', $addressSS); $template->setValue('typeSS', $typeSS); $template->setValue('suggestion', $suggestion); $filename = date('Y-m-d') . '.docx'; // if (self::$TYPE == 'weapp') { // $filename = Str::random(8) . '.docx'; // $template->saveAs(base_path() . '/storage/app/public/tmp/' . $filename); // $url = '/storage/tmp/' . $filename; // return Response::success(compact('url', 'filename')); // } header('Content-Type: application/vnd.ms-word'); header('Content-Disposition: attachment;filename=' . $filename); header('Cache-Control: max-age=0'); $template->saveAs('php://output');//直接下载 } catch (\Exception $exception) { $this->exception($exception); } } /** * 统计 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function statistics(Request $request) { $data = $this->validateData($request, [ 'date_type' => 'required|in:1,2,3,4', 'start_time' => 'nullable', 'end_time' => 'nullable', 'type_id' => 'required|integer', 'deal_status' => 'required|integer', 'department_id' => 'required|integer', 'category_id' => 'required|integer', ], [ 'date_type' => '日期类型', 'start_time' => '开始日期', 'end_time' => '结束日期', 'type_id' => '来源id', 'deal_status' => '办理状态', 'department_id' => '部门id', 'category_id' => '分类id', ]); switch ($data['date_type']) { case 1: //当天 $data['start_time'] = Carbon::now()->startOfDay()->toDateTimeString(); $data['end_time'] = false; break; case 2: //本周 $data['start_time'] = Carbon::now()->startOfWeek()->toDateTimeString(); $data['end_time'] = false; break; case 3: //本月 $data['start_time'] = Carbon::now()->startOfMonth()->toDateTimeString(); $data['end_time'] = false; break; case 4: //自定义 $this->validateData($request, [ 'start_time' => 'required|date', 'end_time' => 'required|date', ], ['start_time' => '开始时间', 'end_time' => '结束时间'] ); break; } $arr = []; if ($data['category_id']) $arr = Category::byCategoryIdGetCategoryArr($data['category_id']); $category_1_id = 0; $category_2_id = 0; $category_3_id = 0; $category_4_id = 0; $category_5_id = 0; if (count($arr) >= 1) $category_1_id = $arr[0]; if (count($arr) >= 2) $category_2_id = $arr[1]; if (count($arr) >= 3) $category_3_id = $arr[2]; if (count($arr) >= 4) $category_3_id = $arr[3]; if (count($arr) >= 5) $category_3_id = $arr[4]; $model = Message::query() ->where('created_at', '>=', $data['start_time']) ->when($data['end_time'], function ($query) use ($data) { return $query->where('created_at', '<', $data['end_time']); }) ->when($data['type_id'], function ($query) use ($data) { return $query->where('type_id', '=', $data['type_id']); }) ->when($data['deal_status'], function ($query) use ($data) { return $query->where('deal_status', '=', $data['deal_status']); }) ->when($data['department_id'], function ($query) use ($data) { return $query->where('deal_department_id', '=', $data['department_id']); }) ->when($category_1_id, function ($query) use ($category_1_id) { return $query->where('category_1_id', '=', $category_1_id); }) ->when($category_2_id, function ($query) use ($category_2_id) { return $query->where('category_2_id', '=', $category_2_id); }) ->when($category_3_id, function ($query) use ($category_3_id) { return $query->where('category_3_id', '=', $category_3_id); }) ->when($category_4_id, function ($query) use ($category_4_id) { return $query->where('category_4_id', '=', $category_4_id); }) ->when($category_5_id, function ($query) use ($category_5_id) { return $query->where('category_5_id', '=', $category_5_id); }); //事件总数 $model_temp = $model->clone(); $numS = $model_temp->count(); //部门统计 $model_department = $model->clone(); $dataDepartments = $model_department->selectRaw('count(*) as nums,deal_department_id')->groupBy('deal_department_id')->with(['deal_department'])->get(); $departmentsS = []; foreach ($dataDepartments as $dataDepartment) { $departmentsS[] = [ 'name' => $dataDepartment['deal_department'] ? $dataDepartment['deal_department']['name'] : '未知', 'nums' => $dataDepartment['nums'] ]; } $departmentsS = arraySort($departmentsS, 'nums'); //分类统计 // $categories = Category::getLast(); $categoriesS = []; // $categoriesA = $this->statisticsArr(); // foreach ($categories as $category) { // $model_category = $model->clone(); // $level = $category['level']; // $nums = $model_category->where("category_{$level}_id", $category['id'])->count(); // if (!$nums) continue; // $names = Category::byIdGetParentName($category['id']); // // if ($level >= 1) $categoriesA[$names[0]]['row'] += $nums; // if ($level >= 2) $categoriesA[$names[0]][$names[1]]['row'] += $nums; // if ($level >= 3) $categoriesA[$names[0]][$names[1]][$names[2]]['row'] += $nums; // if ($level >= 4) $categoriesA[$names[0]][$names[1]][$names[2]][$names[3]]['row'] += $nums; // // $categoriesS[] = [ // 'nums' => $nums, // 'name' => arr2str($names, '/') // ]; // } // $categoriesS = arraySort($categoriesS, 'nums'); //行业 $model_type = $model->clone(); $dataTypes = $model_type->selectRaw('count(*) as nums,type_id')->groupBy('type_id')->with(['type'])->get()->toArray(); $typeS = []; foreach ($dataTypes as $dataType) { $typeS[] = [ 'name' => $dataType['type'] ? $dataType['type']['name'] : '', 'nums' => $dataType['nums'] ]; } $typeS = arraySort($typeS, 'nums'); //办理状态 $model_deal_status = $model->clone(); $dataDeals = $model_deal_status->selectRaw('count(*) as nums,deal_status')->groupBy('deal_status')->get(); $dealS = []; foreach ($dataDeals as $dataDeal) { $dealS[] = [ 'name' => DealStatusEnum::getDescription($dataDeal['deal_status']), 'nums' => $dataDeal['nums'] ]; } //乡镇 $model_address = $model->clone(); $dataAddress = $model_address->selectRaw('count(*) as nums,address_id')->groupBy('address_id')->with(['address'])->get(); $addressS = []; foreach ($dataAddress as $address) { $addressS[] = [ 'name' => $address['address'] ? $address['address']['name'] : '未知', 'nums' => $address['nums'] ]; } $addressS = arraySort($addressS, 'nums'); $categoriesB = $this->statisticsArrB($model->clone()); return $this->response->success(compact('numS', 'departmentsS', 'categoriesS', 'dealS', 'addressS', 'typeS', 'categoriesB')); } private function statisticsArrB($messages) { $messagesB = $messages->clone(); $messages = $messages->groupBy("category_1_id")->limit(3)->select(DB::raw("category_1_id as id,count(*) as nums"))->orderByDesc('nums')->get()->toArray(); foreach ($messages as &$da) { $da['level'] = 1; $child = $this->fB(2, $da['id'], $messagesB->clone()); $da['row'] = array_sum(array_column($child, 'row')); $da['child'] = $child; $da['name'] = Category::query()->where('id', $da['id'])->value('name'); } return $messages; } private function fB($l = 1, $cid = 0, $messages = false) { $messagesC = $messages->clone(); $lp = $l - 1; $messages = $messages->where("category_{$l}_id", '<>', 0)->where("category_{$lp}_id", $cid)->groupBy("category_{$l}_id")->select(DB::raw("category_{$l}_id as id,count(*) as nums"))->orderByDesc('nums')->get()->toArray(); if (!$messages) return false; foreach ($messages as $k => $message) { $messages[$k]['level'] = $l; $messages[$k]['name'] = Category::query()->where('id', $message['id'])->value('name'); } if ($l == 4) { foreach ($messages as $k => $message) { $messages[$k]['row'] = 1; } return $messages; } foreach ($messages as $k => $m) { $child = $this->fB($l + 1, $m['id'], $messagesC->clone()); if ($child) { $messages[$k]['row'] = array_sum(array_column($child, 'row')); $messages[$k]['child'] = $child; } else { $messages[$k]['row'] = 1; } } return $messages; } /** * 分类统计 * @return array */ private function statisticsArr($messages = false) { $messagesB = $messages->clone(); $messages = $messages->groupBy("category_1_id")->limit(3)->select(DB::raw("category_1_id as id,count(*) as nums"))->orderByDesc('nums')->get()->toArray(); foreach ($messages as &$da) { $da['level'] = 1; $child = $this->f(2, $da['id'], $messagesB->clone()); $da['row'] = array_sum(array_column($child, 'row')); $da['child'] = $child; } $data = []; foreach ($messages as $k => $message) { $c2n = 0; $c3n = 0; $c4n = 0; $c1 = 0; $c2 = 0; $c3 = 0; $mD = [ 'id' => $message['id'], 'name' => Category::query()->where('id', $message['id'])->value('name'), 'nums' => $message['nums'], 'row' => $message['row'], ]; for ($i = 1; $i <= $message['row']; $i++) { $col2 = 0; $col3 = 0; $col4 = 0; if (isset($message['child'])) { if ($c2n == 0) { $model = $message['child'][$c1]; $col2 = [ 'id' => $model['id'], 'name' => Category::query()->where('id', $model['id'])->value('name'), 'nums' => $model['nums'], 'row' => $c2n == 0 ? $model['row'] : 0, ]; } $c2n++; } if (isset($message['child'][$c1]['child'])) { if ($c3n == 0) { $model = $message['child'][$c1]['child'][$c2]; $col3 = [ 'id' => $model['id'], 'name' => Category::query()->where('id', $model['id'])->value('name'), 'nums' => $model['nums'], 'row' => $c3n == 0 ? $model['row'] : 0, ]; } $c3n++; } if (isset($message['child'][$c1]['child'][$c2]['child'])) { if ($c4n == 0) { $model = $message['child'][$c1]['child'][$c2]['child'][$c3]; $col4 = [ 'id' => $model['id'], 'name' => Category::query()->where('id', $model['id'])->value('name'), 'nums' => $model['nums'], 'row' => $c4n == 0 ? $model['row'] : 0, ]; } $c4n++; } if ($i == 1) $mD['row'] = $message['row']; $data[] = [ $i == 1 ? ['name' => ($k + 1), 'row' => $mD['row']] : 0, $i == 1 ? $mD : 0, $col2, $col3, $col4, ]; if ($c2n && $c2n == $message['child'][$c1]['row']) { $c1++; $c2 = 0; $c3 = 0; $c2n = 0; $c3n = 0; $c4n = 0; continue; } if ($c3n && $c3n == $message['child'][$c1]['child'][$c2]['row']) { $c2++; $c3 = 0; $c3n = 0; $c4n = 0; continue; } if ($c4n && $c4n == $message['child'][$c1]['child'][$c2]['child'][$c3]['row']) { $c3++; $c4n = 0; } } } return $data; } private function f($l = 1, $cid = 0, $messages = false) { $messagesC = $messages->clone(); $lp = $l - 1; $messages = $messages->where("category_{$l}_id", '<>', 0)->where("category_{$lp}_id", $cid)->groupBy("category_{$l}_id")->select(DB::raw("category_{$l}_id as id,count(*) as nums"))->orderByDesc('nums')->get()->toArray(); if (!$messages) return false; foreach ($messages as $k => $message) { $messages[$k]['level'] = $l; } if ($l == 4) { foreach ($messages as $k => $message) { $messages[$k]['row'] = 1; } return $messages; } foreach ($messages as $k => $m) { $child = $this->f($l + 1, $m['id'], $messagesC->clone()); if ($child) { $messages[$k]['row'] = array_sum(array_column($child, 'row')); $messages[$k]['child'] = $child; } else { $messages[$k]['row'] = 1; } } return $messages; } /** * 事项数量统计 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function messageNumsStatistics(Request $request) { $data = $this->validateData($request, [ 'date_type' => 'required|in:1,2,3' ]); $date_type = $data['date_type']; $department_id = $request->get('department_id', false); $department_ids = Department::byIdGetChildIds($department_id); $s_department_ids = Department::statistics(); /** * 近一周:获取每天的办理中数量、已办理数量、已完成数量 * 近一月:获取每天的办理中数量、已办理数量、已完成数量 * 近一年:获取每月的办理中数量、已办理数量、已完成数量 */ $data = []; $dayTemp = array(); $waitNums = array(); $inNums = array(); $okNums = array(); switch ($date_type) { case 1: //近一周 for ($i = 0; $i < 7; $i++) { $day = Carbon::now()->addDays(-6)->addDays($i)->toDateString(); $wait_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', $day)->where('deal_status', DealStatusEnum::WAIT)->count(); $in_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', $day)->where('deal_status', DealStatusEnum::IN)->count(); $ok_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', $day)->where('deal_status', DealStatusEnum::OK)->count(); array_push($dayTemp, $day); array_push($waitNums, $wait_nums); array_push($inNums, $in_nums); array_push($okNums, $ok_nums); $data = [ 'day' => $dayTemp, 'wait_nums' => $waitNums, 'in_nums' => $inNums, 'ok_nums' => $okNums, ]; /*$data[] = [ 'day' => $day, 'wait_nums' => $wait_nums, 'in_nums' => $in_nums, 'ok_nums' => $ok_nums ];*/ } break; case 2: //近一月 for ($i = 0; $i < 30; $i++) { $day = Carbon::now()->addDays(-29)->addDays($i)->toDateString(); $wait_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('deal_status', DealStatusEnum::WAIT)->count(); $in_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('deal_status', DealStatusEnum::IN)->count(); $ok_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('deal_status', DealStatusEnum::OK)->count(); array_push($dayTemp, $day); array_push($waitNums, $wait_nums); array_push($inNums, $in_nums); array_push($okNums, $ok_nums); $data = [ 'day' => $dayTemp, 'wait_nums' => $waitNums, 'in_nums' => $inNums, 'ok_nums' => $okNums, ]; /*$data[] = [ 'day' => $day, 'wait_nums' => $wait_nums, 'in_nums' => $in_nums, 'ok_nums' => $ok_nums ];*/ } break; case 3: //近一年 for ($i = 0; $i < 12; $i++) { $firstDay = date('Y-m-01', strtotime(Carbon::now()->addMonths(-11)->addMonths($i))); $lastDay = date('Y-m-d', strtotime("$firstDay +1 month -1 day")); $month = date('Y-m', strtotime($firstDay)); $wait_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereBetween('created_at', [$firstDay, $lastDay])->where('deal_status', DealStatusEnum::WAIT)->count(); $in_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereBetween('created_at', [$firstDay, $lastDay])->where('deal_status', DealStatusEnum::IN)->count(); $ok_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereBetween('created_at', [$firstDay, $lastDay])->where('deal_status', DealStatusEnum::OK)->count(); array_push($dayTemp, $month); array_push($waitNums, $wait_nums); array_push($inNums, $in_nums); array_push($okNums, $ok_nums); $data = [ 'day' => $dayTemp, 'wait_nums' => $waitNums, 'in_nums' => $inNums, 'ok_nums' => $okNums, ]; /*$data[] = [ 'day' => $month, 'wait_nums' => $wait_nums, 'in_nums' => $in_nums, 'ok_nums' => $ok_nums ];*/ } break; } return $this->response->success($data); } /** * 当天办理进度 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource] */ public function todayNumStatistics(Request $request) { $department_id = $request->get('department_id', false); $department_ids = Department::byIdGetChildIds($department_id); $s_department_ids = Department::statistics(); /** * 获取当天的办理中数量、已办理数量、已完成数量、总数量、带审核的数量 */ $day = Carbon::now()->toDateString(); //总数 $totalNums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->count(); //未办理 $wait_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('deal_status', DealStatusEnum::WAIT)->count(); //办理中 $in_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('deal_status', DealStatusEnum::IN)->count(); //已完成(已完结) $ok_nums = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('deal_status', DealStatusEnum::OK)->count(); //待审核 /*$wait_check_nums = Message::query()->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '=', $day)->where('check_status', StatusEnum::WAIT)->count();*/ $data = [ 'day' => $day, 'totalNums' => $totalNums, 'wait_nums' => $wait_nums, 'in_nums' => $in_nums, 'ok_nums' => $ok_nums ]; return $this->response->success($data); } /** * 事项办理完成情况排行榜 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function completionRateStatistics(Request $request) { $data = $this->validateData($request, [ 'date_type' => 'required|in:1,2,3' ]); $date_type = $data['date_type']; $department_id = $request->get('department_id', false); $department_ids = Department::byIdGetChildIds($department_id); $s_department_ids = Department::statistics(); /** * 根据部门完成率排行「完成率【完成数/总数】」 */ $data = []; $day = Carbon::now()->toDateString(); switch ($date_type) { case 1: //近一周 $weekAgo = Carbon::now()->addDays(-6)->toDateString(); //根据部门id分组查询,获取到该部门近一周内的数量 $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->selectRaw('count(id) as nums,import_department_id')->where('import_department_id', '!=', '0')->whereBetween('created_at', [$weekAgo, $day])->groupBy('import_department_id')->get(); foreach ($messages as $message) { //根据部门id查询近一周内的已处理完成的数量 $departOkNums = Message::query()->whereBetween('created_at', [$weekAgo, $day])->where('import_department_id', '=', $message->import_department_id)->where('deal_status', '=', DealStatusEnum::OK)->count(); //部门总数量 $departTotalNums = $message->nums; //部门名称 $departName = ''; if (null != $message->import_department_id && $message->import_department_id != 0) { $departs = Department::query()->selectRaw('name')->where('id', '=', $message->import_department_id)->get(); foreach ($departs as $depart) { $departName = $depart->name; } } if ($departTotalNums != null && $departTotalNums != 0) { //算出完成率 $departRate = (round(($departOkNums / $departTotalNums), 4) * 100) . '%'; $data[] = [ 'departName' => $departName, 'departRate' => $departRate ]; } } $data = arraySort($data, 'departRate'); break; case 2: //近一月 $monthAgo = Carbon::now()->addDays(-29)->toDateString(); //根据部门id分组查询,获取到该部门近一月内的数量 $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->selectRaw('count(id) as nums,import_department_id')->where('import_department_id', '!=', '0')->whereBetween('created_at', [$monthAgo, $day])->groupBy('import_department_id')->get(); foreach ($messages as $message) { //根据部门id查询近一月内的已处理完成的数量 $departOkNums = Message::query()->whereBetween('created_at', [$monthAgo, $day])->where('import_department_id', '=', $message->import_department_id)->where('deal_status', '=', DealStatusEnum::OK)->count(); //部门总数量 $departTotalNums = $message->nums; //部门名称 $departName = ''; if (null != $message->import_department_id && $message->import_department_id != 0) { $departs = Department::query()->selectRaw('name')->where('id', '=', $message->import_department_id)->get(); foreach ($departs as $depart) { $departName = $depart->name; } } if ($departTotalNums != null && $departTotalNums != 0) { //算出完成率 $departRate = (round(($departOkNums / $departTotalNums), 4) * 100) . '%'; $data[] = [ 'departName' => $departName, 'departRate' => $departRate ]; } } $data = arraySort($data, 'departRate'); break; case 3: //近一年 $yearAgo = Carbon::now()->addDays(-364)->toDateString(); //根据部门id分组查询,获取到该部门近一月内的数量 $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->selectRaw('count(id) as nums,import_department_id')->where('import_department_id', '!=', '0')->whereBetween('created_at', [$yearAgo, $day])->groupBy('import_department_id')->get(); foreach ($messages as $message) { //根据部门id查询近一年内的已处理完成的数量 $departOkNums = Message::query()->whereBetween('created_at', [$yearAgo, $day])->where('import_department_id', '=', $message->import_department_id)->where('deal_status', '=', DealStatusEnum::OK)->count(); //部门总数量 $departTotalNums = $message->nums; //部门名称 $departName = ''; if (null != $message->import_department_id && $message->import_department_id != 0) { $departs = Department::query()->selectRaw('name')->where('id', '=', $message->import_department_id)->get(); foreach ($departs as $depart) { $departName = $depart->name; } } if ($departTotalNums != null && $departTotalNums != 0) { //算出完成率 $departRate = (round(($departOkNums / $departTotalNums), 4) * 100) . '%'; $data[] = [ 'departName' => $departName, 'departRate' => $departRate ]; } } $data = arraySort($data, 'departRate'); break; } return $this->response->success($data); } /** * 事项来源统计 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function typeStatistics(Request $request) { $data = $this->validateData($request, [ 'date_type' => 'required|in:1,2,3' ]); $date_type = $data['date_type']; $department_id = $request->get('department_id', false); $department_ids = Department::byIdGetChildIds($department_id); $s_department_ids = Department::statistics(); $data = []; switch ($date_type) { case 1: //近一周 $day = Carbon::now()->addDays(-6)->toDateString(); $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->selectRaw('count(id) as nums,type_id')->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '>=', $day)->groupBy('type_id')->with(['type'])->get(); foreach ($messages as $message) { $data[] = [ //$message['type'] ? $message['type']['name'] : '' => $message->nums, 'value' => $message->nums, 'name' => $message['type'] ? $message['type']['name'] : '' ]; } $data = arraySort($data, 'value'); break; case 2: //近一月 $day = Carbon::now()->addDays(-29)->toDateString(); $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->selectRaw('count(id) as nums,type_id')->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '>=', $day)->groupBy('type_id')->with(['type'])->get(); foreach ($messages as $message) { $data[] = [ //$message['type'] ? $message['type']['name'] : '' => $message->nums, 'value' => $message->nums, 'name' => $message['type'] ? $message['type']['name'] : '' ]; } $data = arraySort($data, 'value'); break; case 3: //近一年 $day = Carbon::now()->addDays(-364)->toDateString(); $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->selectRaw('count(id) as nums,type_id')->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->whereDate('created_at', '>=', $day)->groupBy('type_id')->with(['type'])->get(); foreach ($messages as $message) { $data[] = [ //$message['type'] ? $message['type']['name'] : '' => $message->nums, 'value' => $message->nums, 'name' => $message['type'] ? $message['type']['name'] : '' ]; } $data = arraySort($data, 'value'); break; } return $this->response->success($data); } /** * 事项涉及部门数量统计 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function departmentStatistics(Request $request) { $data = $this->validateData($request, [ 'date_type' => 'required|in:1,2,3' ]); $date_type = $data['date_type']; $department_id = $request->get('department_id', false); $department_ids = []; if ($department_id) $department_ids = Department::byIdGetChildIds($department_id); $s_department_ids = Department::statistics(); $data = []; //全部部门 $departments = Department::getLast(); switch ($date_type) { case 1: //近一周 $day = Carbon::now()->addDays(-6)->toDateString(); foreach ($departments as $department_id) { if (count($department_ids) && !in_array($department_id, $department_ids)) continue; $nums = Message::query()->whereIn('import_department_id', $s_department_ids)->where('import_department_id', $department_id)->whereDate('created_at', '>=', $day)->count(); if ($nums == 0) continue; $data[] = [ 'name' => Department::query()->where('id', $department_id)->value('name'), 'value' => $nums ]; } $data = arraySort($data, 'value'); break; case 2: //近一月 $day = Carbon::now()->addDays(-29)->toDateString(); foreach ($departments as $department_id) { if (count($department_ids) && !in_array($department_id, $department_ids)) continue; $nums = Message::query()->whereIn('import_department_id', $s_department_ids)->where('import_department_id', $department_id)->whereDate('created_at', '>=', $day)->count(); if ($nums == 0) continue; $data[] = [ 'name' => Department::query()->where('id', $department_id)->value('name'), 'value' => $nums ]; } $data = arraySort($data, 'value'); break; case 3: //近一年 $day = Carbon::now()->addDays(-364)->toDateString(); foreach ($departments as $department_id) { if (count($department_ids) && !in_array($department_id, $department_ids)) continue; $nums = Message::query()->whereIn('import_department_id', $s_department_ids)->where('import_department_id', $department_id)->whereDate('created_at', '>=', $day)->count(); if ($nums == 0) continue; $data[] = [ 'name' => Department::query()->where('id', $department_id)->value('name'), 'value' => $nums ]; } $data = arraySort($data, 'value'); break; } return $this->response->success($data); } /** * 事项涉及区域数量统计 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function addressStatistics(Request $request) { $data = $this->validateData($request, [ 'date_type' => 'required|in:1,2,3' ]); $date_type = $data['date_type']; $department_id = $request->get('department_id', false); $department_ids = Department::byIdGetChildIds($department_id); $s_department_ids = Department::statistics(); $data = []; //全部部门 $departments = Department::getLast(); switch ($date_type) { case 1: //近一周 $day = Carbon::now()->addDays(-6)->toDateString(); $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->selectRaw('count(id) as nums,address_name')->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->where('address_name', '!=', '')->whereDate('created_at', '>=', $day)->groupBy('address_name')->get(); foreach ($messages as $message) { $data[] = [ //$message->address_name => $message->nums, 'name' => $message->address_name, 'value' => $message->nums ]; } $data = arraySort($data, 'value'); break; case 2: //近一月 $day = Carbon::now()->addDays(-29)->toDateString(); $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->selectRaw('count(id) as nums,address_name')->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->where('address_name', '!=', '')->whereDate('created_at', '>=', $day)->groupBy('address_name')->get(); foreach ($messages as $message) { $data[] = [ 'name' => $message->address_name, 'value' => $message->nums ]; } $data = arraySort($data, 'value'); break; case 3: //近一年 $day = Carbon::now()->addDays(-364)->toDateString(); $messages = Message::query()->whereIn('import_department_id', $s_department_ids)->selectRaw('count(id) as nums,address_name')->when($department_id, function ($query) use ($department_ids) { return $query->whereIn('import_department_id', $department_ids); })->where('address_name', '!=', '')->whereDate('created_at', '>=', $day)->groupBy('address_name')->get(); foreach ($messages as $message) { $data[] = [ 'name' => $message->address_name, 'value' => $message->nums ]; } $data = arraySort($data, 'value'); break; } return $this->response->success($data); } }