Эх сурвалжийг харах

货主的绑定切换源由角色到用户

Zhouzhendong 4 жил өмнө
parent
commit
a3ea253fdb

+ 0 - 4
app/Http/Controllers/InventoryController.php

@@ -2,16 +2,13 @@
 
 namespace App\Http\Controllers;
 
-use App\OracleBasCustomer;
 use App\Owner;
 use App\Services\AllInventoryService;
 use App\Services\InventoryDailyLogService;
 use App\Services\InventoryService;
 use App\Services\OwnerService;
-use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Gate;
-use Illuminate\Support\Facades\Http;
 use Oursdreams\Export\Export;
 
 class InventoryController extends Controller
@@ -40,7 +37,6 @@ class InventoryController extends Controller
         $service = app('AllInventoryService');
         $oracleActTransactingLogs= $service->paginate($request->input());
         $oracleActTransactingLogs=json_encode($oracleActTransactingLogs);
-//        $owners=OracleBasCustomer::query()->select('customerid','descr_c')->where('customer_type','OW')->where('active_flag','Y')->get();
         $owners=Owner::filterAuthorities()->select(['code', 'name'])->get();
         $isTotalStock=true;
         $page = $request->page ?? 1;

+ 14 - 1
app/Http/Controllers/TestController.php

@@ -13,12 +13,15 @@ use App\OrderDetail;
 use App\OrderIssue;
 use App\OrderIssueRejectedBill;
 use App\RejectedBill;
+use App\Role;
 use App\Services\common\BatchUpdateService;
 use App\Services\DeliveryAppointmentService;
 use App\Services\OracleDocAsnHerderService;
 use App\Services\OrderRejectedBillRelationService;
 use App\Services\OrderRejectingStatusService;
+use App\Services\OwnerService;
 use App\Services\RejectedService;
+use App\Services\UserService;
 use App\Services\WaybillService;
 use App\User;
 use App\Waybill;
@@ -27,6 +30,7 @@ use Illuminate\Database\Capsule\Manager;
 use Illuminate\Database\DatabaseManager;
 use Illuminate\Foundation\Auth\AuthenticatesUsers;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Hash;
@@ -54,7 +58,16 @@ class TestController extends Controller
         }
     }
     public function test(Request $request){
-        dd(Cache::get(DeliveryAppointment::BAN,[]));
+        $users = User::query()->with(["roles.owners"])->get();
+        foreach ($users as $user){
+            $owners = [];
+            foreach ($user->roles as $role){
+                foreach ($role->owners as $owner){
+                    $owners[] = $owner->id;
+                }
+            }
+            $user->owners()->sync($owners);
+        }
     }
 }
 

+ 28 - 0
app/Http/Controllers/UserController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
+use App\Owner;
 use App\Role;
 use App\Supplier;
 use App\User;
@@ -12,6 +13,7 @@ use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Hash;
 use Illuminate\Support\Facades\Validator;
@@ -251,4 +253,30 @@ class UserController extends Controller
         $user->ownerGroups()->sync($params['ownerGroups']);
         return ['success'=>true];
     }
+
+    /**
+     * 获取拥有货主
+     *
+     * @param Request $request
+     */
+    public function getOwners(Request $request)
+    {
+        $this->gate("用户-编辑");
+        $this->success(app("UserService")->getUserUnderOwnerIdArr($request->input("id")));
+    }
+
+    /**
+     * 绑定货主
+     *
+     * @param Request $request
+     */
+    public function bindOwner(Request $request)
+    {
+        $this->gate("用户-编辑");
+        $user = new User();
+        $user->id = $request->input("id");
+        $user->owners()->sync($request->input("owners",[]));
+        Cache::pull("USER.{$user->id}.OWNER.ID");
+        $this->success();
+    }
 }

+ 2 - 1
app/Interfaces/UserFilter.php

@@ -9,5 +9,6 @@ use Illuminate\Database\Eloquent\Builder;
 interface UserFilter
 {
     function getIdArr(?int $userId):array;
-    function getQuery(?int $userId):Builder;
+    function getCodeArr(?int $userId):array;
+    function getQuery(?int $userId, $column):Builder;
 }

+ 7 - 1
app/Owner.php

@@ -4,6 +4,7 @@ namespace App;
 
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Support\Facades\Auth;
 
