123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140 |
- <?php
- namespace App\Http\Controllers\Admin\Manage;
- use App\Http\Controllers\Controller;
- use App\Repositories\Enums\Manage\DealStatusEnum;
- use App\Repositories\Models\Base\Department;
- use App\Repositories\Models\Manage\Category;
- use App\Repositories\Models\Manage\Message;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use PhpOffice\PhpWord\Element\Table;
- use PhpOffice\PhpWord\TemplateProcessor;
- /**
- * 信息管理
- */
- class StatisticsController extends Controller
- {
- /**
- * 下载报告
- * @param Request $request
- * @throws \Illuminate\Validation\ValidationException
- */
- public function down(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',
- '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);
- }
- }
|