Przeglądaj źródła

录入用户,添加配置供应商功能

haozi 5 lat temu
rodzic
commit
0f883cf5fc

+ 15 - 2
app/Http/Controllers/Auth/RegisterController.php

@@ -4,6 +4,8 @@ namespace App\Http\Controllers\Auth;
 
 use App\User;
 use App\Http\Controllers\Controller;
+use App\UserDetail;
+use Carbon\Carbon;
 use Illuminate\Auth\Events\Registered;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -75,17 +77,28 @@ class RegisterController extends Controller
     }
     public function register(Request $request)
     {
-
         $headTo=$request->input('headTo')??'';
         $this->validator($request->all())->validate();
 
         event(new Registered($user = $this->create($request->all())));
-
+        $phone=$request->input('phone');
+        if ($phone) UserDetail::query()->create([
+            'user_id'=>$user['id'],
+            'full_name'=>$user['name'],
+            'mobile_phone'=>$phone,
+            'created_at'=>Carbon::now()->toDateTimeString(),
+            'updated_at'=>Carbon::now()->toDateTimeString(),
+        ]);
         $rolesIds=$request->input('role')??'';
         if($rolesIds){
             $roleIdArr=explode(',',$rolesIds);
             $user->roles()->sync($roleIdArr);
         }
+        $supplierIds=$request->input('supplier')??'';
+        if($supplierIds){
+            $supplierIdArr=explode(',',$supplierIds);
+            $user->suppliers()->sync($supplierIdArr);
+        }
 //        $this->guard()->login($user);
         $carrierIds=$request->input('carrier')??'';
         if ($carrierIds){

+ 2 - 1
app/Http/Controllers/ProcurementController.php

@@ -55,9 +55,9 @@ class ProcurementController extends Controller
         /** @var ProcurementService $procurementService*/
         $procurementService=app(ProcurementService::class);
         $deadline=$procurementService->computeDeadline($procurement->created_at);
+        $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
         if ($procurement->type==0) dispatch(new ProcurementEnquiry($procurement))->delay($deadline); //采购单创建时 推送到队列中
         dispatch(new ProcurementConfirmInform($procurement));  //推送发送订单通知消息模板  队列
-        $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
         return $procurement;
     }
 
@@ -101,6 +101,7 @@ class ProcurementController extends Controller
     }
     public function createProcurement(ProcurementRequest $request): array
     {
+
         $this->gate('采购管理-采购-新建');
         $request->validated();
         $param=$request->all(['owner_material_id','quantity','amount','unit_price']);

+ 0 - 6
app/Http/Controllers/TestController.php

@@ -1661,10 +1661,4 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         }
         return $count;
     }
-    public function testConf(){
-
-        $procurementTotalBills=ProcurementTotalBill::query()->with(['supplier.user.userDetail','procurement'])->get();
-        dd($procurementTotalBills);
-
-    }
 }

+ 22 - 3
app/Http/Controllers/UserController.php

@@ -3,8 +3,11 @@
 namespace App\Http\Controllers;
 
 use App\Role;
+use App\Supplier;
 use App\User;
+use App\UserDetail;
 use App\UserWorkgroup;
+use Doctrine\DBAL\Configuration;
 use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
@@ -23,7 +26,7 @@ class UserController extends Controller
     public function index(Request $request)
     {
         if(!Gate::allows('用户-查询')){ return redirect(url('/'));  }
-        $query = User::with(['roles','logistics','userWorkgroups']);
+        $query = User::with(['roles','logistics','userWorkgroups','suppliers']);
         if($request->has('user')){
            $query->where('name','like',$request->input('user'));
         }
@@ -51,7 +54,8 @@ class UserController extends Controller
         $roles=Role::all();
         $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
         $userWorkgroups=UserWorkgroup::query()->get();
-        return view('maintenance.user.create',['rolesAll'=>$roles,'logistics'=>$logistics,'userWorkgroups'=>$userWorkgroups]);
+        $suppliers=Supplier::query()->get();
+        return view('maintenance.user.create',['rolesAll'=>$roles,'logistics'=>$logistics,'userWorkgroups'=>$userWorkgroups,'suppliers'=>$suppliers]);
     }
 
 