@@ -82,11 +83,16 @@ class Owner extends Model
         return $this['checking_count'];
     }
 
-    public function paperBoxes()
+    public function paperBoxes(): BelongsToMany
     {
         return $this->belongsToMany('\App\PaperBox', 'owner_paper_box', 'owner_id', 'paper_box_id');
     }
 
+    public function users(): BelongsToMany
+    {
+        return $this->belongsToMany('\App\User', 'owner_user', 'owner_id', 'user_id');
+    }
+
     public function orderTrackingOwner(){
         return $this->belongsTo(OrderTrackingOwner::class,'id','owner_id');
     }

+ 9 - 1
app/Services/AuthorityService.php

@@ -152,8 +152,16 @@ class AuthorityService
         })->orWhereIn("name",config("users.superAdmin"))->get();
     }
 
-    public function checkAllOwner(): bool
+    public function checkAllOwner($userId): bool
     {
+        $authorityName = "货主-可见全部";
+        if ($userId != Auth::id()){
+            return Authority::query()->selectRaw("1")->whereHas("roles",function ($query)use($userId){
+                $query->whereHas("users",function ($query)use($userId){
+                    $query->where("users.id",$userId);
+                });
+            })->where("alias_name",$authorityName)->first() != null;
+        }
         return Gate::allows("货主-可见全部");
     }
 }

+ 7 - 2
app/Services/LogisticService.php

@@ -123,10 +123,15 @@ class LogisticService implements UserFilter
         if (!$userId)$userId = Auth::id();
         return array_column($this->getQuery($userId)->get()->toArray(),"id");
     }
