Просмотр исходного кода

Merge branch 'master' into yang

# Conflicts:
#	app/Http/Controllers/TestController.php
#	app/Providers/AppServiceProvider.php
#	resources/views/finance/menu.blade.php
#	resources/views/finance/settlementBills/menu.blade.php
ANG YU 4 лет назад
Родитель
Сommit
4183d408cb
100 измененных файлов с 2486 добавлено и 1227 удалено
  1. 4 2
      app/Authority.php
  2. 1 1
      app/Http/Controllers/Auth/LoginController.php
  3. 48 138
      app/Http/Controllers/AuthorityController.php
  4. 8 8
      app/Http/Controllers/LogisticController.php
  5. 128 0
      app/Http/Controllers/MenuController.php
  6. 64 130
      app/Http/Controllers/RoleController.php
  7. 328 274
      app/Http/Controllers/TestController.php
  8. 4 4
      app/Http/Controllers/WaybillController.php
  9. 1 1
      app/Menu.php
  10. 8 0
      app/Observers/OwnerObserver.php
  11. 16 0
      app/Observers/UserWorkGroupObserver.php
  12. 4 0
      app/Owner.php
  13. 15 2
      app/Providers/AppServiceProvider.php
  14. 9 0
      app/Role.php
  15. 87 0
      app/Services/AuthorityService.php
  16. 127 0
      app/Services/MenuService.php
  17. 33 0
      app/Services/RoleService.php
  18. 71 0
      app/Services/UserService.php
  19. 8 4
      app/User.php
  20. 4 0
      app/UserWorkgroup.php
  21. 0 5
      database/migrations/2020_03_09_132100_add_store_transfer_authority.php
  22. 0 2
      database/migrations/2020_12_12_093011_change_authorities_order_assign.php
  23. 34 0
      database/migrations/2021_04_27_104357_change_menus_table_add_font_column.php
  24. 54 0
      database/migrations/2021_05_08_143922_change_authority_table_deleted_at_column.php
  25. 10 5
      package-lock.json
  26. 1 0
      package.json
  27. 1 0
      resources/js/app.js
  28. 922 0
      resources/js/utilities/icons.json
  29. 79 0
      resources/js/vue/tree.vue
  30. 15 0
      resources/sass/text.scss
  31. 1 0
      resources/views/auth/login.blade.php
  32. 0 9
      resources/views/customer/customer/create.blade.php
  33. 0 4
      resources/views/customer/customer/index.blade.php
  34. 0 23
      resources/views/customer/customer/menu.blade.php
  35. 0 4
      resources/views/customer/customer/tag/index.blade.php
  36. 0 5
      resources/views/customer/customerLogStatus/index.blade.php
  37. 0 1
      resources/views/customer/index.blade.php
  38. 0 24
      resources/views/customer/menu.blade.php
  39. 0 2
      resources/views/customer/ownerSundryFee/create_and_edit.blade.php
  40. 0 1
      resources/views/customer/ownerSundryFee/index.blade.php
  41. 0 30
      resources/views/customer/ownerSundryFee/menu.blade.php
  42. 0 1
      resources/views/customer/ownerSundryFee/show.blade.php
  43. 0 1
      resources/views/customer/project/area.blade.php
  44. 0 7
      resources/views/customer/project/create.blade.php
  45. 0 1
      resources/views/customer/project/index.blade.php
  46. 0 23
      resources/views/customer/project/menu.blade.php
  47. 0 4
      resources/views/customer/relating.blade.php
  48. 0 1
      resources/views/finance/billConfirmation.blade.php
  49. 0 1
      resources/views/finance/instantBill.blade.php
  50. 0 2
      resources/views/finance/settlementBills/ownerSundryFee/create_and_edit.blade.php
  51. 0 1
      resources/views/finance/settlementBills/ownerSundryFee/index.blade.php
  52. 0 26
      resources/views/finance/settlementBills/ownerSundryFee/menu.blade.php
  53. 0 1
      resources/views/finance/settlementBills/ownerSundryFee/show.blade.php
  54. 0 15
      resources/views/inventory/menu.blade.php
  55. 0 1
      resources/views/inventory/statement/changeInventory.blade.php
  56. 0 1
      resources/views/inventory/statement/dailyLog.blade.php
  57. 0 1
      resources/views/inventory/statement/inventoryCompare.blade.php
  58. 0 26
      resources/views/inventory/statement/menu.blade.php
  59. 0 5
      resources/views/inventory/stockInventory/blindReceive.blade.php
  60. 0 5
      resources/views/inventory/stockInventory/inventoryMission.blade.php
  61. 0 17
      resources/views/inventory/stockInventory/menu.blade.php
  62. 0 1
      resources/views/inventory/stockInventory/mission.blade.php
  63. 116 2
      resources/views/layouts/app.blade.php
  64. 1 74
      resources/views/layouts/menu.blade.php
  65. 43 0
      resources/views/maintenance/authority/_add.blade.php
  66. 25 0
      resources/views/maintenance/authority/_edit.blade.php
  67. 0 4
      resources/views/maintenance/authority/create.blade.php
  68. 0 9
      resources/views/maintenance/authority/edit.blade.php
  69. 93 0
      resources/views/maintenance/authority/index.blade.bak.php
  70. 123 74
      resources/views/maintenance/authority/index.blade.php
  71. 0 16
      resources/views/maintenance/authority/menu.blade.php
  72. 0 4
      resources/views/maintenance/batch/create.blade.php
  73. 0 9
      resources/views/maintenance/batch/edit.blade.php
  74. 0 4
      resources/views/maintenance/batch/index.blade.php
  75. 0 12
      resources/views/maintenance/batch/menu.blade.php
  76. 0 4
      resources/views/maintenance/carType/create.blade.php
  77. 0 9
      resources/views/maintenance/carType/edit.blade.php
  78. 0 4
      resources/views/maintenance/carType/index.blade.php
  79. 0 16
      resources/views/maintenance/carType/menu.blade.php
  80. 0 4
      resources/views/maintenance/carrier/create.blade.php
  81. 0 9
      resources/views/maintenance/carrier/edit.blade.php
  82. 0 4
      resources/views/maintenance/carrier/index.blade.php
  83. 0 16
      resources/views/maintenance/carrier/menu.blade.php
  84. 0 4
      resources/views/maintenance/city/create.blade.php
  85. 0 9
      resources/views/maintenance/city/edit.blade.php
  86. 0 4
      resources/views/maintenance/city/index.blade.php
  87. 0 16
      resources/views/maintenance/city/menu.blade.php
  88. 0 4
      resources/views/maintenance/commodity/create.blade.php
  89. 0 9
      resources/views/maintenance/commodity/edit.blade.php
  90. 0 4
      resources/views/maintenance/commodity/import.blade.php
  91. 0 4
      resources/views/maintenance/commodity/index.blade.php
  92. 0 20
      resources/views/maintenance/commodity/menu.blade.php
  93. 0 4
      resources/views/maintenance/configuration/index.blade.php
  94. 0 4
      resources/views/maintenance/emails/index.blade.php
  95. 0 12
      resources/views/maintenance/emails/menu.blade.php
  96. 0 12
      resources/views/maintenance/expressPrinting/menu.blade.php
  97. 0 5
      resources/views/maintenance/expressPrinting/part/create.blade.php
  98. 0 5
      resources/views/maintenance/expressPrinting/part/index.blade.php
  99. 0 12
      resources/views/maintenance/expressPrinting/part/menu.blade.php
  100. 0 5
      resources/views/maintenance/expressPrinting/print/index.blade.php

+ 4 - 2
app/Authority.php

@@ -7,13 +7,15 @@ use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 
 use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\DB;
 
 class Authority extends Model
 {
     use ModelLogChanging;
-
+    //use SoftDeletes;
     use ModelTimeFormat;
-    protected $fillable = ['name','remark','id_parent','alias_name','type','relevance','permission'];
+    protected $fillable = ['name','parent_id','alias_name','permission'];
     function roles(){
         return $this->belongsToMany('App\Role','authority_role','id_authority','id_role');
     }

+ 1 - 1
app/Http/Controllers/Auth/LoginController.php

@@ -86,7 +86,7 @@ class LoginController extends Controller
             if(env('DB_USERNAME')!='developer')
                 app('LogService')->log(__METHOD__,__FUNCTION__,'',Auth::user()['id']);
             if($request['is_json']){
-                return ['success'=>true,'url'=>url($this->redirectTo)];
+                return ['success'=>true,'url'=>url($this->redirectTo),'menus'=>app("MenuService")->getVisibleFunctionList()];
             }
             return $this->sendLoginResponse($request)->header('Cache-Control','no-store');
         }

+ 48 - 138
app/Http/Controllers/AuthorityController.php

@@ -4,12 +4,8 @@ namespace App\Http\Controllers;
 
 use App\Authority;
 use App\Components\AsyncResponse;
-use App\Owner;
+use App\Services\common\BatchUpdateService;
 use App\User;