@@ -78,13 +82,16 @@ class UserController extends Controller
     public function edit(User $user)
     {
         if(!Gate::allows('用户-编辑')){ return redirect(url('/'));  }
+        $user=$user->loadMissing('userDetail');
         $rolesAll=Role::all();
         $roles=$user->roles()->get();
         $logistics=app('LogisticService')->getSelection(["id","name"],"物流");
         $logisticUser=$user->logistics()->get();
         $userWorkgroups=UserWorkgroup::query()->get();
         $userWorkgroup=$user->userWorkgroups()->first();
-        return view('maintenance.user.edit',compact('user','rolesAll','roles','logistics','logisticUser','userWorkgroups','userWorkgroup'));
+        $supplierUser=$user->suppliers()->get();
+        $suppliers=Supplier::query()->get();
+        return view('maintenance.user.edit',compact('user','rolesAll','roles','logistics','logisticUser','userWorkgroups','userWorkgroup','suppliers','supplierUser'));
     }
 
     /**
@@ -96,6 +103,7 @@ class UserController extends Controller
      */
     public function update(Request $request, User $user)
     {
+
         if(!Gate::allows('用户-编辑')){ return redirect(url('/'));  }
         $this->validatorUpdate($request->all())->validate();
         $user->fill($request->all());
@@ -107,6 +115,13 @@ class UserController extends Controller
         }else{
             $user->roles()->sync([]);
         }
+        $supplierIds=$request->input('supplier')??'';
+        if($supplierIds){
+            $supplierIdArr=explode(',',$supplierIds);
+            $user->suppliers()->sync($supplierIdArr);
+        }else{
+            $user->suppliers()->sync([]);
+        }
         $carrierIds=$request->input('logistic')??'';
         if($carrierIds){
             $carrierIds=explode(',',$carrierIds);
@@ -120,6 +135,10 @@ class UserController extends Controller
         }else{
             $user->userWorkgroups()->sync([]);
         }
+        $phone=$request->input('phone');
+        $user=$user->loadMissing('userDetail');
+        if ($phone && $user->userDetail->mobile_phone && $phone!=$user->userDetail->mobile_phone)UserDetail::query()->where('user_id',$user->id)
+            ->update(['mobile_phone'=>$phone]);
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return redirect('maintenance/user/')->with('successTip',"成功修改用户“{$user['name']}”!");
     }

+ 78 - 0
app/Jobs/ProcurementCheckConfirmInform.php

@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Services\ProcurementWeiXinSendMessageService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Collection;
+
+class ProcurementCheckConfirmInform implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurementTotalBills;
+    /**
+     * Create a new job instance.
+     *
+     * @param Collection $procurementTotalBills
+     */
+    public function __construct(Collection $procurementTotalBills)
+    {
+        $this->procurementTotalBills=$procurementTotalBills;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        if (empty($this->procurementTotalBills)) return;
+        foreach ($this->procurementTotalBills as $procurementTotalBill){
+            foreach ($procurementTotalBill->supplier as $supplier) {
+                foreach ($supplier->user as $user){
+                   if($user->userDetail->procurement_wechat_open_id){
+                       $param['touser'] =$user->userDetail->procurement_wechat_open_id;
+                       $param['mp_template_msg'] =[
+                           "appid"=>config('weiXin.fuWuHao.appId'),
+                           "template_id"=>config('weiXin.fuWuHaoTemplate.check_sheet_inform'),
+                           "url"=>"http://weixin.qq.com/download",
+                           "miniprogram"=>[
+                               "appid"=>config('weiXin.appId.appId'),
+                               "pagepath"=>"pages/login/login"
+                           ],
+                           'data'=>[
+                               'first' => [
+                                   "value"=>"您好,您的对账单已生成。",
+                               ],
+                               'keyword1' => [
+                                   "value"=>$procurementTotalBill->created_at ?? '',
+                                   "color"=>"#173177"
+                               ],
+                               'keyword2' => [
+                                   "value"=>$procurementTotalBill->procurement_count ?? '',
+                                   "color"=>"#173177"
+                               ],
+                               'keyword3' => [
+                                   "value"=>$procurementTotalBill->total_payable ?? '',
+                                   "color"=>"#173177"
+                               ],
+                               'remark' => [
+                                   "value"=>'点击查看详情。',
+                               ],
+                           ]
+                       ];
+                       app(ProcurementWeiXinSendMessageService::class)->sendWenChantTemplate($param);
+                   }
+                }
+            }
+
+        }
+
+    }
+}

