cqp 3 месяцев назад
Родитель
Сommit
c3d06cfc72

+ 209 - 0
app/Http/Controllers/Api/EmployeeController.php

@@ -0,0 +1,209 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\EmployeeService;
+use Illuminate\Http\Request;
+
+class EmployeeController extends BaseController
+{
+    public function employeeEditOther(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->employeeEditOther($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function employeeEdit(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->employeeEdit($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+    
+    public function employeeAdd(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->employeeAdd($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+    
+    public function employeeDel(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->employeeDel($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function employeeList(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->employeeList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function roleEdit(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->roleEdit($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function roleAdd(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->roleAdd($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function roleDel(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->roleDel($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function roleList(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->roleList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function roleMenu(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->roleMenu($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function roleDetail(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->roleDetail($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function departEdit(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->departEdit($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function departAdd(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->departAdd($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function departDel(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->departDel($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function departList(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->departList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+}

+ 19 - 0
app/Http/Controllers/Api/LoginController.php

@@ -0,0 +1,19 @@
+<?php
+namespace App\Http\Controllers\Api;
+
+use App\Service\LoginService;
+use Illuminate\Http\Request;
+
+class LoginController extends BaseController
+{
+    public function login(Request $request){
+        $service = new LoginService();
+        list($status,$data) = $service->login($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201, $data);
+        }
+    }
+}

+ 72 - 0
app/Http/Controllers/Api/SysMenuController.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\SysMenuService;
+use Illuminate\Http\Request;
+
+class SysMenuController extends BaseController
+{
+    public function add(Request $request)
+    {
+        $service = new SysMenuService();
+        $user = $request->userData;
+        list($status,$data) = $service->add($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function edit(Request $request)
+    {
+        $service = new SysMenuService();
+        $user = $request->userData;
+        list($status,$data) = $service->edit($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function del(Request $request)
+    {
+        $service = new SysMenuService();
+        $user = $request->userData;
+        list($status,$data) = $service->del($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function menuList(Request $request)
+    {
+        $service = new SysMenuService();
+        $user = $request->userData;
+        list($status,$data) = $service->menuList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function menuMove(Request $request){
+        $service = new SysMenuService();
+        list($status,$data) = $service->menuMove($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 0 - 34
app/Http/Controllers/Api/TestController.php

@@ -8,38 +8,4 @@ use Illuminate\Support\Str;
 
 class TestController extends BaseController
 {
-    public function getSignatures(Request $request)
-    {
-        $data = $request->all();
-        $url  = $data['url'];
-        if(empty($url)) return $this->json_return(201, 'URL不能为空');
-        $nonceStr = Str::random();
-        $timestamp = time();
-
-        // 1. 企业级签名 (wx.config)
-        $wechat = new qyWechatService();
-        list($status, $ticket) = $wechat->getJsApiTicket();
-        if(! $status) {
-            return $this->json_return(201, $ticket);
-        }
-        $configSignature = $wechat->makeSignature($ticket, $nonceStr, $timestamp, $url);
-
-        // 2. 应用级签名 (wx.agentConfig)
-        list($status, $agentTicket) = $wechat->getAgentTicket();
-        if(! $status) {
-            return $this->json_return(201, $agentTicket);
-        }
-        $agentSignature = $wechat->makeSignature($agentTicket, $nonceStr, $timestamp, $url);
-
-        $return = [
-            'corpid'    => $wechat->corpId,
-            'agentid'   => $wechat->agentId,
-            'timestamp' => $timestamp,
-            'nonceStr'  => $nonceStr,
-            'configSignature' => $configSignature,
-            'agentSignature'  => $agentSignature,
-        ];
-
-        return $this->json_return(200,'',$return);
-    }
 }

+ 0 - 93
app/Http/Controllers/WeixinController.php

@@ -1,93 +0,0 @@
-<?php
-
-namespace App\Http\Controllers\Api;
-
-use App\Service\Weixin\WeixinService;
-use App\Service\Weixin\WxEmployeeService;
-use Illuminate\Http\Request;
-
-class WeixinController extends BaseController
-{
-    //开发者密码:
-    /**
-     * 用于微信token验证,全部通用,前提token都为qingyao
-     * @param Request $request
-     * @return void
-     */
-    public function weixin(Request $request)
-    {
-        file_put_contents('1.txt',json_encode($request->all()));
-
-        $data = $request->all();
-        $signature = $data["signature"];
-        $timestamp = $data["timestamp"];
-        $nonce = $data["nonce"];
-
-        $token = 'qingyao';
-        $tmpArr = array($token, $timestamp, $nonce);
-        sort($tmpArr, SORT_STRING);
-        $tmpStr = implode( $tmpArr );
-        $tmpStr = sha1( $tmpStr );
-
-        if( $tmpStr == $signature ){
-            echo $data['echostr'];die;
-        }else{
-            die('fail');
-        }
-    }
-
-    public function setWebHook(Request $request){
-        $service = new WeixinService();
-        list($status,$msg) = $service->setWebHook($request->all());
-        return $this->json_return($status,$msg,'');
-    }
-
-    /**
-     * 重定向获取unionid
-     * @param Request $request
-     * @return void
-     */
-    public function getUnionid(Request $request){
-        $service = new WeixinService();
-        $res = $service->getUnionid($request->all());
-    }
-
-    /**
-     * 获取openid
-     * @param Request $request
-     * @return void
-     */
-    public function getOpenid(Request $request){
-        $service = new WeixinService();
-        list($status,$data) = $service->getOpenid($request->all());
-        if ($status) {
-            return $this->json_return(200, '', $data);
-        } else {
-            return $this->json_return(201, $data);
-        }
-    }
-
-    public function setUser(Request $request)
-    {
-        $service = new WxEmployeeService();
-        list($status, $data) = $service->setUser($request->all());
-
-        if ($status) {
-            return $this->json_return(200, '', $data);
-        } else {
-            return $this->json_return(201, $data);
-        }
-    }
-
-    public function login(Request $request)
-    {
-        $service = new WxEmployeeService();
-        list($status, $data) = $service->login($request->all(),$request->header('ciphertext'));
-
-        if ($status) {
-            return $this->json_return(200, '', $data);
-        } else {
-            return $this->json_return(201, $data);
-        }
-    }
-}

+ 1 - 0
app/Http/Kernel.php

@@ -63,6 +63,7 @@ class Kernel extends HttpKernel
         'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
         'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
         'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+        'checkLogin' => \App\Http\Middleware\CheckLogin::class,
     ];
 
     /**

+ 46 - 0
app/Http/Middleware/CheckLogin.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Service\LoginService;
+use Closure;
+use App\Service\TokenService;
+
+class CheckLogin
+{
+    public function handle($request, Closure $next)
+    {
+        $token = $request->header('Authorization');
+        if (empty($token)) return response()->json(['code' => 1,'msg' => '缺少登录凭证','data' => null]);
+
+        //校验token
+        list($bool, $return) = TokenService::verifyToken($token);
+        if(! $bool) return response()->json(['code' => 1,'msg' => $return,'data' => null]);
+
+        //人员在jwt里的信息
+        $e_array = $return;
+
+        //校验人员
+        $checkResult = LoginService::checkUser($e_array);
+        list($state, $msg) = $checkResult;
+        if(! $state) return response()->json(['code' => 1,'msg' => $msg,'data' => null]);
+        $employee = $msg;
+
+        //人员id
+        $employee_id = $employee['id'];
+        //人员公司部门
+        $employee = array_merge($employee, LoginService::getPersonDepart($employee_id));
+        list($state, $msg) = LoginService::checkCompany($employee);
+        if(! $state) return response()->json(['code' => 1,'msg' => $msg,'data' => null]);
+        //人员角色 菜单权限
+        $employee = array_merge($employee, LoginService::getPersonRoleAndPermissions($employee));
+
+        //校验是否有路由权限
+//        list($state, $msg) = LoginService::checkRoute($employee,$request);
+//        if(! $state) return response()->json(['code' => 201,'msg' => $msg,'data' => null]);
+
+        $request->userData = $employee;
+
+        return $next($request);
+    }
+}

+ 0 - 7
app/Http/Middleware/RequestLog.php

@@ -7,13 +7,6 @@ use Illuminate\Support\Facades\Log;
 
 class RequestLog
 {
-    /**
-     * Handle an incoming request.
-     *
-     * @param  \Illuminate\Http\Request  $request
-     * @param  \Closure  $next
-     * @return mixed
-     */
     public function handle($request, Closure $next)
     {
         if (getenv('HTTP_CLIENT_IP')) {

+ 80 - 0
app/Model/DataScopeBaseModel.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DataScopeBaseModel extends Model
+{
+    //人员id字段
+    const employee_column = '';
+
+    public function __construct(array $attributes = [])
+    {
+        parent::__construct($attributes);
+    }
+
+    //根据公司过滤
+    public function scopeTopClear($query, $user, $search)
+    {
+        $query->where('top_depart_id', $user['top_depart_id']);
+
+        return $query;
+    }
+
+    //数据权限中  人员 部门 所有 (在公司的基础上)
+    public function scopeClear($query, $user, $search)
+    {
+        //权限范围内的部门
+        $depart_range = $user['depart_id'] ?? [];
+        //个人 部门 所有
+        $auth_type = $this->getQx($search,$user);
+        // 获取模型的实例
+        $model = $query->getModel();
+        // 获取模型类名
+        $className = get_class($model);
+        // 人员字段
+        $column = defined($className . '::employee_column') ? constant($className . '::employee_column') : '';
+
+        $this->makeModel($query, $auth_type, $user, $depart_range,$column);
+    }
+
+    //最高权限
+    private function makeModel(&$query, $auth_type, $user, $depart_range, $column){
+        if(empty($column)) return;
+
+        if($auth_type == Employee::AUTH_ONE){
+            //我创建的
+            $query->where($column,$user['id']);
+        }elseif ($auth_type == Employee::AUTH_TWO){
+            if (empty($depart_range)) {
+                $query->whereRaw('1 = 0');
+            } else {
+                $query->whereExists(function ($q) use ($column, $depart_range) {
+                    $q->from('employee_depart_permission')
+                        ->whereColumn('employee_depart_permission.employee_id', $column)
+                        ->whereIn('employee_depart_permission.depart_id', $depart_range);
+                });
+            }
+        }elseif ($auth_type == Employee::AUTH_THREE){
+            //所有
+        }
+    }
+
+    public function getQx($data, $user){
+        if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的
+        if($user['top_depart_id'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部
+        if(! empty($user['menu_permissions'][$data['menu_id']])) {
+            //指定菜单 显示对应权限
+            return $user['menu_permissions'][$data['menu_id']];
+        }else{
+            return Employee::AUTH_ONE; // 我的
+        }
+    }
+
+    function hasMethod($class, $methodName)
+    {
+        $reflection = new \ReflectionClass($class);
+        return $reflection->hasMethod($methodName);
+    }
+}

+ 21 - 0
app/Model/Depart.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 部门管理
+ * Class Unit
+ * @package App\Models
+ */
+class Depart extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "depart"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const IS_UES = 1;//启用
+
+}

+ 29 - 0
app/Model/Employee.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Employee extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "employee"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const SPECIAL_ADMIN = 1;
+    const USE = 1;
+    const NOT_USE = 2;
+    const IS_ADMIN_ZERO = 0;
+    const IS_ADMIN_ONE = 1;
+    const IS_ADMIN_TWO = 2;
+    const IS_ADMIN_TITLE = [
+        self::IS_ADMIN_ZERO => '普通账号(限制后台登录)',
+        self::IS_ADMIN_ONE => '后台用户',
+        self::IS_ADMIN_TWO => '管理员',
+    ];
+
+    const AUTH_ONE = 1; // 我的
+    const AUTH_TWO = 2; // 部门
+    const AUTH_THREE = 3; // 全部
+}

+ 15 - 0
app/Model/EmployeeDepartPermission.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class EmployeeDepartPermission extends Model
+{
+    protected $guarded = [];
+    protected $table = "employee_depart_permission"; //指定表
+    const CREATED_AT = null;
+    const UPDATED_AT = null;
+    protected $dateFormat = 'U';
+
+}

+ 15 - 0
app/Model/EmployeeRole.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class EmployeeRole extends Model
+{
+    protected $guarded = [];
+    protected $table = "employee_role"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 18 - 0
app/Model/Role.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 角色管理
+ * Class Unit
+ * @package App\Models
+ */
+class Role extends DataScopeBaseModel
+{
+    protected $table = "role"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+}

+ 22 - 0
app/Model/RoleMenu.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class RoleMenu extends Model
+{
+    protected $table = "role_menu"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+    const type_one = 1;//个人
+    const type_two = 2;//部门
+    const type_three = 3;//所有
+    public static $type_name = [
+        self::type_one => '我创建的',
+        self::type_two => '我的部门权限范围内',
+        self::type_three => '所有',
+    ];
+}

+ 15 - 0
app/Model/RoleMenuButton.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class RoleMenuButton extends Model
+{
+    protected $table = "role_menu_button"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+    const special_one = -1;
+}

+ 15 - 0
app/Model/SysMenu.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SysMenu extends Model
+{
+    protected $guarded = [];
+    protected $table = "sys_menu"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 18 - 0
app/Model/SysMenuButton.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 菜单按钮
+ * Class Unit
+ * @package App\Models
+ */
+class SysMenuButton extends Model
+{
+    protected $table = "sys_menu_button"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+}

+ 616 - 0
app/Service/EmployeeService.php

@@ -0,0 +1,616 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Depart;
+use App\Model\Employee;
+use App\Model\EmployeeDepartPermission;
+use App\Model\EmployeeRole;
+use App\Model\Role;
+use App\Model\RoleMenu;
+use App\Model\RoleMenuButton;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Hash;
+use Mockery\Exception;
+
+class EmployeeService extends Service
+{
+    public function employeeEditOther($data,$user){
+        list($status,$msg) = $this->employeeOtherRule($data,$user);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+            $model = new Employee();
+            $model = $model->where('id',$user['id'])->first();
+            $model->password = Hash::make($data['new_password']);
+            $model->save();
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false, $exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function employeeOtherRule($data,$user){
+        if(! isset($data['old_password'])) return [false,'请输入原密码'];
+        if($data['old_password'] == "") return [false,'原密码不能为空'];
+        if(! isset($data['new_password'])) return [false,'请输入新密码'];
+        if($data['new_password'] == "") return [false,'新密码不能为空'];
+        if(! isset($data['re_password'])) return [false,'请输入确认密码'];
+        if($data['re_password'] == "") return [false,'确认密码不能为空'];
+        if(! Hash::check($data['old_password'], $user['password'])) return [false,'原密码错误'];
+        if($data['new_password'] == $data['old_password']) return [false,'原密码与新密码一致'];
+        if($data['new_password'] !== $data['re_password']) return [false,'新密码与确认密码不一致'];
+
+        return [true,''];
+    }
+
+    public function employeeEdit($data,$user){
+        list($status,$msg) = $this->employeeRule($data,$user,false);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+            $model = new Employee();
+            $model = $model->where('id',$data['id'])->first();
+            $model->number = $data['number'];
+            $model->title = $data['title'];
+            $model->mobile = $data['mobile'] ?? '';
+            $model->is_admin = $data['is_admin'];
+            if($model->is_admin && $data['password'] !== '******') $model->password = Hash::make($data['password']);
+            $model->save();
+
+            EmployeeDepartPermission::where('employee_id',$data['id'])->delete();
+            if(isset($data['depart'])){
+                $insert = [];
+                foreach ($data['depart'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'depart_id' => $value,
+                    ];
+                }
+                EmployeeDepartPermission::insert($insert);
+            }
+
+            EmployeeRole::where('employee_id',$data['id'])->update([
+                'del_time' => time()
+            ]);
+            if(isset($data['role'])){
+                $insert = [];
+                foreach ($data['role'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'role_id' => $value,
+                        'crt_time' => time(),
+                        'upd_time' => time(),
+                    ];
+                }
+                EmployeeRole::insert($insert);
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false, $exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function employeeAdd($data,$user){
+        list($status,$msg) = $this->employeeRule($data, $user);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $model = new Employee();
+
+            $model->number = $data['number'];
+            $model->title = $data['title'];
+            $model->mobile = $data['mobile'] ?? '';
+            $model->crt_id = $user['id'];
+            $model->is_admin = $data['is_admin'];
+            $model->account = $data['account'] ?? "";
+            if($model->is_admin && $data['password']) $model->password = Hash::make($data['password']);
+            $model->top_depart_id = $data['top_depart_id'];
+            $model->save();
+
+            if(isset($data['depart'])){
+                $insert = [];
+                foreach ($data['depart'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'depart_id' => $value,
+                    ];
+                }
+                EmployeeDepartPermission::insert($insert);
+            }
+
+            if(isset($data['role'])){
+                $insert = [];
+                foreach ($data['role'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'role_id' => $value,
+                        'crt_time' => time(),
+                        'upd_time' => time(),
+                    ];
+                }
+                EmployeeRole::insert($insert);
+            }
+
+            DB::commit();
+        }catch (Exception $e){
+            DB::rollBack();
+            return [false, $e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function employeeDel($data){
+        if($this->isEmpty($data,'id')) return [false,'请选择删除的数据!'];
+
+        Employee::whereIn('id',$data['id'])->update([
+            'del_time'=>time()
+        ]);
+        EmployeeRole::where('del_time',0)->whereIn('employee_id',$data['id'])->update([
+            'del_time'=>time()
+        ]);
+        EmployeeDepartPermission::whereIn('employee_id',$data['id'])->delete();
+
+        return [true,'删除成功'];
+    }
+
+    public function employeeList($data,$user){
+        $model = Employee::TopClear($user,$data);
+        $model = $model->where('del_time',0)
+            ->select('number','mobile','title','id','is_admin', 'account', 'crt_time')
+            ->orderBy('id','desc');
+
+        if(! empty($data['number'])) $model->where('number', 'LIKE', '%'.$data['number'].'%');
+        if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
+        if(! empty($data['mobile'])) $model->where('mobile', 'LIKE', '%'.$data['mobile'].'%');
+        if(! empty($data['role'])) {
+            $emp = EmployeeRole::where('role_id',$data['role'])
+                ->where('del_time',0)
+                ->select('employee_id')->get()->toArray();
+            $model->whereIn('id',array_column($emp,'employee_id'));
+        }
+
+        $list = $this->limit($model,'',$data);
+
+        //组织数据
+        $list = $this->organizationEmployeeData($list);
+
+        return [true , $list];
+    }
+
+    public function organizationEmployeeData($data)
+    {
+        if (empty($data['data'])) return $data;
+
+        // 获取员工ID并查询扩展数据
+        $employee_ids = array_column($data['data'], 'id');
+        list($status, $extraMap) = $this->getEmployee($employee_ids);
+
+        foreach ($data['data'] as &$item) {
+            $id = $item['id'];
+            $extra = $extraMap[$id] ?? null;
+
+            $item['role']         = $extra['role_ids'] ?? [];
+            $item['role_name']    = isset($extra['role_names']) ? implode(',', $extra['role_names']) : '';
+            $item['depart']       = $extra['depart_ids'] ?? [];
+            $item['depart_title'] = isset($extra['depart_names']) ? implode(',', $extra['depart_names']) : '';
+
+            // 业务状态字段
+            $item['is_admin_title'] = Employee::IS_ADMIN_TITLE[$item['is_admin']] ?? "";
+            $item['crt_time']       = !empty($item['crt_time']) ? date("Y-m-d", $item['crt_time']) : "";
+        }
+
+        return $data;
+    }
+
+    public function getEmployee(array $employee_ids)
+    {
+        if (empty($employee_ids)) return [false, []];
+
+        // 1. 一次性获取所有角色
+        $roles = DB::table('employee_role as a')
+            ->join('role as b', 'a.role_id', '=', 'b.id')
+            ->where('a.del_time', 0)
+            ->where('b.del_time', 0)
+            ->whereIn("a.employee_id", $employee_ids)
+            ->select('a.employee_id', 'b.title', 'b.id')
+            ->get();
+
+        // 2. 一次性获取所有部门
+        $departs = DB::table('employee_depart_permission as a')
+            ->join('depart as b', 'a.depart_id', '=', 'b.id')
+            ->whereIn("a.employee_id", $employee_ids)
+            ->select('a.employee_id', 'b.title', 'b.id')
+            ->orderBy('b.id')
+            ->get();
+
+        // 3. 结果按员工ID分组归纳
+        $resultMap = [];
+        foreach ($employee_ids as $id) {
+            $resultMap[$id] = [
+                'role_ids' => [],
+                'role_names' => [],
+                'depart_ids' => [],
+                'depart_names' => []
+            ];
+        }
+
+        foreach ($roles as $r) {
+            $resultMap[$r->employee_id]['role_ids'][] = $r->id;
+            $resultMap[$r->employee_id]['role_names'][] = $r->title;
+        }
+
+        foreach ($departs as $d) {
+            $resultMap[$d->employee_id]['depart_ids'][] = $d->id;
+            $resultMap[$d->employee_id]['depart_names'][] = $d->title;
+        }
+
+        return [true, $resultMap];
+    }
+
+    public function employeeRule(&$data, $user,$is_add = true){
+        if(empty($data['number'])) return [false,'工号不存在'];
+        if(empty($data['title'])) return [false,'姓名不存在'];
+        if(empty($data['depart'])) return [false,'部门不能为空'];
+        if(! empty($data['is_admin']) && empty($data['password'])) return [false, '密码不能为空'];
+        $data['top_depart_id'] = $user['top_depart_id'];
+
+        $mobile = $data['mobile'] ?? "";
+        $number = $data['number'] ?? "";
+        if(! $is_add){
+            if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
+            $bool = Employee::where('del_time',0)
+                ->where('id','<>',$data['id'])
+                ->where(function ($query) use ($mobile, $number){
+                    $query->where('number', $number);
+                    $query->when(! empty($mobile), function ($query) use ($mobile) {
+                        return $query->orWhere('mobile', $mobile);
+                    });
+                })->exists();
+        }else{
+            if(! empty($data['is_admin'])){
+                $code = Depart::where('id', $user['top_depart_id'])->value('code');
+                $data['account'] = $code . "_" . $data['number'];
+            }
+            $bool = Employee::where('del_time',0)
+                ->where(function ($query) use ($mobile, $number){
+                    $query->where('number', $number);
+                    $query->when(! empty($mobile), function ($query) use ($mobile) {
+                        return $query->orWhere('mobile', $mobile);
+                    });
+                })->exists();
+        }
+        if($bool) return [false,'工号或手机号码已存在'];
+
+        return [true,''];
+    }
+
+    public function roleEdit($data,$user){
+        list($status,$msg) = $this->roleRule($data,$user, false);
+        if(!$status) return [$status,$msg];
+
+        $model = new Role();
+        $model = $model->where('id',$data['id'])->first();
+        $model->title = $data['title'];
+        $model->save();
+
+        return [true,''];
+    }
+
+    public function roleAdd($data,$user){
+        list($status,$msg) = $this->roleRule($data,$user);
+        if(!$status) return [$status,$msg];
+
+        $model = new Role();
+        $model->title = $data['title'] ;
+        $model->top_depart_id = $data['top_depart_id'];
+        $model->save();
+
+        return [true,''];
+    }
+
+    public function roleDel($data){
+        if($this->isEmpty($data,'id')) return [false,'ID必须!'];
+
+        $bool = EmployeeRole::where('del_time',0)
+            ->whereIn('role_id',$data['id'])
+            ->exists();
+        if($bool) return [false,'角色已绑定人员'];
+
+        Role::where('id',$data['id'])->update([
+            'del_time' => time()
+        ]);
+
+        RoleMenu::where('del_time',0)->where('role_id',$data['id'])->update([
+            'del_time' => time()
+        ]);
+
+        RoleMenuButton::where('del_time',0)->where('role_id',$data['id'])->update([
+            'del_time' => time()
+        ]);
+
+        return [true, ''];
+    }
+
+    public function roleList($data,$user){
+        $model = Role::TopClear($user,$data);
+        $model = $model->where('del_time',0)
+            ->select('title','crt_time','id','upd_time')
+            ->orderBy('id','desc');
+        if(! empty($data['title'])) $model->where('title', 'LIKE', '%' . $data['title'] . '%');
+
+        $list = $this->limit($model,'',$data);
+
+        return [true, $list];
+    }
+
+    public function roleRule(&$data,$user, $is_check = true){
+        if($this->isEmpty($data,'title')) return [false,'名称不能为空'];
+
+        $data['top_depart_id'] = $user['top_depart_id'];
+
+        if($is_check){
+            $bool = Role::where('title',$data['title'])
+                ->where('top_depart_id', $data['top_depart_id'])
+                ->where('del_time',0)
+                ->exists();
+            if($bool) return [false,'角色名称已存在'];
+        }else{
+            if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
+            $top_depart_id = Role::where('id',$data['id'])->value('top_depart_id');
+            $bool = Role::where('title',$data['title'])
+                ->where('top_depart_id',$top_depart_id)
+                ->where('id','<>',$data['id'])
+                ->where('del_time',0)
+                ->exists();
+            if($bool) return [false,'角色名称已存在'];
+        }
+
+        return [true, ''];
+    }
+
+    public function roleMenu($data){
+        if(empty($data['role_id']))  return [false,'角色不能为空!'];
+        if(empty($data['menu'])) return [false,'菜单数据不能为空!'];
+
+        DB::beginTransaction();
+        try {
+            RoleMenu::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
+            RoleMenuButton::where('del_time',0)->where('role_id',$data['role_id'])->update(['del_time' => time()]);
+
+            $insert = $insert2 = [];
+            foreach ($data['menu'] as $t){
+                $insert[] = [
+                    'role_id' => $data['role_id'],
+                    'menu_id' => $t['menu_id'],
+                    'type' => $t['type'],
+                    'crt_time' => time()
+                ];
+                if(! empty($t['button'])){
+                    foreach ($t['button'] as $b){
+                        $insert2[] = [
+                            'role_id' => $data['role_id'],
+                            'menu_id' => $t['menu_id'],
+                            'button_id' => $b,
+                            'crt_time' => time()
+                        ];
+                    }
+                RoleMenuButton::insert($insert2);
+                }
+            }
+            RoleMenu::insert($insert);
+
+            DB::commit();
+        }catch (\Throwable $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    public function roleDetail($data){
+        if(empty($data['role_id'])) return [false,'请选择角色'];
+
+        $role = Role::where('id',$data['role_id'])
+            ->where('del_time',0)
+            ->select('id','title')
+            ->first();
+        if(empty($role)) return [false,'角色不存在或已被删除'];
+        $role = $role->toArray();
+
+        $menu = RoleMenu::where('role_id',$data['role_id'])
+            ->where('del_time',0)
+            ->select('menu_id','type')
+            ->get()->toArray();
+        $button = $this->fillRoleButton([$data['role_id']]);
+        foreach ($menu as $key => $value){
+            $menu[$key]['button'] = $button[$value['menu_id']] ?? [];
+        }
+        $role['menu'] = $menu;
+
+        return [true, $role];
+    }
+
+    public function departEdit($data, $user){
+        list($status,$msg) = $this->departRule($data,$user,false);
+        if(!$status) return [$status,$msg];
+
+        $update = $msg['data'][0];
+        $model = new Depart();
+        $model->where('id',$data['id'])->update($update);
+
+        return [true, ''];
+    }
+
+    public function departAdd($data,$user){
+        list($status,$msg) = $this->departRule($data,$user);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            foreach ($msg['data'] as $value){
+                $model = new Depart();
+                $model->parent_id = $value['parent_id'];
+                $model->title = $value['title'];
+                $model->code = $value['code'];
+                $model->save();
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function departDel($data){
+        list($status,$msg) = $this->checkDepartDel($data);
+        if(! $status) return [false, $msg];
+
+        Depart::whereIn('id',$data['id'])->update([
+            'del_time'=>time()
+        ]);
+
+        return [true,''];
+    }
+
+    public function checkDepartDel($data){
+        if($this->isEmpty($data,'id')) return [false,'ID不能为空'];
+
+        $bool = Depart::whereIn('parent_id',$data['id'])->where('del_time',0)->exists();
+        if($bool) return [false,'部门下有子部门!'];
+
+        if($this->checkDepartHasPerson($data['id'])) return [false,'部门下有人员档案!'];
+
+        return [true, ''];
+    }
+
+    public function departList($data, $user){
+        $model = Depart::TopClear($user,$data);
+        $model = $model->where('del_time',0)
+            ->select('title','id','code','parent_id','is_use')
+            ->orderby('id', 'asc');
+
+        if(isset($data['parent_id'])) $model->where('parent_id', $data['parent_id']);
+        if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
+        if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
+
+        $list = $model->get()->toArray();
+        $list = $this->fillDepartList($list, $user);
+        $list_tree = $list;
+        if(! empty($list_tree)) {
+            $minParentId = min(array_column($list_tree, 'parent_id'));
+            $list_tree = $this->makeTree($minParentId,$list_tree);
+            $list_tree = $this->set_sort_circle($list_tree);
+        }
+
+        return [true,['data' => $list,'tree' => $list_tree]];
+    }
+
+    public function fillDepartList($list,$user){
+        if(empty($list)) return $list;
+
+//        foreach ($list as $key => $value){
+//
+//        }
+
+        return $list;
+    }
+
+    public function departRule($data,$user, $is_check = true){
+        if(empty($data['data'])) return [false,'数据不能为空!'];
+
+        $code = array_column($data['data'],'code');
+        $title = array_column($data['data'],'title');
+        $code = array_map(function($val) {
+            return $val !== null ? $val : 0;
+        }, $code);
+        $title = array_map(function($val) {
+            return $val !== null ? $val : 0;
+        }, $title);
+        $code_count = array_count_values($code);
+        $title_count = array_count_values($title);
+        foreach ($code as $value){
+            if(empty($value)) return [false,'编码不能为空!'];
+            if($code_count[$value] > 1) return [false,'编码不能重复'];
+        }
+        foreach ($title as $value){
+            if(empty($value)) return [false,'名称不能为空!'];
+            if($title_count[$value] > 1) return [false,'名称不能重复'];
+        }
+
+        foreach ($data['data'] as $key => $value){
+            $top_depart_id = $value['parent_id'];
+            if(empty($value['parent_id'])) {
+                $data['data'][$key]['parent_id'] = $user['top_depart_id'];
+                $top_depart_id = $user['top_depart_id'];
+            }
+
+            $data['data'][$key]['top_depart_id'] = $top_depart_id;
+            $data['data'][$key]['upd_time'] = time();
+
+            if($is_check){
+                $data['data'][$key]['crt_time'] = time();
+                $bool = Depart::whereRaw("binary code = '{$value['code']}'")
+                    ->where('parent_id', $top_depart_id)
+                    ->where('del_time',0)
+                    ->exists();
+            }else{
+                if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
+                $bool = Depart::whereRaw("binary code = '{$value['code']}'")
+                    ->where('parent_id', $top_depart_id)
+                    ->where('id','<>',$data['id'])
+                    ->where('del_time',0)
+                    ->exists();
+            }
+            if($bool) return [false,'部门编码不能重复'];
+        }
+
+        return [true, $data];
+    }
+
+    public function checkDepartHasPerson($depart_id = []){
+        if(empty($depart_id)) return false;
+
+        $bool = EmployeeDepartPermission::from('employee_depart_permission as a')
+            ->leftJoin('employee as b','b.id','a.employee_id')
+            ->where('b.del_time',0)
+            ->whereIn('a.depart_id',$depart_id)
+            ->exists();
+
+        return $bool;
+    }
+
+    public function fillRoleButton($role_id){
+        $button = RoleMenuButton::whereIn('role_id',$role_id)
+            ->where('del_time',0)
+            ->select('menu_id','button_id')
+            ->get()->toArray();
+        $button_map = [];
+        foreach ($button as $value){
+            if(! isset($button_map[$value['menu_id']])){
+                $button_map[$value['menu_id']][] = $value['button_id'];
+            }else{
+                if(! in_array($value['button_id'], $button_map[$value['menu_id']])) $button_map[$value['menu_id']][] = $value['button_id'];
+            }
+        }
+
+        return $button_map;
+    }
+}

+ 170 - 0
app/Service/LoginService.php

@@ -0,0 +1,170 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Depart;
+use App\Model\Employee;
+use App\Model\EmployeeDepartPermission;
+use App\Model\EmployeeRole;
+use App\Model\RoleMenu;
+use App\Model\RoleMenuButton;
+use App\Model\SysMenu;
+use Illuminate\Support\Facades\Hash;
+
+class LoginService extends Service
+{
+    public function login($data){
+        if(empty($data['account'])) return [false, '账号不能为空'];
+        if(empty($data['password'])) return [false, '密码不能为空'];
+
+        $account = $data['account'];
+        $password = $data['password'];
+        $employee = Employee::where('del_time',0)
+            ->where('account', $account)
+            ->first();
+        if(empty($employee)) return [false,'账号不存在或已被删除'];
+        $employee = $employee->toArray();
+
+        if(! Hash::check($password, $employee['password'])) return [false,'密码错误'];
+        if($employee['is_admin'] == Employee::IS_ADMIN_ZERO) return [false, '账号限制登录'];
+
+        //生成token
+        list($status, $jwtToken) = TokenService::getToken($employee);
+        if(! $status) return [false, $jwtToken];
+
+        return [true, [
+            'token' => $jwtToken,
+            'employee_id' => $employee['id'],
+            'title' => $employee['title'],
+        ]];
+    }
+
+    public static function checkUser($employee){
+        if(empty($employee['employee_id'])) return [false, 'token错误'];
+        if(! isset($employee['p_version'])) return [false, 'token错误'];
+        $result = Employee::where('id', $employee['employee_id'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($result)) return [false, '账号不存在或已被删除'];
+        $result = $result->toArray();
+        if($result['is_admin'] == Employee::IS_ADMIN_ZERO) return [false, '账号限制登录'];
+        if($result['p_version'] != $employee['p_version']) return [false, '请重新登录'];
+
+        return [true, $result];
+    }
+
+    public static function checkCompany($employee){
+        $employee_id = $employee['id'];
+//        if ($employee_id == Employee::SPECIAL_ADMIN) return [true, ''];
+        $top_depart_id = $employee['top_depart_id'];
+        if(empty($top_depart_id)) return [false, '公司信息不存在'];
+
+        return [true, ''];
+    }
+
+    public static function checkRoute($employee, $request){
+        $currentRouteName = $request->route()->getName();
+
+        //没有取别名的路由需要校验
+        if(! empty($currentRouteName)){
+            if($currentRouteName == "only.admin"){
+                return [false, '无接口'. $currentRouteName . '访问权限'];
+            }else{
+                //角色中所有的按钮
+                $role_id = $employee['role_ids'];
+                $bool = RoleMenuButton::from('role_menu_button as a')
+                    ->join('sys_menu_button as b', 'b.id', '=', 'a.button_id')
+                    ->whereIn('a.role_id', $role_id)
+                    ->where('b.func',$currentRouteName)
+                    ->where('a.del_time', 0)
+                    ->where('b.del_time', 0)
+                    ->exists();
+                if(! $bool) return [false, '无接口'. $currentRouteName . '访问权限'];
+            }
+        }
+
+        return [true, ''];
+    }
+
+    public static function getPersonDepart($employee_id) {
+        // 1. 初始化返回结构
+        $result = [
+            'top_depart_id' => 0,
+            'depart_id' => [],
+        ];
+
+        // 2. 基础校验
+        if (empty($employee_id) ) return $result;
+
+        $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
+            ->join('depart as c', 'c.id', '=', 'a.top_depart_id') // 公司必须存在
+            ->leftJoin('depart as b', 'b.id', '=', 'a.depart_id') // 部门可能为0
+            ->where('a.employee_id', $employee_id)
+            ->where('c.is_use', Depart::IS_UES) // 公司必须启用
+            ->select('a.depart_id', 'b.is_use as dept_use','a.top_depart_id')
+            ->get()->toArray();
+
+        foreach ($depart as $value){
+            if($value['depart_id'] && $value['dept_use'] && ! in_array($value['depart_id'], $result['depart_id'])) $result['depart_id'][] = $value['depart_id'];
+            if($value['top_depart_id'] && ! $result['top_depart_id']) $result['top_depart_id'] = $value['top_depart_id'];
+        }
+
+        return $result;
+    }
+
+    public static function getPersonRoleAndPermissions($employee) {
+        // 1. 初始化返回结构
+        $result = [
+            'role_ids'    => [],
+            'menu_permissions' => []
+        ];
+
+        // 2. 是管理员账户
+        if ($employee['is_admin'] == Employee::IS_ADMIN_TWO) {
+            return $result;
+        }
+
+        $role_ids = EmployeeRole::from('employee_role as a')
+            ->join('role as b', 'b.id', '=', 'a.role_id')
+            ->where('a.del_time', 0)
+            ->where('b.top_depart_id', $employee['top_depart_id'])
+            ->where('a.employee_id', $employee['id'])
+            ->pluck('a.role_id')
+            ->unique()
+            ->sort()
+            ->values()
+            ->toArray();
+
+        if (empty($role_ids)) return $result;
+        $result['role_ids'] = $role_ids;
+
+        // 4. 获取合法的系统菜单 ID (用于过滤)
+        $valid_menu_ids = SysMenu::where('del_time', 0)
+            ->where('is_authority', '>', 0)
+            ->pluck('id')
+            ->toArray();
+
+        // 5. 获取并合并菜单权限
+        $role_menus = RoleMenu::where('del_time', 0)
+            ->whereIn('role_id', $role_ids)
+            ->select('menu_id', 'type')
+            ->get();
+
+        $permissions = [];
+        foreach ($role_menus as $item) {
+            // 过滤不在系统权限菜单内的记录
+            if (!in_array($item->menu_id, $valid_menu_ids)) {
+                continue;
+            }
+
+            // 取相同 menu_id 下最大的 type
+            if (!isset($permissions[$item->menu_id]) || $permissions[$item->menu_id] < $item->type) {
+                $permissions[$item->menu_id] = $item->type;
+            }
+        }
+
+        $result['menu_permissions'] = $permissions;
+
+        return $result;
+    }
+}

+ 423 - 0
app/Service/SysMenuService.php

@@ -0,0 +1,423 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Employee;
+use App\Model\RoleMenu;
+use App\Model\RoleMenuButton;
+use App\Model\SysMenu;
+use App\Model\SysMenuButton;
+use Illuminate\Support\Facades\DB;
+
+class SysMenuService extends Service
+{
+    public function edit($data){
+        list($status,$msg) = $this->menuRule($data,false);
+        if(! $status) return [$status, $msg];
+
+        $del_button_id = $msg;
+
+        DB::beginTransaction();
+        try{
+            $model = SysMenu::where('id',$data['id'])->first();
+            $model->title = $data['title'];
+            $model->icon = $data['icon'] ??  '';
+            $model->uri = $data['uri'];
+            $model->parent_id = $data['parent_id'];
+            $model->sort = $data['sort'] ?? 0;
+            $model->save();
+
+            $time = time();
+
+            //按钮
+            $this->saveDetail($model->id, time(), $data);
+
+            if(! empty($del_button_id)){
+                SysMenuButton::where('del_time',0)
+                    ->whereIn('id',$del_button_id)
+                    ->update(['del_time' => $time]);
+                RoleMenuButton::where('del_time',0)
+                    ->whereIn('button_id', $del_button_id)
+                    ->update(['del_time' => $time]);
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function add($data,$user){
+        list($status,$msg) = $this->menuRule($data);
+        if(! $status) return [$status,$msg];
+
+        DB::beginTransaction();
+        try{
+            $model = new SysMenu();
+            $sort = $model->where('parent_id',$data['parent_id'])->max('sort');
+            $model->title = $data['title'];
+            $model->icon = $data['icon'] ??  '';
+            $model->uri = $data['uri'];
+            $model->parent_id = $data['parent_id'];
+            $model->sort = $sort ? $sort + 1 : 1;
+            $model->crt_id = $user['id'];
+            $model->save();
+
+            //按钮
+            $this->saveDetail($model->id, time(), $data);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    private function saveDetail($id, $time, $data){
+        if (! empty($data['button'])) {
+            $toUpdate = [];
+            $toInsert = [];
+
+            foreach ($data['button'] as $key => $value) {
+                $row = [
+                    'menu_id'  => $id,
+                    'title'    => $value['title'],
+                    'sort'     => $key,
+                    'func'     => $value['func'],
+                ];
+
+                if (!empty($value['id'])) {
+                    $row['id'] = $value['id'];
+                    $toUpdate[] = $row;
+                } else {
+                    $row['crt_time'] = $time;
+                    $toInsert[] = $row;
+                }
+            }
+
+            // 1. 批量插入
+            if (! empty($toInsert)) SysMenuButton::insert($toInsert);
+
+            // 2. 批量更新
+            if(! empty($toUpdate)){
+                foreach ($toUpdate as $updateRow) {
+                    $id = $updateRow['id'];
+                    unset($updateRow['id']);
+                    SysMenuButton::where('id', $id)->update($updateRow);
+                }
+            }
+        }
+    }
+
+    public function del($data){
+        if($this->isEmpty($data,'id')) return [false,'菜单ID不能为空'];
+
+        DB::beginTransaction();
+        try {
+            $time = time();
+
+            SysMenu::where('id',$data['id'])->update([
+                'del_time' => $time
+            ]);
+            SysMenuButton::where('del_time',0)->where('menu_id',$data['id'])->update([
+                'del_time' => $time
+            ]);
+            RoleMenu::where('del_time',0)->where('menu_id',$data['id'])->update([
+                'del_time' => $time
+            ]);
+            RoleMenuButton::where('del_time',0)->where('menu_id',$data['id'])->update([
+                'del_time' => $time
+            ]);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function menuList($data, $user){
+        $return = [];
+        $type = $data['type'] ?? "";
+
+        $sysList = SysMenu::where('del_time',0)
+            ->select('title','icon','uri','parent_id','sort','id','is_authority', 'state')
+            ->orderBy('sort','desc')
+            ->get()
+            ->toArray();
+        $button = SysMenuButton::where('del_time',0)
+            ->select('id','title','sort','func','menu_id')
+            ->get()->toArray();
+
+        if(empty($type)){
+            $return = $this->fillMenuButton($button,$sysList, $user);
+        }elseif($type == "all"){
+            $return_one = $this->fillMenuButton($button, $sysList, $user);
+            $return_two = $this->returnTwo($sysList, $user);
+            $return_three = $this->fillMenuButton($button, $sysList, $user,2);
+
+            $return = [
+                'one' => $return_one,
+                'two' => $return_two,
+                'three' => $return_three,
+            ];
+        }
+
+        return [true, $return];
+    }
+
+    public function menuRule($data, $is_check = true){
+        if($this->isEmpty($data,'title')) return [false,'名称不能为空!'];
+        if($this->isEmpty($data,'parent_id')) return [false,'父级不存在!'];
+
+        //菜单
+        if($is_check){
+            $bool = SysMenu::where('title',$data['title'])
+                ->where('del_time',0)
+                ->exists();
+        }else{
+            if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
+            $bool = SysMenu::where('title',$data['title'])
+                ->where('id','<>',$data['id'])
+                ->where('del_time',0)
+                ->exists();
+            $menu_button = SysMenuButton::where('del_time',0)
+                ->where('menu_id',$data['id'])
+                ->pluck('id')->all();
+        }
+        if($bool) return [false,'菜单名称已经存在'];
+
+        //按钮
+        if(! empty($data['button'])){
+            $title = array_column($data['button'],'title');
+            $title = array_map(function($val) {
+                return $val !== null ? $val : "";
+            }, $title);
+            $title_count = array_count_values($title);
+            foreach ($title as $value){
+                if(empty($value)) return [false,'按钮名称不能为空!'];
+                if($title_count[$value] > 1) return [false,'按钮名称不能重复'];
+            }
+        }
+        $del = [];
+        if(! empty($menu_button)){
+            $submit = array_column($data['button'],'id');
+            foreach ($menu_button as $value){
+                if(! in_array($value, $submit)) $del[] = $value;
+            }
+        }
+
+        return [true, $del];
+    }
+
+    public function menuMove($data){
+        if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
+        if($this->isEmpty($data,'move')) return [false,'移动不能能为空!'];
+
+        //移动项
+        $model = new SysMenu();
+        $res = $model->where('id', $data['id'])->first();
+
+        if($data['move'] == 1 || $data['move'] == -1){
+            //替项目
+            $moveModel = $model->where('del_time',0)->where('parent_id',$res->parent_id);
+
+            //下移-1 上移1
+            $data['move'] == 1 ? $moveModel->orderby('sort','desc')->where('sort','<', $res['sort']) : $moveModel->orderby('sort','asc')->where('sort','>', $res['sort']);
+
+            $moveRes = $moveModel->first();
+            if(! $moveRes) return [false, '移动失败'];
+
+            $weightOne = $res->sort;
+            $weightTwo = $moveRes->sort;
+
+            $res->sort = $weightTwo;
+            $res->save();
+            $moveRes->sort = $weightOne;
+            $moveRes->save();
+        }elseif($data['move'] == 'top' || $data['move'] == 'bottom'){
+            if($data['move'] == 'top'){
+                $sort = $model->where('del_time',0)->where('parent_id',$res->parent_id)->max('sort');
+                if($sort == $res->sort) return [false,'已经置顶,移动失败!'];
+                $res->sort = $sort + 1;
+            }elseif($data['move'] == 'bottom'){
+                $sort = $model->where('del_time',0)->where('parent_id',$res->parent_id)->min('sort');
+                if($sort == $res->sort) return [false,'已经置底部,移动失败!'];
+                $res->sort = $sort - 1;
+            }
+            $res->save();
+        }else{
+            return [false, '异常参数'];
+        }
+
+        return [true,''];
+    }
+
+    public function fillMenuButton($button, $menu, $user, $type = 1)
+    {
+        // 1. 预处理所有按钮池(合并配置中的特殊按钮)
+        $allButtons = collect($button)->concat(config('specialButton') ?? [])->groupBy('menu_id');
+
+        // 2. 获取权限基础数据(如果是超管,这两个值为空,逻辑依然兼容)
+        $isSuper = ($user['is_admin'] == Employee::IS_ADMIN_TWO);
+        $roleButtons = $isSuper ? [] : (new EmployeeService())->fillRoleButton($user['role_ids'] ?? []);
+        $allowedMenuIds = $isSuper ? [] : $this->getMenuIDByRoleInList($user);
+
+        $result = [];
+
+        foreach ($menu as $m) {
+            $menuId = $m['id'];
+
+            // 权限过滤:非超管且不在权限内,跳过
+            if (!$isSuper && !in_array($menuId, $allowedMenuIds)) continue;
+
+            // 计算当前菜单拥有的按钮
+            if ($isSuper) {
+                $btns = $allButtons->get($menuId) ?? [];
+            } else {
+                // 取交集:只返回该角色拥有的按钮数据
+                $myBtnIds = $roleButtons[$menuId] ?? [];
+                $btnPool = collect($allButtons->get($menuId))->keyBy('id');
+                $btns = collect($myBtnIds)->map(fn($id) => $btnPool->get($id))->filter()->values();
+            }
+
+            // 3. 根据 type 返回不同的数据结构
+            if ($type == 1) {
+                // 完整模式:保留原菜单所有字段
+                $m['button'] = $btns;
+                $result[] = $m;
+            } else {
+                // 精简模式:只给前端路由用的字段
+                $result[] = [
+                    'id'     => $menuId,
+                    'uri'    => $m['uri'] ?? '',
+                    'button' => $btns,
+                ];
+            }
+        }
+
+        return $result;
+    }
+
+    public function fillMenuButton1($button, $menu, $user, $type = 1){
+        $button_map = [];
+        $special_button = config('specialButton') ?? [];
+        foreach ($special_button as $value){
+            $button[] = $value;
+        }
+        foreach ($button as $value){
+            $button_map[$value['menu_id']][] = $value;
+        }
+
+        if($type == 1){
+            if($user['is_admin'] == Employee::IS_ADMIN_TWO){
+                //管理员
+                foreach ($menu as $key => $value){
+                    $menu[$key]['button'] = $button_map[$value['id']] ?? [];
+                }
+                return $menu;
+            }else{
+                //人员所拥有的菜单ID
+                $menu_id = $this->getMenuIDByRoleInList($user);
+                //角色
+                $role_id = $user['role_ids'] ?? [];
+                //角色下拥有的菜单里按钮
+                $role_button = (new EmployeeService())->fillRoleButton($role_id);
+                foreach ($menu as $key => $value){
+                    $result = [];
+                    if(! in_array($value['id'], $menu_id)) {
+                        unset($menu[$key]);
+                        continue;
+                    }
+                    $bt = $role_button[$value['id']] ?? [];
+                    $button_tmp = $button_map[$value['id']] ?? [];
+                    foreach ($bt as $b){
+                        if(isset($button_tmp[$b])) $result[] = $button_tmp[$b];
+                    }
+                    $menu[$key]['button'] = $result;
+                }
+                return array_values($menu);
+            }
+        }else{
+            $object = [];
+
+            if($user['is_admin'] == Employee::IS_ADMIN_TWO){
+                //管理员
+                foreach ($menu as $value){
+                    $object[] = [
+                        'id' => $value['id'],
+                        'uri' => $value['uri'],
+                        'button' => $button_map[$value['id']] ?? [],
+                    ];
+                }
+            }else{
+                //人员所拥有的菜单数据
+                $role_menu = $this->getMenuDataByRoleInList($user);
+                if(empty($role_menu)) return $object;
+                $menu_map = array_column($menu,'uri','id');
+                //角色
+                $role_id = $user['role_ids'] ?? [];
+                //角色下拥有的菜单里按钮
+                $role_button = (new EmployeeService())->fillRoleButton($role_id);
+                foreach ($role_menu as $value){
+                    $result = [];
+                    $bt = $role_button[$value['menu_id']] ?? [];
+                    $button_tmp = $button_map[$value['menu_id']] ?? [];
+                    $button_tmp = array_column($button_tmp,null,'id');
+                    foreach ($bt as $b){
+                        if(isset($button_tmp[$b])) $result[] = $button_tmp[$b];
+                    }
+
+                    $object[] = [
+                        'id' => $value['menu_id'],
+                        'uri' => $menu_map[$value['menu_id']] ?? '',
+                        'button' => $result,
+                    ];
+                }
+            }
+
+            return $object;
+        }
+    }
+
+    private function returnTwo($sysList, $user){
+        //人员所拥有的菜单
+        $menu = $this->getMenuIDByRoleInList($user);
+
+        foreach ($sysList as $key => $value){
+            if($value['state'] <= 0) unset($sysList[$key]);
+            if($user['is_admin'] != Employee::IS_ADMIN_TWO && ! in_array($value['id'], $menu)) unset($sysList[$key]);
+        }
+        $list = array_values($sysList);
+        $return = $this->makeTree(0,$list);
+        return $this->set_sort_circle($return);;
+    }
+
+    //通过角色获取菜单ID
+    public function getMenuIDByRoleInList($user){
+        $role_id = $user['role_ids'] ?? [];
+        if(empty($role_id)) return [];
+
+        return RoleMenu::whereIn('role_id', $role_id)
+            ->where('del_time',0)
+            ->pluck('menu_id')
+            ->all();
+    }
+
+    public function getMenuDataByRoleInList($user){
+        $role_id = $user['role_ids'] ?? [];
+        if(empty($role_id)) return [];
+
+        return RoleMenu::whereIn('role_id',$role_id)
+            ->where('del_time',0)
+            ->select('menu_id','type')
+            ->get()->toArray();
+    }
+}

+ 47 - 0
app/Service/TokenService.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Service;
+
+use Firebase\JWT\JWT;
+use Firebase\JWT\Key;
+
+class TokenService
+{
+    public static function getToken($user) {
+        $key = config('jwt.key');
+        $ttl = config('jwt.ttl');
+        if(empty($key)) return [false, 'JWT_KEY暂未配置'];
+
+        $token = array(
+            "iat"=> time(), //签发时间
+            "nbf"=> time() - 1, //生效时间  (立即生效)
+            "exp"=> time() + $ttl,
+            "data"=> [
+                'employee_id' => $user['id'],
+                'p_version' => $user['p_version']
+            ]
+        );
+        return [true, JWT::encode($token, $key,"HS256")];
+    }
+
+    public static function verifyToken($token){
+        try {
+            $key = config('jwt.key');
+            if(empty($key)) return [false, 'JWT_KEY暂未配置'];
+
+            JWT::$leeway = 60;//当前时间减去60,把时间留点余地,同步其他服务器时间,解决nbf字段验证不通过问题
+            $decoded = JWT::decode($token,new Key($key, "HS256")); //HS256方式,这里要和签发的时候对应
+
+            $employee = (array)$decoded->data;
+            return [true, $employee];
+        } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
+            return [false, "签名不正确"];
+        } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
+            return [false, "签名在某个时间点之后才能用"];
+        } catch (\Firebase\JWT\ExpiredException $e) { // token过期
+            return [false, "签名过期"];
+        } catch (\Exception $e) { //其他错误
+            return [false, "未知错误"];
+        }
+    }
+}

+ 0 - 169
app/Service/qyWechatService.php

@@ -1,169 +0,0 @@
-<?php
-
-namespace App\Service;
-
-use Illuminate\Support\Facades\Http;
-use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\Log;
-
-class qyWechatService
-{
-    public $corpId = "ww0e2580a34523500b";
-    public $agentId = "1000046";
-    protected $secret = "8YFLG89PjXQ20CTF2DDq1Pwng8vvSHrC37C_6lgV6mY";
-
-    public function __construct()
-    {
-//        $this->corpId = config('services.wechat.corp_id');
-//        $this->agentId = config('services.wechat.agent_id');
-//        $this->secret = config('services.wechat.secret');
-    }
-
-    /**
-     * Step 1: 获取 AccessToken
-     */
-    public function getAccessToken()
-    {
-        // 1. 先从缓存拿
-        $wechat_access_token = "wechat_access_token" . $this->corpId . $this->agentId;
-        $cacheToken = Cache::get($wechat_access_token);
-        if ($cacheToken) return [true, $cacheToken];
-
-        // 2. 缓存没有则请求接口
-        $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=".$this->corpId."&corpsecret=".$this->secret;
-        list($status, $res) = $this->get_helper($url);
-        if (!$status) return [false, $res];
-
-        if (isset($res['access_token'])) {
-            Cache::put($wechat_access_token, $res['access_token'], 7000);
-            return [true, $res['access_token']];
-        }
-
-        return [false, $res['errmsg'] ?? '获取AccessToken失败'];
-    }
-
-    /**
-     * 获取 企业级 Ticket (用于 wx.config)
-     */
-    public function getJsApiTicket()
-    {
-        $cacheTicketKey = "wechat_jsapi_ticket" . $this->corpId . $this->agentId;
-        $cacheTicket = Cache::get($cacheTicketKey);
-        if ($cacheTicket) return [true, $cacheTicket];
-
-        list($status, $token) = $this->getAccessToken();
-        if (!$status) return [false, $token];
-
-        $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" . $token;
-        list($status, $res) = $this->get_helper($url);
-
-        if (!$status) return [false, $res];
-
-        if (isset($res['ticket'])) {
-            Cache::put($cacheTicketKey, $res['ticket'], 7000);
-            return [true, $res['ticket']];
-        }
-
-        return [false, $res['errmsg'] ?? '获取JsApiTicket失败'];
-    }
-
-    /**
-     * 获取 应用级 Ticket (用于 wx.agentConfig)
-     */
-    public function getAgentTicket()
-    {
-        $cacheTicketKey = "wechat_agent_ticket" . $this->corpId . $this->agentId;
-        $cacheTicket = Cache::get($cacheTicketKey);
-        if ($cacheTicket) return [true, $cacheTicket];
-
-        list($status, $token) = $this->getAccessToken();
-        if (!$status) return [false, $token];
-
-        // 注意这里 type=agent_config
-        $url = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token={$token}&type=agent_config";
-        list($status, $res) = $this->get_helper($url);
-
-        if (!$status) return [false, $res];
-
-        if (isset($res['ticket'])) {
-            Cache::put($cacheTicketKey, $res['ticket'], 7000);
-            return [true, $res['ticket']];
-        }
-
-        return [false, $res['errmsg'] ?? '获取AgentTicket失败'];
-    }
-
-    /**
-     * 生成签名通用方法
-     */
-    public function makeSignature($ticket, $nonceStr, $timestamp, $url)
-    {
-        $string = "jsapi_ticket={$ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
-        return sha1($string);
-    }
-
-    public function post_helper($url, $data, $header = [], $timeout = 20, $title = ""){
-        Log::channel('apiLog')->info($title . 'POST', ["api" => $url , "param" => json_decode($data,true) ,"header" => $header]);
-
-        $ch = curl_init();
-        curl_setopt($ch, CURLOPT_URL, $url);
-        curl_setopt($ch,  CURLOPT_RETURNTRANSFER, true);
-        curl_setopt($ch, CURLOPT_ENCODING, '');
-        curl_setopt($ch, CURLOPT_POST, 1);
-        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
-        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
-        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
-
-        if(!is_null($data)) curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
-        $r = curl_exec($ch);
-
-        if ($r === false) {
-            // 获取错误号
-            $errorNumber = curl_errno($ch);
-            // 获取错误信息
-            $errorMessage = curl_error($ch);
-            $message = "cURL Error #{$errorNumber}: {$errorMessage}";
-
-            Log::channel('apiLog')->info($title . 'POST结果', ["message" => $message ]);
-            return [false, $message];
-        }
-        curl_close($ch);
-
-        Log::channel('apiLog')->info($title . 'POST结果', ["message" => json_decode($r, true) ]);
-        return [true, json_decode($r, true)];
-    }
-
-    public function get_helper($url,$header=[],$timeout = 20){
-        $ch = curl_init();
-        curl_setopt_array($ch, array(
-            CURLOPT_URL => $url,
-            CURLOPT_RETURNTRANSFER => true,
-            CURLOPT_ENCODING => '',
-            CURLOPT_MAXREDIRS => 10,
-            CURLOPT_TIMEOUT => $timeout,
-            CURLOPT_FOLLOWLOCATION => true,
-            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
-            CURLOPT_CUSTOMREQUEST => 'GET',
-            CURLOPT_SSL_VERIFYPEER => false,
-            CURLOPT_HTTPHEADER => $header,
-        ));
-        $r = curl_exec($ch);
-
-        if ($r === false) {
-            // 获取错误号
-            $errorNumber = curl_errno($ch);
-            // 获取错误信息
-            $errorMessage = curl_error($ch);
-
-            $message = "cURL Error #{$errorNumber}: {$errorMessage}";
-            Log::channel('apiLog')->info('企业微信GET结果', ["message" => $message]);
-            return [false, $message];
-        }
-
-        curl_close($ch);
-        Log::channel('apiLog')->info('企业微信GET结果', ["message" => json_decode($r, true)]);
-
-        return [true, json_decode($r, true)];
-    }
-}

+ 6 - 0
config/jwt.php

@@ -0,0 +1,6 @@
+<?php
+
+return [
+    'key' => env('JWT_KEY', ''),
+    'ttl' => env('JWT_EXPIRE', 86400),
+];

+ 12 - 0
config/specialButton.php

@@ -0,0 +1,12 @@
+<?php
+
+return [
+//    [
+//        "id" => \App\Model\RoleMenuButton::special_one,
+//        "title" => "分社价格",
+//        "sort" => -1,
+//        "func" => "special_show_branch_price",
+//        "menu_id" => 17,
+//    ],
+];
+

+ 55 - 4
routes/api.php

@@ -13,9 +13,60 @@ use Illuminate\Http\Request;
 |
 */
 
-Route::middleware('auth:api')->get('/user', function (Request $request) {
-    return $request->user();
+//登录
+Route::any('login', 'Api\LoginController@login');
+//文件获取
+Route::any('uploadFiles/{file_name}', 'Api\FileUploadController@getFile');
+
+Route::group(['middleware'=> ['checkLogin']],function ($route){
+    //文件上传统一方法
+    $route->any('uploadFile', 'Api\FileUploadController@uploadFile');
+    //获取默认表头
+    $route->any('getTableHead','Api\TableHeadController@tableHeadGet');
+    //设置表头
+    $route->any('setTableHead','Api\TableHeadController@tableHeadAdd');
+    //获取下载模板
+    $route->any('getTableTitleXls','Api\ImportController@getTableTitleXls');
+    //菜单
+    $route->any('menuList', 'Api\SysMenuController@menuList');
+    //导入
+    $route->any('importAll','Api\ImportController@importAll');
+    //导出统一方法
+    $route->any('exportFile', 'Api\ExportFileController@exportFile');
+
+    //只有超级管理员有权限的接口 ------- 菜单管理前端页面不开放
+    $route->any('menuAdd', 'Api\SysMenuController@add')->name('only.add');
+    $route->any('menuEdit', 'Api\SysMenuController@edit')->name('only.edit');
+    $route->any('menuDel', 'Api\SysMenuController@del')->name('only.delete');
+    $route->any('menuMove', 'Api\SysMenuController@menuMove')->name('only.move');
+
+    $route->any('employeeManageAdd', 'Api\EmployeeController@employeeManageAdd')->name('only.manageAdd');
+    $route->any('employeeManageEdit', 'Api\EmployeeController@employeeManageEdit')->name('only.admin');
+
+    //人员
+    $route->any('employeeAdd', 'Api\EmployeeController@employeeAdd')->name('employee.add');
+    $route->any('employeeEdit', 'Api\EmployeeController@employeeEdit')->name('employee.edit');
+    $route->any('employeeEditOther', 'Api\EmployeeController@employeeEditOther')->name('employee.editPassword');
+    $route->any('employeeDel', 'Api\EmployeeController@employeeDel')->name('employee.delete');
+    $route->any('employeeList', 'Api\EmployeeController@employeeList')->name('employee.list');
+
+    $route->any('employeeDepart', 'Api\EmployeeController@employeeDepart');
+    $route->any('employeeEditImg', 'Api\EmployeeController@employeeEditImg')->middleware('OssFileDeal');
+    $route->any('getEmployeeImg', 'Api\EmployeeController@getEmployeeImg');
+
+    //部门
+    $route->any('departAdd', 'Api\EmployeeController@departAdd')->name('depart.add');
+    $route->any('departEdit', 'Api\EmployeeController@departEdit')->name('depart.edit');
+    $route->any('departDel', 'Api\EmployeeController@departDel')->name('employee.del');
+    $route->any('departList', 'Api\EmployeeController@departList');
+
+    //角色
+    $route->any('roleAdd', 'Api\EmployeeController@roleAdd')->name('role.add');
+    $route->any('roleEdit', 'Api\EmployeeController@roleEdit')->name('role.edit');
+    $route->any('roleDel', 'Api\EmployeeController@roleDel')->name('role.delete');
+    $route->any('roleList', 'Api\EmployeeController@roleList');
+    $route->any('roleDetail', 'Api\EmployeeController@roleDetail')->name('role.');
+    $route->any('roleMenu', 'Api\EmployeeController@roleMenu')->name('role.');
+
 });
 
-//重庆普健
-Route::any('getSignatures', 'Api\TestController@getSignatures');