BiController.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. <?php
  2. namespace App\Http\Controllers\Api\Config;
  3. use App\Http\Controllers\Api\ApiBaseController;
  4. use App\Models\Company;
  5. use App\Models\Config;
  6. use App\Models\Jobs;
  7. use App\Models\Recruit;
  8. use App\Models\RecruitAppointInfo;
  9. use App\Models\RecruitPost;
  10. use App\Models\Resume;
  11. use Illuminate\Support\Facades\DB;
  12. class BiController extends ApiBaseController
  13. {
  14. public function jkq()
  15. {
  16. $data = [];
  17. //人才数据
  18. $talent = Config::whereIn('type_id', [78, 79, 80, 81, 82])->get();
  19. $talent = $this->_valueToKey($talent, 'alias');
  20. $data['talent_level'] = [
  21. ['name' => '第一层次', 'count' => (int)$talent['talent_level_1']['value']],
  22. ['name' => '第二层次', 'count' => (int)$talent['talent_level_2']['value']],
  23. ['name' => '第三层次', 'count' => (int)$talent['talent_level_3']['value']],
  24. ['name' => '第四层次', 'count' => (int)$talent['talent_level_4']['value']],
  25. ['name' => '第五层次', 'count' => (int)$talent['talent_level_5']['value']],
  26. ['name' => '第六层次', 'count' => (int)$talent['talent_level_6']['value']],
  27. ['name' => '第七层次', 'count' => (int)$talent['talent_level_7']['value']],
  28. ];
  29. $data['talent_industry'] = [
  30. ['name' => $talent['talent_industry_trade']['name'], 'count' => (int)$talent['talent_industry_trade']['value']],
  31. ['name' => $talent['talent_industry_goods']['name'], 'count' => (int)$talent['talent_industry_goods']['value']],
  32. ['name' => $talent['talent_industry_clothing']['name'], 'count' => (int)$talent['talent_industry_clothing']['value']],
  33. ['name' => $talent['talent_industry_drug']['name'], 'count' => (int)$talent['talent_industry_drug']['value']],
  34. ['name' => $talent['talent_industry_medical']['name'], 'count' => (int)$talent['talent_industry_medical']['value']],
  35. ['name' => $talent['talent_industry_hotel']['name'], 'count' => (int)$talent['talent_industry_hotel']['value']],
  36. ['name' => $talent['talent_industry_traffic']['name'], 'count' => (int)$talent['talent_industry_traffic']['value']],
  37. ['name' => $talent['talent_industry_other']['name'], 'count' => (int)$talent['talent_industry_other']['value']],
  38. ];
  39. $data['talent_age'] = [
  40. ['name' => $talent['talent_age_1']['name'], 'count' => (int)$talent['talent_age_1']['value']],
  41. ['name' => $talent['talent_age_2']['name'], 'count' => (int)$talent['talent_age_2']['value']],
  42. ['name' => $talent['talent_age_3']['name'], 'count' => (int)$talent['talent_age_3']['value']],
  43. ['name' => $talent['talent_age_4']['name'], 'count' => (int)$talent['talent_age_4']['value']],
  44. ];
  45. $data['talent_education'] = [
  46. ['name' => $talent['talent_education_1']['name'], 'count' => (int)$talent['talent_education_1']['value']],
  47. ['name' => $talent['talent_education_2']['name'], 'count' => (int)$talent['talent_education_2']['value']],
  48. ['name' => $talent['talent_education_3']['name'], 'count' => (int)$talent['talent_education_3']['value']],
  49. ];
  50. //企业数和岗位数
  51. $company_count = Company::where('is_jkq', 1)->count();
  52. $job_count = Jobs::whereHas('company', function ($query) {
  53. $query->where('is_jkq', 1);
  54. })->count();
  55. $data['total_count'] = [
  56. ['name' => '企业数', 'count' => $company_count],
  57. ['name' => '岗位数', 'count' => $job_count],
  58. ['name' => '硕博人才数', 'count' => (int)$talent['talent_total']['value']],
  59. ];
  60. //企业所属行业
  61. $company_trade_data = Company::where('is_jkq', 1)->select(['trade', DB::raw('count(trade) as count')])->groupBy('trade')->get();
  62. $company_trade = [];
  63. $company_trade_other = 0;
  64. foreach ($company_trade_data as $v) {
  65. switch ($v['trade']) {
  66. case 11:
  67. $company_trade[] = ['name' => '贸易/进出口', 'count' => $v['count']];
  68. break;
  69. case 13:
  70. $company_trade[] = ['name' => '消费品(食/饮/烟酒)', 'count' => $v['count']];
  71. break;
  72. case 14:
  73. $company_trade[] = ['name' => '服装/纺织/皮革', 'count' => $v['count']];
  74. break;
  75. case 19:
  76. $company_trade[] = ['name' => '制药/生物工程', 'count' => $v['count']];
  77. break;
  78. case 21:
  79. $company_trade[] = ['name' => '医疗设备/器械', 'count' => $v['count']];
  80. break;
  81. case 36:
  82. $company_trade[] = ['name' => '酒店/旅游', 'count' => $v['count']];
  83. break;
  84. case 37:
  85. $company_trade[] = ['name' => '交通/运输/物流', 'count' => $v['count']];
  86. break;
  87. default:
  88. $company_trade_other += $v['count'];
  89. break;
  90. }
  91. }
  92. $company_trade[] = ['name' => '其他', 'count' => $company_trade_other];
  93. $data['company_trade'] = $company_trade;
  94. //企业需求工种
  95. $job_category_data = Jobs::whereHas('company', function ($query) {
  96. $query->where('is_jkq', 1);
  97. })->select(['topclass', DB::raw('count(topclass) as count')])->groupBy('topclass')->get();
  98. $job_category = [];
  99. $job_category_other = 0;
  100. foreach ($job_category_data as $v) {
  101. switch ($v['topclass']) {
  102. case 1:
  103. $job_category[] = ['name' => '销售|市场|客服|贸易', 'count' => $v['count']];
  104. break;
  105. case 74:
  106. $job_category[] = ['name' => '计算机|通信', 'count' => $v['count']];
  107. break;
  108. case 96:
  109. $job_category[] = ['name' => '服装/纺织/皮革', 'count' => $v['count']];
  110. break;
  111. case 116:
  112. $job_category[] = ['name' => '生产|质管|技工', 'count' => $v['count']];
  113. break;
  114. case 136:
  115. $job_category[] = ['name' => '电子|电气|能源|化工', 'count' => $v['count']];
  116. break;
  117. case 225:
  118. $job_category[] = ['name' => '医疗|制药|环保', 'count' => $v['count']];
  119. break;
  120. case 258:
  121. $job_category[] = ['name' => '学生|社工|科研|农业|其他', 'count' => $v['count']];
  122. break;
  123. default:
  124. $job_category_other += $v['count'];
  125. break;
  126. }
  127. }
  128. $job_category[] = ['name' => '其他', 'count' => $job_category_other];
  129. $data['job_category'] = $job_category;
  130. //企业薪酬范围
  131. $job_wage_1 = Jobs::whereHas('company', function ($query) {
  132. $query->where('is_jkq', 1);
  133. })->where('wage_min', '<=', 3000)->count();
  134. $job_wage_2 = Jobs::whereHas('company', function ($query) {
  135. $query->where('is_jkq', 1);
  136. })->where('wage_min', '>=', 3000)->where('wage_min', '<', 5000)->count();
  137. $job_wage_3 = Jobs::whereHas('company', function ($query) {
  138. $query->where('is_jkq', 1);
  139. })->where('wage_min', '>=', 5000)->where('wage_min', '<', 10000)->count();
  140. $job_wage_4 = Jobs::whereHas('company', function ($query) {
  141. $query->where('is_jkq', 1);
  142. })->where('wage_max', '>=', 10000)->count();
  143. $data['job_wage'] = [
  144. ['name' => '3000以下/月', 'count' => $job_wage_1],
  145. ['name' => '3000-5000/月', 'count' => $job_wage_2],
  146. ['name' => '5000-10000/月', 'count' => $job_wage_3],
  147. ['name' => '10000以上/月', 'count' => $job_wage_4],
  148. ];
  149. //企业学历范围
  150. $job_education_data = Jobs::whereHas('company', function ($query) {
  151. $query->where('is_jkq', 1);
  152. })->select(['education', DB::raw('count(education) as count')])->groupBy('education')->get();
  153. $job_education = [];
  154. $job_education_other = 0;
  155. foreach ($job_education_data as $v) {
  156. switch ($v['education']) {
  157. case 69:
  158. $job_education[] = ['name' => '大专', 'count' => $v['count']];
  159. break;
  160. case 70:
  161. $job_education[] = ['name' => '本科', 'count' => $v['count']];
  162. break;
  163. case 71:
  164. $job_education[] = ['name' => '硕士', 'count' => $v['count']];
  165. break;
  166. case 72:
  167. $job_education[] = ['name' => '博士', 'count' => $v['count']];
  168. break;
  169. case 73:
  170. $job_education[] = ['name' => '博士后', 'count' => $v['count']];
  171. break;
  172. default:
  173. $job_education_other += $v['count'];
  174. break;
  175. }
  176. }
  177. $job_education[] = ['name' => '其他', 'count' => $job_education_other];
  178. $data['job_education'] = $job_education;
  179. //求职者性别
  180. $resume_sex_data = Resume::select(['sex', DB::raw('count(sex) as count')])->groupBy('sex')->get();
  181. $resume_sex = [];
  182. $resume_total = 0;
  183. foreach ($resume_sex_data as $v) {
  184. $resume_total += $v['count'];
  185. switch ($v['sex']) {
  186. case 0:
  187. $resume_sex[] = ['name' => '未知', 'count' => $v['count']];
  188. break;
  189. case 1:
  190. $resume_sex[] = ['name' => '男', 'count' => $v['count']];
  191. break;
  192. case 2:
  193. $resume_sex[] = ['name' => '女', 'count' => $v['count']];
  194. break;
  195. }
  196. }
  197. $resume_sex[] = ['name' => '总人数', 'count' => $resume_total];
  198. $data['resume_sex'] = $resume_sex;
  199. //求职者求职工种
  200. $resume_trade_1 = Resume::where('trade', 'like', "11%")->count();
  201. $resume_trade_2 = Resume::where('trade', 'like', "13%")->count();
  202. $resume_trade_3 = Resume::where('trade', 'like', "14%")->count();
  203. $resume_trade_4 = Resume::where('trade', 'like', "19%")->count();
  204. $resume_trade_5 = Resume::where('trade', 'like', "21%")->count();
  205. $resume_trade_6 = Resume::where('trade', 'like', "36%")->count();
  206. $resume_trade_7 = Resume::where('trade', 'like', "37%")->count();
  207. $data['resume_trade'] = [
  208. ['name' => '贸易/进出口', 'count' => $resume_trade_1],
  209. ['name' => '消费品(食/饮/烟酒)', 'count' => $resume_trade_2],
  210. ['name' => '服装/纺织/皮革', 'count' => $resume_trade_3],
  211. ['name' => '制药/生物工程', 'count' => $resume_trade_4],
  212. ['name' => '医疗设备/器械', 'count' => $resume_trade_5],
  213. ['name' => '酒店/旅游', 'count' => $resume_trade_6],
  214. ['name' => '交通/运输/物流', 'count' => $resume_trade_7],
  215. ['name' => '其他', 'count' => ($resume_total - $resume_trade_1 - $resume_trade_2 - $resume_trade_3 - $resume_trade_4 - $resume_trade_5 - $resume_trade_6 - $resume_trade_7)],
  216. ];
  217. //求职者年龄分布
  218. $year = date('Y');
  219. $resume_age_1 = Resume::where('birthdate', '>', $year - 30)->count();
  220. $resume_age_2 = Resume::where('birthdate', '>', $year - 39)->where('birthdate', '<', $year - 30)->count();
  221. $resume_age_3 = Resume::where('birthdate', '>', $year - 49)->where('birthdate', '<', $year - 40)->count();
  222. $resume_age_4 = Resume::where('birthdate', '<', $year - 50)->count();
  223. $data['resume_age'] = [
  224. ['name' => '30岁以下', 'count' => $resume_age_1],
  225. ['name' => '30-39岁', 'count' => $resume_age_2],
  226. ['name' => '40-49岁', 'count' => $resume_age_3],
  227. ['name' => '50岁以上', 'count' => $resume_age_4],
  228. ];
  229. //求职者学历分布
  230. $resume_education_data = Resume::select(['education', DB::raw('count(education) as count')])->groupBy('education')->get();
  231. $resume_education = [];
  232. $resume_education_other = 0;
  233. foreach ($resume_education_data as $v) {
  234. switch ($v['education']) {
  235. case 69:
  236. $resume_education[] = ['name' => '大专', 'count' => $v['count']];
  237. break;
  238. case 70:
  239. $resume_education[] = ['name' => '本科', 'count' => $v['count']];
  240. break;
  241. case 71:
  242. $resume_education[] = ['name' => '硕士', 'count' => $v['count']];
  243. break;
  244. case 72:
  245. $resume_education[] = ['name' => '博士', 'count' => $v['count']];
  246. break;
  247. case 73:
  248. $resume_education[] = ['name' => '博士后', 'count' => $v['count']];
  249. break;
  250. default:
  251. $resume_education_other += $v['count'];
  252. break;
  253. }
  254. }
  255. $resume_education[] = ['name' => '其他', 'count' => $resume_education_other];
  256. $data['resume_education'] = $resume_education;
  257. return response()->json($data);
  258. }
  259. /**
  260. * 聚合
  261. */
  262. public function agg()
  263. {
  264. $data = [];
  265. //求职者性别
  266. $resume_sex_data = Resume::select(['sex', DB::raw('count(sex) as count')])->groupBy('sex')->get();
  267. $resume_sex = [];
  268. $resume_total = 0;
  269. foreach ($resume_sex_data as $v) {
  270. $resume_total += $v['count'];
  271. switch ($v['sex']) {
  272. case 0:
  273. $resume_sex[] = ['name' => '未知', 'count' => $v['count']];
  274. break;
  275. case 1:
  276. $resume_sex[] = ['name' => '男', 'count' => $v['count']];
  277. break;
  278. case 2:
  279. $resume_sex[] = ['name' => '女', 'count' => $v['count']];
  280. break;
  281. }
  282. }
  283. $resume_sex[] = ['name' => '总人数', 'count' => $resume_total];
  284. $data['resume_sex'] = $resume_sex;
  285. //求职者求职工种
  286. $resume_trade_1 = Resume::where('trade', 'like', "11%")->count();
  287. $resume_trade_2 = Resume::where('trade', 'like', "13%")->count();
  288. $resume_trade_3 = Resume::where('trade', 'like', "14%")->count();
  289. $resume_trade_4 = Resume::where('trade', 'like', "19%")->count();
  290. $resume_trade_5 = Resume::where('trade', 'like', "21%")->count();
  291. $resume_trade_6 = Resume::where('trade', 'like', "36%")->count();
  292. $resume_trade_7 = Resume::where('trade', 'like', "37%")->count();
  293. $data['resume_trade'] = [
  294. ['name' => '贸易/进出口', 'count' => $resume_trade_1],
  295. ['name' => '消费品(食/饮/烟酒)', 'count' => $resume_trade_2],
  296. ['name' => '服装/纺织/皮革', 'count' => $resume_trade_3],
  297. ['name' => '制药/生物工程', 'count' => $resume_trade_4],
  298. ['name' => '医疗设备/器械', 'count' => $resume_trade_5],
  299. ['name' => '酒店/旅游', 'count' => $resume_trade_6],
  300. ['name' => '交通/运输/物流', 'count' => $resume_trade_7],
  301. ['name' => '其他', 'count' => ($resume_total - $resume_trade_1 - $resume_trade_2 - $resume_trade_3 - $resume_trade_4 - $resume_trade_5 - $resume_trade_6 - $resume_trade_7)],
  302. ];
  303. //求职者年龄分布
  304. $year = date('Y');
  305. $resume_age_1 = Resume::where('birthdate', '>', $year - 30)->count();
  306. $resume_age_2 = Resume::where('birthdate', '>', $year - 39)->where('birthdate', '<', $year - 30)->count();
  307. $resume_age_3 = Resume::where('birthdate', '>', $year - 49)->where('birthdate', '<', $year - 40)->count();
  308. $resume_age_4 = Resume::where('birthdate', '<', $year - 50)->count();
  309. $data['resume_age'] = [
  310. ['name' => '30岁以下', 'count' => $resume_age_1],
  311. ['name' => '30-39岁', 'count' => $resume_age_2],
  312. ['name' => '40-49岁', 'count' => $resume_age_3],
  313. ['name' => '50岁以上', 'count' => $resume_age_4],
  314. ];
  315. //求职者学历分布
  316. $resume_education_data = Resume::select(['education', DB::raw('count(education) as count')])->groupBy('education')->get();
  317. $resume_education = [];
  318. $resume_education_other = 0;
  319. foreach ($resume_education_data as $v) {
  320. switch ($v['education']) {
  321. case 69:
  322. $resume_education[] = ['name' => '大专', 'count' => $v['count']];
  323. break;
  324. case 70:
  325. $resume_education[] = ['name' => '本科', 'count' => $v['count']];
  326. break;
  327. case 71:
  328. $resume_education[] = ['name' => '硕士', 'count' => $v['count']];
  329. break;
  330. case 72:
  331. $resume_education[] = ['name' => '博士', 'count' => $v['count']];
  332. break;
  333. case 73:
  334. $resume_education[] = ['name' => '博士后', 'count' => $v['count']];
  335. break;
  336. default:
  337. $resume_education_other += $v['count'];
  338. break;
  339. }
  340. }
  341. $resume_education[] = ['name' => '其他', 'count' => $resume_education_other];
  342. $data['resume_education'] = $resume_education;
  343. //招考数据
  344. $data['recruit_count'] = Recruit::count();
  345. $data['recruit_post'] = RecruitPost::count();
  346. $data['recruit_apply'] = RecruitAppointInfo::count();
  347. //学历和年龄
  348. $recruit_apply_data = RecruitAppointInfo::select(['birthday','education'])->get();
  349. $recruit_education = [
  350. '专科' => ['name' => '专科', 'count' => 0],
  351. '本科' => ['name' => '本科', 'count' => 0],
  352. '硕士' => ['name' => '硕士', 'count' => 0],
  353. '博士' => ['name' => '博士', 'count' => 0],
  354. '其他' => ['name' => '其他', 'count' => 0],
  355. ];
  356. $recruit_age = [
  357. '30岁及以下' => ['name' => '30岁及以下', 'count' => 0],
  358. '30到35岁' => ['name' => '30到35岁', 'count' => 0],
  359. '35到40岁' => ['name' => '35到40岁', 'count' => 0],
  360. '40岁以上' => ['name' => '40岁以上', 'count' => 0],
  361. ];
  362. foreach ($recruit_apply_data as $v) {
  363. if (!empty($recruit_education[$v['education']])) {
  364. $recruit_education[$v['education']]['count']++;
  365. } else {
  366. $recruit_education['其他']['count']++;
  367. }
  368. $birth = mb_substr($v['birthday'], 0, 4);
  369. if ($birth >= ($year - 30)) {
  370. $recruit_age['30岁及以下']['count']++;
  371. } elseif ($birth >= ($year - 35) && $birth < ($year - 30)) {
  372. $recruit_age['30到35岁']['count']++;
  373. } elseif ($birth >= ($year - 40) && $birth < ($year - 35)) {
  374. $recruit_age['35到40岁']['count']++;
  375. } else {
  376. $recruit_age['40岁以上']['count']++;
  377. }
  378. }
  379. $data['recruit_education'] = array_values($recruit_education);
  380. $data['recruit_age'] = array_values($recruit_age);
  381. return response()->json($data);
  382. }
  383. public function company()
  384. {
  385. $data = [];
  386. //企业数和岗位数
  387. $company_count = Company::where(1)->count();
  388. $job_count = Jobs::where(1)->count();
  389. $data['total_count'] = [
  390. ['name' => '企业数', 'count' => $company_count],
  391. ['name' => '岗位数', 'count' => $job_count]
  392. ];
  393. //企业所属行业
  394. $company_trade_data = Company::select(['trade', DB::raw('count(trade) as count')])->groupBy('trade')->get();
  395. $company_trade = [];
  396. $company_trade_other = 0;
  397. foreach ($company_trade_data as $v) {
  398. switch ($v['trade']) {
  399. case 11:
  400. $company_trade[] = ['name' => '贸易/进出口', 'count' => $v['count']];
  401. break;
  402. case 13:
  403. $company_trade[] = ['name' => '消费品(食/饮/烟酒)', 'count' => $v['count']];
  404. break;
  405. case 14:
  406. $company_trade[] = ['name' => '服装/纺织/皮革', 'count' => $v['count']];
  407. break;
  408. case 19:
  409. $company_trade[] = ['name' => '制药/生物工程', 'count' => $v['count']];
  410. break;
  411. case 21:
  412. $company_trade[] = ['name' => '医疗设备/器械', 'count' => $v['count']];
  413. break;
  414. case 36:
  415. $company_trade[] = ['name' => '酒店/旅游', 'count' => $v['count']];
  416. break;
  417. case 37:
  418. $company_trade[] = ['name' => '交通/运输/物流', 'count' => $v['count']];
  419. break;
  420. default:
  421. $company_trade_other += $v['count'];
  422. break;
  423. }
  424. }
  425. $company_trade[] = ['name' => '其他', 'count' => $company_trade_other];
  426. $data['company_trade'] = $company_trade;
  427. //企业需求工种
  428. $job_category_data = Jobs::select(['topclass', DB::raw('count(topclass) as count')])->groupBy('topclass')->get();
  429. $job_category = [];
  430. $job_category_other = 0;
  431. foreach ($job_category_data as $v) {
  432. switch ($v['topclass']) {
  433. case 1:
  434. $job_category[] = ['name' => '销售|市场|客服|贸易', 'count' => $v['count']];
  435. break;
  436. case 74:
  437. $job_category[] = ['name' => '计算机|通信', 'count' => $v['count']];
  438. break;
  439. case 96:
  440. $job_category[] = ['name' => '服装/纺织/皮革', 'count' => $v['count']];
  441. break;
  442. case 116:
  443. $job_category[] = ['name' => '生产|质管|技工', 'count' => $v['count']];
  444. break;
  445. case 136:
  446. $job_category[] = ['name' => '电子|电气|能源|化工', 'count' => $v['count']];
  447. break;
  448. case 225:
  449. $job_category[] = ['name' => '医疗|制药|环保', 'count' => $v['count']];
  450. break;
  451. case 258:
  452. $job_category[] = ['name' => '学生|社工|科研|农业|其他', 'count' => $v['count']];
  453. break;
  454. default:
  455. $job_category_other += $v['count'];
  456. break;
  457. }
  458. }
  459. $job_category[] = ['name' => '其他', 'count' => $job_category_other];
  460. $data['job_category'] = $job_category;
  461. return response()->json($data);
  462. }
  463. private function _valueToKey($arr, $key)
  464. {
  465. $res = [];
  466. foreach ($arr as $v) {
  467. $res[$v[$key]] = $v;
  468. }
  469. return $res;
  470. }
  471. }