-use Exception;
-use Illuminate\Http\Request;
-use Illuminate\Http\Response;
-use Illuminate\Queue\RedisQueue;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Validator;
@@ -17,152 +13,66 @@ use Illuminate\Support\Facades\Validator;
 class AuthorityController extends Controller
 {
     use AsyncResponse;
-
-    /**
-     * Display a listing of the resource.
-     *
-     * @return string
-     */
     public function index()
     {
-
-        if(!Gate::allows('权限-查询')){ return redirect(url('/'));  }
-        $authorities=Authority::orderBy('id','asc')->paginate(100);
+        if (!Gate::allows('权限-查询')){return view("exception.authority"); }
+        $authorities = app("AuthorityService")->format(Authority::query()->get());
         return view('maintenance.authority.index',['authorities'=>$authorities]);
     }
 
-    /**
-     * Show the form for creating a new resource.
-     *
-     * @return string
-     */
-    public function create()
-    {
-        if(!Gate::allows('权限-录入')){ return redirect(url('/'));  }
-        $owners=Owner::all();
-        return view('maintenance.authority.create',compact('owners'));
-    }
-
-//    /**
-//     * Store a newly created resource in storage.
-//     *
-//     * @param Request $request
-//     * @return string
-//     */
-//    public function store(Request $request)
-//    {
-//        if(!Gate::allows('权限-录入')){ return redirect(url('/'));  }
-//        $inputs=$request->all();
-//        $inputs['combinedName']=$request->input('name').'_'.$request->input('id_owner');
-//        $this->validatorCreate($inputs)->validate();
-//        $successName= $request->input('name')??'';
-//        $inputs['name']=$inputs['combinedName'];
-//
-//        if($request->input('id_owner')??''){
-//            $owner=Owner::find($inputs['id_owner']);
-//            if(isset($inputs['remark'])){
-//                $inputs['remark'].="(key: {$inputs['combinedName']})";
-//            }else{
-//                $inputs['remark']="(key: {$inputs['combinedName']})";
-//            }
-//            $inputs['alias_name']=$request->input('name')."_(货主:$owner->name)";
-//            $successName.="(货主:$owner->name)";
-//        }else{
-//            $inputs['alias_name']=$request->input('name');
-//        }
-//        $authority=new Authority($inputs);
-//        $authority->save();
-//
-//        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-//        return redirect('maintenance/authority/create')->with('successTip',"成功录入权限“{$successName}”");
-//    }
-
-    public function store(Request $request)
-    {
-        if(!Gate::allows('权限-录入')){ return redirect(url('/'));  }
-        $this->validatorCreate($request->all())->validate();
-        $owner=Owner::find($request->input('id_owner'));
-
-        $authority=new Authority(['alias_name'=>"(货主:{$owner['name']})",'name'=>"_{$owner['id']}",'remark'=>"(key: _{$owner['id']})"]);
-        $authority->save();
-
-        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return redirect('maintenance/authority/create')->with('successTip',"成功录入权限: (货主:{$owner['name']})");
-    }
-
-    protected function validatorCreate(array $data)
+    public function store()
     {
-        $data['name']="_{$data['id_owner']}";
-        return Validator::make($data, [
-            'id_owner' => ['required', 'exists:owners,id'],
-            'name' => ['unique:authorities,name'],
-        ],[
-            'id_owner.required' => '必须选一个货主',
-            'id_owner.exists' => '当前货主不存在',
-            'name.unique' => '该货主对应权限已添加过',
+        $this->gate("权限-录入");
+        $errors = Validator::make(\request()->input(),
+            ['parent_id'=>['nullable',"integer"],
+             'name'=>'required',
+             'alias_name'=>['required','unique:authorities,alias_name'],
+             'permission'=>'required',
+            ],[
+            'integer'=>':attribute 非法参数',
+            'required'=>':attribute 必填',
+            ],[
+                'parent_id'=>'父级',
+                'name'=>'权限名',
+                'alias_name'=>'唯一标识',
+                'permission'=>'许可',
+                'unique'=>'重复'
+            ])->errors();
+        if ($errors->count()>0)$this->success(["errors"=>$errors]);
+        $authority = Authority::query()->create([
+            'name'          => \request("name"),
+            'parent_id'     => \request("parent_id"),
+            'alias_name'    => \request("alias_name"),
+            'permission'    => \request("permission")
         ]);
+        app("AuthorityService")->removeAdminAuth();
+        $this->success($authority);
     }
 
-    protected function validatorUpdate(array $data)
-    {
-        return Validator::make($data, [
-            'name' => ['required', 'string', 'max:50'],
-        ]);
-    }
-    /**
-     * Display the specified resource.
-     *
-     * @param Authority $authority
-     * @return Response
-     */
-    public function show(Authority $authority)
-    {
-        //
-    }
-
-    /**
-     * Show the form for editing the specified resource.
-     *
-     * @param \App\Http\Controllers\Authority $authority
-     * @return Response
-     */
-    public function edit(Authority $authority)
-    {
-        if(!Gate::allows('权限-编辑')){ return redirect(url('/'));  }
-        $owners=Owner::all();
-        return view('maintenance.authority.edit',compact('owners','authority'));
-    }
-
-    /**
-     * Update the specified resource in storage.
-     *
-     * @param Request $request
-     * @param \App\Http\Controllers\Authority $authority
-     * @return Response
-     */
-    public function update(Request $request, Authority $authority)
+    public function update()
     {
-        if(!Gate::allows('权限-编辑')){ return redirect(url('/'));  }
-        $this->validatorUpdate($request->all())->validate();
-        $authority->fill($request->all());
-        $authority->update();
-        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return redirect('maintenance/authority/')->with('successTip',"成功修改权限“{$authority['name']}”!");
+        $this->gate("权限-编辑");
+        $list = request("list");
+        if (!$list || count($list)<1)$this->success();
+        array_unshift($list,["id","name"]);
+        app(BatchUpdateService::class)->batchUpdate("authorities",$list);//更新权限名
+        app("AuthorityService")->removeAllAuth();//刷掉权限缓存
+        $updateMenu = [["id","name"]];
+        $mapping = array_flip(app("MenuService")->getMenuAndAuthorityMapping());//获取菜单与权限映射并反转
+        foreach (request("list") as $data)if (isset($mapping[$data["id"]]))$updateMenu[] = ["id"=>$mapping[$data["id"]],"name"=>$data["name"]];//验证更新的权限中是否存在有映射关系的缓存并记录
+        if (count($updateMenu)>1){
+            app(BatchUpdateService::class)->batchUpdate("menus",$updateMenu);//存在映射关系的缓存更新映射对象
+            app("MenuService")->setMenu();//重建菜单缓存
+        }
+        $this->success();
     }
 
-    /**
-     * Remove the specified resource from storage.
-     *
-     * @param \App\Http\Controllers\Authority $authority
-     * @return array|Response
-     * @throws Exception
-     */
-    public function destroy(Authority $authority)
+    public function destroy()
     {
-        if(!Gate::allows('权限-删除')){ return redirect(url('/'));  }
-        app('LogService')->log(__METHOD__,__FUNCTION__,$authority->toJson(),Auth::user()['id']);
-        $re=$authority->delete();
-        return ['success'=>$re];
+        $this->gate("权限-删除");
+        Authority::destroy(request("ids"));
+        app("AuthorityService")->removeAllAuth();//刷掉权限缓存
+        $this->success();
     }
 
     public function getAuthoritiesApi()

+ 8 - 8
app/Http/Controllers/LogisticController.php

@@ -19,7 +19,7 @@ class LogisticController extends Controller
      */
     public function index()
     {
-        if(!Gate::allows('物流公司-查询')){ return redirect(url('/'));  }
+        if(!Gate::allows('承运商-查询')){ return view("exception.authority");  }
         $logistics=Logistic::orderBy('id','desc')->paginate(35);
         return view('maintenance.logistic.index',['logistics'=>$logistics]);
     }
@@ -31,7 +31,7 @@ class LogisticController extends Controller
      */
     public function create()
     {
-        if(!Gate::allows('物流公司-录入')){ return redirect(url('/'));  }
+        if(!Gate::allows('承运商-录入')){ return view("exception.authority");  }
         return view('maintenance.logistic.create');
     }
 
@@ -43,14 +43,14 @@ class LogisticController extends Controller
      */
     public function store(Request $request)
     {
-        if(!Gate::allows('物流公司-录入')){ return redirect(url('/'));  }
+        if(!Gate::allows('承运商-录入')){ return view("exception.authority");  }
         $this->validatorCreate($request->all())->validate();
         $request->offsetSet("is_bunched",$request->input("is_bunched") ? 'Y' : 'N');
         $logistic=new Logistic($request->all());
         $logistic->save();
 
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return redirect('maintenance/logistic/create')->with('successTip',"成功录入物流公司“{$request->input('name')}”");
+        return redirect('maintenance/logistic/create')->with('successTip',"成功录入承运商“{$request->input('name')}”");
     }
     protected function validatorCreate(array $data)
     {
@@ -89,19 +89,19 @@ class LogisticController extends Controller
      */
     public function edit(Logistic $logistic)
     {
-        if(!Gate::allows('物流公司-编辑')){ return redirect(url('/'));  }
+        if(!Gate::allows('承运商-编辑')){ return view("exception.authority");  }
         return view('maintenance.logistic.edit',['logistic'=>$logistic]);
     }
 
     public function update(Request $request, Logistic $logistic)
     {
-        if(!Gate::allows('物流公司-编辑')){ return redirect(url('/'));  }
+        if(!Gate::allows('承运商-编辑')){ return redirect(url('/'));  }
         $this->validatorUpdate($request->all(),$logistic->id)->validate();
         $request->offsetSet("is_bunched",$request->input("is_bunched") ? 'Y' : 'N');
         $logistic->fill($request->all());
         $logistic->update();
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return redirect('maintenance/logistic/')->with('successTip',"成功修改物流公司“{$logistic['name']}”!");
+        return redirect('maintenance/logistic/')->with('successTip',"成功修改承运商“{$logistic['name']}”!");
     }
 
     /**
@@ -113,7 +113,7 @@ class LogisticController extends Controller
      */
     public function destroy(Logistic $logistic)
     {
-        if(!Gate::allows('物流公司-删除')){ return redirect(url('/'));  }
+        if(!Gate::allows('承运商-删除')){ return view("exception.authority");  }
         app('LogService')->log(__METHOD__,__FUNCTION__,$logistic->toJson(),Auth::user()['id']);
         $re=$logistic->delete();
         return ['success'=>$re];

+ 128 - 0
app/Http/Controllers/MenuController.php

@@ -0,0 +1,128 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Authority;
+use App\Components\AsyncResponse;
+use App\Menu;
+use App\Services\common\BatchUpdateService;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Gate;
+
+class MenuController extends Controller
+{
+    use AsyncResponse;
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function index()
+    {
+        if (!Gate::allows('基础设置-菜单')){return view("exception.authority"); }
+        return \view("maintenance.menu.index",["menus"=>Menu::query()->orderByRaw("level DESC,sequence")->get()]);
+    }
+
+    public function update()
+    {
+        $this->gate("基础设置-菜单-编辑");
+        $update = [];
+        $mapping = app("MenuService")->getMenuAndAuthorityMapping();
+        $authorityUpdate = [];
+        if (request()->has("parent_id")){
+            $update["parent_id"] = request("parent_id");
+            $authorityUpdate["parent_id"] = request("parent_id") ? ($mapping[request("parent_id")] ?? null) : null;
+        }
+        if (request()->has("level"))$update["level"] = request("level");
+        if (request()->has("name")){
+            $update["name"] = request("name");
+            $authorityUpdate["name"] = $mapping[request("name")];
+        }
+        if (request()->has("font"))$update["font"] = request("font");
+        if (request()->has("font_style"))$update["font_style"] = request("font_style");
+        if (request()->has("route"))$update["route"] = request("route");
+        if (request()->has("diff")){
+            $diff = request("diff");
+            Menu::query()->whereIn("id",request("child"))->update(["level"=>DB::raw("level - {$diff}")]);
+        }
+        if ($update && Menu::query()->where("id",request("id"))->update($update)){
+            app("MenuService")->setMenu();//重建菜单缓存
+            if ($authorityUpdate && ($mapping[request("id")] ?? null)){
+                Authority::query()->where("id",$mapping[request("id")])->update($authorityUpdate);
+                app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
+            }
+        }
+        $this->success();
+    }
+
+    public function sort()
+    {
+        $this->gate("基础设置-菜单-编辑");
+        app(BatchUpdateService::class)->batchUpdate("menus",request("update"));
+        app("MenuService")->setMenu();//重建菜单缓存
+        $this->success();
+    }
+
+    //菜单更新时 刷掉全部菜单权限缓存 录入时刷掉超管权限 与 附加菜单缓存
+    public function save()
+    {
+        $id = request("id");
+        $mapping = app("MenuService")->getMenuAndAuthorityMapping();
+        if ($id){
+            $this->gate("基础设置-菜单-编辑");
+            Menu::query()->where("id",$id)->update([
+                "name" => request("name"),
+                "route" => request("route"),
+                "font" => request("font"),
+                "font_style" => request("font_style"),
+            ]);
+            if ($mapping[$id] ?? false){
+                $authority = Authority::query()->where("id",$mapping[$id])->first();
+                if ($authority->name != request("name"))$authority->update(["name"=>request("name")]);
+                app("AuthorityService")->removeAllAuth();
+            }
+            app("MenuService")->setMenu();//重建菜单缓存
+            $this->success();
+        }
+        $this->gate("基础设置-菜单-录入");
+        $menu = Menu::query()->create([
+            "name" => request("name"),
+            "route" => request("route"),
+            "font" => request("font"),
+            "font_style" => request("font_style"),
+            "parent_id" => request("parent_id"),
+            "level" => request("level"),
+        ]);
+        //暂时禁止菜单新建时补充权限 留待权限路由绑定后可开启此步骤
+        /*Authority::query()->create([
+            'name' => $menu->name,
+            'parent_id' => $mapping[$menu->parent_id] ?? null,
+            'alias_name' => $menu->name.$menu->id,
+        ]);
+        app("AuthorityService")->removeAdminAuth();//刷掉超管权限缓存*/
+        app("MenuService")->appendMenu($menu);//为菜单总缓存附加
+        $this->success($menu);
+    }
+    public function delete()
+    {
+        $this->gate("基础设置-菜单-删除");
+        $ids = request("ids");
+        $authIds = [];
+        $mapping = app("MenuService")->getMenuAndAuthorityMapping();
+        foreach ($ids as $id)if (isset($mapping[$id]))$authIds[] = $mapping[$id];
+
+        Menu::destroy($ids);
+        app("MenuService")->setMenu();//重建菜单缓存
+        if ($authIds){
+            DB::table("authority_role")->whereIn("id_authority",$authIds)->delete();
+            Authority::destroy($ids);
+            app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
+        }
+        $this->success();
+    }
+
+    public function get()
+    {
+        return app("MenuService")->getVisibleFunctionList();
+    }
+}

+ 64 - 130
app/Http/Controllers/RoleController.php

@@ -3,158 +3,92 @@
 namespace App\Http\Controllers;
 
 use App\Authority;
-use App\LaborCompany;
+use App\Components\AsyncResponse;
+use App\Owner;
 use App\Role;
-use Exception;
-use Illuminate\Http\Request;
-use Illuminate\Http\Response;
-use Illuminate\Support\Facades\Auth;
+use App\UserWorkgroup;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
-use Illuminate\Support\Facades\Validator;
 
 class RoleController extends Controller
 {
-
-    public function index(Request $request)
+    use AsyncResponse;
+    public function index()
     {
-        if(!Gate::allows('角色-查询')){ return redirect(url('/'));  }
-        $query = Role::with('authorities');
-/*        if($request->has('user')){
-            $user = $request->input('user');
-            $query->whereHas('users',function($query) use ($user){
-                $query->where('name','like',$user);
-            });
-        }*/
-        if($request->has('role')){
-            $role=$request->input('role');
-            if (strpos($role, ',') || strpos($role, ',') || strpos($role, ' ')) {
-                $arr = array_filter(preg_split('/[,, ]+/is', $role));
-                $query->whereIn('name', $arr);
-                unset($role);
-            } else {
-                $query->where('name','like',$role.'%');
-            }
-        }
-        $roles= $query->orderBy('id','desc')->paginate(35);
-        return view('maintenance.role.index',['roles'=>$roles]);
+        if (!Gate::allows('角色-查询')){return view("exception.authority"); }
+        $roles = Role::query()->get();
+        $authorities = app("AuthorityService")->format(Authority::query()->get());
+        $owners = Owner::query()->whereNull("deleted_at")->get();
+        $userWorkGroups = UserWorkgroup::query()->get();
+        return view('maintenance.role.index',compact("roles","authorities","userWorkGroups","owners"));
     }
 
-
-    public function create()
+    /**
+     * @throws \Exception
+     */
+    public function destroy()
     {
-        if(!Gate::allows('角色-录入')){ return redirect(url('/'));  }
-        $authoritiesAll=Authority::orderBy('alias_name','desc')->get();
-        $authoritiesAll = Authority::filterRecycle($authoritiesAll);
-        $laborCompanies=LaborCompany::query()->get();
-        return view('maintenance.role.create',compact('authoritiesAll','laborCompanies'));
+        $this->gate("角色-删除");
+        /** @var Role $role */
+        $role = Role::query()->find(request("id"));
+        $role->owners()->sync([]);
+        $role->userWorkGroups()->sync([]);
+        $role->delete();
+        app("RoleService")->clearUserAuthority(request("id"),true,true,true);//清除角色下所有控制信息
+        $this->success();
     }
 
-
-    public function store(Request $request)
-    {
-        if(!Gate::allows('角色-录入')){ return redirect(url('/'));  }
-        $this->validatorCreate($request->all())->validate();
-        $role=new Role($request->all());
-        $role->save();
-        $authorityIds=$request->input('authority')??'';
-        if($authorityIds){
-            $authorityIdArr=explode(',',$authorityIds);
-            $role->authorities()->sync($authorityIdArr);
-        }
-        $laborCompanyIds=$request->input('laborCompany')??'';
-        if($laborCompanyIds){
-            $laborCompanyIdArr=explode(',',$laborCompanyIds);
-            $role->laborCompanies()->sync($laborCompanyIdArr);
-        }else{
-            $role->laborCompanies()->sync([]);
-        }
-
-        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return redirect('maintenance/role/create')->with('successTip',"成功录入角色“{$request->input('name')}”");
-    }
-    protected function validatorCreate(array $data)
-    {
-        return Validator::make($data, [
-            'name' => ['required', 'string', 'max:50', 'unique:roles'],
-        ]);
-    }
-    protected function validatorUpdate(array $data)
+    public function save()
     {
-        return Validator::make($data, [
-            'name' => ['required', 'string', 'max:50'],
-        ]);
+        $this->gate("角色-录入");
+        $id = request("id");
+        $name = request("name");
+        $role = null;
+        if ($id)Role::query()->where("id",$id)->update(["name"=>$name]);
+        else $role = Role::query()->create(["name"=>$name]);
+        $this->success($role);
     }
-    /**
-     * Display the specified resource.
-     *
-     * @param Role $role
-     * @return Response
-     */
-    public function show(Role $role)
+
+    public function loadRelevance()
     {
-        //
+        $this->gate("角色-编辑");
+        $authorities = array_column(DB::select(DB::raw("SELECT id_authority FROM authority_role WHERE id_role = ?"),[request("id")]),"id_authority");
+        $owners = array_column(DB::select(DB::raw("SELECT owner_id FROM owner_role WHERE role_id = ?"),[request("id")]),"owner_id");
+        $userWorkGroups = array_column(DB::select(DB::raw("SELECT user_work_group_id FROM role_user_work_group WHERE role_id = ?"),[request("id")]),"user_work_group_id");
+        $this->success(compact("authorities","owners","userWorkGroups"));
     }
 
-    /**
-     * Show the form for editing the specified resource.
-     *
-     * @param Role $role
-     * @return Response
-     */
-    public function edit(Role $role)
+    public function saveAuthority()
     {
-        if(!Gate::allows('角色-编辑')){ return redirect(url('/'));  }
-        $authoritiesAll=Authority::orderBy('alias_name','desc')->get();
-        $authoritiesAll = Authority::filterRecycle($authoritiesAll);
-        $authorities=$role->authorities()->get();
-        $laborCompanies=LaborCompany::query()->get();
-        $laborCompaniesRole=$role->laborCompanies()->get();
-        return view('maintenance.role.edit',compact('role','authorities','authoritiesAll','laborCompanies','laborCompaniesRole'));
+        $this->gate("角色-编辑");
+        /** @var Role|\stdClass $role */
+        $role = new Role();
+        $role->id = request("id");
+        $role->authorities()->sync(request("authorities"));
+        app("RoleService")->clearUserAuthority($role->id);
+        $this->success();
     }
 
-    /**
-     * Update the specified resource in storage.
-     *
-     * @param Request $request
-     * @param Role $role
-     * @return Response
-     */
-    public function update(Request $request, Role $role)
+    public function saveOwner()
     {
-        if(!Gate::allows('角色-编辑')){ return redirect(url('/'));  }
-        $this->validatorUpdate($request->all())->validate();
-        $role->fill($request->all());
-        $role->update();
-        $authorityIds=$request->input('authority')??'';
-        if($authorityIds){
-            $authorityIdArr=explode(',',$authorityIds);
-            $role->authorities()->sync($authorityIdArr);
-        }else{
-            $role->authorities()->sync([]);
-        }
-        $laborCompanyIds=$request->laborCompany??'';
-        if($laborCompanyIds){
-            $laborCompanyIdArr=explode(',',$laborCompanyIds);
-            $role->laborCompanies()->sync($laborCompanyIdArr);
-        }else{
-            $role->laborCompanies()->sync([]);
-        }
-        app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        return redirect('maintenance/role/')->with('successTip',"成功修改角色“{$role['name']}”!");
+        $this->gate("角色-编辑");
+        /** @var Role|\stdClass $role */
+        $role = new Role();
+        $role->id = request("id");
+        $role->owners()->sync(request("owners"));
+        app("RoleService")->clearUserAuthority($role->id,false,true);
+        $this->success();
     }
 
-    /**
-     * Remove the specified resource from storage.
-     *
-     * @param Role $role
-     * @return array|Response
-     * @throws Exception
-     */
-    public function destroy(Role $role)
+    public function saveUserWorkGroup()
     {
-        if(!Gate::allows('角色-删除')){ return redirect(url('/'));  }
-        app('LogService')->log(__METHOD__,__FUNCTION__,$role->toJson(),Auth::user()['id']);
-        $re=$role->delete();
-        return ['success'=>$re];
+        $this->gate("角色-编辑");
+        /** @var Role|\stdClass $role */
+        $role = new Role();
+        $role->id = request("id");
+        $role->userWorkGroups()->sync(request("userWorkGroups"));
+        app("RoleService")->clearUserAuthority($role->id,false,false,true);
+        $this->success();
     }
+
 }

+ 328 - 274
app/Http/Controllers/TestController.php

@@ -83,6 +83,7 @@ use App\Store;
 use App\StationTaskBatch;
 use App\StoreItem;
 use App\Unit;
+use App\User;
 use App\UserDetail;
 use App\UserDutyCheck;
 use App\ValueStore;
@@ -93,7 +94,6 @@ use ChangeColumnOrderIdToOrderIssues;
 use Doctrine\DBAL\Exception\DatabaseObjectExistsException;
 use Doctrine\DBAL\Query\QueryBuilder;
 use GuzzleHttp\Client;
-use http\Client\Curl\User;
 use Illuminate\Database\Connection;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
@@ -129,37 +129,72 @@ class TestController extends Controller
     {
         return call_user_func([$this, $method], $request);
     }
+
     public function test()
     {
-        ini_set('max_execution_time', 2500);
-        $model = MaterialBoxModel::query()->create([
-            "code" => "common"
-        ]);
-        $sql = <<<sql
-    select * from INV_LOT_LOC_ID where traceid = '*' and locationid like 'IDE%'
-sql;
-        foreach (DB::connection("oracle")->select(DB::raw($sql)) as $inv){
-            $materialBox = MaterialBox::query()->firstOrCreate(["code"=>$inv->locationid],[
-                "code" => $inv->locationid,
-                "material_box_model_id"=>$model
-            ]);
-            $owner = Owner::query()->firstOrCreate([
-                "code" => $inv->customerid
-            ],[
-                "code" => $inv->customerid,
-                "name" => $inv->customerid,
-            ]);
-            $commodity = Commodity::query()->where("owner_id",$owner->id)->where("sku",$inv->sku)->first();
-            if (!$commodity){
-                dump($inv->customerid." | ".$inv->sku);
-                continue;
+        dd(app("MenuService")->getVisibleFunctionList());
+        ini_set('max_execution_time',9999);
+        DB::beginTransaction();
+        try{
+            $mapping = [
+                "43"=>[647],"40"=>[648,649,650],
+                "612"=>[651],"210"=>[652],"274" => [653],"314"=>[654],"327"=>[655],
+                "329"=>[656],"344"=>[657],"159"=>[646,658],"164"=>[660],
+                "206"=>[661,662],"205"=>[663,664,665],"272"=>[666,667],
+                "320"=>[668],"220"=>[669],"223"=>[670],"616"=>[671],"310"=>[672],
+                "348"=>[673],"538"=>[674,675],"311"=>[676],"16"=>[677],"133"=>[678,679],
+                "488"=>[688],"557"=>[689,690]
+            ];
+            foreach ($mapping as $key=>$arr){
+                $roles = DB::select(DB::raw("SELECT * FROM authority_role WHERE id_authority = ?"),[$key]);
+                if (!$roles)continue;
+                foreach ($roles as $role){
+                    foreach ($arr as $aId){
+                        DB::insert(DB::raw("INSERT INTO authority_role(id_authority,id_role) values (?,?)"),[$aId,$role->id_role]);
+                    }
+                }
             }
-            \App\Storage::query()->create([
-                "material_box_id" => $materialBox->id,
-                "commodity_id" => $commodity->id,
-                "amount" => $inv->qty,
-            ]);
+            $re = [
+                257=>1,
+                258=>2,
+                259=>3,
+                260=>4,
+                261=>5,
+                262=>6,
+                263=>7,
+                264=>8,
+                265=>9,
+                266=>10,
+                312=>11,
+                313=>12,
+                510=>13,
+            ];
+            foreach ($re as $key=>$val){
+                $usId = $val;
+                $auId = $key;
+                $roles = DB::select(DB::raw("SELECT * FROM authority_role WHERE id_authority = ?"),[$auId]);
+                if (!$roles)continue;
+                foreach ($roles as $role){
+                    DB::insert(DB::raw("INSERT INTO role_user_work_group(role_id,user_work_group_id) values (?,?)"),[$role->id_role,$usId]);
+                }
+            }
+            $owners = Authority::query()->where("name","like","\_%")->get();
+            foreach ($owners as $owner){
+                $owId = ltrim($owner->name,"_");
+                $auId = $owner->id;
+                $roles = DB::select(DB::raw("SELECT * FROM authority_role WHERE id_authority = ?"),[$auId]);
+                if (!$roles)continue;
+                foreach ($roles as $role){
+                    DB::insert(DB::raw("INSERT INTO owner_role(owner_id,role_id) values (?,?)"),[$owId,$role->id_role]);
+                }
+            }
+            DB::commit();
+        }catch (\Exception $e){
+            DB::rollBack();
+            dd($e->getMessage());
         }
+        app("MenuService")->setMenu();//重建菜单缓存
+        app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
     }
     public function orderCreateBill()
     {
@@ -168,6 +203,7 @@ sql;
         $ser->createInstantBill($order);
         dd("order create bill success");
     }
+
     public function supplementMarchOwnerReport()
     {
         $ows = OwnerAreaReport::query()->select("owner_id")->where("counting_month", 'like', "2021-03%")->get();
@@ -359,11 +395,11 @@ sql;
     public function tj2(Request $request)
     {
 
-        dd((function (){
-            try{
+        dd((function () {
+            try {
                 throw new Exception();
                 return 1;
-            }catch (\Exception $e){
+            } catch (\Exception $e) {
                 return 2;
             }
         })());
@@ -662,9 +698,9 @@ sql;
 
     public function testImp()
     {
-        $batch=Batch::query()->first();
+        $batch = Batch::query()->first();
         dump($batch->created_at);
-        dump($batch->created_at<Carbon::now()->subDay());
+        dump($batch->created_at < Carbon::now()->subDay());
         dump(Carbon::now()->subDay());
     }
 
@@ -890,14 +926,15 @@ sql;
 
     public function ld2()
     {
-        $r=new \Illuminate\Support\Collection();
+        $r = new \Illuminate\Support\Collection();
         $sb = StationTaskBatch::query()->limit(3)->get();
-        dump(data_get($sb,'*.id'));
+        dump(data_get($sb, '*.id'));
         foreach ($sb as $s) {
             $r->push($s);
         }
-        dump(data_get($sb,'*.id'));
+        dump(data_get($sb, '*.id'));
     }
+
     public function y111()
     {
         $controller = new SendEmailsController();
@@ -967,6 +1004,7 @@ sql;
             }
         }
     }
+
     public function addProcurementData()
     {
         $this->syncUserDetail();
@@ -975,23 +1013,25 @@ sql;
         $this->addProcurementQuotation();
         $this->addProcurementCheckSheet();
     }
+
     public function syncUserDetail()
     {
-        $sql=DB::raw('SELECT * from user where supplierid is not null');
+        $sql = DB::raw('SELECT * from user where supplierid is not null');
         $params = DB::connection('erp')->select($sql);
-        $user_Details=UserDetail::query()->where('created_at','like','2021-04-12%')->get();
+        $user_Details = UserDetail::query()->where('created_at', 'like', '2021-04-12%')->get();
         $dataHandlerService = app(DataHandlerService::class);
         $user_Details_map = $dataHandlerService->dataHeader(['mobile_phone'], $user_Details);
-        foreach ($params as $param){
+        foreach ($params as $param) {
             $user_detail = $dataHandlerService->getKeyValue(['mobile_phone' => $param->mobile], $user_Details_map);
             if (!$user_detail) continue;
-            $user_detail->update(['procurement_wechat_open_id'=>$param->openid]);
+            $user_detail->update(['procurement_wechat_open_id' => $param->openid]);
         }
     }
 
-    public function addProcurementDeliver(){
+    public function addProcurementDeliver()
+    {
         //送货单
-        $sql=DB::raw('SELECT
+        $sql = DB::raw('SELECT
 deliver.id id,request.id procurement_id,deliver.delivernum amount,deliver.status status,deliver.accepttime signed_at,
 deliver.createtime created_at,deliver.createtime updated_at,deliver.confirmnum receipt_amount
 from deliver
@@ -1000,17 +1040,17 @@ LEFT JOIN ask on purch.askid=ask.id
 LEFT JOIN request on ask.requestid=request.id
 where purch.islower=1');
         $params = DB::connection('erp')->select($sql);
-        $insert=[];
-        foreach ($params as $param){
-            $insert[]=[
-                'id'=>$param->id,
-                'procurement_id'=>$param->procurement_id,
-                'amount'=>$param->amount,
-                'status'=>$param->status?$param->status-1:$param->status,
-                'signed_at'=>Carbon::parse($param->signed_at)->toDateString(),
-                'created_at'=>Carbon::parse($param->created_at)->toDateTimeString(),
-                'updated_at'=>Carbon::parse($param->updated_at)->toDateTimeString(),
-                'receipt_amount'=>$param->receipt_amount,
+        $insert = [];
+        foreach ($params as $param) {
+            $insert[] = [
+                'id' => $param->id,
+                'procurement_id' => $param->procurement_id,
+                'amount' => $param->amount,
+                'status' => $param->status ? $param->status - 1 : $param->status,
+                'signed_at' => Carbon::parse($param->signed_at)->toDateString(),
+                'created_at' => Carbon::parse($param->created_at)->toDateTimeString(),
+                'updated_at' => Carbon::parse($param->updated_at)->toDateTimeString(),
+                'receipt_amount' => $param->receipt_amount,
             ];
         }
         ProcurementDeliverie::query()->insert($insert);
@@ -1020,7 +1060,7 @@ where purch.islower=1');
     {
 
         //采购单
-        $sql=DB::raw('select request.id id,
+        $sql = DB::raw('select request.id id,
 request.number code,request.type type,request.resourceid owner_material_id,purch.supplierid supplier_id,request.num quantity, request.sellnum amount,
 request.price unit_price,purch.acceptprice cost_price,request.status status,request.createtime created_at,request.createtime updated_at,
 purch.accepttime deadline
@@ -1029,151 +1069,155 @@ LEFT JOIN ask on purch.askid= ask.id
 LEFT JOIN request on ask.requestid=request.id
 where purch.islower=1 and request.type=3 ORDER BY request.id ASC');
         $params = DB::connection('erp')->select($sql);
-        $insert=[];
-        foreach ($params as $param){
-            if (!$param->status)continue;
-            if ($param->status==0)$status=10;
-            if ($param->status==1)$status=0;
-            if ($param->status==2)$status=1;
-            if ($param->status==3)$status=2;
-            if ($param->status==4)$status=11;
-            if ($param->status==5)$status=4;
-            if ($param->status==6)$status=5;
-            if ($param->status==7)$status=6;
-            if ($param->status==8)$status=8;
-            if ($param->status==9)$status=9;
-            $key=$param->id;
-            $insert[$key]=[
-                'id'=>$param->id,
-                'code'=>$param->code,
-                'type'=>0,
-                'owner_material_id'=>$param->owner_material_id,
-                'supplier_id'=>$param->supplier_id,
-                'quantity'=>$param->quantity,
-                'amount'=>$param->amount,
-                'unit_price'=>$param->unit_price,
-                'cost_price'=>$param->cost_price,
-                'initiator'=>0,
-                'status'=>$status,
-                'created_at'=>Carbon::parse($param->created_at)->toDateTimeString(),
-                'updated_at'=>Carbon::parse($param->updated_at)->toDateTimeString(),
-                'deadline'=>Carbon::parse($param->deadline)->toDateTimeString(),
+        $insert = [];
+        foreach ($params as $param) {
+            if (!$param->status) continue;
+            if ($param->status == 0) $status = 10;
+            if ($param->status == 1) $status = 0;
+            if ($param->status == 2) $status = 1;
+            if ($param->status == 3) $status = 2;
+            if ($param->status == 4) $status = 11;
+            if ($param->status == 5) $status = 4;
+            if ($param->status == 6) $status = 5;
+            if ($param->status == 7) $status = 6;
+            if ($param->status == 8) $status = 8;
+            if ($param->status == 9) $status = 9;
+            $key = $param->id;
+            $insert[$key] = [
+                'id' => $param->id,
+                'code' => $param->code,
+                'type' => 0,
+                'owner_material_id' => $param->owner_material_id,
+                'supplier_id' => $param->supplier_id,
+                'quantity' => $param->quantity,
+                'amount' => $param->amount,
+                'unit_price' => $param->unit_price,
+                'cost_price' => $param->cost_price,
+                'initiator' => 0,
+                'status' => $status,
+                'created_at' => Carbon::parse($param->created_at)->toDateTimeString(),
+                'updated_at' => Carbon::parse($param->updated_at)->toDateTimeString(),
+                'deadline' => Carbon::parse($param->deadline)->toDateTimeString(),
             ];
         }
         Procurement::query()->insert($insert);
 
         //打样 或者 询价
-        $procurement_ids=Procurement::query()->select('id')->get();
-        $ids = $procurement_ids->map(function($procurement){
+        $procurement_ids = Procurement::query()->select('id')->get();
+        $ids = $procurement_ids->map(function ($procurement) {
             return $procurement['id'];
         });
         $idSql = "(''";
-        foreach ($ids as $id)$idSql.=",".$id;
+        foreach ($ids as $id) $idSql .= "," . $id;
         $idSql .= ")";
-        $sql=DB::raw('select * from request where id  not in '.$idSql);
-        $params=DB::connection('erp')->select($sql);
-        $insert=[];
-        foreach ($params as $param){
-            if (!$param->status)continue;
-            if (!$param->type)continue;
-            if ($param->status==0)$status=10;
-            if ($param->status==1)$status=0;
-            if ($param->status==2)$status=1;
-            if ($param->status==3)$status=2;
-            if ($param->status==4)$status=11;
-            if ($param->status==5)$status=4;
-            if ($param->status==6)$status=5;
-            if ($param->status==7)$status=6;
-            if ($param->status==8)$status=8;
-            if ($param->status==9)$status=9;
-            if ($param->type==3){
-                $type=0;
-            }else{
-                $type=$param->type;
+        $sql = DB::raw('select * from request where id  not in ' . $idSql);
+        $params = DB::connection('erp')->select($sql);
+        $insert = [];
+        foreach ($params as $param) {
+            if (!$param->status) continue;
+            if (!$param->type) continue;
+            if ($param->status == 0) $status = 10;
+            if ($param->status == 1) $status = 0;
+            if ($param->status == 2) $status = 1;
+            if ($param->status == 3) $status = 2;
+            if ($param->status == 4) $status = 11;
+            if ($param->status == 5) $status = 4;
+            if ($param->status == 6) $status = 5;
+            if ($param->status == 7) $status = 6;
+            if ($param->status == 8) $status = 8;
+            if ($param->status == 9) $status = 9;
+            if ($param->type == 3) {
+                $type = 0;
+            } else {
+                $type = $param->type;
             }
-            $insert[$param->id]=[
-                'id'=>$param->id,
-                'code'=>$param->number,
-                'type'=>$type,
-                'owner_material_id'=>$param->resourceid,
-                'quantity'=>$param->num,
-                'amount'=>$param->sellnum,
-                'unit_price'=>$param->price,
-                'initiator'=>0,
-                'status'=>$status,
-                'created_at'=>Carbon::parse($param->createtime)->toDateTimeString(),
-                'updated_at'=>Carbon::parse($param->createtime)->toDateTimeString(),
-                'deadline'=>Carbon::parse($param->createtime)->subHours(-4)->toDateTimeString(),
+            $insert[$param->id] = [
+                'id' => $param->id,
+                'code' => $param->number,
+                'type' => $type,
+                'owner_material_id' => $param->resourceid,
+                'quantity' => $param->num,
+                'amount' => $param->sellnum,
+                'unit_price' => $param->price,
+                'initiator' => 0,
+                'status' => $status,
+                'created_at' => Carbon::parse($param->createtime)->toDateTimeString(),
+                'updated_at' => Carbon::parse($param->createtime)->toDateTimeString(),
+                'deadline' => Carbon::parse($param->createtime)->subHours(-4)->toDateTimeString(),
             ];
         }
         Procurement::query()->insert($insert);
 
         //删除没有项目耗材的采购记录
-        $OwnerMaterialIds=OwnerMaterial::query()->select('id')->get();
-        $Procurements=Procurement::query()->whereNotIn('owner_material_id',$OwnerMaterialIds)->get();
-        $data=[];
-        foreach ($Procurements as $procurement){
-            $data[]=$procurement->owner_material_id;
+        $OwnerMaterialIds = OwnerMaterial::query()->select('id')->get();
+        $Procurements = Procurement::query()->whereNotIn('owner_material_id', $OwnerMaterialIds)->get();
+        $data = [];
+        foreach ($Procurements as $procurement) {
+            $data[] = $procurement->owner_material_id;
             $procurement->delete();
         }
     }
-    public function addProcurementQuotation(){
+
+    public function addProcurementQuotation()
+    {
         //报价单
-        $procurement_ids=Procurement::query()->select('id')->get();
-        $ids = $procurement_ids->map(function($procurement){
+        $procurement_ids = Procurement::query()->select('id')->get();
+        $ids = $procurement_ids->map(function ($procurement) {
             return $procurement['id'];
         });
         $idSql = "(''";
-        foreach ($ids as $id)$idSql.=",".$id;
+        foreach ($ids as $id) $idSql .= "," . $id;
         $idSql .= ")";
-        $sql=DB::raw('SELECT purch.id id,request.id procurement_id,purch.supplierid supplier_id,
+        $sql = DB::raw('SELECT purch.id id,request.id procurement_id,purch.supplierid supplier_id,
 purch.acceptprice offer,purch.accepttime quoted_at,purch.status status,
 purch.accepttime created_at,purch.accepttime updated_at
 FROM purch
 LEFT JOIN ask on purch.askid=ask.id
 LEFT JOIN request on ask.requestid=request.id
-where request.id in'.$idSql);
-        $params=DB::connection('erp')->select($sql);
-        foreach ($params as $param){
-            $key=$param->id;
-            $insert[$key]=[
-                'id'=>$param->id,
-                'procurement_id'=>$param->procurement_id,
-                'supplier_id'=>$param->supplier_id,
-                'offer'=>$param->offer,
-                'status'=>$param->status,
-                'quoted_at'=>Carbon::parse($param->quoted_at)->toDateTimeString(),
-                'created_at'=>Carbon::parse($param->created_at)->toDateTimeString(),
-                'updated_at'=>Carbon::parse($param->updated_at)->toDateTimeString(),
+where request.id in' . $idSql);
+        $params = DB::connection('erp')->select($sql);
+        foreach ($params as $param) {
+            $key = $param->id;
+            $insert[$key] = [
+                'id' => $param->id,
+                'procurement_id' => $param->procurement_id,
+                'supplier_id' => $param->supplier_id,
+                'offer' => $param->offer,
+                'status' => $param->status,
+                'quoted_at' => Carbon::parse($param->quoted_at)->toDateTimeString(),
+                'created_at' => Carbon::parse($param->created_at)->toDateTimeString(),
+                'updated_at' => Carbon::parse($param->updated_at)->toDateTimeString(),
             ];
         }
         ProcurementQuotation::query()->insert($insert);
     }
-    public function addProcurementCheckSheet(){
+
+    public function addProcurementCheckSheet()
+    {
         //对账单
-        $procurement_delivers=ProcurementDeliverie::query()->get();
+        $procurement_delivers = ProcurementDeliverie::query()->get();
         $dataHandlerService = app(DataHandlerService::class);
         $procurement_delivers_map = $dataHandlerService->dataHeader(['procurement_id'], $procurement_delivers);
-        $sql=DB::raw('select request.id procurement_id,billdetail.billno invoice_number,billdetail.status status,purch.acceptnum amount,purch.acceptprice price,
+        $sql = DB::raw('select request.id procurement_id,billdetail.billno invoice_number,billdetail.status status,purch.acceptnum amount,purch.acceptprice price,
 purch.accepttime created_at,purch.accepttime updated_at
 FROM billdetail
 LEFT JOIN purch on purch.id=billdetail.purchid
 LEFT JOIN ask on purch.askid=ask.id
 LEFT JOIN request on ask.requestid=request.id
 where purch.islower=1');
-        $params=DB::connection('erp')->select($sql);
+        $params = DB::connection('erp')->select($sql);
 
-        $insert=[];
-        foreach ($params as $param){
+        $insert = [];
+        foreach ($params as $param) {
             $procurement_deliver = $dataHandlerService->getKeyValue(['procurement_id' => $param->procurement_id], $procurement_delivers_map);
             if (!$procurement_deliver) continue;
-            $insert[$param->procurement_id]=[
-                'procurement_delivery_id'=>$procurement_deliver->id,
-                'invoice_number'=>$param->invoice_number??null,
-                'account_payable'=>$param->amount*$param->price,
-                'status'=>$param->status,
-                'created_at'=>$param->created_at,
-                'updated_at'=>$param->updated_at,
+            $insert[$param->procurement_id] = [
+                'procurement_delivery_id' => $procurement_deliver->id,
+                'invoice_number' => $param->invoice_number ?? null,
+                'account_payable' => $param->amount * $param->price,
+                'status' => $param->status,
+                'created_at' => $param->created_at,
+                'updated_at' => $param->updated_at,
             ];
         }
         ProcurementCheckSheet::query()->insert($insert);
@@ -1181,111 +1225,115 @@ where purch.islower=1');
 
     public function order_packages_exception_type_sync()
     {
-        $count = OrderPackage::query()->where('status', '派送异常')->update(['exception_type' => '派件异常','exception' => '是']);
-        dump('更新了: '.$count);
+        $count = OrderPackage::query()->where('status', '派送异常')->update(['exception_type' => '派件异常', 'exception' => '是']);
+        dump('更新了: ' . $count);
     }
 
     public function order_packages_exception_type_and_exception_update()
     {
         $count_1 = OrderPackage::query()
-            ->whereIn('exception_type', ['疑似库内丢件','揽件异常'])
+            ->whereIn('exception_type', ['疑似库内丢件', '揽件异常'])
             ->whereNotNull('transfer_status')
-            ->update(['exception_type' => '无','exception' => '否']);
-        $count_2 =   OrderPackage::query()
-            ->where('status','已收件')
-            ->update(['exception_type' => '无','exception' => '否']);
-        dump('更新了: '.($count_1 + $count_2));
+            ->update(['exception_type' => '无', 'exception' => '否']);
+        $count_2 = OrderPackage::query()
+            ->where('status', '已收件')
+            ->update(['exception_type' => '无', 'exception' => '否']);
+        dump('更新了: ' . ($count_1 + $count_2));
     }
+
     public function addProcurementDeliverAndCheckMeet()
     {
-        $id=ProcurementDeliverie::query()->orderByDesc('id')->value('id');
-        $sql=DB::raw('SELECT
+        $id = ProcurementDeliverie::query()->orderByDesc('id')->value('id');
+        $sql = DB::raw('SELECT
 deliver.id id,request.id procurement_id,deliver.delivernum amount,deliver.status status,deliver.accepttime signed_at,
 deliver.createtime created_at,deliver.createtime updated_at,deliver.confirmnum receipt_amount
 from deliver
 LEFT JOIN purch on deliver.purchid=purch.id
 LEFT JOIN ask on purch.askid=ask.id
 LEFT JOIN request on ask.requestid=request.id
-where purch.islower=1 and deliver.id>'.$id);
+where purch.islower=1 and deliver.id>' . $id);
         $params = DB::connection('erp')->select($sql);
-        $insert=[];
-        foreach ($params as $param){
-            $insert[]=[
-                'id'=>$param->id,
-                'procurement_id'=>$param->procurement_id,
-                'amount'=>$param->amount,
-                'status'=>$param->status?$param->status-1:$param->status,
-                'signed_at'=>Carbon::parse($param->signed_at)->toDateString(),
-                'created_at'=>Carbon::parse($param->created_at)->toDateTimeString(),
-                'updated_at'=>Carbon::parse($param->updated_at)->toDateTimeString(),
-                'receipt_amount'=>$param->receipt_amount,
+        $insert = [];
+        foreach ($params as $param) {
+            $insert[] = [
+                'id' => $param->id,
+                'procurement_id' => $param->procurement_id,
+                'amount' => $param->amount,
+                'status' => $param->status ? $param->status - 1 : $param->status,
+                'signed_at' => Carbon::parse($param->signed_at)->toDateString(),
+                'created_at' => Carbon::parse($param->created_at)->toDateTimeString(),
+                'updated_at' => Carbon::parse($param->updated_at)->toDateTimeString(),
+                'receipt_amount' => $param->receipt_amount,
             ];
         }
         ProcurementDeliverie::query()->insert($insert);
 
-        $procurement_delivers=ProcurementDeliverie::query()->where('id','>',$id)->get();
+        $procurement_delivers = ProcurementDeliverie::query()->where('id', '>', $id)->get();
         $dataHandlerService = app(DataHandlerService::class);
         $procurement_delivers_map = $dataHandlerService->dataHeader(['procurement_id'], $procurement_delivers);
-        $sql=DB::raw('SELECT deliver.id id,request.id procurement_id,
+        $sql = DB::raw('SELECT deliver.id id,request.id procurement_id,
 deliver.createtime created_at,deliver.createtime updated_at,purch.acceptnum amount,purch.acceptprice price
 from deliver
 LEFT JOIN purch on deliver.purchid=purch.id
 LEFT JOIN ask on purch.askid=ask.id
 LEFT JOIN request on ask.requestid=request.id
-where purch.islower=1 and deliver.id>'.$id);
-        $params=DB::connection('erp')->select($sql);
-        $insert_=[];
-        foreach ($params as $param){
+where purch.islower=1 and deliver.id>' . $id);
+        $params = DB::connection('erp')->select($sql);
+        $insert_ = [];
+        foreach ($params as $param) {
             $procurement_deliver = $dataHandlerService->getKeyValue(['procurement_id' => $param->procurement_id], $procurement_delivers_map);
             if (!$procurement_deliver) continue;
-            $insert_[$param->procurement_id]=[
-                'procurement_delivery_id'=>$procurement_deliver->id,
-                'account_payable'=>$param->amount*$param->price,
-                'status'=>0,
-                'created_at'=>$param->created_at,
-                'updated_at'=>$param->updated_at,
+            $insert_[$param->procurement_id] = [
+                'procurement_delivery_id' => $procurement_deliver->id,
+                'account_payable' => $param->amount * $param->price,
+                'status' => 0,
+                'created_at' => $param->created_at,
+                'updated_at' => $param->updated_at,
             ];
         }
         ProcurementCheckSheet::query()->insert($insert_);
     }
+
     public function updateProcurementCheckSheet()
     {
-        $pro=ProcurementDeliverie::query()->find(515);
+        $pro = ProcurementDeliverie::query()->find(515);
         $pro->update([
-            'signed_at'=>'2021-04-02',
-            'created_at'=>'2021-04-02 08:34:51',
-            'updated_at'=>'2021-04-02 08:34:51',
+            'signed_at' => '2021-04-02',
+            'created_at' => '2021-04-02 08:34:51',
+            'updated_at' => '2021-04-02 08:34:51',
         ]);
-        $pro=$pro->loadMissing('procurement');
+        $pro = $pro->loadMissing('procurement');
         ProcurementCheckSheet::query()->create([
-            'procurement_delivery_id'=>$pro['id'],
-            'account_payable'=>$pro['procurement']['cost_price']*$pro['receipt_amount'],
-            'created_at'=>$pro['created_at'],
-            'updated_at'=>$pro['updated_at'],
+            'procurement_delivery_id' => $pro['id'],
+            'account_payable' => $pro['procurement']['cost_price'] * $pro['receipt_amount'],
+            'created_at' => $pro['created_at'],
+            'updated_at' => $pro['updated_at'],
         ]);
-        $collect=ProcurementDeliverie::query()->with('procurement')->where('id','>=',517)
-            ->where('id','<=',528)->get();
-        $insert=[];
-
-        foreach ($collect as $item){
-            if ($item['receipt_amount']==0){
-                $receipt_amount=$item['amount'];
-            }else{
-                $receipt_amount=$item['receipt_amount'];
+        $collect = ProcurementDeliverie::query()->with('procurement')->where('id', '>=', 517)
+            ->where('id', '<=', 528)->get();
+        $insert = [];
+
+        foreach ($collect as $item) {
+            if ($item['receipt_amount'] == 0) {
+                $receipt_amount = $item['amount'];
+            } else {
+                $receipt_amount = $item['receipt_amount'];
             }
-            $insert[]=[
-                'procurement_delivery_id'=>$item['id'],
-                'account_payable'=>$item['procurement']['cost_price']*$receipt_amount,
-                'created_at'=>$item['created_at'],
-                'updated_at'=>$item['updated_at'],
+            $insert[] = [
+                'procurement_delivery_id' => $item['id'],
+                'account_payable' => $item['procurement']['cost_price'] * $receipt_amount,
+                'created_at' => $item['created_at'],
+                'updated_at' => $item['updated_at'],
             ];
         }
         ProcurementCheckSheet::query()->insert($insert);
     }
-    public function testPro(){
-        /**@var SupplierService $supplierService*/
-        $supplierService=app(SupplierService::class);
-        $supplier_ids=$supplierService->screenSupplierIds();
+
+    public function testPro()
+    {
+        /**@var SupplierService $supplierService */
+        $supplierService = app(SupplierService::class);
+        $supplier_ids = $supplierService->screenSupplierIds();
 //        $status=0;
 //        $procurements=Procurement::query()
 //            ->withCount('procurementQuotations')
@@ -1308,23 +1356,23 @@ where purch.islower=1 and deliver.id>'.$id);
 //        }
 //        $procurements = $procurements->diffKeys($keys);
 //        dd($procurements);
-        $status=0;//0:待报价,2:待接单
-        $procurements=Procurement::query()
+        $status = 0;//0:待报价,2:待接单
+        $procurements = Procurement::query()
             ->withCount('procurementQuotations')
-            ->with(['ownerMaterial.material','procurementQuotations'])
-            ->where('status',$status)
+            ->with(['ownerMaterial.material', 'procurementQuotations'])
+            ->where('status', $status)
             ->get();
         dd($procurements);
         $keys = [];
-        foreach ($procurements as $key=>$procurement){
-            if ($procurement->procurement_quotations_count>0 ){
-                foreach ($procurement->procurementQuotations as $procurementQuotation){
-                    if (in_array($procurementQuotation->supplier_id,$supplier_ids))$keys[]= $key;
+        foreach ($procurements as $key => $procurement) {
+            if ($procurement->procurement_quotations_count > 0) {
+                foreach ($procurement->procurementQuotations as $procurementQuotation) {
+                    if (in_array($procurementQuotation->supplier_id, $supplier_ids)) $keys[] = $key;
                 }
             }
-            if ($procurement->type==2 && $procurement->supplier_id )$keys[]= $key;
-            if (Carbon::parse($procurement->deadline)->gt(Carbon::now())) $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds();
-            else $procurement->deadline=0;
+            if ($procurement->type == 2 && $procurement->supplier_id) $keys[] = $key;
+            if (Carbon::parse($procurement->deadline)->gt(Carbon::now())) $procurement->deadline = Carbon::parse($procurement->deadline)->diffInMilliseconds();
+            else $procurement->deadline = 0;
         }
         $procurements = $procurements->diffKeys($keys);
         dd($procurements);
@@ -1332,7 +1380,7 @@ where purch.islower=1 and deliver.id>'.$id);
 
     public function pushToWmsWeight()
     {
-        $orderPackages = OrderPackage::query()->where('measuring_machine_id',12)->where('uploaded_to_wms','!=','是')->whereNotNull('weight')->get();
+        $orderPackages = OrderPackage::query()->where('measuring_machine_id', 12)->where('uploaded_to_wms', '!=', '是')->whereNotNull('weight')->get();
         $packageController = new WeightBaseController();
         foreach ($orderPackages as $orderPackage) {
             $packageController->activityWaveNoProcessing($orderPackage);
@@ -1340,13 +1388,12 @@ where purch.islower=1 and deliver.id>'.$id);
     }
 
 
-
     public function syncOrderTracking()
     {
-        $orderNos = ['OSSO21040013','OSSO21040012'];
+        $orderNos = ['OSSO21040013', 'OSSO21040012'];
         $service = new OrderTrackingService();
         $orderHeaderService = new OracleDOCOrderHeaderService();
-        $orderHeaders = $orderHeaderService->getQuery()->whereIn('DOC_Order_Header.SoReference1',$orderNos)->get();
+        $orderHeaders = $orderHeaderService->getQuery()->whereIn('DOC_Order_Header.SoReference1', $orderNos)->get();
         $service->createByWmsOrderHeader($orderHeaders);
         $service->updateByWmsOrderHeaders($orderHeaders);
     }
@@ -1362,9 +1409,9 @@ where purch.islower=1 and deliver.id>'.$id);
 </form>
 TEXT;
         $input = $request->input('boxes');
-        if($input){
-            $input=preg_replace('/[\n\r]/',',',trim($input));
-            $boxes=explode(',',$input);
+        if ($input) {
+            $input = preg_replace('/[\n\r]/', ',', trim($input));
+            $boxes = explode(',', $input);
             dd($boxes);
         }
     }
@@ -1400,25 +1447,25 @@ TEXT;
         $orderService = app(OrderService::class);
         $orderHeaderService = app(OracleDOCOrderHeaderService::class);
 
-        $orderPackages = OrderPackage::query()->selectRaw('count(1) counts,logistic_number')->where('created_at','>=','2020-01-01')->groupBy('logistic_number')->having('counts','>','1')->get();
+        $orderPackages = OrderPackage::query()->selectRaw('count(1) counts,logistic_number')->where('created_at', '>=', '2020-01-01')->groupBy('logistic_number')->having('counts', '>', '1')->get();
 
         $updateParams = [];
         $deleteParams = [];
         foreach ($orderPackages as $orderPackage) {
-            $items = OrderPackage::query()->with('order')->where('logistic_number',$orderPackage['logistic_number'])->with('order')->get();
-            $actAllocationDetails = OracleActAllocationDetails::query()->selectRaw('orderno')->where('PICKTOTRACEID',$orderPackage['logistic_number'])->get();
+            $items = OrderPackage::query()->with('order')->where('logistic_number', $orderPackage['logistic_number'])->with('order')->get();
+            $actAllocationDetails = OracleActAllocationDetails::query()->selectRaw('orderno')->where('PICKTOTRACEID', $orderPackage['logistic_number'])->get();
 
-            $oracleOrderNos = array_unique(data_get($actAllocationDetails,'*.orderno'));
-            $diffOrderNos = array_diff($oracleOrderNos,data_get($items,'*.order.code'));
-            if(count($diffOrderNos) != 0){
-                $orderHeaders = $orderHeaderService->getQuery()->whereIn('DOC_Order_Header.OrderNo',$diffOrderNos)->get();
+            $oracleOrderNos = array_unique(data_get($actAllocationDetails, '*.orderno'));
+            $diffOrderNos = array_diff($oracleOrderNos, data_get($items, '*.order.code'));
+            if (count($diffOrderNos) != 0) {
+                $orderHeaders = $orderHeaderService->getQuery()->whereIn('DOC_Order_Header.OrderNo', $diffOrderNos)->get();
                 $orderService->syncOrderInfo($orderHeaders);
             }
 
-            $items = OrderPackage::query()->with('order')->where('logistic_number',$orderPackage['logistic_number'])->with('order')->get();
-            if($order = Order::query()->whereIn('id',data_get($items,'*.id'))->where('wms_status','!=','订单取消')->first()){
-                $saveOrderPackage = OrderPackage::query()->where('order_id',$order['id'])->where('logistic_number',$orderPackage['logistic_number'])->first();
-            }else{
+            $items = OrderPackage::query()->with('order')->where('logistic_number', $orderPackage['logistic_number'])->with('order')->get();
+            if ($order = Order::query()->whereIn('id', data_get($items, '*.id'))->where('wms_status', '!=', '订单取消')->first()) {
+                $saveOrderPackage = OrderPackage::query()->where('order_id', $order['id'])->where('logistic_number', $orderPackage['logistic_number'])->first();
+            } else {
                 $saveOrderPackage = $items->first();
             }
 
@@ -1438,22 +1485,28 @@ TEXT;
                 $saveOrderPackage['status'] = $item['status'] != '无' ? $item['status'] : $saveOrderPackage['transfer_status'];
                 $saveOrderPackage['uploaded_to_wms'] = $item['uploaded_to_wms'] != '否' ? $item['uploaded_to_wms'] : $saveOrderPackage['uploaded_to_wms'];
             }
-            $orderPackages_filter = $items->filter(function($item)use($saveOrderPackage){
-                if($saveOrderPackage['id'] === $item['id'])return false;
+            $orderPackages_filter = $items->filter(function ($item) use ($saveOrderPackage) {
+                if ($saveOrderPackage['id'] === $item['id']) return false;
                 return true;
             });
-            $ids = $orderPackages_filter->map(function($item){
+            $ids = $orderPackages_filter->map(function ($item) {
                 return $item['id'];
             });
-            LogService::log('order_packages','order_packages_logistic_number_unique_delete',json_encode($orderPackages_filter));
-            OrderPackage::query()->whereIn('id',$ids)->delete();
+            LogService::log('order_packages', 'order_packages_logistic_number_unique_delete', json_encode($orderPackages_filter));
+            OrderPackage::query()->whereIn('id', $ids)->delete();
             $updateParams[] = $saveOrderPackage;
-            $deleteParams[]  = $orderPackages_filter;
+            $deleteParams[] = $orderPackages_filter;
             $saveOrderPackage->save();
         }
         dd('任务完成');
+        dd($updateParams, $deleteParams);
     }
 
+    public function endStationTask()
+    {
+        $stationTask = StationTask::query()->where('id', 711)->first();
+        $stationTask->update(['status' => '完成']);
+    }
 
     public function order_package_exception_type_counting_record_init()
     {
@@ -1463,44 +1516,45 @@ TEXT;
         $service = app('OrderPackageExceptionTypeCountingRecordService');
         $service->updateOrCreate(30);
     }
+
     public function testForeignZhenCang($batches)
     {
 
-        $batches=Batch::query()
+        $batches = Batch::query()
             ->with(['orders.orderCommodities.commodity.barcodes'])
             ->find(111953);
-        $body=[];
-        $body['id']=$batches->code;
+        $body = [];
+        $body['id'] = $batches->code;
         $body['orders'] = [];
-        foreach ($batches->orders as $order){
+        foreach ($batches->orders as $order) {
             $orderArr = [];
-            $orderArr['id']=$order->code??'';
-            $orderArr['createdAt']=Carbon::parse($order->created_at)->toDateTimeString()??'';
+            $orderArr['id'] = $order->code ?? '';
+            $orderArr['createdAt'] = Carbon::parse($order->created_at)->toDateTimeString() ?? '';
             $orderArr['barcodes'] = [];
-            foreach ($order->orderCommodities as $orderCommodity){
-                $barcode=[];
-                $barcode['id']=$orderCommodity->id;
-                $barcode['barcode']=$orderCommodity->commodity ? ($orderCommodity->commodity->barcodes?$orderCommodity->commodity->barcodes->first()['code']:'') : '';
-                $barcode['name']=$orderCommodity->commodity->name??'';
-                $barcode['sku']=$orderCommodity->commodity->sku??'';
-                $barcode['amount']=$orderCommodity->amount??'';
-                $barcode['location']=$orderCommodity->location??'';
-                $orderArr['barcodes'][]=$barcode;
+            foreach ($order->orderCommodities as $orderCommodity) {
+                $barcode = [];
+                $barcode['id'] = $orderCommodity->id;
+                $barcode['barcode'] = $orderCommodity->commodity ? ($orderCommodity->commodity->barcodes ? $orderCommodity->commodity->barcodes->first()['code'] : '') : '';
+                $barcode['name'] = $orderCommodity->commodity->name ?? '';
+                $barcode['sku'] = $orderCommodity->commodity->sku ?? '';
+                $barcode['amount'] = $orderCommodity->amount ?? '';
+                $barcode['location'] = $orderCommodity->location ?? '';
+                $orderArr['barcodes'][] = $barcode;
             }
             $body['orders'][] = $orderArr;
         }
         $response = Http::withHeaders([
             'Host' => 'zc-it.com',
-        ])->post('http://1.116.164.201:8080/api/createBatch',$body);
+        ])->post('http://1.116.164.201:8080/api/createBatch', $body);
         dd(json_decode($response->body()));
     }
 
     public function updateBulk()
     {
-        $orderPackages=OrderPackage::query()->where('measuring_machine_id',16)->get();
-        foreach ($orderPackages as $orderPackage){
+        $orderPackages = OrderPackage::query()->where('measuring_machine_id', 16)->get();
+        foreach ($orderPackages as $orderPackage) {
             $orderPackage->update([
-                'bulk'=>$orderPackage['length']*$orderPackage['width']*$orderPackage['height']
+                'bulk' => $orderPackage['length'] * $orderPackage['width'] * $orderPackage['height']
             ]);
         }
     }
@@ -1518,9 +1572,9 @@ TEXT;
             "printerName" => "打印机5",
         ];
         $post = Http::post("http://127.0.0.1:3000", $content);
-        $body = json_decode($post->body(),true);
-        $body['msg'] = json_decode($body['msg'],true);
-        dd(json_decode($post->body()),$post->body(),$body);
+        $body = json_decode($post->body(), true);
+        $body['msg'] = json_decode($body['msg'], true);
+        dd(json_decode($post->body()), $post->body(), $body);
     }
 
 
@@ -1561,7 +1615,7 @@ TEXT;
          * @var $services OwnerLogisticFeeDetailService
          */
         $services = app('OwnerLogisticFeeDetailService');
-        $result = $services->getDetails('12','2021-05-30','2021-05-31');
+        $result = $services->getDetails('12', '2021-05-30', '2021-05-31', 50);
         dd($result);
     }
 

+ 4 - 4
app/Http/Controllers/WaybillController.php

@@ -53,7 +53,7 @@ class WaybillController extends Controller
      */
     public function index(Request $request,OwnerService $ownerService,LogisticService $logisticService)
     {
-        if(!Gate::allows('运输管理-运单-查询')){ return view("transport.waybill.authorityMenu");  }
+        if(!Gate::allows('运输管理-运单-查询')){ return view("exception.authority");  }
         $paginateParams = $request->input();
         $waybills=app('waybillService')->paginate($request->input());
         return view('transport.waybill.index', [
@@ -68,7 +68,7 @@ class WaybillController extends Controller
 
     public function create(Request $request,OwnerService $ownerService)
     {
-        if(!Gate::allows('运输管理-运单-录入')){ return redirect(url('/'));  }
+        if(!Gate::allows('运输管理-运单-录入')){ return redirect(url('denied'));  }
         $type=$request->type ?? "";
         if ($type==='ZF')$type='直发车';
         if ($type==='ZX')$type='专线';
@@ -77,7 +77,7 @@ class WaybillController extends Controller
 
     public function store(Request $request)
     {
-        if(!Gate::allows('运输管理-运单-录入')){ return redirect(url('/'));  }
+        if(!Gate::allows('运输管理-运单-录入')){ return redirect(url('denied'));  }
         $this->validatorWaybill($request,false)->validate();
         /** @var WaybillService */
         $waybill=app('waybillService')->store($request);
@@ -86,7 +86,7 @@ class WaybillController extends Controller
 
     public function edit($id,LogisticService $logisticService,CarTypeService $carTypeService,UnitService $unitService)
     {
-        if(!Gate::allows('运输管理-编辑')){ return redirect(url('/'));  }
+        //if(!Gate::allows('运输管理-编辑')){ return redirect(url('denied'));  }
         $waybill = app('waybillService')->find($id);
         if ($waybill->order_id){
             /** @var Waybill $waybill */

+ 1 - 1
app/Menu.php

@@ -13,6 +13,6 @@ class Menu extends Model
 
     use ModelTimeFormat;
     protected $fillable=[
-        'name','level', 'parent_id', 'route','sequence',
+        'name','level', 'parent_id', 'route','sequence',"font","font_style"
     ];
 }

+ 8 - 0
app/Observers/OwnerObserver.php

@@ -27,4 +27,12 @@ class OwnerObserver
         }
     }
 
+    public function deleted(Owner $owner)
+    {
+        $owner->load("roles");
+        $owner->roles->each(function ($role){
+            app("RoleService")->clearUserAuthority($role->id,false,true);
+        });
+    }
+
 }

+ 16 - 0
app/Observers/UserWorkGroupObserver.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Observers;
+
+use App\UserWorkGroup;
+
+class UserWorkGroupObserver
+{
+    public function restored(UserWorkGroup $userWorkGroup)
+    {
+        $userWorkGroup->load("roles");
+        $userWorkGroup->roles->each(function ($role){
+            app("RoleService")->clearUserAuthority($role->id,false,false,true);
+        });
+    }
+}

+ 4 - 0
app/Owner.php

@@ -215,4 +215,8 @@ class Owner extends Model
     {
         return $this->hasMany(OwnerSundryFeeDetail::class);
     }
+    public function roles()
+    {   //角色
+        return $this->belongsToMany(Role::class);
+    }
 }

+ 15 - 2
app/Providers/AppServiceProvider.php

@@ -7,8 +7,9 @@ use App\Jobs\LogisticSFSync;
 use App\Jobs\LogisticYDSync;
 use App\Jobs\LogisticYTOSync;
 use App\Jobs\LogisticZopSync;
-use App\LaborCompany;
-use App\Observers\LaborCompanyObserver;
+use App\Observers\OwnerObserver;
+use App\Observers\UserWorkGroupObserver;
+use App\Owner;
 use App\Services\AuthorityService;
 use App\Services\BatchService;
 use App\Services\CacheService;
@@ -110,8 +111,11 @@ use App\Services\WeighExceptedService;
 use App\Services\OrderFreezeService;
 use App\Services\RegionService;
 use App\Services\UserWorkgroupService;
+use App\Services\MenuService;
 use App\Services\DischargeTaskService;
 use App\Services\DeliveryAppointmentService;
+use App\Services\RoleService;
+use App\UserWorkgroup;
 use App\Services\StationCacheShelfGridService;
 use App\Services\weight\GoodScanWeightService;
 use App\Services\weight\HaoChuangWeightService;
@@ -158,6 +162,7 @@ class AppServiceProvider extends ServiceProvider
     public function boot()
     {
         $this->loadingService();
+        $this->registerObserver();
         //
         Schema::defaultStringLength(191);
         Queue::failing(function (JobFailed $event) {
@@ -326,5 +331,13 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('HaoChuangWeightService',HaoChuangWeightService::class);
         app()->singleton('HengLiWeightService',HengLiWeightService::class);
         app()->singleton('InventoryAccountMissionService',InventoryAccountMissionService::class);
+        app()->singleton('MenuService',MenuService::class);
+        app()->singleton('RoleService',RoleService::class);
+    }
+
+    private function registerObserver()
+    {
+        Owner::observe(OwnerObserver::class);
+        UserWorkgroup::observe(UserWorkGroupObserver::class);
     }
 }

+ 9 - 0
app/Role.php

@@ -19,6 +19,15 @@ class Role extends Model
     function authorities(){
         return $this->belongsToMany('App\Authority','authority_role','id_role','id_authority');
     }
+
+    public function owners()
+    {   //货主
+        return $this->belongsToMany(Owner::class);
+    }
+    public function userWorkGroups()
+    {   //工作组
+        return $this->belongsToMany(UserWorkgroup::class,"role_user_work_group","role_id","user_work_group_id");
+    }
     function laborCompanies(){
         return $this->belongsToMany('App\LaborCompany','role_labor_company','role_id','labor_company_id');
     }

+ 87 - 0
app/Services/AuthorityService.php

@@ -7,8 +7,12 @@ namespace App\Services;
 use App\Authority;
 use App\Role;
 use Exception;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use App\Traits\ServiceAppAop;
+use Illuminate\Support\Facades\DB;
 
 
 class AuthorityService
@@ -41,4 +45,87 @@ class AuthorityService
 //        }
 //        return $roles;
 //    }
+
+    public function getUserAuthority()
+    {
+        $key = "authorities:user_".Auth::id();
+        $isAdmin = array_search(Auth::user()["name"],config("users.superAdmin"))!==false;
+        $tag = $isAdmin ? "authorities:admin" : "authorities:user";
+        if (!Cache::tags($tag)->has($key)){
+            if ($isAdmin) Cache::tags("authorities:admin")->forever($key,Authority::query()->get());
+            else Cache::tags("authorities:user")->forever($key,Authority::query()->whereHas("roles",function (Builder $query){
+                $query->whereHas("users",function (Builder $query){
+                    $query->where(DB::raw("users.id"),Auth::id());
+                });
+            })->get());
+        }
+        return Cache::tags($tag)->get($key);
+    }
+
+    public function removeAdminAuth()
+    {
+        Cache::tags("authorities:admin")->flush();
+    }
+
+    public function removeAllAuth()
+    {
+        Cache::tags("authorities:admin")->flush();
+        Cache::tags("authorities:user")->flush();
+    }
+
+    /**
+     * 格式化为树状结构
+     *
+     * @param Collection $authorities
+     * @return array
+     */
+    public function format($authorities)
+    {
+        $authMap = [];
+        foreach ($authorities as $authority){
+            $item = $authority->toArray();
+            $item["child"] = [];
+            $authMap[$authority->id] = $item;
+        }
+
+        foreach ($authorities as $authority){
+            if ($authority->parent_id){
+                if (!isset($authMap[$authority->parent_id])){
+                    $authTem = $this->formatAuthority($authMap,$authMap[$authority->id]);
+                    if ($authTem)$authMap = $authTem;
+                } else $authMap[$authority->parent_id]["child"][] = $authMap[$authority->id];
+                unset($authMap[$authority->id]);
+            }
+        }
+        return $authMap;
+    }
+
+
+    /**
+     * 递归格式化权限组
+     *
+     * @param array $authMap
+     * @param array $authorities
+     *
+     * @return array|bool
+     */
+    private function formatAuthority(array $authMap,array $authorities)
+    {
+        foreach ($authMap as $index=>$data){
+            if ($data["id"]==$authorities["parent_id"]){
+                $authMap[$index]["child"][] = $authorities;
+                unset($authMap[$authorities["id"]]);
+                return $authMap;
+            }else{
+                if ($authMap[$index]["child"]){
+                    $re = $this->formatAuthority($authMap[$index]["child"],$authorities);
+                    if ($re){
+                        $authMap[$index]["child"] = $re;
+                        return $authMap;
+                    }
+                }
+            }
+        }
+        return false;
+    }
 }

+ 127 - 0
app/Services/MenuService.php

@@ -0,0 +1,127 @@
+<?php 
+
+namespace App\Services;
+
+use App\Authority;
+use App\Traits\ServiceAppAop;
+use App\Menu;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Cache;
+
+class MenuService
+{
+    use ServiceAppAop;
+    protected $modelClass=Menu::class;
+
+    public function getMenu()
+    {
+        if (!Cache::has("menus")){
+            if (Cache::lock("menus",2)){
+                $this->setMenu();
+                Cache::lock("menus")->release();
+            }else{
+                sleep(1);
+                return Cache::get("menus") ?? [];
+            }
+        }
+        return Cache::get("menus");
+    }
+
+    public function setMenu()
+    {
+        //如果需要热更新 为所有用户个人菜单锁定缓存 标记TAGS 在此清除 Cache::tag("tags")->flush()
+        Cache::forever("menus",Menu::query()
+            ->select("id","name","parent_id","route","font","font_style")
+            ->orderByRaw("level DESC,sequence")->get());
+    }
+
+    public function appendMenu(Menu $menu)
+    {
+        $menus = $this->getMenu();
+        if ($menus){
+            $menus->add($menu);
+            Cache::forever("menus",$menus);
+        }
+    }
+
+    //菜单与权限关联依据为 name与parent_id字段 当两个表中任意此字段发生变更 必须刷掉缓存
+    public function getVisibleFunctionList($authorities = null,&$mapping = [])
+    {
+        /** @var Collection $authorities */
+        if (!$authorities)$authorities = app("AuthorityService")->getUserAuthority();
+        $authMap = app("AuthorityService")->format($authorities);
+        $menus = $this->format($this->getMenu());
+        return array_values($this->formatMenu($menus,$authMap,$mapping));
+    }
+
+
+    /**
+     * 格式化为树状结构
+     *
+     * @param Collection $menus
+     * @return array
+     */
+    public function format($menus)
+    {
+        $menuMap = [];
+        foreach ($menus as $menu){
+            $menuMap[$menu->id] = [
+                "id" => $menu->id,
+                "child" => [],
+                "name"  => $menu->name,
+                "font"  => $menu->font,
+                "fontStyle"  => $menu->font_style,
+                "route" => $menu->route,
+            ];
+        }
+        foreach ($menus as $menu){
+            if ($menu->parent_id){
+                $menuMap[$menu->parent_id]["child"][] = $menuMap[$menu->id];
+                unset($menuMap[$menu->id]);
+            }
+        }
+        return $menuMap;
+    }
+    /**
+     * 递归格式化菜单组
+     *
+     * @param array $menus
+     * @param array $authorities
+     * @param array $mapping
+     *
+     * @return array|bool
+     */
+    private function formatMenu(array $menus,array $authorities,&$mapping=[])
+    {
+        foreach ($menus as $index=>$menu){
+            $mark = false;
+            foreach ($authorities as $j=>$authority){
+                if ($menu["name"] == $authority["name"]){
+                    $mapping[$menu["id"]] = $authority["id"];
+                    $mark = true;
+                    $authorities[$j]["mark"] = true;
+                    if ($authority["child"])$menus[$index]["child"] = array_values($this->formatMenu($menu["child"],$authority["child"],$mapping));
+                }
+            }
+            if (!$mark)unset($menus[$index]);
+        }
+        foreach ($authorities as $authority){
+            if (!isset($authority["mark"])){
+                $menus[] = [
+                    "name" => $authority["name"],
+                    "route" => "",
+                ];
+            }
+        }
+        return $menus;
+    }
+
+    /**
+     * 获取菜单与权限映射
+     */
+    public function getMenuAndAuthorityMapping()
+    {
+        $this->getVisibleFunctionList(Authority::query()->get(),$mapping);
+        return $mapping;
+    }
+}

+ 33 - 0
app/Services/RoleService.php

@@ -0,0 +1,33 @@
+<?php 
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\Role;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
+
+class RoleService
+{
+    use ServiceAppAop;
+    protected $modelClass=Role::class;
+
+
+    /**
+     * 清除角色对应的用户权限
+     *
+     * @param integer $roleId
+     * @param bool $isAuthority
+     * @param bool $isOwner
+     * @param bool $isUserWorkGroup
+     */
+    public function clearUserAuthority($roleId,bool $isAuthority = true,bool $isOwner = false,bool $isUserWorkGroup = false)
+    {
+        $ids = array_column(DB::select(DB::raw("SELECT id_user FROM user_role WHERE id_role = ?"),[$roleId]),"id_user");
+        foreach ($ids as $id){
+            if ($isAuthority)Cache::forget("authorities:user_".$id);
+            if ($isOwner)Cache::forget("owners:user_".$id);
+            if ($isUserWorkGroup)Cache::forget("userWorkGroups:user_".$id);
+        }
+    }
+}

+ 71 - 0
app/Services/UserService.php

@@ -7,7 +7,10 @@ namespace App\Services;
 use App\Authority;
 use App\Owner;
 use App\User;
+use App\UserWorkgroup;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use App\Traits\ServiceAppAop;
 
@@ -34,4 +37,72 @@ class UserService
             return $user->getPermittingOwnerIdsAttribute() ?? [];
         })??[];
     }
+
+
+    /**
+     * 检查用户的管理员身份
+     *
+     * @param integer $userId
+     *
+     * @return bool
+     */
+    private function checkAdminIdentity($userId):bool
+    {
+        if ($userId == Auth::id())return array_search(Auth::user()["name"],config("users.superAdmin"))!==false;
+        /** @var User|\stdClass $user */
+        $user = User::query()->select("name")->find($userId);
+        if (!$user)return false;
+        return array_search($user->name,config("users.superAdmin"))!==false;
+    }
+    /**
+     * @param integer|null $userId
+     *
+     * @return array
+     */
+    public function getUserHasOwners($userId = null)
+    {
+        if (!$userId)$userId = Auth::id();
+        $key = "owners:user_".$userId;
+        if (!Cache::has($key)){
+            if ($this->checkAdminIdentity($userId))Cache::forever($key,array_column(Owner::query()->select("id")->whereNull("deleted_at")->get()->toArray(),"id"));
+            else{
+                $owners = [];
+                /** @var User|\stdClass $user */
+                $user = new User();
+                $user->id = $userId;
+                $user->load("roles.owners");
+                $user->roles->each(function ($role)use (&$owners){
+                    $owners = array_merge($owners,array_column($role->owners->toArray(),"id"));
+                });
+                Cache::forever($key,$owners);
+            }
+        }
+        return Cache::get($key);
+    }
+
+    /**
+     * @param integer|null $userId
+     *
+     * @return array
+     */
+    public function getUserHasUserWorkGroups($userId = null)
+    {
+        if (!$userId)$userId = Auth::id();
+        $key = "userWorkGroups:user_".$userId;
+        if (!Cache::has($key)){
+            if ($this->checkAdminIdentity($userId))Cache::forever($key,array_column(UserWorkgroup::query()->select("id")->get()->toArray(),"id"));
+            else{
+                $userWorkGroups = [];
+                /** @var User|\stdClass $user */
+                $user = new User();
+                $user->id = $userId;
+                $user->load("roles.userWorkGroups");
+                $user->roles->each(function ($role)use (&$userWorkGroups){
+                    $userWorkGroups = array_merge($userWorkGroups,array_column($role->userWorkGroups->toArray(),"id"));
+                });
+                Cache::forever($key,$userWorkGroups);
+            }
+        }
+        return Cache::get($key);
+    }
 }

+ 8 - 4
app/User.php

@@ -8,6 +8,7 @@ use Illuminate\Notifications\Notifiable;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use App\Traits\ModelTimeFormat;
 
@@ -118,11 +119,12 @@ class User extends Authenticatable
             });
             return $ownerIds;
         }
-        $this->authorities()->each(function(Authority $authority)use(&$ownerIds){
+        return array_column(DB::table("owner_role")->whereIn("role_id",array_column($this->roles->toArray(),"id"))->get()->toArray(),"owner_id");
+        /*$this->authorities()->each(function(Authority $authority)use(&$ownerIds){
             $ownerId=$authority->getOwnerIdAttribute();
             if($ownerId){array_push($ownerIds,$ownerId);}
         });
-        return array_unique($ownerIds);
+        return array_unique($ownerIds);*/
     }
     function getPermittingWorkgroupIds($allowAll=false){
         $workgroupIds=[];
@@ -132,9 +134,11 @@ class User extends Authenticatable
                 array_push($workgroupIds,$workgroup['id']);
             });
         }else{
-            $this->authorities()->each(function(Authority $authority)use(&$workgroupIds){
+            $workgroupIds = array_column(DB::table("role_user_work_group")
+                ->whereIn("role_id",array_column($this->roles->toArray(),"id"))->get()->toArray(),"user_work_group_id");
+            /*$this->authorities()->each(function(Authority $authority)use(&$workgroupIds){
                 if($authority->type=="工作组"){array_push($workgroupIds,$authority->relevance);}
-            });
+            });*/
         }
         return $workgroupIds;
     }

+ 4 - 0
app/UserWorkgroup.php

@@ -18,6 +18,10 @@ class UserWorkgroup extends Model
         'token','isNeedRemark',
     ];
 
+    public function roles()
+    {   //角色
+        return $this->belongsToMany(Role::class,"role_user_work_group","user_work_group_id","role_id");
+    }
     public function users(){
         return $this->belongsToMany('App\User','user_workgroup_user','user_workgroup_id','user_id');
     }

+ 0 - 5
database/migrations/2020_03_09_132100_add_store_transfer_authority.php

@@ -15,11 +15,6 @@ class AddStoreTransferAuthority extends Migration
         '入库管理-快速入库-录入',
         '入库管理-快速入库-编辑',
         '入库管理-快速入库-删除',
-        '仓库管理',
-        '仓库管理-查询',
-        '仓库管理-录入',
-        '仓库管理-编辑',
-        '仓库管理-删除',
     ];
 
     /**

+ 0 - 2
database/migrations/2020_12_12_093011_change_authorities_order_assign.php

@@ -11,10 +11,8 @@ class ChangeAuthoritiesOrderAssign extends Migration
     protected $changeNames=[
 
         ["指定分配","订单管理-指定分配"],
-        ["指定分配-查询"],
         ["指定分配-编辑","订单管理-指定分配-编辑"],
         ["商品配置","订单管理-指定分配"],
-        ["商品配置-查询"],
         ["商品配置-编辑","订单管理-指定分配-编辑"],
     ];
     /**

+ 34 - 0
database/migrations/2021_04_27_104357_change_menus_table_add_font_column.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeMenusTableAddFontColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('menus', function (Blueprint $table) {
+            $table->string("font")->nullable()->comment("font图标");
+            $table->string("font_style")->nullable()->comment("font图标样式");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('menus', function (Blueprint $table) {
+            $table->dropColumn("font");
+            $table->dropColumn("font_style");
+        });
+    }
+}

+ 54 - 0
database/migrations/2021_05_08_143922_change_authority_table_deleted_at_column.php

@@ -0,0 +1,54 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeAuthorityTableDeletedAtColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table("authorities",function (Blueprint $table){
+            $table->timestamp("deleted_at")->nullable()->comment("软删除");
+            $table->dropUnique("authorities_name_unique");
+            $table->unique("alias_name");
+            $table->renameColumn("id_parent","parent_id");
+            $table->dropColumn("remark");
+            $table->dropColumn("type");
+            $table->dropColumn("relevance");
+        });
+        Schema::create("owner_role",function (Blueprint $table){
+            $table->bigInteger("owner_id");
+            $table->bigInteger("role_id");
+        });
+        Schema::create("role_user_work_group",function (Blueprint $table){
+            $table->bigInteger("role_id");
+            $table->bigInteger("user_work_group_id");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table("authorities",function (Blueprint $table){
+            $table->dropColumn("deleted_at");
+            $table->unique("name");
+            $table->dropUnique("authorities_alias_name_unique");
+            $table->renameColumn("parent_id","id_parent");
+            $table->string("remark")->nullable()->comment("备注");
+            $table->enum('type',['通用','工作组','货主'])->default('通用')->comment('类别');
+            $table->bigInteger('relevance')->nullable()->comment('外键类型关联表');
+        });
+        Schema::drop("owner_role");
+        Schema::drop("role_user_work_group");
+    }
+}

+ 10 - 5
package-lock.json

@@ -1801,7 +1801,7 @@
     },
     "babel-runtime": {
       "version": "6.26.0",
-      "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
       "requires": {
         "core-js": "^2.4.0",
@@ -3161,13 +3161,13 @@
     },
     "cyclist": {
       "version": "1.0.1",
-      "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
       "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
       "dev": true
     },
     "davidshimjs-qrcodejs": {
       "version": "0.0.2",
-      "resolved": "https://registry.npm.taobao.org/davidshimjs-qrcodejs/download/davidshimjs-qrcodejs-0.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/davidshimjs-qrcodejs/-/davidshimjs-qrcodejs-0.0.2.tgz",
       "integrity": "sha1-LrRCpElWcQed9/eCDM/nT0Wp3sA="
     },
     "de-indent": {
@@ -4818,6 +4818,11 @@
         "micromatch": "^3.1.10"
       }
     },
+    "http-vue-loader": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npm.taobao.org/http-vue-loader/download/http-vue-loader-1.4.2.tgz",
+      "integrity": "sha1-mOjDME9cE1GFjqymDF2Av2okQZY="
+    },
     "https-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
@@ -5436,7 +5441,7 @@
     },
     "jquery.cookie": {
       "version": "1.4.1",
-      "resolved": "https://registry.npm.taobao.org/jquery.cookie/download/jquery.cookie-1.4.1.tgz",
+      "resolved": "https://registry.npmjs.org/jquery.cookie/-/jquery.cookie-1.4.1.tgz",
       "integrity": "sha1-1j3OIJ6raR/mMxbbCMqeR+D5OFs="
     },
     "js-cookie": {
@@ -6253,7 +6258,7 @@
     },
     "normalize-wheel": {
       "version": "1.0.1",
-      "resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
       "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
     },
     "npm-run-path": {

+ 1 - 0
package.json

@@ -29,6 +29,7 @@
     "davidshimjs-qrcodejs": "0.0.2",
     "echarts": "^4.9.0",
     "element-ui": "^2.14.1",
+    "http-vue-loader": "^1.4.2",
     "html2canvas": "^1.0.0-rc.7",
     "jquery.cookie": "^1.4.1",
     "js-cookie": "^2.2.1",

+ 1 - 0
resources/js/app.js

@@ -11,4 +11,5 @@ window.scanner=require('./utilities/scanner');
 window.datetimeRelating=require('./utilities/datetimeRelating');
 window.Vue.use(window.ElementUI);
 require('bootstrap-select');
+window.Vue.use(require('http-vue-loader'));
 

+ 922 - 0
resources/js/utilities/icons.json

@@ -0,0 +1,922 @@
+[
+  "fa-address-book",
+  "fa-address-book-o",
+  "fa-address-card",
+  "fa-address-card-o",
+  "fa-adjust",
+  "fa-american-sign-language-interpreting",
+  "fa-anchor",
+  "fa-archive",
+  "fa-area-chart",
+  "fa-arrows",
+  "fa-arrows-h",
+  "fa-arrows-v",
+  "fa-asl-interpreting",
+  "fa-assistive-listening-systems",
+  "fa-asterisk",
+  "fa-at",
+  "fa-audio-description",
+  "fa-automobile",
+  "fa-balance-scale",
+  "fa-ban",
+  "fa-bank",
+  "fa-bar-chart",
+  "fa-bar-chart-o",
+  "fa-barcode",
+  "fa-bars",
+  "fa-bath",
+  "fa-bathtub",
+  "fa-battery",
+  "fa-battery-0",
+  "fa-battery-1",
+  "fa-battery-2",
+  "fa-battery-3",
+  "fa-battery-4",
+  "fa-battery-empty",
+  "fa-battery-full",
+  "fa-battery-half",
+  "fa-battery-quarter",
+  "fa-battery-three-quarters",
+  "fa-bed",
+  "fa-beer",
+  "fa-bell",
+  "fa-bell-o",
+  "fa-bell-slash",
+  "fa-bell-slash-o",
+  "fa-bicycle",
+  "fa-binoculars",
+  "fa-birthday-cake",
+  "fa-blind",
+  "fa-bluetooth",
+  "fa-bluetooth-b",
+  "fa-bolt",
+  "fa-bomb",
+  "fa-book",
+  "fa-bookmark",
+  "fa-bookmark-o",
+  "fa-braille",
+  "fa-briefcase",
+  "fa-bug",
+  "fa-building",
+  "fa-building-o",
+  "fa-bullhorn",
+  "fa-bullseye",
+  "fa-bus",
+  "fa-cab",
+  "fa-calculator",
+  "fa-calendar",
+  "fa-calendar-check-o",
+  "fa-calendar-minus-o",
+  "fa-calendar-o",
+  "fa-calendar-plus-o",
+  "fa-calendar-times-o",
+  "fa-camera",
+  "fa-camera-retro",
+  "fa-car",
+  "fa-caret-square-o-down",
+  "fa-caret-square-o-left",
+  "fa-caret-square-o-right",
+  "fa-caret-square-o-up",
+  "fa-cart-arrow-down",
+  "fa-cart-plus",
+  "fa-cc",
+  "fa-certificate",
+  "fa-check",
+  "fa-check-circle",
+  "fa-check-circle-o",
+  "fa-check-square",
+  "fa-check-square-o",
+  "fa-child",
+  "fa-circle",
+  "fa-circle-o",
+  "fa-circle-o-notch",
+  "fa-circle-thin",
+  "fa-clock-o",
+  "fa-clone",
+  "fa-close",
+  "fa-cloud",
+  "fa-cloud-download",
+  "fa-cloud-upload",
+  "fa-code",
+  "fa-code-fork",
+  "fa-coffee",
+  "fa-cog",
+  "fa-cogs",
+  "fa-comment",
+  "fa-comment-o",
+  "fa-commenting",
+  "fa-commenting-o",
+  "fa-comments",
+  "fa-comments-o",
+  "fa-compass",
+  "fa-copyright",
+  "fa-creative-commons",
+  "fa-credit-card",
+  "fa-credit-card-alt",
+  "fa-crop",
+  "fa-crosshairs",
+  "fa-cube",
+  "fa-cubes",
+  "fa-cutlery",
+  "fa-dashboard",
+  "fa-database",
+  "fa-deaf",
+  "fa-deafness",
+  "fa-desktop",
+  "fa-diamond",
+  "fa-dot-circle-o",
+  "fa-download",
+  "fa-drivers-license",
+  "fa-drivers-license-o",
+  "fa-edit",
+  "fa-ellipsis-h",
+  "fa-ellipsis-v",
+  "fa-envelope",
+  "fa-envelope-o",
+  "fa-envelope-open",
+  "fa-envelope-open-o",
+  "fa-envelope-square",
+  "fa-eraser",
+  "fa-exchange",
+  "fa-exclamation",
+  "fa-exclamation-circle",
+  "fa-exclamation-triangle",
+  "fa-external-link",
+  "fa-external-link-square",
+  "fa-eye",
+  "fa-eye-slash",
+  "fa-eyedropper",
+  "fa-fax",
+  "fa-feed",
+  "fa-female",
+  "fa-fighter-jet",
+  "fa-file-archive-o",
+  "fa-file-audio-o",
+  "fa-file-code-o",
+  "fa-file-excel-o",
+  "fa-file-image-o",
+  "fa-file-movie-o",
+  "fa-file-pdf-o",
+  "fa-file-photo-o",
+  "fa-file-picture-o",
+  "fa-file-powerpoint-o",
+  "fa-file-sound-o",
+  "fa-file-video-o",
+  "fa-file-word-o",
+  "fa-file-zip-o",
+  "fa-film",
+  "fa-filter",
+  "fa-fire",
+  "fa-fire-extinguisher",
+  "fa-flag",
+  "fa-flag-checkered",
+  "fa-flag-o",
+  "fa-flash",
+  "fa-flask",
+  "fa-folder",
+  "fa-folder-o",
+  "fa-folder-open",
+  "fa-folder-open-o",
+  "fa-frown-o",
+  "fa-futbol-o",
+  "fa-gamepad",
+  "fa-gavel",
+  "fa-gear",
+  "fa-gears",
+  "fa-gift",
+  "fa-glass",
+  "fa-globe",
+  "fa-graduation-cap",
+  "fa-group",
+  "fa-hand-grab-o",
+  "fa-hand-lizard-o",
+  "fa-hand-paper-o",
+  "fa-hand-peace-o",
+  "fa-hand-pointer-o",
+  "fa-hand-rock-o",
+  "fa-hand-scissors-o",
+  "fa-hand-spock-o",
+  "fa-hand-stop-o",
+  "fa-handshake-o",
+  "fa-hard-of-hearing",
+  "fa-hashtag",
+  "fa-hdd-o",
+  "fa-headphones",
+  "fa-heart",
+  "fa-heart-o",
+  "fa-heartbeat",
+  "fa-history",
+  "fa-home",
+  "fa-hotel",
+  "fa-hourglass",
+  "fa-hourglass-1",
+  "fa-hourglass-2",
+  "fa-hourglass-3",
+  "fa-hourglass-end",
+  "fa-hourglass-half",
+  "fa-hourglass-o",
+  "fa-hourglass-start",
+  "fa-i-cursor",
+  "fa-id-badge",
+  "fa-id-card",
+  "fa-id-card-o",
+  "fa-image",
+  "fa-inbox",
+  "fa-industry",
+  "fa-info",
+  "fa-info-circle",
+  "fa-institution",
+  "fa-key",
+  "fa-keyboard-o",
+  "fa-language",
+  "fa-laptop",
+  "fa-leaf",
+  "fa-legal",
+  "fa-lemon-o",
+  "fa-level-down",
+  "fa-level-up",
+  "fa-life-bouy",
+  "fa-life-buoy",
+  "fa-life-ring",
+  "fa-life-saver",
+  "fa-lightbulb-o",
+  "fa-line-chart",
+  "fa-location-arrow",
+  "fa-lock",
+  "fa-low-vision",
+  "fa-magic",
+  "fa-magnet",
+  "fa-mail-forward",
+  "fa-mail-reply",
+  "fa-mail-reply-all",
+  "fa-male",
+  "fa-map",
+  "fa-map-marker",
+  "fa-map-o",
+  "fa-map-pin",
+  "fa-map-signs",
+  "fa-meh-o",
+  "fa-microchip",
+  "fa-microphone",
+  "fa-microphone-slash",
+  "fa-minus",
+  "fa-minus-circle",
+  "fa-minus-square",
+  "fa-minus-square-o",
+  "fa-mobile",
+  "fa-mobile-phone",
+  "fa-money",
+  "fa-moon-o",
+  "fa-mortar-board",
+  "fa-motorcycle",
+  "fa-mouse-pointer",
+  "fa-music",
+  "fa-navicon",
+  "fa-newspaper-o",
+  "fa-object-group",
+  "fa-object-ungroup",
+  "fa-paint-brush",
+  "fa-paper-plane",
+  "fa-paper-plane-o",
+  "fa-paw",
+  "fa-pencil",
+  "fa-pencil-square",
+  "fa-pencil-square-o",
+  "fa-percent",
+  "fa-phone",
+  "fa-phone-square",
+  "fa-photo",
+  "fa-picture-o",
+  "fa-pie-chart",
+  "fa-plane",
+  "fa-plug",
+  "fa-plus",
+  "fa-plus-circle",
+  "fa-plus-square",
+  "fa-plus-square-o",
+  "fa-podcast",
+  "fa-power-off",
+  "fa-print",
+  "fa-puzzle-piece",
+  "fa-qrcode",
+  "fa-question",
+  "fa-question-circle",
+  "fa-question-circle-o",
+  "fa-quote-left",
+  "fa-quote-right",
+  "fa-random",
+  "fa-recycle",
+  "fa-refresh",
+  "fa-registered",
+  "fa-remove",
+  "fa-reorder",
+  "fa-reply",
+  "fa-reply-all",
+  "fa-retweet",
+  "fa-road",
+  "fa-rocket",
+  "fa-rss",
+  "fa-rss-square",
+  "fa-s15",
+  "fa-search",
+  "fa-search-minus",
+  "fa-search-plus",
+  "fa-send",
+  "fa-send-o",
+  "fa-server",
+  "fa-share",
+  "fa-share-alt",
+  "fa-share-alt-square",
+  "fa-share-square",
+  "fa-share-square-o",
+  "fa-shield",
+  "fa-ship",
+  "fa-shopping-bag",
+  "fa-shopping-basket",
+  "fa-shopping-cart",
+  "fa-shower",
+  "fa-sign-in",
+  "fa-sign-language",
+  "fa-sign-out",
+  "fa-signal",
+  "fa-signing",
+  "fa-sitemap",
+  "fa-sliders",
+  "fa-smile-o",
+  "fa-snowflake-o",
+  "fa-soccer-ball-o",
+  "fa-sort",
+  "fa-sort-alpha-asc",
+  "fa-sort-alpha-desc",
+  "fa-sort-amount-asc",
+  "fa-sort-amount-desc",
+  "fa-sort-asc",
+  "fa-sort-desc",
+  "fa-sort-down",
+  "fa-sort-numeric-asc",
+  "fa-sort-numeric-desc",
+  "fa-sort-up",
+  "fa-space-shuttle",
+  "fa-spinner",
+  "fa-spoon",
+  "fa-square",
+  "fa-square-o",
+  "fa-star",
+  "fa-star-half",
+  "fa-star-half-empty",
+  "fa-star-half-full",
+  "fa-star-half-o",
+  "fa-star-o",
+  "fa-sticky-note",
+  "fa-sticky-note-o",
+  "fa-street-view",
+  "fa-suitcase",
+  "fa-sun-o",
+  "fa-support",
+  "fa-tablet",
+  "fa-tachometer",
+  "fa-tag",
+  "fa-tags",
+  "fa-tasks",
+  "fa-taxi",
+  "fa-television",
+  "fa-terminal",
+  "fa-thermometer",
+  "fa-thermometer-0",
+  "fa-thermometer-1",
+  "fa-thermometer-2",
+  "fa-thermometer-3",
+  "fa-thermometer-4",
+  "fa-thermometer-empty",
+  "fa-thermometer-full",
+  "fa-thermometer-half",
+  "fa-thermometer-quarter",
+  "fa-thermometer-three-quarters",
+  "fa-thumb-tack",
+  "fa-thumbs-down",
+  "fa-thumbs-o-down",
+  "fa-thumbs-o-up",
+  "fa-thumbs-up",
+  "fa-ticket",
+  "fa-times",
+  "fa-times-circle",
+  "fa-times-circle-o",
+  "fa-times-rectangle",
+  "fa-times-rectangle-o",
+  "fa-tint",
+  "fa-toggle-down",
+  "fa-toggle-left",
+  "fa-toggle-off",
+  "fa-toggle-on",
+  "fa-toggle-right",
+  "fa-toggle-up",
+  "fa-trademark",
+  "fa-trash",
+  "fa-trash-o",
+  "fa-tree",
+  "fa-trophy",
+  "fa-truck",
+  "fa-tty",
+  "fa-tv",
+  "fa-umbrella",
+  "fa-universal-access",
+  "fa-university",
+  "fa-unlock",
+  "fa-unlock-alt",
+  "fa-unsorted",
+  "fa-upload",
+  "fa-user",
+  "fa-user-circle",
+  "fa-user-circle-o",
+  "fa-user-o",
+  "fa-user-plus",
+  "fa-user-secret",
+  "fa-user-times",
+  "fa-users",
+  "fa-vcard",
+  "fa-vcard-o",
+  "fa-video-camera",
+  "fa-volume-control-phone",
+  "fa-volume-down",
+  "fa-volume-off",
+  "fa-volume-up",
+  "fa-warning",
+  "fa-wheelchair",
+  "fa-wheelchair-alt",
+  "fa-wifi",
+  "fa-window-close",
+  "fa-window-close-o",
+  "fa-window-maximize",
+  "fa-window-minimize",
+  "fa-window-restore",
+  "fa-wrench",
+  "fa-hand-grab-o",
+  "fa-hand-lizard-o",
+  "fa-hand-o-down",
+  "fa-hand-o-left",
+  "fa-hand-o-right",
+  "fa-hand-o-up",
+  "fa-hand-paper-o",
+  "fa-hand-peace-o",
+  "fa-hand-pointer-o",
+  "fa-hand-rock-o",
+  "fa-hand-scissors-o",
+  "fa-hand-spock-o",
+  "fa-hand-stop-o",
+  "fa-thumbs-down",
+  "fa-thumbs-o-down",
+  "fa-thumbs-o-up",
+  "fa-thumbs-up",
+  "fa-american-sign-language-interpreting",
+  "fa-asl-interpreting",
+  "fa-assistive-listening-systems",
+  "fa-audio-description",
+  "fa-blind",
+  "fa-braille",
+  "fa-cc",
+  "fa-deaf",
+  "fa-deafness",
+  "fa-hard-of-hearing",
+  "fa-low-vision",
+  "fa-question-circle-o",
+  "fa-sign-language",
+  "fa-signing",
+  "fa-tty",
+  "fa-universal-access",
+  "fa-volume-control-phone",
+  "fa-wheelchair",
+  "fa-wheelchair-alt",
+  "fa-ambulance",
+  "fa-automobile",
+  "fa-bicycle",
+  "fa-bus",
+  "fa-cab",
+  "fa-car",
+  "fa-fighter-jet",
+  "fa-motorcycle",
+  "fa-plane",
+  "fa-rocket",
+  "fa-ship",
+  "fa-space-shuttle",
+  "fa-subway",
+  "fa-taxi",
+  "fa-train",
+  "fa-truck",
+  "fa-wheelchair",
+  "fa-wheelchair-alt",
+  "fa-genderless",
+  "fa-intersex",
+  "fa-mars",
+  "fa-mars-double",
+  "fa-mars-stroke",
+  "fa-mars-stroke-h",
+  "fa-mars-stroke-v",
+  "fa-mercury",
+  "fa-neuter",
+  "fa-transgender",
+  "fa-transgender-alt",
+  "fa-venus",
+  "fa-venus-double",
+  "fa-venus-mars",
+  "fa-file",
+  "fa-file-archive-o",
+  "fa-file-audio-o",
+  "fa-file-code-o",
+  "fa-file-excel-o",
+  "fa-file-image-o",
+  "fa-file-movie-o",
+  "fa-file-o",
+  "fa-file-pdf-o",
+  "fa-file-photo-o",
+  "fa-file-picture-o",
+  "fa-file-powerpoint-o",
+  "fa-file-sound-o",
+  "fa-file-text",
+  "fa-file-text-o",
+  "fa-file-video-o",
+  "fa-file-word-o",
+  "fa-file-zip-o",
+  "fa-circle-o-notch",
+  "fa-cog",
+  "fa-gear",
+  "fa-refresh",
+  "fa-spinner",
+  "fa-check-square",
+  "fa-check-square-o",
+  "fa-circle",
+  "fa-circle-o",
+  "fa-dot-circle-o",
+  "fa-minus-square",
+  "fa-minus-square-o",
+  "fa-plus-square",
+  "fa-plus-square-o",
+  "fa-square",
+  "fa-square-o",
+  "fa-cc-amex",
+  "fa-cc-diners-club",
+  "fa-cc-discover",
+  "fa-cc-jcb",
+  "fa-cc-mastercard",
+  "fa-cc-paypal",
+  "fa-cc-stripe",
+  "fa-cc-visa",
+  "fa-credit-card",
+  "fa-credit-card-alt",
+  "fa-google-wallet",
+  "fa-paypal",
+  "fa-area-chart",
+  "fa-bar-chart",
+  "fa-bar-chart-o",
+  "fa-line-chart",
+  "fa-pie-chart",
+  "fa-bitcoin",
+  "fa-btc",
+  "fa-cny",
+  "fa-dollar",
+  "fa-eur",
+  "fa-euro",
+  "fa-gbp",
+  "fa-gg",
+  "fa-gg-circle",
+  "fa-ils",
+  "fa-inr",
+  "fa-jpy",
+  "fa-krw",
+  "fa-money",
+  "fa-rmb",
+  "fa-rouble",
+  "fa-rub",
+  "fa-ruble",
+  "fa-rupee",
+  "fa-shekel",
+  "fa-sheqel",
+  "fa-try",
+  "fa-turkish-lira",
+  "fa-usd",
+  "fa-won",
+  "fa-yen",
+  "fa-align-center",
+  "fa-align-justify",
+  "fa-align-left",
+  "fa-align-right",
+  "fa-bold",
+  "fa-chain",
+  "fa-chain-broken",
+  "fa-clipboard",
+  "fa-columns",
+  "fa-copy",
+  "fa-cut",
+  "fa-dedent",
+  "fa-eraser",
+  "fa-file",
+  "fa-file-o",
+  "fa-file-text",
+  "fa-file-text-o",
+  "fa-files-o",
+  "fa-floppy-o",
+  "fa-font",
+  "fa-header",
+  "fa-indent",
+  "fa-italic",
+  "fa-link",
+  "fa-list",
+  "fa-list-alt",
+  "fa-list-ol",
+  "fa-list-ul",
+  "fa-outdent",
+  "fa-paperclip",
+  "fa-paragraph",
+  "fa-paste",
+  "fa-repeat",
+  "fa-rotate-left",
+  "fa-rotate-right",
+  "fa-save",
+  "fa-scissors",
+  "fa-strikethrough",
+  "fa-subscript",
+  "fa-superscript",
+  "fa-table",
+  "fa-text-height",
+  "fa-text-width",
+  "fa-th",
+  "fa-th-large",
+  "fa-th-list",
+  "fa-underline",
+  "fa-undo",
+  "fa-unlink",
+  "fa-angle-double-down",
+  "fa-angle-double-left",
+  "fa-angle-double-right",
+  "fa-angle-double-up",
+  "fa-angle-down",
+  "fa-angle-left",
+  "fa-angle-right",
+  "fa-angle-up",
+  "fa-arrow-circle-down",
+  "fa-arrow-circle-left",
+  "fa-arrow-circle-o-down",
+  "fa-arrow-circle-o-left",
+  "fa-arrow-circle-o-right",
+  "fa-arrow-circle-o-up",
+  "fa-arrow-circle-right",
+  "fa-arrow-circle-up",
+  "fa-arrow-down",
+  "fa-arrow-left",
+  "fa-arrow-right",
+  "fa-arrow-up",
+  "fa-arrows",
+  "fa-arrows-alt",
+  "fa-arrows-h",
+  "fa-arrows-v",
+  "fa-caret-down",
+  "fa-caret-left",
+  "fa-caret-right",
+  "fa-caret-square-o-down",
+  "fa-caret-square-o-left",
+  "fa-caret-square-o-right",
+  "fa-caret-square-o-up",
+  "fa-caret-up",
+  "fa-chevron-circle-down",
+  "fa-chevron-circle-left",
+  "fa-chevron-circle-right",
+  "fa-chevron-circle-up",
+  "fa-chevron-down",
+  "fa-chevron-left",
+  "fa-chevron-right",
+  "fa-chevron-up",
+  "fa-exchange",
+  "fa-hand-o-down",
+  "fa-hand-o-left",
+  "fa-hand-o-right",
+  "fa-hand-o-up",
+  "fa-long-arrow-down",
+  "fa-long-arrow-left",
+  "fa-long-arrow-right",
+  "fa-long-arrow-up",
+  "fa-toggle-down",
+  "fa-toggle-left",
+  "fa-toggle-right",
+  "fa-toggle-up",
+  "fa-arrows-alt",
+  "fa-backward",
+  "fa-compress",
+  "fa-eject",
+  "fa-expand",
+  "fa-fast-backward",
+  "fa-fast-forward",
+  "fa-forward",
+  "fa-pause",
+  "fa-pause-circle",
+  "fa-pause-circle-o",
+  "fa-play",
+  "fa-play-circle",
+  "fa-play-circle-o",
+  "fa-random",
+  "fa-step-backward",
+  "fa-step-forward",
+  "fa-stop",
+  "fa-stop-circle",
+  "fa-stop-circle-o",
+  "fa-youtube-play",
+  "fa-500px",
+  "fa-adn",
+  "fa-amazon",
+  "fa-android",
+  "fa-angellist",
+  "fa-apple",
+  "fa-bandcamp",
+  "fa-behance",
+  "fa-behance-square",
+  "fa-bitbucket",
+  "fa-bitbucket-square",
+  "fa-bitcoin",
+  "fa-black-tie",
+  "fa-bluetooth",
+  "fa-bluetooth-b",
+  "fa-btc",
+  "fa-buysellads",
+  "fa-cc-amex",
+  "fa-cc-diners-club",
+  "fa-cc-discover",
+  "fa-cc-jcb",
+  "fa-cc-mastercard",
+  "fa-cc-paypal",
+  "fa-cc-stripe",
+  "fa-cc-visa",
+  "fa-chrome",
+  "fa-codepen",
+  "fa-codiepie",
+  "fa-connectdevelop",
+  "fa-contao",
+  "fa-css3",
+  "fa-dashcube",
+  "fa-delicious",
+  "fa-deviantart",
+  "fa-digg",
+  "fa-dribbble",
+  "fa-dropbox",
+  "fa-drupal",
+  "fa-edge",
+  "fa-eercast",
+  "fa-empire",
+  "fa-envira",
+  "fa-etsy",
+  "fa-expeditedssl",
+  "fa-fa",
+  "fa-facebook",
+  "fa-facebook-f",
+  "fa-facebook-official",
+  "fa-facebook-square",
+  "fa-firefox",
+  "fa-first-order",
+  "fa-flickr",
+  "fa-font-awesome",
+  "fa-fonticons",
+  "fa-fort-awesome",
+  "fa-forumbee",
+  "fa-foursquare",
+  "fa-free-code-camp",
+  "fa-ge",
+  "fa-get-pocket",
+  "fa-gg",
+  "fa-gg-circle",
+  "fa-git",
+  "fa-git-square",
+  "fa-github",
+  "fa-github-alt",
+  "fa-github-square",
+  "fa-gitlab",
+  "fa-gittip",
+  "fa-glide",
+  "fa-glide-g",
+  "fa-google",
+  "fa-google-plus",
+  "fa-google-plus-circle",
+  "fa-google-plus-official",
+  "fa-google-plus-square",
+  "fa-google-wallet",
+  "fa-gratipay",
+  "fa-grav",
+  "fa-hacker-news",
+  "fa-houzz",
+  "fa-html5",
+  "fa-imdb",
+  "fa-instagram",
+  "fa-internet-explorer",
+  "fa-ioxhost",
+  "fa-joomla",
+  "fa-jsfiddle",
+  "fa-lastfm",
+  "fa-lastfm-square",
+  "fa-leanpub",
+  "fa-linkedin",
+  "fa-linkedin-square",
+  "fa-linode",
+  "fa-linux",
+  "fa-maxcdn",
+  "fa-meanpath",
+  "fa-medium",
+  "fa-meetup",
+  "fa-mixcloud",
+  "fa-modx",
+  "fa-odnoklassniki",
+  "fa-odnoklassniki-square",
+  "fa-opencart",
+  "fa-openid",
+  "fa-opera",
+  "fa-optin-monster",
+  "fa-pagelines",
+  "fa-paypal",
+  "fa-pied-piper",
+  "fa-pied-piper-alt",
+  "fa-pied-piper-pp",
+  "fa-pinterest",
+  "fa-pinterest-p",
+  "fa-pinterest-square",
+  "fa-product-hunt",
+  "fa-qq",
+  "fa-quora",
+  "fa-ra",
+  "fa-ravelry",
+  "fa-rebel",
+  "fa-reddit",
+  "fa-reddit-alien",
+  "fa-reddit-square",
+  "fa-renren",
+  "fa-resistance",
+  "fa-safari",
+  "fa-scribd",
+  "fa-sellsy",
+  "fa-share-alt",
+  "fa-share-alt-square",
+  "fa-shirtsinbulk",
+  "fa-simplybuilt",
+  "fa-skyatlas",
+  "fa-skype",
+  "fa-slack",
+  "fa-slideshare",
+  "fa-snapchat",
+  "fa-snapchat-ghost",
+  "fa-snapchat-square",
+  "fa-soundcloud",
+  "fa-spotify",
+  "fa-stack-exchange",
+  "fa-stack-overflow",
+  "fa-steam",
+  "fa-steam-square",
+  "fa-stumbleupon",
+  "fa-stumbleupon-circle",
+  "fa-superpowers",
+  "fa-telegram",
+  "fa-tencent-weibo",
+  "fa-themeisle",
+  "fa-trello",
+  "fa-tripadvisor",
+  "fa-tumblr",
+  "fa-tumblr-square",
+  "fa-twitch",
+  "fa-twitter",
+  "fa-twitter-square",
+  "fa-usb",
+  "fa-viacoin",
+  "fa-viadeo",
+  "fa-viadeo-square",
+  "fa-vimeo",
+  "fa-vimeo-square",
+  "fa-vine",
+  "fa-vk",
+  "fa-wechat",
+  "fa-weibo",
+  "fa-weixin",
+  "fa-whatsapp",
+  "fa-wikipedia-w",
+  "fa-windows",
+  "fa-wordpress",
+  "fa-wpbeginner",
+  "fa-wpexplorer",
+  "fa-wpforms",
+  "fa-xing",
+  "fa-xing-square",
+  "fa-y-combinator",
+  "fa-y-combinator-square",
+  "fa-yahoo",
+  "fa-yc",
+  "fa-yc-square",
+  "fa-yelp",
+  "fa-yoast",
+  "fa-youtube",
+  "fa-youtube-play",
+  "fa-youtube-square",
+  "fa-ambulance",
+  "fa-h-square",
+  "fa-heart",
+  "fa-heart-o",
+  "fa-heartbeat",
+  "fa-hospital-o",
+  "fa-medkit",
+  "fa-plus-square",
+  "fa-stethoscope",
+  "fa-user-md",
+  "fa-wheelchair",
+  "fa-wheelchair-alt"
+]

+ 79 - 0
resources/js/vue/tree.vue

@@ -0,0 +1,79 @@
+<template>
+    <ul class="tree">
+        <li v-for="item in list" :id="'li-'+item.id">
+            <div class="custom-control custom-checkbox mb-3">
+                <input @change="checkedData(item.id,$event)" type="checkbox" class="custom-control-input" :value="item.id" :id="'check-'+item.id">
+                <label class="custom-control-label" :for="'check-'+item.id"></label>
+                <label style="cursor: pointer;" @click.prevent.stop="unfold(item.id)">{{item[column]}}&nbsp;
+                <i v-if="item.child && item.child.length>0" :id="'item-fa-'+item.id" class="fa fa-plus-circle"></i>
+                </label>
+            </div>
+            <tree :id="'item-'+item.id" class="up" v-if="item.child && item.child.length>0" :list="item.child" :column="column"></tree>
+        </li>
+    </ul>
+</template>
+
+<script>
+    module.exports = {
+        name: "tree",
+        props:["list","column"],
+        mounted(){
+            $(".up").slideUp();
+        },
+        methods:{
+            unfold(id){
+                $('#item-'+id).slideToggle();
+                let fa = document.getElementById('item-fa-'+id);
+                if (!fa)return;
+                if (fa.className==='fa fa-plus-circle')fa.className = "fa fa-minus-circle";
+                else fa.className='fa fa-plus-circle';
+            },
+            checkedData(id,e){
+                let dom = document.getElementById('item-'+id);
+                if (!dom)return;
+                let nodes = dom.getElementsByClassName("custom-control-input");
+                if(nodes.length<1)return;
+                for(let i=0;i<nodes.length;i++)nodes[i].checked = e.target.checked;
+            },
+        },
+    }
+</script>
+
+<style scoped>
+    ul.tree ul {
+        margin: 0;
+        padding: 0 0 0 2em;
+    }
+
+    ul.tree li {
+        list-style: none;
+        position: relative;
+    }
+
+    ul.tree>li:first-child:before {
+        border-style: none none solid none;
+    }
+
+    ul.tree li:before {
+        position: absolute;
+        content: '';
+        top: -0.01em;
+        left: -0.7em;
+        width: 0.5em;
+        height: 0.615em;
+        border-style: none none solid solid;
+        border-width: 0.05em;
+        border-color: #aaa;
+    }
+
+    ul.tree li:not(:last-child):after {
+        position: absolute;
+        content: '';
+        top: 0.6em;
+        left: -0.7em;
+        bottom: -1em;
+        border-style: none none none solid;
+        border-width: 0.05em;
+        border-color: #aaa;
+    }
+</style>

+ 15 - 0
resources/sass/text.scss

@@ -280,4 +280,19 @@
 //tr选中效果
 .tr-select td{
     background-color: rgb(170, 199, 234) !important;
+}
+
+//icon
+.icon-item{
+    float: left;
+    width: 38px;
+    height: 38px;
+    padding: 12px;
+    margin: 0 12px 12px 0;
+    text-align: center;
+    cursor: pointer;
+    border-radius: 3px;
+    font-size: 14px;
+    box-shadow: 0 0 0 1px #ddd;
+    color: inherit;
 }

+ 1 - 0
resources/views/auth/login.blade.php

@@ -115,6 +115,7 @@
                 }else{
                     tempTip.setDuration(99999);
                     tempTip.waitingTip('页面跳转中');
+                    localStorage.setItem("menus",JSON.stringify(response.data.menus));
                     location=response.data.url;
                 }
             }).catch(function(response){

+ 0 - 9
resources/views/customer/customer/create.blade.php

@@ -2,15 +2,6 @@
 @section('title')编辑-客户@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('customer.menu')@endcomponent
-        @component('customer.customer.menu')
-                @if(isset($customer))@can('客户-编辑')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">编辑</a>
-                </li> @endcan @endif
-        @endcomponent
-    </div>
     <div class="container-fluid card">
         <div class="card-body offset-3 mt-2">
             <form method="post" action="{{isset($customer) ? url('customer/customer').'/'.$customer->id : url('customer/customer')}}">

+ 0 - 4
resources/views/customer/customer/index.blade.php

@@ -2,10 +2,6 @@
 @section('title')客户@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('customer.menu')@endcomponent
-        @component('customer.customer.menu')@endcomponent
-    </div>
     <div class="d-none container-fluid card" id="container">
         <div class="card-body mt-2">
             <div id="form_div" class="mb-2"></div>

+ 0 - 23
resources/views/customer/customer/menu.blade.php

@@ -1,23 +0,0 @@
-<div class="container-fluid nav3">
-    <div class="card menu-third" >
-        <ul class="nav nav-pills">
-            @can('客户-查询')
-            <li class="nav-item">
-                <a target="customer/customer" class="nav-link" href="{{url('customer/customer')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            @can('客户-录入')
-            <li class="nav-item">
-                <a target="customer/customer/create" class="nav-link" href="{{url('customer/customer/create')}}" :class="{active:isActive('create',3)}">录入</a>
-            </li> @endcan
-            @can('客户-客户状态')
-            <li class="nav-item">
-                <a target="customer/customer/customerLogStatus" class="nav-link" href="{{url('customer/customer/customerLogStatus')}}" :class="{active:isActive('customerLogStatus',3)}">客户状态</a>
-            </li>@endcan
-            @can('客户-客户标签')
-            <li class="nav-item">
-                <a target="customer/customer/customerTag" class="nav-link" href="{{url('customer/customer/customerTag')}}" :class="{active:isActive('customerTag',3)}">客户标签</a>
-            </li>@endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/customer/customer/tag/index.blade.php

@@ -2,10 +2,6 @@
 @section('title')客户标签-客户@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('customer.menu')@endcomponent
-        @component('customer.customer.menu')@endcomponent
-    </div>
     <div class="container-fluid" id="container">
         @include("customer.customer.tag._edit")
         <div class="card">

+ 0 - 5
resources/views/customer/customerLogStatus/index.blade.php

@@ -2,11 +2,6 @@
 @section('title')客户日志状态@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('customer.menu')@endcomponent
-        @component('customer.customer.menu')@endcomponent
-    </div>
-
     <div class="d-none container-fluid" id="container">
         <div class="card">
             <div class="card-body">

+ 0 - 1
resources/views/customer/index.blade.php

@@ -2,5 +2,4 @@
 @section('title')项目管理@endsection
 
 @section("content")
-    @component('customer.project.menu')@endcomponent
 @stop

+ 0 - 24
resources/views/customer/menu.blade.php

@@ -1,24 +0,0 @@
-
-<div class="container-fluid nav2" id="nav2">
-    <div class="card">
-        <ul class="nav nav-pills">
-            @can('项目管理-项目')
-            <li class="nav-item">
-                <a target="customer/project/area" class="nav-link" href="{{url('customer/project/area')}}" :class="{active:isActive('project',2)}">项目</a>
-            </li>@endcan
-            @can('项目管理-客户')
-            <li class="nav-item">
-                <a target="customer/customer" class="nav-link" href="{{url('customer/customer')}}" :class="{active:isActive('customer',2)}">客户</a>
-            </li>@endcan
-            @can('项目管理-相关设置')
-            <li class="nav-item">
-                <a target="customer/relating" class="nav-link" href="{{url('customer/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
-            </li>
-                @endcan
-            @can('项目管理-杂项费-查询')
-                <li class="nav-item">
-                    <a target="customer/ownerSundryFeeDetails" class="nav-link" href="{{url('customer/ownerSundryFeeDetails')}}" :class="{active:isActive('ownerSundryFeeDetails',2)}">杂项费</a>
-                </li>@endcan
-        </ul>
-    </div>
-</div>

+ 0 - 2
resources/views/customer/ownerSundryFee/create_and_edit.blade.php

@@ -1,8 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    @component("customer.ownerSundryFee.menu")@endcomponent
-
 <div class="container">
   <div class="col-md-10 offset-md-1">
     <div class="card ">

+ 0 - 1
resources/views/customer/ownerSundryFee/index.blade.php

@@ -1,7 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    @component("customer.ownerSundryFee.menu")@endcomponent
     @include('shared._messages')
     @include('shared._error')
     <div id="list" class="d-none">

+ 0 - 30
resources/views/customer/ownerSundryFee/menu.blade.php

@@ -1,30 +0,0 @@
-<div id="nav2">
-    @component('customer.menu')@endcomponent
-    <div class="container-fluid nav3">
-        <div class="card menu-third">
-            <ul class="nav nav-pills">
-                @can('项目管理-杂项费-查询')
-                    <li class="nav-item">
-                        <a target="customer/ownerSundryFee" class="nav-link"
-                           href="{{url('customer/ownerSundryFeeDetails')}}"
-                           :class="{active:isActive('',3)}">查询</a>
-                    </li>
-                @endcan
-                @can('项目管理-杂项费-录入')
-                    <li class="nav-item">
-                        <a target="customer/ownerSundryFee/create" class="nav-link"
-                           href="{{url('customer/ownerSundryFeeDetails/create')}}"
-                           :class="{active:isActive('create',3)}">录入</a>
-                    </li>
-                @endcan
-{{--                @can('项目管理-杂项费-编辑')--}}
-{{--                    <li class="nav-item">--}}
-{{--                        <a target="customer/ownerSundryFee/edit" class="nav-link"--}}
-{{--                           href="{{url('customer/ownerSundryFeeDetails/{ownerSundryFeeDetail}/edit')}}"--}}
-{{--                           :class="{active:isActive('edit',4)}">编辑</a>--}}
-{{--                    </li>--}}
-{{--                @endcan--}}
-            </ul>
-        </div>
-    </div>
-</div>

+ 0 - 1
resources/views/customer/ownerSundryFee/show.blade.php

@@ -1,6 +1,5 @@
 @extends('layouts.app')
 @section('content')
-    @component("customer.ownerSundryFee.menu")@endcomponent
     <div class="container">
         <div class="col-md-10 offset-md-1">
             <div class="card ">

+ 0 - 1
resources/views/customer/project/area.blade.php

@@ -3,7 +3,6 @@
     用仓盘点-项目管理
 @endsection
 @section('content')
-    @component('customer.project.menu')@endcomponent
     <div class="container-fluid d-none" id="container">
 
         @include("customer._selectedOwner")

+ 0 - 7
resources/views/customer/project/create.blade.php

@@ -2,13 +2,6 @@
 @section('title')项目编辑-项目管理@endsection
 @section("head")<link href="{{ mix('css/animation.css') }}" rel="stylesheet">@endsection
 @section('content')
-    @component('customer.project.menu')
-        @if($owner)
-            <li class="nav-item">
-                <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">编辑</a>
-            </li>
-        @endif
-    @endcomponent
     <div class="container-fluid card d-none" id="container">
         <div class="card-body offset-1">
             <div class="row">

+ 0 - 1
resources/views/customer/project/index.blade.php

@@ -2,7 +2,6 @@
 @section('title')项目列表-项目管理@endsection
 
 @section('content')
-    @component('customer.project.menu')@endcomponent
     <div class="container-fluid d-none" id="container">
         <div id="form_div"></div>
         <div class="modal fade" tabindex="-1" role="dialog" id="modal">

+ 0 - 23
resources/views/customer/project/menu.blade.php

@@ -1,23 +0,0 @@
-<div id="nav2">
-    @component('customer.menu')
-    @endcomponent
-    <div class="container-fluid nav3">
-        <div class="card menu-third" >
-            <ul class="nav nav-pills">
-                @can('项目管理-项目-面积')
-                    <li class="nav-item">
-                        <a target="customer/project/area" class="nav-link" href="{{url('customer/project/area')}}" :class="{active:isActive('area',3)}">用仓盘点</a>
-                    </li> @endcan
-                @can('项目管理-项目-查询')
-                <li class="nav-item">
-                    <a target="customer/project/index" class="nav-link" href="{{url('customer/project/index')}}" :class="{active:isActive('index',3)}">列表</a>
-                </li> @endcan
-                @can('项目管理-项目-查询')
-                <li class="nav-item">
-                    <a target="customer/project/create" class="nav-link" href="{{url('customer/project/create')}}" :class="{active:isActive('create',3)}">录入</a>
-                </li> @endcan
-                {{ $slot }}
-            </ul>
-        </div>
-    </div>
-</div>

+ 0 - 4
resources/views/customer/relating.blade.php

@@ -2,8 +2,4 @@
 @section('title')相关设置@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('customer.menu')@endcomponent
-        @component('maintenance.priceModel.menu')@endcomponent
-    </div>
 @endsection

+ 0 - 1
resources/views/finance/billConfirmation.blade.php

@@ -2,7 +2,6 @@
 @section('title')账单确认-项目管理@endsection
 
 @section('content')
-    @component('finance.menu')@endcomponent
     <div class="container-fluid d-none" id="container">
         <div id="form_div"></div>
         <div class="mt-1">

+ 0 - 1
resources/views/finance/instantBill.blade.php

@@ -2,7 +2,6 @@
 @section('title')即时账单-客户项目@endsection
 
 @section('content')
-    @component('finance.menu')@endcomponent
     <div class="container-fluid d-none" id="container">
         <div class="container-fluid nav3">
             <div class="card menu-third">

+ 0 - 2
resources/views/finance/settlementBills/ownerSundryFee/create_and_edit.blade.php

@@ -1,8 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    @component("finance.settlementBills.ownerSundryFee.menu")@endcomponent
-
 <div class="container">
   <div class="col-md-10 offset-md-1">
     <div class="card ">

+ 0 - 1
resources/views/finance/settlementBills/ownerSundryFee/index.blade.php

@@ -1,7 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    @component("finance.settlementBills.ownerSundryFee.menu")@endcomponent
     @include('shared._messages')
     @include('shared._error')
     <div id="list" class="d-none">

+ 0 - 26
resources/views/finance/settlementBills/ownerSundryFee/menu.blade.php

@@ -1,26 +0,0 @@
-<div id="nav2">
-    @component('finance.settlementBills.menu')@endcomponent
-    <div class="container-fluid nav4">
-        <div class="card menu-third">
-            <ul class="nav nav-pills">
-                @can('结算管理-结算账单-杂项费')
-                    <li class="nav-item">
-                        <a target="finance/settlementBills/ownerSundryFeeDetails" class="nav-link"
-                           href="{{url('finance/settlementBills/ownerSundryFeeDetails')}}"
-                           :class="{active:isActive('',4)}">查询</a>
-                    </li>
-                @endcan
-                    <li class="nav-item">
-                        <a target="finance/settlementBills/ownerSundryFeeDetails/create" class="nav-link"
-                           href="{{url('finance/settlementBills/ownerSundryFeeDetails/create')}}"
-                           :class="{active:isActive('create',4)}">新建</a>
-                    </li>
-                    <li class="nav-item">
-                        <a target="finance/settlementBills/ownerSundryFeeDetails/edit" class="nav-link"
-                           href="{{url('finance/settlementBills/ownerSundryFeeDetails/edit')}}"
-                           :class="{active:isActive('edit',4)}">编辑</a>
-                    </li>
-            </ul>
-        </div>
-    </div>
-</div>

+ 0 - 1
resources/views/finance/settlementBills/ownerSundryFee/show.blade.php

@@ -1,6 +1,5 @@
 @extends('layouts.app')
 @section('content')
-    @component("finance.settlementBills.ownerSundryFee.menu")@endcomponent
     <div class="container">
         <div class="col-md-10 offset-md-1">
             <div class="card ">

+ 0 - 15
resources/views/inventory/menu.blade.php

@@ -1,15 +0,0 @@
-
-<div class="container-fluid nav2" id="nav2">
-    <div class="card">
-        <ul class="nav nav-pills">
-            @can('库存管理')
-                <li class="nav-item">
-                    <a target="inventory/statement/changeInventory" class="nav-link" href="{{url('inventory/statement/changeInventory?range=1')}}" :class="{active:isActive('statement',2)}">库存</a>
-                </li> @endcan
-            @can('库存管理-盘点')
-                <li class="nav-item">
-                    <a target="inventory/stockInventory/mission" class="nav-link" href="{{url('inventory/stockInventory/mission')}}" :class="{active:isActive('stockInventory',2)}">盘点</a>
-                </li> @endcan
-        </ul>
-    </div>
-</div>

+ 0 - 1
resources/views/inventory/statement/changeInventory.blade.php

@@ -1,7 +1,6 @@
 @extends('layouts.app')
 @section('title')动库报表-库存管理@endsection
 @section('content')
-    @component('inventory.statement.menu')@endcomponent
 <div id="list" class="d-none card container-fluid" style="min-width: 1500px">
     <div id="form_div"></div>
     <span class="dropdown">

+ 0 - 1
resources/views/inventory/statement/dailyLog.blade.php

@@ -2,7 +2,6 @@
 @section('title')库存体积-库存管理@endsection
 
 @section('content')
-    @component('inventory.statement.menu')@endcomponent
     <div class="d-none card" id="container">
         <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="pasteDataTitle" aria-hidden="true">
             <div class="modal-dialog modal-dialog-centered modal-lg" role="document">

+ 0 - 1
resources/views/inventory/statement/inventoryCompare.blade.php

@@ -2,7 +2,6 @@
 @section('title')库存对比-库存管理@endsection
 
 @section('content')
-    @component('inventory.statement.menu')@endcomponent
     <div class="d-none card" id="container">
         <div class="modal fade" id="importExcel" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
             <div class="modal-dialog">

+ 0 - 26
resources/views/inventory/statement/menu.blade.php

@@ -1,26 +0,0 @@
-<div id="nav2">
-    @component('inventory.menu')
-    @endcomponent
-    <div class="container-fluid nav3">
-        <div class="card menu-third" >
-            <ul class="nav nav-pills">
-                @can('库存管理-库存')
-                    <li class="nav-item">
-                        <a target="inventory/statement/changeInventory" class="nav-link" href="{{url('inventory/statement/changeInventory?range=1')}}" :class="{active:isActive('changeInventory',3)}">动库报表</a>
-                    </li>
-                    <li class="nav-item">
-                        <a target="inventory/statement/allInventory" class="nav-link" href="{{url('inventory/statement/allInventory')}}" :class="{active:isActive('allInventory',3)}">全部库存</a>
-                    </li> @endcan
-                @can('库存管理-库存体积')
-                    <li class="nav-item">
-                        <a target="inventory/statement/dailyLog" class="nav-link" href="{{url('inventory/statement/dailyLog')}}" :class="{active:isActive('dailyLog',3)}">库存体积</a>
-                    </li> @endcan
-                @can('库存管理-库存-库存对比')
-                    <li class="nav-item">
-                        <a target="inventory/statement/inventoryCompare" class="nav-link" href="{{url('inventory/statement/inventoryCompare')}}" :class="{active:isActive('inventoryCompare',3)}">库存对比</a>
-                    </li> @endcan
-            </ul>
-        </div>
-    </div>
-</div>
-

+ 0 - 5
resources/views/inventory/stockInventory/blindReceive.blade.php

@@ -1,11 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    @component('inventory.stockInventory.menu')
-        <li class="nav-item">
-            <a  class="nav-link" href="{{URL::current()}}" :class="{active:isActive('blindReceive',3)}">盘点中({!! $inventoryAccount->id !!})</a>
-        </li>
-    @endcomponent
     <div class="container">
         <div class="mt-3">
             <span>

+ 0 - 5
resources/views/inventory/stockInventory/inventoryMission.blade.php

@@ -2,11 +2,6 @@
 @section('title')库存盘点-库存管理@endsection
 
 @section('content')
-    @component('inventory.stockInventory.menu')
-        <li class="nav-item">
-            <a  class="nav-link" href="{{URL::current()}}" :class="{active:isActive('enterStockInventory',3)}">盘点中({!! $inventoryAccount->id !!})</a>
-        </li>
-    @endcomponent
     <div class="text-center h5 mt-2" id="loadingPage">
         载入中……
     </div>

+ 0 - 17
resources/views/inventory/stockInventory/menu.blade.php

@@ -1,17 +0,0 @@
-<div id="nav2">
-    @component('inventory.menu')
-    @endcomponent
-    <div class="container-fluid nav3">
-        <div class="card menu-third" >
-            <ul class="nav nav-pills">
-                @can('库存管理-盘点')
-                    <li class="nav-item">
-                        <a target="inventory/stockInventory/mission" class="nav-link" href="{{url('inventory/stockInventory/mission')}}" :class="{active:isActive('mission',3)}">任务</a>
-                    </li>
-                @endcan
-                {{$slot}}
-            </ul>
-        </div>
-    </div>
-</div>
-

+ 0 - 1
resources/views/inventory/stockInventory/mission.blade.php

@@ -3,7 +3,6 @@
 
 
 @section('content')
-    @component('inventory.stockInventory.menu')@endcomponent
     <div class="text-center h5 mt-2" id="loadingPage">
         载入中……
     </div>

+ 116 - 2
resources/views/layouts/app.blade.php

@@ -25,6 +25,7 @@
             @component('layouts.menu')@endcomponent
         </div>
     </nav>
+    <div id="menu"></div>
 
     @auth()
         @component('demand._create')@endcomponent
@@ -36,6 +37,119 @@
 <!-- Scripts -->
 @yield('script')
 {{-- 必须在app.js前边--}}
+<script type="text/javascript">
+    let menus = localStorage.getItem("menus");
+    if (menus===null)menus = getMenu();
+    let menuList = JSON.parse(menus);
+    let baseUrl = "{{url('')}}";
+    let currentUri = window.location.href.slice(baseUrl.length+1);
+    let relativeUrl = currentUri.split(/[/?]/);
+    (function () {
+        if ("{{\Illuminate\Support\Facades\Auth::id()}}")createMenu();
+    }());
+    function createMenu(type = 1,menus=menuList) {
+        return new Promise(function () {
+            let dom = createBeforeMenu(type);
+            for (let i=0;i<menus.length;i++){
+                if (!menus[i].route)continue;
+                let uri = menus[i].route.split(/[/?]/);
+                let isEquals = uri[type-1]===relativeUrl[type-1];
+                if (uri[type-1]==='*'){
+                    if (uri[type]===relativeUrl[type]){
+                        isEquals=true;
+                        menus[i].route = currentUri;
+                    }
+                    else continue;
+                }
+                dom.appendChild(createChildElement(type,menus[i],isEquals));
+                if (isEquals && menus[i].child && menus[i].child.length>0)createMenu(type+1,menus[i].child);
+            }
+        });
+    }
+    function createBeforeMenu(type) {
+        let dom = undefined;
+        let ul = undefined;
+        switch (type) {
+            case 2:
+                dom = document.createElement("div");
+                dom.className="container-fluid nav2";
+                let div = document.createElement("div");
+                div.className="card";
+                ul = document.createElement("ul");
+                ul.className="nav nav-pills";
+                div.appendChild(ul);
+                dom.appendChild(div);
+                document.getElementById("menu").appendChild(dom);
+                return ul;
+            case 3:
+                dom = document.createElement("div");
+                dom.className="container-fluid nav3";
+                let dom2 = document.createElement("div");
+                dom2.className = "card menu-third";
+                let dom3 = document.createElement("ul");
+                dom3.className="nav nav-pills";
+                dom2.appendChild(dom3);
+                dom.appendChild(dom2);
+                document.getElementById("menu").appendChild(dom);
+                return dom3;
+            case 4:
+                dom = document.createElement("div");
+                dom.className="container-fluid nav3";
+                let card = document.createElement("div");
+                card.className = "card menu-third";
+                ul = document.createElement("ul");
+                ul.className="nav nav-pills";
+                card.appendChild(ul);
+                dom.appendChild(card);
+                document.getElementById("menu").appendChild(dom);
+                return ul;
+            default:
+                dom = document.createElement("ul");
+                dom.className = "navbar-nav mr-auto nav-tabs nav font-weight-bold";
+                dom.style.paddingTop = "10px";
+                document.getElementById("mainMenu").appendChild(dom);
+                return dom;
+        }
+    }
+    function createChildElement(type,menu,isEquals) {
+        let li = document.createElement("li");
+        let a = document.createElement("a");
+        li.className="nav-item";
+        a.href = baseUrl+'/'+menu.route;
+        a.className = "nav-link";
+        if (isEquals)a.className += " active";
+        a.target = menu.route;
+        switch (type) {
+            case 2:
+                a.innerText = menu.name;
+                li.appendChild(a);
+                return li;
+            case 3:
+                a.innerText = menu.name;
+                li.appendChild(a);
+                return li;
+            default:
+                if (menu.font){
+                    let span = document.createElement("span");
+                    span.className = 'fa '+menu.font;
+                    span.style.cssText = menu.fontStyle;
+                    a.appendChild(span);
+                }
+                a.appendChild(document.createTextNode(menu.name));
+                li.appendChild(a);
+                return li;
+        }
+    }
+    function getMenu() {
+        let xhr = new XMLHttpRequest();
+        let url = "{{url('getMenu')}}";
+        xhr.open('POST', url, false);
+        xhr.setRequestHeader('Content-Type', 'application/json');
+        xhr.setRequestHeader('X-CSRF-Token', "{{ csrf_token() }}");
+        xhr.send('');
+        return xhr.responseText;
+    }
+</script>
 <script src="{{ mix('js/app.js') }}"></script>
 <script>
     let isActive=function (name,atSlashLevel) {
@@ -47,12 +161,12 @@
         if(atSlashLevel>uriParts.length||!atSlashLevel)return false;
         return uriParts[atSlashLevel]===name;
     };
-    new Vue({
+    /*new Vue({
         el:'#nav1',
         methods:{
             isActive:isActive,
         }
-    });
+    });*/
     if($('#nav2').length>0)
         new Vue({
             el:'#nav2',

+ 1 - 74
resources/views/layouts/menu.blade.php

@@ -1,79 +1,6 @@
 <div class="collapse navbar-collapse nav1" id="navbarSupportedContent">
     <!-- Left Side Of Navbar -->
-    <ul class="navbar-nav mr-auto nav-tabs nav font-weight-bold" id="nav1" style="padding-top: 10px">
-        @can('退货管理')
-            <li class="nav-item"><a href="{{url("rejected/index/general")}}" class="nav-link" target="rejected/index/general"
-                                    :class="{active:isActive('rejected',1)}">
-                    <span class="fa fa-recycle" style="color: #721b6e"></span>
-                    退货管理</a></li> @endcan
-        @can('入库管理')
-            <li class="nav-item"><a href="{{url("store/checkingReceive/mission")}}" class="nav-link" target="store/checkingReceive/mission"
-                                    :class="{active:isActive('store',1)}">
-                    <span class="fa fa-sign-in" style="color: #721b25"></span>
-                    入库管理</a></li>
-            @endcan
-        @can('订单管理')
-            <li class="nav-item"><a href="{{url("order/index/delivering")}}" class="nav-link" target="order/index/delivering"
-                                    :class="{active:isActive('order',1)}">
-                    <span class="fa fa-calendar-check-o" style="color: #1b4b72"></span>
-                    订单管理</a></li> @endcan
-        @can('运输管理')
-            <li class="nav-item"><a href="{{url("transport/waybill/index")}}" class="nav-link" target="transport/waybill/index"
-                                    :class="{active:isActive('transport',1)}">
-                    <span class="fa fa-truck" style="color: #4c2584"></span>
-                    运输管理</a></li> @endcan
-        @can('称重管理')
-            <li class="nav-item"><a href="{{url("package/weigh/index")}}" class="nav-link" target="package/weigh/index"
-                                    :class="{active:isActive('package',1)}">
-                    <span class="fa fa-suitcase" style="color: #1b7234"></span>
-                    包裹管理</a></li> @endcan
-        @can('库存管理')
-            <li class="nav-item"><a href="{{url('inventory/statement/allInventory')}}" class="nav-link" target="inventory/statement/allInventory"
-                                    :class="{active:isActive('inventory',1)}">
-                    <span class="fa fa-list-alt" style="color: #32721b"></span>
-                    库存管理</a></li> @endcan
-        @can('二次加工管理')
-            <li class="nav-item"><a href="{{url("process")}}" class="nav-link" target="process"
-                                    :class="{active:isActive('process',1)}">
-                    <span class="fa fa-hand-scissors-o" style="color: #726e1b"></span>
-                    二次加工管理</a></li> @endcan
-        @can('项目管理')
-            <li class="nav-item"><a href="{{url("customer/project/area")}}" class="nav-link" target="customer/project/area"
-                                    :class="{active:isActive('customer',1)}">
-                    <span class="fa fa-address-book-o" style="color: #72441b"></span>
-                    项目管理</a></li> @endcan
-        @can('结算管理')
-            <li class="nav-item"><a href="{{url("finance/instantBill")}}" class="nav-link" target="finance/instantBill"
-                                    :class="{active:isActive('finance',1)}">
-                    <span class="fa fa-money" style="color: #72441b"></span>
-                    结算管理</a></li> @endcan
-        @can('人事管理')
-            <li class="nav-item"><a href="{{url("personnel/laborReport")}}" class="nav-link" target="personnel/laborReport"
-                                    :class="{active:isActive('personnel',1)}">
-                    <span class="fa fa-header" style="color: #72441b"></span>
-                    人事管理</a></li> @endcan
-        @can('站管理')
-            <li class="nav-item"><a href="{{url("station/monitor")}}" class="nav-link" target="station/monitor/index"
-                                    :class="{active:isActive('station',1)}">
-                    <span class="fa fa-share-alt-square" style="color: #72441b"></span>
-                    站管理</a></li> @endcan
-        @can('采购管理')
-                <li class="nav-item"><a href="{{url("procurement/procurement/index")}}" class="nav-link"
-                                        :class="{active:isActive('procurement',1)}">
-                        <span class="fa fa-cart-plus" style="color: #1b4b72"></span>
-                        采购管理</a></li>@endcan
-
-            <li class="nav-item"><a href="{{url("demand/")}}" class="nav-link"
-                                    :class="{active:isActive('demand',1),'d-none':!isActive('demand',1)}">
-                    <span class="fa fa-cart-plus" style="color: #1b4b72"></span>
-                    需求管理</a></li>
-        @can('基础设置')
-            <li class="nav-item"><a href="{{url("maintenance")}}" class="nav-link" target="maintenance"
-                                    :class="{active:isActive('maintenance',1)}">
-                    <span class="fa fa-server"></span>
-                    基础设置</a></li> @endcan
-    </ul>
-
+    <div id="mainMenu"></div>
     <!-- Right Side Of Navbar -->
     <ul class="navbar-nav ml-auto">
         <!-- Authentication Links -->

+ 43 - 0
resources/views/maintenance/authority/_add.blade.php

@@ -0,0 +1,43 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="addModal">
+    <div class="modal-dialog modal-lg modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="font-weight-bold">新增</h5>
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <label class="col-2 offset-1" for="parent_id">父级</label>
+                    <select class="col-5 form-control" id="parent_id" type="text" v-model="authority.parent_id">
+                        <option selected value="">顶级</option>
+                        <option v-for="m in parentList" :value="m.id" v-html="m.name"></option>
+                    </select>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="name"><b class="text-danger">*&nbsp;</b>权限名</label>
+                    <input class="col-5 form-control" :class="errors.name ? 'is-invalid' : ''" id="name" type="text" v-model="authority.name">
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.name">
+                        <strong>@{{ errors.name[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="alias_name"><b class="text-danger">*&nbsp;</b>唯一标识</label>
+                    <input class="col-5 form-control" :class="errors.alias_name ? 'is-invalid' : ''" id="alias_name" type="text" v-model="authority.alias_name">
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.alias_name">
+                        <strong>@{{ errors.alias_name[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="permission">许可</label>
+                    <select class="col-5 form-control" id="permission" type="text" v-model="authority.permission">
+                        <option value="允许">允许</option>
+                        <option value="禁止">禁止</option>
+                    </select>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" @click="submitAuthority()">  提  交  </button>
+            </div>
+        </div>
+    </div>
+</div>

+ 25 - 0
resources/views/maintenance/authority/_edit.blade.php

@@ -0,0 +1,25 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="editModal">
+    <div class="modal-dialog modal-lg modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="font-weight-bold">修改</h5>
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+            </div>
+            <div class="modal-body">
+                <div class="row mt-1" v-for="item in updateArr">
+                    <div class="offset-1 col-5 row">
+                        <label class="col-3">标识:</label>
+                        <label class="col-9"><input type="text" class="form-control" :value="item.alias_name" disabled></label>
+                    </div>
+                    <div class="offset-1 col-5 row">
+                        <label class="col-3">名称:</label>
+                        <label class="col-9"><input name="authorityName" type="text" class="form-control" :value="item.name"></label>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" @click="updateAuthority()">  确  定  </button>
+            </div>
+        </div>
+    </div>
+</div>

+ 0 - 4
resources/views/maintenance/authority/create.blade.php

@@ -1,10 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.authority.menu')@endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">

+ 0 - 9
resources/views/maintenance/authority/edit.blade.php

@@ -1,15 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')
-        @endcomponent
-        @component('maintenance.authority.menu')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
-                </li>
-        @endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 93 - 0
resources/views/maintenance/authority/index.blade.bak.php

@@ -0,0 +1,93 @@
+@extends('layouts.app')
+@section('title')权限-基础设置@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.authority.menu')@endcomponent
+    </span>
+    <div class="container-fluid">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <table class="table table-striped table-sm" id="list">
+                    <tr>
+                        <th>ID</th>
+                        <th>权限名</th>
+                        <th>上级</th>
+                        <th>许可状态</th>
+                        <th>注释</th>
+                        <th>类别</th>
+                        <th>创建时间</th>
+                        <th>操作</th>
+                    </tr>
+                    <tr v-for="authority in authorities" @click="selectTr===authority.id?selectTr=0:selectTr=authority.id" :class="selectTr==authority.id ? 'focusing' : ''">
+                        <td class="text-muted">@{{authority.id}}</td>
+                        <td>@{{authority.name}}</td>
+                        <td></td>
+                        <td>@{{authority.permission}}</td>
+                        <td>@{{authority.remark}}</td>
+                        <td>@{{authority.type}}</td>
+                        <td class="text-muted">@{{authority.created_at}}</td>
+                        <td>
+{{--                            @can('权限-编辑')--}}
+{{--                            <button class="btn btn-sm btn-outline-primary" @click="edit(authority.id)">改</button> @endcan--}}
+{{--                            @can('权限-删除')--}}
+{{--                            <button class="btn btn-sm btn-outline-dark" @click="destroy(authority)">删</button> @endcan--}}
+                        </td>
+                    </tr>
+                </table>
+                {{$authorities->links()}}
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                authorities:[
+                    @foreach( $authorities as $authority )
+                    {id:'{{$authority->id}}',name:'{{$authority->alias_name}}',type:'{{$authority->type}}',remark:'{{$authority->remark}}',created_at:'{{$authority->created_at}}',
+                        permission:'{{$authority->permission}}'},
+                    @endforeach
+                ],
+                selectTr:''
+            },
+            methods:{
+                edit:function(id){
+                    location.href = "{{url('maintenance/authority')}}/"+id+"/edit";
+                },
+                destroy:function(authority){
+                    if(!confirm('确定要删除权限“' + authority.name + '”吗?')){return};
+                    let data=this;
+                    let url = "{{url('maintenance/authority')}}/"+authority.id;
+                    axios.delete(url,{id:authority.id})
+                        .then(function (response) {
+                            if(response.data.success){
+                                for (let i = 0; i < data.authorities.length; i++) {
+                                    if (data.authorities[i].id===authority.id){
+                                        data.authorities.splice(i,1);
+                                        break;
+                                    }
+                                }
+                                tempTip.setDuration(1000);
+                                tempTip.showSuccess('删除权限"'+authority.name+'"成功!')
+                            }else{
+                                tempTip.setDuration(1000);
+                                tempTip.show('删除权限"'+authority.name+'"失败!')
+                            }
+                        })
+                        .catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('删除权限失败!'+'网络错误:' + err)
+                        });
+                },
+            }
+        });
+    </script>
+@endsection

+ 123 - 74
resources/views/maintenance/authority/index.blade.php

@@ -1,93 +1,142 @@
 @extends('layouts.app')
-@section('title')权限-基础设置@endsection
+@section('title')权限@endsection
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.authority.menu')@endcomponent
-    </span>
-    <div class="container-fluid">
+    <div class="container-fluid" id="container">
+        @include('maintenance.authority._add')
+        @include('maintenance.authority._edit')
         <div class="card">
             <div class="card-body">
-                @if(Session::has('successTip'))
-                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
-                @endif
-                <table class="table table-striped table-sm" id="list">
-                    <tr>
-                        <th>ID</th>
-                        <th>权限名</th>
-                        <th>上级</th>
-                        <th>许可状态</th>
-                        <th>注释</th>
-                        <th>类别</th>
-                        <th>创建时间</th>
-                        <th>操作</th>
-                    </tr>
-                    <tr v-for="authority in authorities" @click="selectTr===authority.id?selectTr=0:selectTr=authority.id" :class="selectTr==authority.id ? 'focusing' : ''">
-                        <td class="text-muted">@{{authority.id}}</td>
-                        <td>@{{authority.name}}</td>
-                        <td></td>
-                        <td>@{{authority.permission}}</td>
-                        <td>@{{authority.remark}}</td>
-                        <td>@{{authority.type}}</td>
-                        <td class="text-muted">@{{authority.created_at}}</td>
-                        <td>
-{{--                            @can('权限-编辑')--}}
-{{--                            <button class="btn btn-sm btn-outline-primary" @click="edit(authority.id)">改</button> @endcan--}}
-{{--                            @can('权限-删除')--}}
-{{--                            <button class="btn btn-sm btn-outline-dark" @click="destroy(authority)">删</button> @endcan--}}
-                        </td>
-                    </tr>
-                </table>
-                {{$authorities->links()}}
+                <div class="w-100 mb-5">
+                    <div class="btn-group pull-left">
+                        <button class="btn btn-outline-primary" data-toggle="modal" data-target="#addModal"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                        <button class="btn btn-outline-info" @click="openEditModal()"><span class="fa fa-edit"></span>&nbsp;修&nbsp;&nbsp;改</button>
+                        <button class="btn btn-outline-danger" @click="deleteAuthority()"><span class="fa fa-close"></span>&nbsp;删&nbsp;&nbsp;除</button>
+                    </div>
+                    <div class="btn-group pull-right">
+                        <button class="btn border btn-primary" @click="expand(true)">展开全部</button>
+                        <button class="btn border btn-primary" @click="expand(false)">收起全部</button>
+                    </div>
+                </div>
+                <div class="w-100" id="tree">
+                    <tree class="offset-2 h5 font-weight-bold" :list="list" :column="'name'"></tree>
+                </div>
             </div>
         </div>
     </div>
-@endsection
+@stop
 
 @section('lastScript')
-    <script>
+    <script type="text/javascript">
         new Vue({
-            el:"#list",
+            el:"#container",
             data:{
-                authorities:[
-                    @foreach( $authorities as $authority )
-                    {id:'{{$authority->id}}',name:'{{$authority->alias_name}}',type:'{{$authority->type}}',remark:'{{$authority->remark}}',created_at:'{{$authority->created_at}}',
-                        permission:'{{$authority->permission}}'},
-                    @endforeach
-                ],
-                selectTr:''
+                list:[@foreach($authorities as $authority)@json($authority),@endforeach],
+                parentList:[],
+                authority:{parent_id:"",name:"",alias_name:"",permission:"允许"},
+                errors:{},
+                updateArr:[],
+            },
+            components:{
+                'tree':"url:{{asset("js/vue/tree.vue")}}"
+            },
+            mounted(){
+                this.parentList = this._mergeArray(this.list);
             },
             methods:{
-                edit:function(id){
-                    location.href = "{{url('maintenance/authority')}}/"+id+"/edit";
+                expand(isExpand){
+                    if (isExpand) $(".up").slideDown();
+                    else $(".up").slideUp();
+                },
+                _mergeArray(arr,result = [],before = '&nbsp;'){
+                    if (!arr)return result;
+                    for (let i=0;i<arr.length;i++){
+                        result.push({id:arr[i].id,name:before+'└─'+arr[i].name});
+                        if (arr[i].child && arr[i].child.length>0)this._mergeArray(arr[i].child,result,before+'&nbsp;&nbsp;&nbsp;')
+                    }
+                    return result;
+                },
+                submitAuthority(){
+                    window.tempTip.postBasicRequest("{{url('maintenance/authority/store')}}",this.authority,res=>{
+                        if (res.errors){this.errors = res.errors;return;}
+                        this._pushToParent(this.list,res.parent_id,{id:res.id,parent_id:res.parent_id,name:res.name,alias_name:res.alias_name,child:[]});//推进父级
+                        setTimeout(()=>{
+                            this.parentList = this._mergeArray(this.list);//异步重构元素,先行返回
+                        });
+                        this.authority = {parent_id:"",name:"",alias_name:"",permission:"允许"};//重置列表
+                        $("#addModal").modal('hide');
+                        return "录入成功";
+                    },true);
+                },
+                //推进父级
+                _pushToParent(arr,id,result){
+                    let target = this._seekTarget(arr,id);
+                    if (!target.child)target.child = [];
+                    target.child.push(result);
+                },
+                _seekTarget(arr,id){
+                    if (!arr)return null;
+                    for (let i=0;i<arr.length;i++){
+                        if (arr[i].id==id)return arr[i];
+                        let result = this._seekTarget(arr[i].child,id);
+                        if (result)return result;
+                    }
+                    return null;
                 },
-                destroy:function(authority){
-                    if(!confirm('确定要删除权限“' + authority.name + '”吗?')){return};
-                    let data=this;
-                    let url = "{{url('maintenance/authority')}}/"+authority.id;
-                    axios.delete(url,{id:authority.id})
-                        .then(function (response) {
-                            if(response.data.success){
-                                for (let i = 0; i < data.authorities.length; i++) {
-                                    if (data.authorities[i].id===authority.id){
-                                        data.authorities.splice(i,1);
-                                        break;
-                                    }
-                                }
-                                tempTip.setDuration(1000);
-                                tempTip.showSuccess('删除权限"'+authority.name+'"成功!')
-                            }else{
-                                tempTip.setDuration(1000);
-                                tempTip.show('删除权限"'+authority.name+'"失败!')
+                openEditModal(){
+                    let inputs = document.getElementById("tree").getElementsByTagName("INPUT");
+                    this.updateArr = [];
+                    for (let i=0;i<inputs.length;i++){
+                        if (inputs[i].checked)this.updateArr.push(this._seekTarget(this.list,inputs[i].value));
+                    }
+                    $("#editModal").modal('show');
+                },
+                updateAuthority(){
+                    let nodes = document.getElementsByName("authorityName");
+                    let updateList = [];
+                    let params=[];
+                    for(let i=0;i<nodes.length;i++){
+                        if (nodes[i].value!==this.updateArr[i].name){
+                            params.push({id:this.updateArr[i].id,name:nodes[i].value});
+                            updateList.push(i);
+                        }
+                    }
+                    if (params.length<1)return;
+                    window.tempTip.postBasicRequest("{{url('maintenance/authority/update')}}",{list:params},()=>{
+                        for (let i=0;i<updateList.length;i++){
+                            this.updateArr[updateList[i]].name = nodes[updateList[i]].value;
+                        }
+                        setTimeout(()=>{
+                            this.parentList = this._mergeArray(this.list);//异步重构元素,先行返回
+                        });
+                        $("#editModal").modal('hide');
+                        return "修改成功";
+                    },true);
+                },
+                deleteAuthority(){
+                    window.tempTip.confirm("确定要删除选中的权限吗?存在子级时无论是否被选中均会跟随父级被删除",()=>{
+                        let inputs = document.getElementById("tree").getElementsByTagName("INPUT");
+                        let destroy = [];
+                        for (let i=0;i<inputs.length;i++){
+                            if (!inputs[i].checked)continue;
+                            let id = inputs[i].value;
+                            destroy.push(id);
+                            let dom = document.getElementById('item-'+id);
+                            if (dom){
+                                let nodes = dom.getElementsByClassName("custom-control-input");
+                                for(let j=0;j<nodes.length;j++)destroy.push(nodes[j].value);
                             }
+                        }
+                        window.tempTip.postBasicRequest("{{url('maintenance/authority/destroy')}}",{ids:destroy},()=>{
+                            for (let i=0;i<destroy.length;i++){
+                                let dom = document.getElementById("li-"+destroy[i]);
+                                if (dom)dom.remove();
+                            }
+                            return "删除成功";
                         })
-                        .catch(function (err) {
-                            tempTip.setDuration(3000);
-                            tempTip.show('删除权限失败!'+'网络错误:' + err)
-                        });
+                    });
                 },
-            }
-        });
+            },
+        })
     </script>
-@endsection
+@stop

+ 0 - 16
resources/views/maintenance/authority/menu.blade.php

@@ -1,16 +0,0 @@
-
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            @can('权限-查询')
-            <li class="nav-item">
-                <a target="maintenance/authority" class="nav-link" href="{{url('maintenance/authority')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            @can('权限-录入')
-            <li class="nav-item">
-                <a target="maintenance/authority/create" class="nav-link" href="{{url('maintenance/authority/create')}}" :class="{active:isActive('create',3)}">录入货主</a>
-            </li> @endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/maintenance/batch/create.blade.php

@@ -1,10 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.logistic.menu')@endcomponent
-    </div>
     <div class="container-fluid mt-3">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">

+ 0 - 9
resources/views/maintenance/batch/edit.blade.php

@@ -1,15 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')
-        @endcomponent
-        @component('maintenance.logistic.menu')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
-                </li>
-        @endcomponent
-    </div>
     <div class="container-fluid mt-3">
         <div class="card">
             <div class="card-body">

+ 0 - 4
resources/views/maintenance/batch/index.blade.php

@@ -1,10 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.batch.menu')@endcomponent
-    </span>
     <div class="container-fluid mt-3">
         <div class="card">
             <div class="card-body">

+ 0 - 12
resources/views/maintenance/batch/menu.blade.php

@@ -1,12 +0,0 @@
-
-<div class="container-fluid">
-    <div class="card" style="background: #f9f0f0;transform: scale(0.95)">
-        <ul class="nav nav-pills">
-            @can('物流公司-查询')
-            <li class="nav-item">
-                <a target="maintenance/batch" class="nav-link" href="{{url('maintenance/batch')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/maintenance/carType/create.blade.php

@@ -2,10 +2,6 @@
 @section('title')录入-车辆@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.carType.menu')@endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">

+ 0 - 9
resources/views/maintenance/carType/edit.blade.php

@@ -2,15 +2,6 @@
 @section('title')编辑-车辆@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')
-        @endcomponent
-        @component('maintenance.carType.menu')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
-                </li>
-        @endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 0 - 4
resources/views/maintenance/carType/index.blade.php

@@ -2,10 +2,6 @@
 @section('title')查询-车辆@endsection
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.carType.menu')@endcomponent
-    </span>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 0 - 16
resources/views/maintenance/carType/menu.blade.php

@@ -1,16 +0,0 @@
-
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            @can('车型-查询')
-            <li class="nav-item">
-                <a target="maintenance/carType" class="nav-link" href="{{url('maintenance/carType')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            @can('车型-录入')
-            <li class="nav-item">
-                <a target="maintenance/carType/create" class="nav-link" href="{{url('maintenance/carType/create')}}" :class="{active:isActive('create',3)}">录入</a>
-            </li> @endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/maintenance/carrier/create.blade.php

@@ -2,10 +2,6 @@
 @section('title')录入-承运商@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.carrier.menu')@endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">

+ 0 - 9
resources/views/maintenance/carrier/edit.blade.php

@@ -2,15 +2,6 @@
 @section('title')编辑-承运商@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')
-        @endcomponent
-        @component('maintenance.carrier.menu')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
-                </li>
-        @endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 0 - 4
resources/views/maintenance/carrier/index.blade.php

@@ -3,10 +3,6 @@
 @section('title')查询-承运商@endsection
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.carrier.menu')@endcomponent
-    </span>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 0 - 16
resources/views/maintenance/carrier/menu.blade.php

@@ -1,16 +0,0 @@
-
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            @can('承运商-查询')
-            <li class="nav-item">
-                <a target="maintenance/carrier" class="nav-link" href="{{url('maintenance/carrier')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            @can('承运商-录入')
-            <li class="nav-item">
-                <a target="maintenance/carrier/create" class="nav-link" href="{{url('maintenance/carrier/create')}}" :class="{active:isActive('create',3)}">录入</a>
-            </li> @endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/maintenance/city/create.blade.php

@@ -1,10 +1,6 @@
 @extends('layouts.app')
 @section('title')录入-城市@endsection
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.city.menu')@endcomponent
-    </div>
     <div class="card col-md-8 offset-md-2">
         <div class="card-body">
             <form method="POST" action="{{ url('maintenance/city') }}">

+ 0 - 9
resources/views/maintenance/city/edit.blade.php

@@ -2,15 +2,6 @@
 @section('title')编辑-城市@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')
-        @endcomponent
-        @component('maintenance.city.menu')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
-                </li>
-        @endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 0 - 4
resources/views/maintenance/city/index.blade.php

@@ -2,10 +2,6 @@
 @section('title')查询-城市@endsection
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.city.menu')@endcomponent
-    </span>
     <div class="container-fluid">
         <div class="card">
             <div class="card-body">

+ 0 - 16
resources/views/maintenance/city/menu.blade.php

@@ -1,16 +0,0 @@
-
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            @can('城市-查询')
-            <li class="nav-item">
-                <a target="maintenance/city" class="nav-link" href="{{url('maintenance/city')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            @can('城市-录入')
-            <li class="nav-item">
-                <a target="maintenance/city/create" class="nav-link" href="{{url('maintenance/city/create')}}" :class="{active:isActive('create',3)}">录入</a>
-            </li> @endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/maintenance/commodity/create.blade.php

@@ -2,10 +2,6 @@
 @section('title')录入-商品@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.commodity.menu')@endcomponent
-    </div>
     <div class="container-fluid" id="list">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">

+ 0 - 9
resources/views/maintenance/commodity/edit.blade.php

@@ -2,15 +2,6 @@
 @section('title')编辑-商品@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')
-        @endcomponent
-        @component('maintenance.commodity.menu')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
-                </li>
-        @endcomponent
-    </div>
     <div class="container-fluid" id="list">
         <div class="card">
             <div class="card-body">

+ 0 - 4
resources/views/maintenance/commodity/import.blade.php

@@ -1,10 +1,6 @@
 @extends('layouts.app')
 
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.commodity.menu')@endcomponent
-    </div>
     <div class="container-fluid">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">

+ 0 - 4
resources/views/maintenance/commodity/index.blade.php

@@ -2,10 +2,6 @@
 @section('title')查询-商品@endsection
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.commodity.menu')@endcomponent
-    </span>
     <div class="container-fluid" id="list">
         <div class="card">
             <div class="card-body">

+ 0 - 20
resources/views/maintenance/commodity/menu.blade.php

@@ -1,20 +0,0 @@
-
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            @can('商品信息-查询')
-                <li class="nav-item">
-                    <a target="maintenance/commodity" class="nav-link" href="{{url('maintenance/commodity')}}" :class="{active:isActive('',3)}">查询</a>
-                </li> @endcan
-            @can('商品信息-录入')
-                <li class="nav-item">
-                    <a target="maintenance/commodity/create" class="nav-link" href="{{url('maintenance/commodity/create')}}" :class="{active:isActive('create',3)}">录入</a>
-                </li> @endcan
-            {{$slot}}
-            @can('商品信息-录入')
-                <li class="nav-item">
-                    <a target="maintenance/commodity/import" class="nav-link" href="{{url('maintenance/commodity/import')}}" :class="{active:isActive('import',3)}">导入</a>
-                </li> @endcan
-        </ul>
-    </div>
-</div>

+ 0 - 4
resources/views/maintenance/configuration/index.blade.php

@@ -3,10 +3,6 @@
 @section('title','系统配置')
 
 @section('content')
-    <nav id="nav2">
-        @component('maintenance.menu')@endcomponent
-    </nav>
-
     <div class="container-fluid d-none" id="configuration">
         <div class="card">
             @can('系统配置-编辑')

+ 0 - 4
resources/views/maintenance/emails/index.blade.php

@@ -1,10 +1,6 @@
 @extends('layouts.app')
 @section('title')邮件@endsection
 @section('content')
-    <div id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.log.menu')@endcomponent
-    </div>
     <div class="container-fluid" id="container">
         <div class="card">
             <div id="form_div"></div>

+ 0 - 12
resources/views/maintenance/emails/menu.blade.php

@@ -1,12 +0,0 @@
-
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            @can('邮件-查询')
-            <li class="nav-item">
-                <a target="maintenance/mail" class="nav-link" href="{{url('maintenance/mail')}}" :class="{active:isActive('',3)}">查询</a>
-            </li> @endcan
-            {{$slot}}
-        </ul>
-    </div>
-</div>

+ 0 - 12
resources/views/maintenance/expressPrinting/menu.blade.php

@@ -1,12 +0,0 @@
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            <li class="nav-item">
-                <a target="maintenance/expressPrinting/part" class="nav-link" href="{{url('/maintenance/expressPrinting/part')}}" :class="{active:isActive('part',3)}">组件</a>
-            </li>
-            <li class="nav-item">
-                <a target="maintenance/expressPrinting/template" class="nav-link" href="{{url('/maintenance/expressPrinting/template/index')}}" :class="{active:isActive('template',3)}">模板</a>
-            </li>
-        </ul>
-    </div>
-</div>

+ 0 - 5
resources/views/maintenance/expressPrinting/part/create.blade.php

@@ -2,11 +2,6 @@
 @section('title')组件创建@endsection
 
 @section('content')
-    <span class="nav">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.expressPrinting.menu')@endcomponent
-        @component('maintenance.expressPrinting.part.menu')@endcomponent
-    </span>
     <div class="container-fluid d-none" id="create-print-part">
         <div class="row">
             <div class="col-3">

+ 0 - 5
resources/views/maintenance/expressPrinting/part/index.blade.php

@@ -2,11 +2,6 @@
 @section('title')组件@endsection
 
 @section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.expressPrinting.menu')@endcomponent
-        @component('maintenance.expressPrinting.part.menu')@endcomponent
-    </span>
     <div class="container-fluid d-none" id="print_part">
         @include('maintenance.expressPrinting.part._table')
     </div>

+ 0 - 12
resources/views/maintenance/expressPrinting/part/menu.blade.php

@@ -1,12 +0,0 @@
-<div class="container-fluid nav3">
-    <div class="card" >
-        <ul class="nav nav-pills">
-            <li class="nav-item">
-                <a target="maintenance/expressPrinting/part" class="nav-link" href="{{url('/maintenance/expressPrinting/part')}}" :class="{active:isActive('part',3)}">查询</a>
-            </li>
-            <li class="nav-item">
-                <a target="/maintenance/expressPrinting/part/create" class="nav-link" href="{{url('/maintenance/expressPrinting/part/create')}}" :class="{active:isActive('create',4)}">创建</a>
-            </li>
-        </ul>
-    </div>
-</div>

+ 0 - 5
resources/views/maintenance/expressPrinting/print/index.blade.php

@@ -2,11 +2,6 @@
 @section("title","打印")
 
 @section("content")
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.expressPrinting.menu')@endcomponent
-        @component('maintenance.expressPrinting.print.menu')@endcomponent
-    </span>
     <div class="container" id="print">
         <div class="row">
             <div class="container">

Некоторые файлы не были показаны из-за большого количества измененных файлов