+ 81 - 0
app/Jobs/ProcurementConfirmInform.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Procurement;
+use App\Services\ProcurementWeiXinSendMessageService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class ProcurementConfirmInform implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurement;
+
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $pro=$this->procurement->loadMissing(['ownerMaterial.material.supplier.user.userDetail','ownerMaterial.owner.customer']);
+        if (empty($pro->ownerMaterial->material->supplier))return;
+        $suppliers=$pro->ownerMaterial->material->supplier;
+        $open_ids=[];
+        foreach ($suppliers as $supplier) {
+            foreach ($supplier->user as $user){
+                $open_id = $user->userDetail->procurement_wechat_open_id ?? false;
+                if($open_id)$open_ids[]=$open_id;
+            }
+        }
+        $open_ids=array_unique($open_ids);
+        foreach ($open_ids as $open_id){
+            $param['touser'] =$open_id;
+            $param['mp_template_msg'] =[
+                "appid"=>config('weiXin.fuWuHao.appId'),
+                "template_id"=>config('weiXin.fuWuHaoTemplate.order_confirm_inform'),
+                "url"=>"http://weixin.qq.com/download",
+                "miniprogram"=>[
+                    "appid"=>config('weiXin.appId.appId'),
+                    "pagepath"=>"pages/login/login"
+                ],
+                'data'=>[
+                    'first' => [
+                        "value"=>"尊敬的供应商,你好!",
+                    ],
+                    'keyword1' => [
+                        "value"=>$pro->code ?? '',
+                        "color"=>"#173177"
+                    ],
+                    'keyword2' => [
+                        "value"=>$pro->ownerMaterial->owner->customer->company_name ?? '',
+                        "color"=>"#173177"
+                    ],
+                    'remark' => [
+                        "value"=>'请及时确认,谢谢。',
+                    ],
+                ]
+            ];
+            app(ProcurementWeiXinSendMessageService::class)->sendWenChantTemplate($param);
+        }
+
+    }
+
+
+
+}

+ 68 - 0
app/Jobs/ProcurementEnquiry.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Configuration;
+use App\Procurement;
+use App\Services\ConfigurationService;
+use App\Services\LogService;
+use App\Services\ProcurementService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Cache;
+
+class ProcurementEnquiry implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurement;
+    private $unit_price;
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        /** @var ProcurementService $procurementService*/
+        /**@var ConfigurationService $configurationService */
+        $configurationService=app(ConfigurationService::class);
+        $receive_time=$configurationService->getReceiveTime();
+        $priceCoefficient=$configurationService->getPriceCoefficient();
+        $procurementService=app(ProcurementService::class);
+        $procurementQuotation=$procurementService->screenLowestQuotation($this->procurement->id);
+        if (!$procurementQuotation){
+            $this->procurement->update(['status'=>3]);
+            return;
+        }
+        if(!$this->procurement->unit_price)$this->unit_price=$priceCoefficient*$procurementQuotation['offer'];
+        try{
+           $this->procurement->update([
+               'status'=>2,
+               'unit_price'=>$this->unit_price,
+               'cost_price'=>$procurementQuotation['offer'],
+               'supplier_id'=>$procurementQuotation['supplier_id'],
+               'deadline'=>Carbon::parse(Carbon::now()->toDateTimeString())->subHours(-$receive_time)->toDateTimeString(),
+           ]);
+            dispatch(new ProcurementReceive($this->procurement))->delay(now()->addHours($receive_time)); //可从系统配置获取
+            dispatch(new ProcurementWaitConfirmInform($this->procurement));
+
+        }catch (\Exception $e){
+            LogService::log(__METHOD__,"ERROR-采购延时选定最低报价供应商",$this->procurement->toJson()." | ".$e->getMessage());
+        }
+    }
+}

