Recruitment.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <?php
  2. namespace app\sys\controller;
  3. use think\facade\View;
  4. use think\facade\Request;
  5. use think\facade\Db;
  6. use app\model\Employee;
  7. use app\model\Customer;
  8. use app\model\Org;
  9. use app\model\Permission;
  10. use app\model\camp as campModel;
  11. use app\model\ExamEmpResult;
  12. use app\model\TrainDoneLog;
  13. use app\model\CampPlan;
  14. use app\model\CampEmployee;
  15. use app\model\trainClass;
  16. use app\model\examPaper;
  17. use app\model\Recruit;
  18. use wx\miniprogram\Qrcode;
  19. use app\model\Miniprogram;
  20. class Recruitment
  21. {
  22. /**
  23. * 人事招聘
  24. */
  25. public function index()
  26. {
  27. $token = request()->employee;
  28. $require = Recruit::where([['root_id','=',$token['root_id']]])->column('name','id');
  29. $w[] = ['root_id','=',$token['root_id']];
  30. $w[] = ['recruit','in',array_keys($require)];
  31. $sql = "recruit is not null AND recruit <> '' AND state<>'待审核'";
  32. $eids = Employee::where($w)->where($sql)->column('id');//通过我的码邀请的人员
  33. $data['count'] = count($eids);//累计招聘
  34. //加入新兵训练营的所有人
  35. $w1[] = ['employee_id','in',$eids];
  36. $em = CampEmployee::where($w1)->group('employee_id')->field('id,employee_id,state')->select()->toArray();
  37. $data['pass'] = $data['no_pass'] = 0;//累计通过,不通过
  38. foreach ($em as $k => $v) {
  39. $v['state'] == '转正' ? $data['pass']+=1 : $data['no_pass']+=1;
  40. }
  41. $data['grawth'] = $data['pass']==0 ? '0%' : round($data['pass']/$data['count']*100,2).'%';//通过率
  42. //人事招聘人数
  43. $many = Employee::where($w)->where($sql)->field("count(*) count,recruit")->group('recruit')->order('count desc')->select()->toArray();
  44. //招聘最多
  45. $data['many'] = empty($many) ? '暂无' : (Recruit::where('id',$many[0]['recruit'])->value('name') ?: '暂无');
  46. //通过新兵训练营的所有人
  47. $emp = CampEmployee::where($w1)->group('employee_id')->field('id,employee_id,state')->select()->toArray();
  48. $row = [];
  49. foreach ($emp as $k1 => $v1) {
  50. if($v1['state']=='转正') $row[] = $v1['employee_id'];
  51. }
  52. $field = "recruit,id,IF(id in ('".implode('\',\'', $row)."'),1,0) as pass";
  53. $emp = Employee::where($sql)->field($field)->select()->toArray();
  54. $row = [];
  55. foreach ($emp as $k4 => $v4) {
  56. isset($row[$v4['recruit']]['all_count']) ? $row[$v4['recruit']]['all_count']+=1 : $row[$v4['recruit']]['all_count']=1;
  57. if($v4['pass']==1) (isset($row[$v4['recruit']]['pass']) ? $row[$v4['recruit']]['pass']+=1 : $row[$v4['recruit']]['pass']=1);
  58. }
  59. $max_grawth = 0;//最高通过率
  60. $max_recruit = 0;//最高通过率人事
  61. foreach ($row as $k5 => $v5) {
  62. if (isset($v5['all_count']) && isset($v5['pass'])) {
  63. $grawth = round($v5['pass']/$v5['all_count'],4);
  64. if($grawth>$max_grawth){
  65. $max_grawth = $grawth;
  66. $max_recruit = $k5;
  67. }
  68. }
  69. }
  70. $data['high'] = $max_recruit ? (Recruit::where('id',$max_recruit)->value('name') ?: '暂无') : '暂无';
  71. View::assign('data',$data);
  72. return View::fetch();
  73. }
  74. /**
  75. * 人事招聘
  76. */
  77. public function list()
  78. {
  79. $token = request()->employee;
  80. $param = Request::only(['page'=>1, 'limit'=>10, 'start_date'=>'','end_date'=>'','keyword'=>'']);
  81. $w[] = ['root_id','=',$token['root_id']];
  82. if ($param['start_date']) {
  83. $w[] = ['addtime','>=',$param['start_date']];
  84. }
  85. if ($param['end_date']) {
  86. $w[] = ['addtime','<=',$param['end_date']];
  87. }
  88. if ($param['keyword']) {
  89. $w[] = ['name','like','%'.$param['keyword'].'%'];
  90. }
  91. $root_id = $token['root_id'];
  92. $list = Recruit::with(['employee'=>function($query) use ($root_id){
  93. $query->where("recruit is not null AND recruit <> '' AND state <> '待审核' AND root_id=".$root_id)->visible(['id']);
  94. }])->where($w)->page($param['page'],$param['limit'])->select()->toArray();
  95. foreach ($list as $k => &$v) {
  96. $list[$k]['pass'] = $list[$k]['no_pass'] = $list[$k]['count'] = 0;
  97. if (!empty($v['employee'])) {
  98. $w1 = [];
  99. $w1[] = ['employee_id','in',array_column($v['employee'],'id')];
  100. $w1[] = ['root_id','=',$root_id];
  101. $employees = CampEmployee::where($w1)->field('state,approve')->group('employee_id')->select();
  102. // echo $employees;die;
  103. foreach ($employees as $k2 => &$v2) {
  104. $v2['state'] == '转正' ? $list[$k]['pass']+=1 : $list[$k]['no_pass']+=1;
  105. }
  106. }
  107. $list[$k]['count']= count($v['employee']);
  108. $list[$k]['growth'] = $list[$k]['pass']==0 ? '0%' : round($list[$k]['pass']/$list[$k]['count']*100,2).'%';
  109. }
  110. $count = Recruit::where($w)->count();
  111. return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']);
  112. }
  113. /**
  114. * 邀请码
  115. */
  116. public function add()
  117. {
  118. $token = request()->employee;
  119. $name = input('value','');
  120. $w[] = ['root_id','=',$token['root_id']];
  121. $w[] = ['name','=',trim($name)];
  122. $count = Recruit::where($w)->count();
  123. if ($count) return json(['code' =>1, 'data' => '人事已存在' ,'msg' => '人事已存在']);
  124. $save['name'] = trim($name);
  125. $save['root_id'] = $token['root_id'];
  126. $id = Recruit::insertGetId($save);
  127. $accessToken = '';
  128. // 二维码生成到企业小程序设置中
  129. $defaultAccesstoken = Miniprogram::where([['root_id', '=',$token['root_id']]])->find();
  130. $miniQr = new Qrcode();
  131. // 1)管理员二维码
  132. $qr = $miniQr->getUnlimited($defaultAccesstoken->accesstoken, [
  133. 'scene' => 'cgi='.$defaultAccesstoken->notify.'&manager=' . $token['root_id'].'&r='.$id,
  134. 'page' => 'mycustomer/pages/invite/invite',
  135. 'width' => '280px',
  136. 'check_path' => false
  137. ]);
  138. $rs = json_decode($qr, true);
  139. if (!is_null($rs)) {
  140. trace($rs, 'error');
  141. return json(['code' => 1, 'msg' => '配置失败,appid,secret不正确或小程序业务域名未配置']);
  142. }
  143. $managerQr = 'invite' . DIRECTORY_SEPARATOR . uniqid() . '.jpeg';
  144. ossContentUpload($managerQr, $qr);
  145. $save['manager_qr'] = $managerQr;
  146. // 2)员工二维码
  147. $qr = $miniQr->getUnlimited($defaultAccesstoken->accesstoken, [
  148. 'scene' => 'cgi='.$defaultAccesstoken->notify.'&employee=' . $token['root_id'].'&r='.$id,
  149. 'page' => 'mycustomer/pages/invite/invite',
  150. 'width' => '280px',
  151. 'check_path' => false
  152. ]);
  153. $rs = json_decode($qr, true);
  154. if (!is_null($rs)) {
  155. return json(['code' => 1, 'msg' => '配置失败,appid,secret不正确或小程序业务域名未配置']);
  156. }
  157. $employeeQr = 'invite' . DIRECTORY_SEPARATOR . uniqid() . '.jpeg';
  158. ossContentUpload($employeeQr, $qr);
  159. $save['employee_qr'] = $employeeQr;
  160. Recruit::where('id',$id)->update(['employee_qr'=>$employeeQr,'manager_qr'=>$managerQr]);
  161. return json(['code' => 0, 'data' => '添加成功', 'msg' => '添加成功']);
  162. }
  163. /**
  164. * 邀请码
  165. */
  166. public function recruitment_qr()
  167. {
  168. $token = request()->employee;
  169. $id = input('name','');
  170. $info = Recruit::where('id',$id)->find();
  171. $data['managerQr'] = $info->manager_qr;
  172. $data['employeeQr'] = $info->employee_qr;
  173. View::assign('data',$data);
  174. return View::fetch();
  175. }
  176. /**
  177. * 招聘人员
  178. */
  179. public function personal()
  180. {
  181. $token = request()->employee;
  182. $name = input('name','');
  183. View::assign('name',$name);
  184. return View::fetch();
  185. }
  186. /**
  187. * 招聘人员liebiao
  188. */
  189. public function personal_list()
  190. {
  191. $token = request()->employee;
  192. $name = input('name','');
  193. $param = Request::only(['page'=>1, 'limit'=>10, 'start_date'=>'','end_date'=>'','keyword'=>'']);
  194. $w[] = ['root_id','=',$token['root_id']];
  195. $w[] = ['recruit','=',trim($name)];
  196. if ($param['keyword']) {
  197. $w[] = ['name','like','%'.$param['keyword'].'%'];
  198. }
  199. if ($param['start_date']) {
  200. $w[] = ['addtime','>=',$param['start_date']];
  201. }
  202. if ($param['end_date']) {
  203. $w[] = ['addtime','<=',$param['end_date']];
  204. }
  205. $list = Employee::with(['org'=>function($query){
  206. $query->visible(['name'])->bind(['org_name'=>'name']);
  207. }])->where($w)->field('id,name,org_id,addtime,opt_name')->page($param['page'],$param['limit'])->select()->toArray();
  208. $counts = Employee::where($w)->count();
  209. foreach ($list as $k => $v) {
  210. $list[$k]['name'] = $v['name'] ?: $v['opt_name'];
  211. $w1 = [];
  212. $w1[] = ['employee_id','=',$v['id']];
  213. $w1[] = ['root_id','=',$token['root_id']];
  214. // $w1[] = ['now','=',1];
  215. $camp = CampEmployee::where($w1)->order('id asc')->field('camp_id,state')->findOrEmpty();
  216. if (!$camp->isEmpty()) {
  217. $camp_id = $camp->camp_id;
  218. $list[$k]['state'] = $camp->state=='转正' ? '转正' : '未通过';
  219. $pw = [];
  220. $pw[] = ['root_id','=',$token['root_id']];
  221. $pw[] = ['camp_id','=',$camp_id];
  222. $pw[] = ['con_id','>',0];
  223. $pw[] = ['plan_id','>',0];
  224. $pw[] = ['del','=',0];
  225. $plan = CampPlan::where($pw)->order('id asc')->select()->toArray();
  226. $count = count($plan);//总节数
  227. $w0 = $w1 = [];//0课程,1试卷
  228. foreach ($plan as $k3 => $v3) {
  229. $v3['type']==0 ? $w0[]=$v3['con_id'] : $w1[]=$v3['con_id'];
  230. }
  231. $tw = [];
  232. $tw[] = ['class_id','in',$w0];
  233. $tw[] = ['root_id','=',$token['root_id']];
  234. $tw[] = ['from','=',1];
  235. $tw[] = ['employee_id','=',$v['id']];
  236. $tw[] = ['done_percent','=',100];
  237. $train = TrainDoneLog::where($tw)->count();
  238. $ew = [];
  239. $ew[] = ['paper_id','in',$w1];
  240. $ew[] = ['root_id','=',$token['root_id']];
  241. $ew[] = ['from','=',1];
  242. $ew[] = ['employee_id','=',$v['id']];
  243. // $paper = ExamEmpResult::where($ew)->count();
  244. $paper = ExamEmpResult::with('paper')->where($ew)->select()->toArray();
  245. $i = 0;
  246. foreach ($paper as $k6 => $v6) {
  247. if ($v6['base_score'] <= $v6['final_score']) {
  248. $i+=1;
  249. }
  250. }
  251. $passed_count = $train+$i;
  252. $list[$k]['speed'] = $count ? round(($passed_count/$count)*100,2).'%' : '0%';
  253. }else{
  254. $list[$k]['speed'] = '';
  255. $list[$k]['state'] = '未训练';
  256. }
  257. }
  258. return json(['code' => 0, 'data' =>$list, 'count'=>$counts,'msg' => '添加成功']);
  259. }
  260. /**
  261. * 通过人员
  262. */
  263. public function pass_personal()
  264. {
  265. $token = request()->employee;
  266. $name = input('name','');
  267. View::assign('name',$name);
  268. return View::fetch();
  269. }
  270. /**
  271. * 通过人员列表
  272. */
  273. public function pass_personal_list()
  274. {
  275. $token = request()->employee;
  276. $param = Request::only(['page'=>1, 'limit'=>10, 'start_date'=>'','end_date'=>'','keyword'=>'']);
  277. $w[] = ['root_id','=',$token['root_id']];
  278. $name = input('name','');
  279. // $w[] = ['state','=','转正'];
  280. if ($param['start_date']) {
  281. $w[] = ['approve_time','>=',$param['start_date']];
  282. }
  283. if ($param['end_date']) {
  284. $w[] = ['approve_time','<=',$param['end_date']];
  285. }
  286. $camp = CampEmployee::where($w)->group('employee_id')->field('employee_id,state,approve_time')->select()->toArray();
  287. $ids = [];
  288. $row = [];
  289. foreach ($camp as $k => $v) {
  290. if ($v['state']=='转正') {
  291. $ids[] = $v['employee_id'];
  292. $row[$v['employee_id']] = $v['approve_time'];
  293. }
  294. }
  295. if ($param['keyword']) {
  296. $w1[] = ['name','like','%'.$param['keyword'].'%'];
  297. }
  298. $w1[] = ['id','in',$ids];
  299. $w1[] = ['recruit','=',$name];
  300. $list = Employee::where($w1)->field('name,id')->page($param['page'],$param['limit'])->select()->toArray();
  301. foreach ($list as $k => $v) {
  302. $list[$k]['approve_time'] = $row[$v['id']];
  303. }
  304. $count = Employee::where($w1)->count();
  305. return json(['code' => 0, 'data' =>$list, 'count'=>$count,'msg' => '添加成功']);
  306. }
  307. /**
  308. * 未通过人员
  309. */
  310. public function no_pass_personal()
  311. {
  312. $token = request()->employee;
  313. $name = input('name','');
  314. View::assign('name',$name);
  315. return View::fetch();
  316. }
  317. /**
  318. * 未通过人员
  319. */
  320. public function no_pass_personal_list()
  321. {
  322. $token = request()->employee;
  323. $param = Request::only(['page'=>1, 'limit'=>10, 'start_date'=>'','end_date'=>'','keyword'=>'']);
  324. $w[] = ['root_id','=',$token['root_id']];
  325. $name = input('name','');
  326. $camp = CampEmployee::where($w)->group('employee_id')->field('employee_id,state,approve_time')->select()->toArray();
  327. $ids = [];
  328. $row = [];
  329. foreach ($camp as $k => $v) {
  330. if ($v['state']!='转正') {
  331. $ids[] = $v['employee_id'];
  332. $row[$v['employee_id']] = $v['approve_time'];
  333. }
  334. }
  335. if ($param['keyword']) {
  336. $w1[] = ['name','like','%'.$param['keyword'].'%'];
  337. }
  338. if ($param['start_date']) {
  339. $w1[] = ['addtime','>=',$param['start_date']];
  340. }
  341. if ($param['end_date']) {
  342. $w1[] = ['addtime','<=',$param['end_date']];
  343. }
  344. $w1[] = ['id','in',$ids];
  345. $w1[] = ['recruit','=',$name];
  346. $list = Employee::with(['org'=>function($query){
  347. $query->visible(['name'])->bind(['org_name'=>'name']);
  348. }])->where($w1)->field('name,id,addtime,org_id')->page($param['page'],$param['limit'])->select()->toArray();
  349. $count = Employee::where($w1)->count();
  350. return json(['code' => 0, 'data' =>$list, 'count'=>$count,'msg' => '添加成功']);
  351. }
  352. }