-    function getQuery(?int $userId = null): Builder
+    function getCodeArr(?int $userId): array
+    {
+        return [];
+    }
+
+    function getQuery(?int $userId = null, $column = "id"): Builder
     {
         if (!$userId)$userId = Auth::id();
-        $query = Logistic::query()->select("id");
+        $query = Logistic::query()->select($column);
         if (!app("UserService")->checkAdminIdentity($userId)){
             $query->whereHas("users",function ($query)use($userId){
                 $query->where("users.id",$userId);

+ 2 - 2
app/Services/OrderService.php

@@ -1141,10 +1141,10 @@ SQL;
         $query = DB::raw(<<<sql
 SELECT COUNT(1) count,logistic_id FROM orders WHERE wms_status = '订单完成'
 AND owner_id = ?
-AND wms_edittime like ? GROUP BY logistic_id
+AND wms_edittime >= ? AND wms_edittime <= ? GROUP BY logistic_id
 sql
         );
-        $statistics = DB::select($query, [$owner, $month . "%"]);
+        $statistics = DB::select($query, [$owner, $month . "-01 00:00:00", ]);
         $toB = 0;
         $toC = 0;
         foreach ($statistics as $statistic) {

+ 14 - 6
app/Services/OwnerService.php

@@ -573,20 +573,28 @@ sql;
     function getIdArr(?int $userId = null): array
     {
         if (!$userId)$userId = Auth::id();
-        return $this->cacheService->getOrExecute("USER.{$userId}.OWNER",function()use($userId){
+        return $this->cacheService->getOrExecute("USER.{$userId}.OWNER.ID",function()use($userId){
             return array_column($this->getQuery($userId)->get()->toArray(),"id");
         });
     }
-    function getQuery(?int $userId = null): Builder
+    function getCodeArr(?int $userId): array
     {
+        $column = "code";
         if (!$userId)$userId = Auth::id();
-        $query = Owner::query()->select("owners.id");
-        if (!app("UserService")->checkAdminIdentity($userId) && !app("AuthorityService")->checkAllOwner()){
-            $query->whereHas("roles",function ($query)use($userId){
+        return $this->cacheService->getOrExecute("USER.{$userId}.OWNER.CODE",function()use($userId, $column){
+            return array_column($this->getQuery($userId, $column)->get()->toArray(),$column);
+        });
+    }
+    function getQuery(?int $userId = null, $column = "id"): Builder
+    {
+        if (!$userId)$userId = Auth::id();
+        $query = Owner::query()->select("owners.".$column);
+        if (!app("UserService")->checkAdminIdentity($userId) && !app("AuthorityService")->checkAllOwner($userId)){
+            //$query->whereHas("roles",function ($query)use($userId){
                 $query->whereHas("users",function ($query)use($userId){
                     $query->where("users.id",$userId);
                 });
-            });
+            //});
         }
         return $query->whereNull("deleted_at");
     }

+ 20 - 0
app/Services/UserService.php

@@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use App\Traits\ServiceAppAop;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
 
 
@@ -188,4 +189,23 @@ class UserService
         $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? "#".md5($_SERVER['HTTP_USER_AGENT']) : "";
         return $tV===($token.$userAgent);
     }
+
+    /**
+     * 这里与ownerService的getIdArr区别为映射真实ID,摒弃其余因素干扰(超管身份,超级权限等)
+     *
+     * @param int|null $userId
+     * @return array
+     */
+    public function getUserUnderOwnerIdArr(?int $userId = null) :array
+    {
+        if (!$userId){
+            /**@var $user User*/
+            $user = Auth::user();
+        }else{
+            $user = new User();
+            $user->id = $userId;
+        }
+        $user->load("owners:id");
+        return array_column($user->owners->toArray(),"id");
+    }
 }

+ 5 - 0
app/User.php

@@ -86,6 +86,11 @@ class User extends Authenticatable
     public function touchToken(){
         return $this->token();
     }
+    public function owners(): BelongsToMany
+    {
+        return $this->belongsToMany('App\Owner','owner_user','user_id','owner_id')
+            ->whereNull("deleted_at");
+    }
     function roles(){
         return $this->belongsToMany('App\Role','user_role','id_user','id_role');
     }

+ 1 - 1
config/users.php

@@ -1,7 +1,7 @@
 <?php
 
 return [
-    'superAdmin' => ['xuxiaodong','ldaaww','baoshi56','徐薇','周亚萍','shiyao','zhouzhendong','zengjun',"yang",'huhao','zy','刘媛媛','李家磊',env('SUPER_ADMIN',"")],
+    'superAdmin' => ['xuxiaodong','ldaaww','baoshi56','周亚萍','shiyao','zhouzhendong','zengjun',"yang",'huhao','zy','刘媛媛','李家磊',env('SUPER_ADMIN',"")],
     'token_expire_minutes'=>7200,
     'token_check_in_expire_minutes'=>432000, //打卡过期时间,单位为秒
     'cookie_expire_minutes'=>7200,//cookie过期时间,单位分钟

+ 32 - 0
database/migrations/2022_02_14_091112_create_owner_user_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOwnerUserTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('owner_user', function (Blueprint $table) {
+            $table->bigInteger("owner_id");
+            $table->bigInteger("user_id");
+            $table->unique(["user_id","owner_id"]);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('owner_user');
+    }
+}

+ 0 - 122
resources/views/maintenance/role/index.blade.bak.php

@@ -1,122 +0,0 @@
-@extends('layouts.app')
-@section('title')查询-角色@endsection
-
-@section('content')
-    <span id="nav2">
-        @component('maintenance.menu')@endcomponent
-        @component('maintenance.role.menu')@endcomponent
-    </span>
-    <div class="container-fluid">
-        <div class="card">
-            <div id="form_div"></div>
-            <div class="card-body" id="list">
-                @if(Session::has('successTip'))
-                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
-                @endif
-                <table class="table table-striped table-sm td-min-width-80" id="table">
-                    <tr v-for="(role,i) in roles"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
-                        <td class="text-muted">@{{role.id}}</td>
-                        <td>@{{role.name}}</td>
-                        <td>
-                            <div style="max-height: 130px;overflow-y: scroll;border: solid 1px #ddd;" v-if="role.authorities.length>0">
-                                <ul class="list-group">
-                                    <li v-for="authority in role.authorities" v-if="authority.permission=='允许'"  style="list-style: none">@{{ authority.alias_name }}</li>
-                                </ul>
-                            </div>
-                        </td>
-                        <td>
-                            <div style="max-height: 130px;overflow-y: scroll;border: solid 1px #ddd;" v-if="role.authorities.length>0">
-                                <ul class="list-group">
-                                    <li v-for="authority in role.authorities" v-if="authority.permission=='禁止'"  style="list-style: none">@{{ authority.alias_name }}</li>
-                                </ul>
-                            </div>
-                        </td>
-                        <td class="text-muted">@{{role.created_at}}</td>
-                        <td>
-                            @can('角色-编辑')
-                            <button class="btn btn-sm btn-outline-primary" @click="edit(role.id)">改</button> @endcan
-                            @can('角色-删除')
-                            <button class="btn btn-sm btn-outline-dark" @click="destroy(role)">删</button> @endcan
-                        </td>
-                    </tr>
-                </table>
-                {{$roles->links()}}
-            </div>
-        </div>
-    </div>
-@endsection
-
-@section('lastScript')
-    <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
-    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版--}}
-    <script>
-        new Vue({
-            el:"#list",
-            data:{
-                roles:[
-                        @foreach( $roles as $role )
-                    {id:'{{$role->id}}',name:'{{$role->name}}',
-                        authorities:{!! $role->authorities !!},created_at:'{{$role->created_at}}',
-                    },
-                    @endforeach
-                ],
-                form:'',
-                selectTr:0
-            },
-            mounted:function(){
-                let data = [[
-                    {name:'role',type:'input',tip:'角色名:可在两侧添加百分号(%)进行模糊搜索',placeholder:'角色名'}]];
-                this.form = new query({
-                    el: '#form_div',
-                    condition: data,
-                });
-                this.form.init();
-                let column = [
-                    {name:'id',value: 'ID'},
-                    {name:'name',value: '角色'},
-                    {name:'alias_name',value: '允许权限', neglect: true},
-                    {name:'alias_name_false',value: '禁止权限', neglect: true},
-                    {name:'created_at',value: '创建时间'},
-                    {name:'operation',value: '操作', neglect: true},
-                ];
-                new Header({
-                    el:"table",
-                    name:"role",
-                    column: column,
-                    data: this.roles,
-                    fixedTop: ($('#form_div').height())+2,
-                }).init();
-            },
-            methods:{
-                edit:function(id){
-                    location.href = "{{url('maintenance/role')}}/"+id+"/edit";
-                },
-                destroy:function(role){
-                    if(!confirm('确定要删除角色“' + role.name + '”吗?')){return};
-                    let data=this;
-                    let url = "{{url('maintenance/role')}}/"+role.id;
-                    axios.delete(url,{id:role.id})
-                        .then(function (response) {
-                            if(response.data.success){
-                                for (let i = 0; i < data.roles.length; i++) {
-                                    if (data.roles[i].id===role.id){
-                                        data.roles.splice(i,1);
-                                        break;
-                                    }
-                                }
-                                tempTip.setDuration(1000);
-                                tempTip.showSuccess('删除角色"'+role.name+'"成功!')
-                            }else{
-                                tempTip.setDuration(1000);
-                                tempTip.show('删除角色"'+role.name+'"失败!')
-                            }
-                        })
-                        .catch(function (err) {
-                            tempTip.setDuration(3000);
-                            tempTip.show('删除角色失败!'+'网络错误:' + err)
-                        });
-                },
-            }
-        });
-    </script>
-@endsection

+ 38 - 0
resources/views/maintenance/user/_allocationOwner.blade.php

@@ -0,0 +1,38 @@
+<div class="modal fade" id="allocation-owner" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog modal-dialog-centered" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="text-center font-weight-bold h4">分配货主</div>
+                <button type="button" class="close" data-dismiss="modal">&times;</button>
+            </div>
+            <div class="modal-body card p-0">
+                <div class="card-header row">
+                    <div class="col-4">
+                        <div class="pull-left text-muted">
+                            <label for="check-owners">
+                                <input type="checkbox" class="switch" v-model="switchStatus" @change="changeSwitchStatus()"  id="check-owners">
+                            </label>
+                        </div>
+                        <label class="ml-0">未拥有</label>
+                    </div>
+                    <div class="col-7">
+                        <input class="form-control form-control-sm rounded-pill" placeholder="检索" @keydown.enter="seekOwner($event)">
+                    </div>
+                </div>
+                <div class="card-body overflow-scrollbar-200 p-0">
+                    <ul class="list-group">
+                        <li class="list-group-item" v-for="owner in owners" v-show="!owner.hide">
+                            <label class="custom-control custom-checkbox" style="user-select:none" :for="'owner'+owner.name">
+                                <input type="checkbox" class="custom-control-input" v-model="switchOwner" :value="owner.name" :id="'owner'+owner.name">
+                                <label class="custom-control-label ml-0">@{{ owner.value }}</label>
+                            </label>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button class="col-12 btn btn-success" @click="executeAllocation()">确定</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 57 - 1
resources/views/maintenance/user/index.blade.php

@@ -11,6 +11,7 @@
                 @endif
                 <div id="list">
                     @include("maintenance.user._resetPwd")
+                    @include("maintenance.user._allocationOwner")
                     <table class="table table-striped table-sm td-min-width-80" id="table">
                         <tr v-for="(user,i) in users"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                             <td class="text-muted"><span>@{{user.id}}</span></td>
@@ -37,7 +38,8 @@
                             <td>
                                 @can('用户-编辑')
                                 <button class="btn btn-sm btn-warning" @click="openResetPwdModal(user)">重置密码</button>
-                                <button class="btn btn-sm btn-outline-primary" @click="edit(user.id)">改</button> @endcan
+                                <button class="btn btn-sm btn-info ml-1" @click="allocationOwner(user)">分配货主</button>
+                                <button class="btn btn-sm btn-outline-primary ml-1" @click="edit(user.id)">改</button> @endcan
                                 @can('用户-删除')
                                 <button class="btn btn-sm btn-outline-dark" @click="destroy(user)">删</button> @endcan
                             </td>
@@ -69,6 +71,8 @@
                 ],
                 selectTr:0,
                 user:{},
+                switchStatus:false,
+                switchOwner:[],
             },
             mounted:function(){
                 let data = [
@@ -153,6 +157,58 @@
                         return "已重置用户:“"+this.user.name+"”的密码";
                     },true);
                 },
+                allocationOwner(user){
+                    this.switchOwner = [];
+                    this._updateOwnerShow(this.switchStatus);
+                    this.user = user;
+                    if (!user.owners){
+                        window.tempTip.postBasicRequest("{{url('maintenance/user/getOwners')}}", {id:user.id},res=>{
+                            this.user.owners = res;
+                            this.switchOwner = res;
+                        });
+                    }else{
+                        this.switchOwner = user.owners;
+                    }
+                    $("#allocation-owner").modal('show');
+                },
+                changeSwitchStatus(){
+                    if (!this.user.owners || this.user.owners.length===0){
+                        this._updateOwnerShow(!this.switchStatus);
+                    }else{
+                        this.owners.forEach(owner=>{
+                            owner.hide = this.isExist(this.user.owners,owner.name) && this.switchStatus;
+                        });
+                        this.$forceUpdate();
+                    }
+                },
+                _updateOwnerShow(isHide){
+                    this.owners.forEach(owner=>{
+                        owner.hide = isHide;
+                    })
+                    this.$forceUpdate();
+                },
+                seekOwner(e){
+                    let val = e.target.value;
+                    this.owners.forEach(owner=>{
+                        if (owner.value.indexOf(val) > -1){
+                            owner.hide = !((this.switchStatus && !this.isExist(this.user.owners,owner.name)) || !this.switchStatus);
+                        }else{
+                            owner.hide = true;
+                        }
+                    })
+                    this.$forceUpdate();
+                },
+                executeAllocation(){
+                    window.tempTip.postBasicRequest("{{url('maintenance/user/bindOwner')}}", {id:this.user.id,owners:this.switchOwner},()=>{
+                        this.user.owners = this.switchOwner;
+                        return "绑定成功";
+                    },true);
+                },
+                isExist(arr, tar){
+                    return arr.some(val=>{
+                        return val == tar;
+                    });
+                },
             }
         });
     </script>

+ 2 - 0
routes/web.php

@@ -345,6 +345,8 @@ Route::group(['middleware' => 'auth'], function ($route) {
             Route::post("resetPassword", 'UserController@resetPassword');
             Route::post("saveWorkGroups", 'UserController@saveWorkGroups');
             Route::post("saveOwnerGroups", 'UserController@saveOwnerGroups');
+            Route::post("getOwners", 'UserController@getOwners');
+            Route::post("bindOwner", 'UserController@bindOwner');
         });
         /** 项目耗材 */
         Route::group(['prefix' => "ownerMaterial"], function () {