+ 37 - 0
app/Jobs/ProcurementReceive.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Procurement;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class ProcurementReceive implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    protected $procurement;
+
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $procurement=Procurement::query()->find($this->procurement->id);
+        if ($procurement->status==2) $procurement->update(['status'=>3]);
+    }
+}

+ 80 - 0
app/Jobs/ProcurementWaitConfirmInform.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Procurement;
+use App\Services\ProcurementWeiXinSendMessageService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Carbon;
+
+class ProcurementWaitConfirmInform implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $procurement;
+    /**
+     * Create a new job instance.
+     *
+     * @param Procurement $procurement
+     */
+    public function __construct(Procurement $procurement)
+    {
+        $this->procurement=$procurement;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $pro=$this->procurement->loadMissing(['initiator','supplier.user.userDetail']);
+        foreach ($pro->supplier as $supplier) {
+            foreach ($supplier->user as $user){
+               if ($user->userDetail->procurement_wechat_open_id){
+                   $param['touser'] =$user->userDetail->procurement_wechat_open_id;
+                   $param['mp_template_msg'] =[
+                       "appid"=>config('weiXin.fuWuHao.appId'),
+                       "template_id"=>config('weiXin.fuWuHaoTemplate.wait_procurement_inform'),
+                       "url"=>"http://weixin.qq.com/download",
+                       "miniprogram"=>[
+                           "appid"=>config('weiXin.appId.appId'),
+                           "pagepath"=>"pages/login/login"
+                       ],
+                       'data'=>[
+                           'first' => [
+                               "value"=>"采购申请等待处理。",
+                           ],
+                           'keyword1' => [
+                               "value"=>$pro->code ?? '',
+                               "color"=>"#173177"
+                           ],
+                           'keyword2' => [
+                               "value"=>$pro->initiator->name ?? '',
+                               "color"=>"#173177"
+                           ],
+                           'keyword3' => [
+                               "value"=>$pro->cost_price*$pro->quantity>0 ? $pro->cost_price*$pro->quantity :0 .'元',
+                               "color"=>"#173177"
+                           ],
+                           'keyword4' => [
+                               "value"=>Carbon::now()->toDateTimeString(),
+                               "color"=>"#173177"
+                           ],
+                           'remark' => [
+                               "value"=>'请及时确认,谢谢。',
+                               "color"=>"#173177"
+                           ],
+                       ]
+                   ];
+                   app(ProcurementWeiXinSendMessageService::class)->sendWenChantTemplate($param);
+               }
+            }
+        }
+    }
+}

+ 1 - 1
app/Services/ProcurementService.php

@@ -28,7 +28,7 @@ class ProcurementService
             ->first();
     }
 
