Employee.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. <?php
  2. namespace App\Models\Manager\Personnel;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Illuminate\Support\Facades\DB;
  6. use App\Models\Manager\Personnel\EmployeeArea as EmployeeAreaModel;
  7. use App\Models\Manager\Personnel\EmployeeDepartment as EmployeeDepartmentModel;
  8. use App\Facades\Servers\Encrypts\AccessToken;
  9. use App\Models\Manager\Personnel\EmployeePlatform as EmployeePlatformModel;
  10. use App\Models\Manager\Personnel\EmployeeProvince as EmployeeProvinceModel;
  11. use App\Models\Manager\Personnel\EmployeeZoning as EmployeeZoningModel;
  12. /**
  13. * 员工模型
  14. * @author 唐远望
  15. * @version 1.0
  16. * @date 2025-12-04
  17. */
  18. class Employee extends Model
  19. {
  20. use HasFactory;
  21. // 与模型关联的表名
  22. protected $table = 'personnel_employee';
  23. // 是否主动维护时间戳
  24. public $timestamps = false;
  25. // 定义时间戳字段名
  26. // const CREATED_AT = 'insert_time';
  27. // const UPDATED_AT = 'update_time';
  28. /**
  29. * 添加
  30. * @author 唐远望
  31. * @version 1.0
  32. * @date 2025-12-04
  33. */
  34. public function addEmployee_content($data)
  35. {
  36. $insert_data = [
  37. 'name' => $data['name'],
  38. 'mobile' => $data['mobile'],
  39. 'email' => $data['email'],
  40. 'password' => md5($data['password']),
  41. 'role_id' => $data['role_id'],
  42. 'department_id' => $data['department_id'],
  43. 'open_notice' => $data['open_notice'],
  44. 'duty_type' => isset($data['duty_type']) ? $data['duty_type'] : '',
  45. 'company_id' => $data['company_id'],
  46. 'insert_time' => time(),
  47. ];
  48. $Employee_id = $this->insertGetId($insert_data);
  49. if ($Employee_id) {
  50. $this->where('id', $Employee_id)->update(['employee_code' => $this->employee_id_rule($data['company_id'], $Employee_id)]);
  51. }
  52. return $Employee_id;
  53. }
  54. /**
  55. * 处理用户城市大区显示
  56. * @author 唐远望
  57. * @version 1.0
  58. * @date 2026-03-19
  59. * @param int $uid 用户ID
  60. *
  61. */
  62. public function get_area_info($uid)
  63. {
  64. //获取用户关联大区信息
  65. $EmployeeZoningModel = new EmployeeZoningModel();
  66. $EmployeeProvinceModel = new EmployeeProvinceModel();
  67. $EmployeeAreaModel = new EmployeeAreaModel();
  68. $user_area_info = $EmployeeZoningModel->where('employee_id', $uid)->get()->toArray();
  69. if (!$user_area_info) {
  70. return $user_area_info;
  71. }
  72. //查询用户关联省份信息
  73. foreach ($user_area_info as $key => $value) {
  74. $province_info = $EmployeeProvinceModel->where(['employee_id' => $uid, 'zoning_id' => $value['zoning_id']])->get()->toArray();
  75. $user_area_info[$key]['province_info'] = '';
  76. if (empty($province_info)) continue;
  77. $user_area_info[$key]['province_info'] = $province_info;
  78. //查询用户关联城市信息
  79. foreach ($province_info as $k => $v) {
  80. $city_info = $EmployeeAreaModel->where(['employee_id' => $uid, 'province_id' => $v['province_id']])->get()->toArray();
  81. $user_area_info[$key]['province_info'][$k]['city_info'] = '';
  82. if (empty($city_info)) continue;
  83. $user_area_info[$key]['province_info'][$k]['city_info'] = $city_info;
  84. }
  85. }
  86. return $user_area_info;
  87. }
  88. /**
  89. * 获取员工归属平台
  90. * @author 唐远望
  91. * @version 1.0
  92. * @date 2026-03-19
  93. * @param int $uid 用户ID
  94. *
  95. */
  96. public function get_platform_info($uid){
  97. $EmployeePlatformModel = new EmployeePlatformModel();
  98. $user_platform_info = $EmployeePlatformModel->where('employee_id', $uid)->pluck('platform_id');
  99. return $user_platform_info;
  100. }
  101. /**
  102. * id转编码
  103. * @author 唐远望
  104. * @version 1.0
  105. * @date 2025-12-04
  106. * @param int $id 编码
  107. *
  108. */
  109. public function employee_idToCode($id)
  110. {
  111. return 'RH' . str_pad($id, 9, '0', STR_PAD_LEFT);
  112. }
  113. /**
  114. * 员工ID生成规则
  115. * @author 唐远望
  116. * @version 1.0
  117. * @date 2026-03-31
  118. * @param int $company_id 公司ID
  119. * @param int $id 员工ID
  120. *
  121. */
  122. public function employee_id_rule($company_id,$id)
  123. {
  124. $new_id =rand(100000000, 999999999);
  125. //查询最新一条记录员工ID
  126. $latest_employee = $this->where('company_id', $company_id)->where([['employee_code','!=','']])->orderBy('id', 'desc')->first();
  127. if (!$latest_employee) {
  128. $new_id = $company_id.str_pad(1, 9, '0', STR_PAD_LEFT);
  129. } else {
  130. //如果包含RH字符,则去除后字符串转数字+1,否则直接字符串数据+1
  131. if (strpos($latest_employee->employee_code, 'RH') === 0) {
  132. $latest_id = intval(str_ireplace('RH', '', $latest_employee->employee_code));
  133. $new_id = $company_id.$latest_id + 1;
  134. } else if (trim($latest_employee->employee_code) != '') {
  135. $new_id = intval($latest_employee->employee_code) + 1;
  136. } else {
  137. $new_id = $company_id.str_pad(1, 9, '0', STR_PAD_LEFT);
  138. }
  139. }
  140. return $new_id;
  141. }
  142. /**
  143. * 编码转id
  144. * @author 唐远望
  145. * @version 1.0
  146. * @date 2025-12-04
  147. * @param string $code 编码
  148. *
  149. */
  150. public function employee_codeToId($code)
  151. {
  152. return intval(str_ireplace('RH', '', $code));
  153. }
  154. /**
  155. * 写入数据
  156. * @author 唐远望
  157. * @version 1.0
  158. * @date 2025-12-04
  159. * @param $data
  160. * @return bool
  161. */
  162. public function addEmployee($data)
  163. {
  164. DB::beginTransaction();
  165. try {
  166. $EmployeeAreaModel = new EmployeeAreaModel();
  167. $EmployeeDepartmentModel = new EmployeeDepartmentModel();
  168. $EmployeePlatformModel = new EmployeePlatformModel();
  169. $EmployeeProvinceModel = new EmployeeProvinceModel();
  170. $EmployeeZoningModel = new EmployeeZoningModel();
  171. $insert_data = [
  172. 'name' => $data['name'],
  173. 'mobile' => $data['mobile'],
  174. 'email' => $data['email'],
  175. 'password' => md5($data['password']),
  176. 'role_id' => $data['role_id'],
  177. 'department_ids' => isset($data['department_ids']) ? ',' . $data['department_ids'] . ',' : '',
  178. 'open_notice' => $data['open_notice'],
  179. 'duty_type' => isset($data['duty_type']) ? $data['duty_type'] : '',
  180. 'company_id' => $data['company_id'],
  181. 'insert_time' => time(),
  182. ];
  183. $Employee_id = $this->insertGetId($insert_data);
  184. if ($Employee_id) {
  185. $this->where('id', $Employee_id)->update(['employee_code' => $this->employee_id_rule($data['company_id'],$Employee_id)]);
  186. }
  187. //处理省份城市大区信息
  188. if (isset($data['area_data'])) {
  189. $area_data = $data['area_data'];
  190. foreach ($area_data as $zoning_key => $zoning_data) {
  191. $insert_zoning_data = [
  192. 'company_id' => $data['company_id'],
  193. 'employee_id' => $Employee_id,
  194. 'zoning_name' => $zoning_data['zoning_name'],
  195. 'is_province_all' => $zoning_data['is_province_all'],
  196. 'zoning_id' => $zoning_data['zoning_id'],
  197. ];
  198. $EmployeeZoningModel->insert($insert_zoning_data);
  199. $province_data_list = $zoning_data['province_data'];
  200. foreach ($province_data_list as $province_key => $province_data) {
  201. $insert_province_data = [
  202. 'company_id' => $data['company_id'],
  203. 'employee_id' => $Employee_id,
  204. 'zoning_id' => $zoning_data['zoning_id'],
  205. 'province_id' => $province_data['province_id'],
  206. 'province_name' => $province_data['province_name'],
  207. 'is_city_all' => $province_data['is_city_all'],
  208. ];
  209. $EmployeeProvinceModel->insert($insert_province_data);
  210. $city_ids = $province_data['city_ids'];
  211. foreach ($city_ids as $city_key => $city_info) {
  212. $insert_city_data = [
  213. 'company_id' => $data['company_id'],
  214. 'employee_id' => $Employee_id,
  215. 'province_id' => $province_data['province_id'],
  216. 'city_id' => $city_info['id'],
  217. 'city_name' => $city_info['name']
  218. ];
  219. $EmployeeAreaModel->insert($insert_city_data);
  220. }
  221. }
  222. }
  223. }
  224. if ($data['department_ids']) {
  225. $insert_department_data = [];
  226. $department_ids = explode(',', $data['department_ids']);
  227. foreach ($department_ids as $department_id) {
  228. $insert_department_data[] = [
  229. 'employee_id' => $Employee_id,
  230. 'department_id' => $department_id,
  231. 'company_id' => $data['company_id'],
  232. ];
  233. }
  234. $EmployeeDepartmentModel->insert($insert_department_data);
  235. }
  236. if ($data['platform_ids']) {
  237. $insert_department_data = [];
  238. $platform_ids = explode(',', $data['platform_ids']);
  239. foreach ($platform_ids as $platform_id) {
  240. $insert_flatform_data[] = [
  241. 'employee_id' => $Employee_id,
  242. 'platform_id' => $platform_id,
  243. 'company_id' => $data['company_id'],
  244. ];
  245. }
  246. $EmployeePlatformModel->insert($insert_flatform_data);
  247. }
  248. DB::commit();
  249. return true;
  250. // 成功处理...
  251. } catch (\Exception $e) {
  252. DB::rollBack();
  253. // 错误处理...
  254. return false;
  255. }
  256. }
  257. /**
  258. * 编辑内容
  259. * @author 唐远望
  260. * @version 1.0
  261. * @date 2025-12-04
  262. * @param $data
  263. * @return bool
  264. */
  265. public function editEmployee_content($where, $data)
  266. {
  267. $Employee = $this->where($where)->first();
  268. if (!$Employee) {
  269. return false;
  270. }
  271. $Employee->name = $data['name'];
  272. $Employee->mobile = $data['mobile'];
  273. $Employee->email = $data['email'];
  274. if (isset($data['password']) && $data['password'] != '') $Employee->password = md5($data['password']);
  275. $Employee->role_id = $data['role_id'];
  276. $Employee->department_ids = isset($data['department_ids']) ? ',' . $data['department_ids'] . ',' : '';
  277. $Employee->open_notice = $data['open_notice'];
  278. $Employee->duty_type = isset($data['duty_type']) ? $data['duty_type'] : '';
  279. $Employee->company_id = $data['company_id'];
  280. $Employee->update_time = time();
  281. $Employee->save();
  282. return true;
  283. }
  284. /**
  285. * 更新数据
  286. * @author 唐远望
  287. * @version 1.0
  288. * @date 2025-12-04
  289. * @param $data
  290. * @return bool
  291. */
  292. public function updateEmployee($Employee, $data)
  293. {
  294. DB::beginTransaction();
  295. try {
  296. $EmployeeAreaModel = new EmployeeAreaModel();
  297. $EmployeeDepartmentModel = new EmployeeDepartmentModel();
  298. $EmployeePlatformModel = new EmployeePlatformModel();
  299. $EmployeeProvinceModel = new EmployeeProvinceModel();
  300. $EmployeeZoningModel = new EmployeeZoningModel();
  301. $Employee->name = $data['name'];
  302. $Employee->mobile = $data['mobile'];
  303. $Employee->email = $data['email'];
  304. if (isset($data['password']) && $data['password'] != '') $Employee->password = md5($data['password']);
  305. $Employee->role_id = $data['role_id'];
  306. $Employee->department_ids = isset($data['department_ids']) ? ',' . $data['department_ids'] . ',' : '';
  307. $Employee->open_notice = $data['open_notice'];
  308. $Employee->duty_type = isset($data['duty_type']) ? $data['duty_type'] : '';
  309. $Employee->company_id = $data['company_id'];
  310. $Employee->update_time = time();
  311. $Employee->save();
  312. $EmployeeAreaModel->where('employee_id', $Employee->id)->delete();
  313. $EmployeeProvinceModel->where('employee_id', $Employee->id)->delete();
  314. $EmployeeZoningModel->where('employee_id', $Employee->id)->delete();
  315. //处理省份城市大区信息
  316. if (isset($data['area_data'])) {
  317. $area_data = $data['area_data'];
  318. foreach ($area_data as $zoning_key => $zoning_data) {
  319. $insert_zoning_data = [
  320. 'company_id' => $data['company_id'],
  321. 'employee_id' => $Employee->id,
  322. 'zoning_name' => $zoning_data['zoning_name'],
  323. 'is_province_all' => $zoning_data['is_province_all'],
  324. 'zoning_id' => $zoning_data['zoning_id'],
  325. ];
  326. $EmployeeZoningModel->insert($insert_zoning_data);
  327. $province_data_list = $zoning_data['province_data'];
  328. foreach ($province_data_list as $province_key => $province_data) {
  329. $insert_province_data = [
  330. 'company_id' => $data['company_id'],
  331. 'employee_id' => $Employee->id,
  332. 'zoning_id' => $zoning_data['zoning_id'],
  333. 'province_id' => $province_data['province_id'],
  334. 'province_name' => $province_data['province_name'],
  335. 'is_city_all' => $province_data['is_city_all'],
  336. ];
  337. $EmployeeProvinceModel->insert($insert_province_data);
  338. $city_ids = $province_data['city_ids'];
  339. foreach ($city_ids as $city_key => $city_info) {
  340. $insert_city_data = [
  341. 'company_id' => $data['company_id'],
  342. 'employee_id' => $Employee->id,
  343. 'province_id' => $province_data['province_id'],
  344. 'city_id' => $city_info['id'],
  345. 'city_name' => $city_info['name']
  346. ];
  347. $EmployeeAreaModel->insert($insert_city_data);
  348. }
  349. }
  350. }
  351. }
  352. $EmployeeDepartmentModel->where('employee_id', $Employee->id)->delete();
  353. if ($data['department_ids']) {
  354. $insert_department_data = [];
  355. $department_ids = explode(',', $data['department_ids']);
  356. foreach ($department_ids as $department_id) {
  357. $insert_department_data[] = [
  358. 'employee_id' => $Employee->id,
  359. 'department_id' => $department_id,
  360. 'company_id' => $data['company_id'],
  361. ];
  362. }
  363. $EmployeeDepartmentModel->insert($insert_department_data);
  364. }
  365. $EmployeePlatformModel->where('employee_id', $Employee->id)->delete();
  366. if ($data['platform_ids']) {
  367. $insert_department_data = [];
  368. $platform_ids = explode(',', $data['platform_ids']);
  369. foreach ($platform_ids as $platform_id) {
  370. $insert_flatform_data[] = [
  371. 'employee_id' => $Employee->id,
  372. 'platform_id' => $platform_id,
  373. 'company_id' => $data['company_id'],
  374. ];
  375. }
  376. $EmployeePlatformModel->insert($insert_flatform_data);
  377. }
  378. DB::commit();
  379. return true;
  380. // 成功处理...
  381. } catch (\Exception $e) {
  382. DB::rollBack();
  383. // 错误处理...
  384. return false;
  385. }
  386. }
  387. /**
  388. * 修改状态
  389. * @author 唐远望
  390. * @version 1.0
  391. * @date 2025-12-04
  392. * @param $id
  393. * @param $status
  394. * @return bool
  395. */
  396. public function changeStatus($where, $status)
  397. {
  398. $Employee = $this->where($where)->first();
  399. if (!$Employee) {
  400. return false;
  401. }
  402. $Employee->status = $status;
  403. $Employee->update_time = time();
  404. $Employee->save();
  405. return true;
  406. }
  407. /**
  408. * 删除数据
  409. * @author 唐远望
  410. * @version 1.0
  411. * @date 2025-12-04
  412. * @param $id
  413. * @return bool
  414. */
  415. public function deleteEmployee($where)
  416. {
  417. $Employee = $this->where($where)->first();
  418. if (!$Employee) {
  419. return false;
  420. }
  421. $Employee->delete();
  422. return true;
  423. }
  424. /**
  425. * 添加数据
  426. *
  427. */
  428. public function edit($id,$data)
  429. {
  430. // 更新时间
  431. $data['update_time'] = time();
  432. // 写入数据表
  433. $result = $this->query()->where(['id'=>$id])->update($data);
  434. // 如果操作失败
  435. if( !$result ) return 0;
  436. // 更新缓存
  437. $this->getList(true);
  438. // 返回结果
  439. return $id;
  440. }
  441. /**
  442. * 获取列表
  443. * @param Bool $force 是否强制更新
  444. *
  445. */
  446. public function getList($force = false)
  447. {
  448. // 结果数据
  449. $list = $force ? [] : cache('manager:admin:employee:list');
  450. // 不存在数据
  451. if ( !$list ) {
  452. // 从数据库获取数据
  453. $data = $this->query()->get(['id','name','mobile','status','password','status','insert_time','update_time'])->toArray();
  454. // 循环处理数据
  455. $list = [];
  456. // 进行更新
  457. foreach ($data as $value) {
  458. // 重组数据
  459. $list[$value['id']] = $value;
  460. }
  461. // 存起来
  462. cache(['manager:admin:employee:list'=>$list]);
  463. }
  464. // 返回结果
  465. return $list;
  466. }
  467. /**
  468. * 获取配置平台对应的应用数据
  469. *
  470. * @param int 用户ID
  471. * @param string 指定字段
  472. *
  473. */
  474. public function getOne($id,$field='')
  475. {
  476. // 获取列表数据
  477. $list = $this->getList();
  478. // 获取数据
  479. $one = isset($list[$id]) ? $list[$id] : [];
  480. // 返回值
  481. return empty($field) ? $one : ( isset($one[$field]) ? $one[$field] : null);
  482. }
  483. /**
  484. * 登录
  485. *
  486. * @param int 用户ID
  487. *
  488. */
  489. public function Login($uid,$company_id=0, $module = 'manager')
  490. {
  491. // 组合数据
  492. $jwtData = ['company_id'=>$company_id, 'uid' => $uid, 'is_admin' => '0', 'type' => $module, 'expire' => time() + 3600 * 8];
  493. // 登录成功
  494. $token = AccessToken::encode($jwtData);
  495. // 如果异常的话
  496. if (isset($token['error'])) return $token;
  497. // 登录成功
  498. cache([$module . ':employee:access_token:' . $uid => md5($token)], 3600 * 8);
  499. // 返回结果
  500. return ['access_token_' . $module => $token, 'expire' => 3600 * 8];
  501. }
  502. /**
  503. * 退出登录
  504. *
  505. * @param int 用户ID
  506. *
  507. */
  508. public function LoginOut($uid, $module = 'manager')
  509. {
  510. // 删除缓存
  511. cache([$module . ':employee:access_token:' . $uid => null]);
  512. // 返回结果
  513. return true;
  514. }
  515. }