BiController.php 24 KB

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