-    public function computeDeadline($time)
+    public function computeDeadline($time): string
     {
         /**@var ConfigurationService $configurationService */
         $configurationService=app(ConfigurationService::class);

+ 3 - 0
app/User.php

@@ -92,6 +92,9 @@ class User extends Authenticatable
     function userWorkgroups(){
         return $this->belongsToMany('App\UserWorkgroup','user_workgroup_user','user_id','user_workgroup_id');
     }
+    function suppliers(){
+        return $this->belongsToMany('App\Supplier','supplier_user','user_id','supplier_id');
+    }
 
     function authorities(){
         $authorities = new Collection([]);

+ 32 - 0
database/migrations/2021_03_19_134619_add_openid_column_to_user_details.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOpenidColumnToUserDetails extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_details', function (Blueprint $table) {
+            $table->string('procurement_wechat_open_id')->nullable()->comment('采购小程序绑定用户openid');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('user_details', function (Blueprint $table) {
+            $table->dropColumn('procurement_wechat_open_id');
+        });
+    }
+}

+ 140 - 0
resources/views/maintenance/user/create.blade.php

@@ -51,6 +51,22 @@
                                 </div>
                             </div>
 
+                            <div class="form-group row">
+                                <label for="phone" class="col-md-3 col-form-label text-md-right">手机号码</label>
+
+                                <div class="col-md-7">
+                                    <input id="phone" type="phone"
+                                           class="form-control @error('phone') is-invalid @enderror" name="phone"
+                                           value="{{ old('phone') }}" required autocomplete="phone">
+
+                                    @error('phone')
+                                    <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                                    @enderror
+                                </div>
+                            </div>
+
                             <div class="form-group row">
                                 <label for="password" class="col-md-3 col-form-label text-md-right">密码</label>
 
@@ -120,6 +136,7 @@
                                     </div>
                                 </div>
                             </div>
+
                             <div class="form-group row">
                                 <label for="logistic" class="col-md-3 col-form-label text-md-right">可见承运商</label>
                                 <div class="col-md-7">
@@ -156,6 +173,42 @@
                                 </div>
                             </div>
 
+                            <div class="form-group row">
+                                <label for="logistic" class="col-md-3 col-form-label text-md-right">可见供应商</label>
+                                <div class="col-md-7">
+                                    <input type="text" class="form-control tooltipTarget" placeholder="定位供应商"
+                                           @input="seekSupplier($event)" title="输入关键词快速定位"></div>
+                            </div>
+                            <div class="form-group row">
+                                <label class="col-md-3"></label>
+                                <div class="col-md-4">
+                                    <div class="input-group"
+                                         style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
+                                        <ul class="list-group tooltipTarget" style="width: 100%"
+                                            onselectstart="return false;">
+                                            <li :data-original-title="supplier.style ? '双击删除供应商' : '双击添加供应商'"
+                                                v-for="supplier in suppliersFilter" :id="supplier.name"
+                                                class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
+                                                @dblclick="selectedSupplier(supplier)"
+                                                :class="supplier.style ? 'active' :''"><span style="cursor: default;"> @{{ supplier.name }}  </span>
+                                            </li>
+                                        </ul>
+                                    </div>
+                                </div>
+                                <div class="col-md-3">
+                                    <input name="supplier" hidden v-model="supplier">
+                                    <div class="input-group"
+                                         style="max-height: 150px; overflow-y: scroll;border-radius:5px;text-align: center;">
+                                        <ul class="list-group" style="width: 100%" onselectstart="return false;">
+                                            <li title="双击删除供应商" v-for="supplier in suppliersList"
+                                                class="list-group-item list-group-item-action pt-0 pb-0"
+                                                @dblclick="selectedSupplier(supplier)"><span style="cursor: default;"> @{{ supplier.name }}  </span>
+                                            </li>
+                                        </ul>
+                                    </div>
+                                </div>
+                            </div>
+
                             <input type="hidden" value="{{url('maintenance/user/create')}}">
                             <div class="form-group row mb-0">
                                 <div class="col-md-7 offset-md-4">
@@ -198,6 +251,7 @@
                 ],
                 roles: [{{old('role')}}],
                 rolesList: [],
+
                 logisticsAll: [
                         @foreach($logistics as $logistic)
                     {
@@ -214,6 +268,23 @@
                 ],
                 logistics: [{{old('logistic')}}],
                 logisticsList: [],
+
+                suppliersAll: [
+                        @foreach($suppliers as $supplier)
+                    {
+                        id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
+                    },
+                    @endforeach
+                ],
+                suppliersFilter: [
+                        @foreach($suppliers as $supplier)
+                    {
+                        id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
+                    },
+                    @endforeach
+                ],
+                supplier: [{{old('supplier')}}],
+                suppliersList: [],
             },
             mounted: function () {
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
@@ -293,6 +364,50 @@
                         $(".tooltipTarget").tooltip({'trigger': 'hover'});
                     }, 10)
                 },
+                selectedSupplier: function (e) {
+                    let supplier = this.supplier;
+                    let suppliersAll = this.suppliersAll;
+                    let suppliersList = this.suppliersList;
+                    let isSupplier = true;
+                    if (supplier && suppliersAll) {
+                        for (let i = 0; i < supplier.length; i++) {
+                            if (supplier[i] == e.id) {
+                                supplier.splice(i, 1);
+                                suppliersAll.every(function (suppliersAll) {
+                                    if (suppliersAll.id == e.id) {
+                                        suppliersAll.style = false;
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                suppliersList.every(function (supplier, i) {
+                                    if (supplier.id == e.id) {
+                                        suppliersList.splice(i, 1);
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                isSupplier = false;
+                                break;
+                            }
+                            isSupplier = true;
+                        }
+                    }
+                    if (isSupplier || !supplier) {
+                        supplier.push(e.id);
+                        suppliersAll.every(function (suppliersAll) {
+                            if (suppliersAll.id == e.id) {
+                                suppliersAll.style = true;
+                                suppliersList.push({'id': suppliersAll.id, 'name': suppliersAll.name});
+                                return false;
+                            }
+                            return true;
+                        });
+                    }
+                    setTimeout(function () {
+                        $(".tooltipTarget").tooltip({'trigger': 'hover'});
+                    }, 10)
+                },
                 seekLogistic: function (e) {
                     let $val = e.target.value;
                     let logisticsAll = this.logisticsAll;
@@ -318,6 +433,31 @@
                         }
                     }
                 },
+                seekSupplier: function (e) {
+                    let $val = e.target.value;
+                    let suppliersAll = this.suppliersAll;
+                    let bool = false;
+                    suppliersAll.every(function (supplierAll) {
+                        let name = supplierAll.name;
+                        if (name.includes($val)) {
+                            bool = true;
+                            return false;
+                        }
+                        return true;
+                    });
+                    if($val==='' && !bool){
+                        this.suppliersFilter = this.suppliersAll;
+                    }else if(bool){
+                        this.suppliersFilter= [];
+                        for (let i = 0; i < suppliersAll.length; i++) {
+                            let supplier = suppliersAll[i];
+                            let name = supplier.name;
+                            if(name.includes($val)){
+                                this.suppliersFilter.push(supplier);
+                            }
+                        }
+                    }
+                },
                 selectedRole: function (e) {
                     let roles = this.roles;
                     let rolesAll = this.rolesAll;

+ 151 - 2
resources/views/maintenance/user/edit.blade.php

@@ -44,6 +44,20 @@
                             @enderror
                         </div>
                     </div>
+
+                    <div class="form-group row">
+                        <label for="email" class="col-2 col-form-label text-right">手机号</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('phone') is-invalid @enderror"
+                                   name="phone" autocomplete="off" value="@if(old('phone')){{old('phone')}}@else{{$user->userDetail->mobile_phone}}@endif" required>
+                            @error('phone')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+
                     <div class="form-group row">
                         <label for="userWorkgroup" class="col-2 col-form-label text-right">工作组</label>
                         <div class="col-8">
@@ -107,6 +121,35 @@
                             </div>
                         </div>
                     </div>
+
+                    <hr class="col-8 offset-2 border-info">
+                    <div class="form-group row">
+                        <label for="supplier" class="col-md-3 col-form-label text-md-right">供应商</label>
+                        <div class="col-md-7">
+                            <input type="text"  class="form-control tooltipTarget" placeholder="定位供应商"
+                                   @input="seekSupplier($event)" title="输入关键词快速定位"></div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-md-3"></label>
+                        <div class="col-md-4">
+                            <input name="supplier" hidden    v-model="suppliers" >
+                            <div class="input-group" style="max-height: 190px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
+                                <ul class="list-group tooltipTarget" style="width: 100%" onselectstart="return false;">
+                                    <li  :data-original-title="supplier.style ? '双击删除供应商' :'双击添加供应商'"    v-for="supplier in suppliersFilter" :id="supplier.name" class="list-group-item list-group-item-action pt-0 pb-0"
+                                         @dblclick="selectedSupplier(supplier)" :class="supplier.style ? 'active' :''"><span style="cursor: default;" :id="supplier.name"> @{{ supplier.name }}  </span></li>
+                                </ul>
+                            </div>
+                        </div>
+                        <div class="col-md-3">
+                            <div class="input-group" style="max-height: 190px; overflow-y: scroll;border-radius:5px;text-align: center;">
+                                <ul class="list-group" style="width: 100%" onselectstart="return false;">
+                                    <li  title="双击删除供应商"    v-for="supplier in suppliersList" :id="supplier.name" class="list-group-item list-group-item-action pt-0 pb-0"
+                                         @dblclick="selectedSupplier(supplier)" ><span style="cursor: default;" > @{{ supplier.name }}  </span></li>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+
                     <hr class="col-8 offset-2 border-info">
                     <div class="form-group row">
                         <div class="col-8 offset-2">
@@ -151,6 +194,7 @@
                     @endif
                 ],
                 rolesList:[],
+
                 logisticsAll:[
                     @foreach($logistics as $logistic)
                     {id:'{{$logistic->id}}',name:'{{$logistic->name}}',style:false},
@@ -171,6 +215,27 @@
                     @endforeach
                 ],
                 logisticsList:[],
+
+                suppliersAll: [
+                        @foreach($suppliers as $supplier)
+                    {id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false},
+                    @endforeach
+                ],
+                suppliersFilter: [
+                        @foreach($suppliers as $supplier)
+                    {id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false},
+                    @endforeach
+                ],
+                suppliers: [
+                    @if(old('supplier'))
+                    {{ old('supplier') }}
+                    @else
+                    @foreach( $supplierUser as $supplier )
+                    {{$supplier->id}},
+                    @endforeach
+                    @endif
+                ],
+                suppliersList: [],
             },
             mounted:function(){
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -204,6 +269,21 @@
                         });
                     }
                 }
+                if (this.suppliers.length>0){
+                    let suppliersAll=this.suppliersAll;
+                    let suppliers=this.suppliers;
+                    let suppliersList=this.suppliersList;
+                    for (let i = 0; i < suppliers.length; i++) {
+                        suppliersAll.every(function (supplierAll) {
+                            if (supplierAll.id == suppliers[i]) {
+                                supplierAll.style = true;
+                                suppliersList.push({'id':supplierAll.id,'name':supplierAll.name});
+                                return false;
+                            }
+                            return true;
+                        });
+                    }
+                }
             },
             methods:{
                 selectedLogistic:function (e) {
@@ -250,6 +330,50 @@
                         $(".tooltipTarget").tooltip({'trigger':'hover'});
                     },10)
                 },
+                selectedSupplier:function (e) {
+                    let suppliers=this.suppliers;
+                    let suppliersAll=this.suppliersAll;
+                    let suppliersList=this.suppliersList;
+                    let isSupplier=true;
+                    if (suppliers&&suppliersAll) {
+                        for (let i = 0; i < suppliers.length; i++) {
+                            if (suppliers[i] == e.id) {
+                                suppliers.splice(i,1);
+                                suppliersAll.every(function (supplierAll) {
+                                    if (supplierAll.id == e.id) {
+                                        supplierAll.style = false;
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                suppliersList.every(function (supplier,i) {
+                                    if (supplier.id==e.id){
+                                        suppliersList.splice(i,1);
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                isSupplier= false;
+                                break;
+                            }
+                            isSupplier= true;
+                        }
+                    }
+                    if (isSupplier || !suppliers){
+                        suppliers.push(e.id);
+                        suppliersAll.every(function (supplierAll) {
+                            if (supplierAll.id==e.id){
+                                supplierAll.style=true;
+                                suppliersList.push({'id':supplierAll.id,'name':supplierAll.name});
+                                return false;
+                            }
+                            return  true;
+                        });
+                    }
+                    setTimeout(function(){
+                        $(".tooltipTarget").tooltip({'trigger':'hover'});
+                    },10)
+                },
                 seekLogistic:function (e) {
                     let $val=e.target.value;
                     let logisticsAll=this.logisticsAll;
@@ -279,7 +403,7 @@
                     let rolesAll=this.rolesAll;
                     let rolesList=this.rolesList;
                     let isRole=true;
-                    if (roles&&rolesAll) {
+                    if (roles && rolesAll) {
                         for (let i = 0; i < roles.length; i++) {
                             if (roles[i] == e.id) {
                                 roles.splice(i,1);
@@ -304,7 +428,7 @@
                         }
                     }
                     if (isRole || !roles){
-                        roles.push(e.id);
+                        roles.push(Number(e.id));
                         rolesAll.every(function (roleAll) {
                             if (roleAll.id==e.id){
                                 roleAll.style=true;
@@ -313,6 +437,7 @@
                             }
                             return  true;
                         });
+                        console.log(roles)
                     }
                     setTimeout(function(){
                         $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -342,6 +467,30 @@
                         }
                     }
                 },
+                seekSupplier:function (e) {
+                    let $val=e.target.value;
+                    let suppliersAll=this.suppliersAll;
+                    let bool = false;
+                    suppliersAll.every(function (supplierAll) {
+                        let name=supplierAll.name;
+                        if (name.includes($val)){
+                            bool = true;
+                            return false;
+                        }
+                        return  true;
+                    });
+                    if($val === '' ){
+                        this.suppliersFilter = this.suppliersAll;
+                    }else if(bool){
+                        this.suppliersFilter = [];
+                        for (let i = 0; i <suppliersAll.length ; i++) {
+                            let supplier = suppliersAll[i];
+                            if(supplier.name.includes($val)){
+                                this.suppliersFilter.push(supplier);
+                            }
+                        }
+                    }
+                },
             },
         });
 

+ 6 - 0
resources/views/maintenance/user/index.blade.php

@@ -32,6 +32,11 @@
                                     <li v-for="logistic in user.logistics" style="list-style: none">@{{ logistic.name }}</li>
                                 </ul>
                             </td>
+                            <td>
+                                <ul v-if="user.suppliers.length>0" class="list-group">
+                                    <li v-for="supplier in user.suppliers" style="list-style: none">@{{ supplier.name }}</li>
+                                </ul>
+                            </td>
                             <td>@{{user.email}}</td>
                             <td class="text-muted">@{{user.created_at}}</td>
                             <td>
@@ -85,6 +90,7 @@
                     {name:'role_name',value: '角色', neglect: true},
                     {name:'workgroup_name',value: '工作组', neglect: true},
                     {name:'carrier_name',value: '配置承运商', neglect: true},
+                    {name:'supplier_name',value: '配置供应商', neglect: true},
                     {name:'email',value: '邮件地址'},
                     {name:'created_at',value: '创建时间'},
                     {name:'operation',value: '操作', neglect: true},