Ver Fonte

采购管理-添加耗材和供应商关联

haozi há 5 anos atrás
pai
commit
23bfe76035

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

@@ -188,7 +188,7 @@ class ProcurementController extends Controller
             ]);
             $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
             if ($procurement) return ['success' => true,'data' => $procurement];
-            else return ['success' => false, 'message' => '取消失败'];
+            else return ['success' => false, 'message' => '发起采购失败'];
         } catch (\Exception $e) {
             return ['success' => false,'message' => $e->getMessage()];
         }

+ 50 - 6
app/Http/Controllers/SupplierController.php

@@ -4,6 +4,8 @@ namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
 use App\Filters\SupplierFilters;
+use App\Material;
+use App\MaterialSupplier;
 use App\Supplier;
 use Illuminate\Http\Request;
 
@@ -13,23 +15,44 @@ class SupplierController extends Controller
     public function index(Request $request,SupplierFilters $filters)
     {
         $this->gate('供应商');
-        $suppliers = Supplier::query()->orderByDesc('id')->filter($filters)->paginate($request['paginate']??50);
-        return view('/maintenance/supplier/index',compact('suppliers'));
+        $suppliers = Supplier::query()->with('material')->orderByDesc('id')->filter($filters)->paginate($request['paginate']??50);
+        $materials=Material::query()->select('id','name')->get();
+        return view('/maintenance/supplier/index',compact('suppliers','materials'));
     }
 
     public function storeApi(Request $request)
     {
         $this->gate('供应商-编辑');
-        $supplier = Supplier::query()->create($request->all());
+        $supplier = Supplier::query()->create($request->addSupplier);
+        $material_supplier=[];
+        foreach ($request->material_id as $item){
+            $material_supplier[]=[
+              'material_id'=>$item,
+              'supplier_id'=>$supplier->id,
+            ];
+        }
+        MaterialSupplier::query()->insert($material_supplier);
         $this->success($supplier);
     }
 
     public function updateApi(Request $request)
     {
         $this->gate('供应商-编辑');
-        $supplier = Supplier::query()->find($request['id']);
-        $bool= $supplier->update($request->only(['name','contact_man','phone','invoice_title','bank','bank_account','opening_bank']));
-        if($bool)$this->success($supplier);
+        $editSupplier=$request->input('editSupplier');
+        $material_ids=$request->input('material_id');
+        $material_suppliers=MaterialSupplier::query()->where('supplier_id',$editSupplier['id'])->get();
+        $this->updateMaterial($material_suppliers,$material_ids,$editSupplier['id']);
+        $supplier = Supplier::query()->find($editSupplier['id']);
+        $bool= $supplier->update([
+            'name'=>$editSupplier['name'],
+            'contact_man'=>$editSupplier['contact_man'],
+            'phone'=>$editSupplier['phone'],
+            'invoice_title'=>$editSupplier['invoice_title'],
+            'bank'=>$editSupplier['bank'],
+            'bank_account'=>$editSupplier['bank_account'],
+            'opening_bank'=>$editSupplier['opening_bank']
+        ]);
+        if($bool)$this->success($supplier->loadMissing('material'));
         $this->error('更新异常');
     }
 
@@ -40,4 +63,25 @@ class SupplierController extends Controller
         $supplier->delete();
         $this->success();
     }
+    private function updateMaterial($material_suppliers,$material_ids,$supplier_id){
+        $exist=[]; $adds=[];$addMaterial=[];
+        foreach ($material_suppliers as $material_supplier){
+            $exist[]=$material_supplier['material_id'];
+        }
+        $deletes=array_diff($exist,$material_ids);
+        foreach ($material_ids as $id){
+            if (empty($material_suppliers->where('material_id',$id)->first()))$adds[]=$id;
+        }
+        foreach ($adds as $add){
+            $addMaterial[]=[
+                'material_id'=>$add,
+                'supplier_id'=>$supplier_id,
+            ];
+        }
+        if (count($addMaterial)>0) MaterialSupplier::query()->insert($addMaterial);
+        foreach ($deletes as $delete){
+            MaterialSupplier::query()->where('material_id',$delete)
+                ->where('supplier_id',$supplier_id)->delete();
+        }
+    }
 }

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

@@ -55,6 +55,7 @@ use App\Package;
 use App\Process;
 use App\ProcessDaily;
 use App\ProcessStatistic;
+use App\Procurement;
 use App\ProcurementCheckSheet;
 use App\ProcurementQuotation;
 use App\Province;
@@ -92,6 +93,7 @@ use App\Store;
 use App\StationTaskBatch;
 use App\StoreCheckingReceiveItem;
 use App\StoreItems;
+use App\Supplier;
 use App\Unit;
 use App\User;
 use App\ValueStore;
@@ -1532,11 +1534,6 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
     public function testProcurement()
     {
-        $procurementQuotation=ProcurementQuotation::query()
-            ->with('supplier')
-            ->select('supplier_id','offer')
-            ->orderBy('offer','asc')
-            ->where('procurement_id',7)->first();
-        dd($procurementQuotation);
+
     }
 }

+ 6 - 1
app/Material.php

@@ -4,8 +4,8 @@ namespace App;
 
 use App\Filters\MaterialFilters;
 use Illuminate\Database\Eloquent\Model;
-
 use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 
 class Material extends Model
 {
@@ -13,6 +13,11 @@ class Material extends Model
 
     protected $fillable = ['name','code'];
 
+    public function supplier():BelongsToMany
+    {
+        return $this->belongsToMany(Supplier::class,'material_suppliers','material_id','supplier_id');
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);

+ 14 - 0
app/MaterialSupplier.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+
+class MaterialSupplier extends Model
+{
+    use ModelLogChanging;
+
+    protected $fillable=['material_id','supplier_id'];
+}

+ 14 - 0
app/Services/ProcurementService.php

@@ -20,4 +20,18 @@ class ProcurementService
             ->select('supplier_id','offer')->orderBy('offer','asc')->where('procurement_id',$procurement_id)->first();
         return $procurementQuotation;
     }
+
+    public function pushEnquiryToSupplier($procurement_id){
+        $procurement=Procurement::query()->find($procurement_id);
+        $procurement->loadMissing(['ownerMaterial.material.supplier']);
+        if (!empty($procurement->ownerMaterial->material->supplier))$suppliers=$procurement->ownerMaterial->material->supplier;
+        foreach ($suppliers as $supplier){
+            $procurementQuotation= new ProcurementQuotation([
+                'procurement_id'=>10,
+                'supplier_id'=>$supplier->id,
+            ]);
+            $procurementQuotation->save();
+            //TODO 添加广播推送给指定供应商
+        }
+    }
 }

+ 1 - 2
app/Supplier.php

@@ -4,7 +4,6 @@ namespace App;
 
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
-
 use App\Traits\ModelLogChanging;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
@@ -18,7 +17,7 @@ class Supplier extends Model
 
     public function material():BelongsToMany
     {
-        return $this->belongsToMany(Material::class,'material_supplier','supplier_id','material_id','id','material_id');
+        return $this->belongsToMany(Material::class,'material_suppliers','supplier_id','material_id');
     }
 
     public function scopeFilter($query,$filters)

+ 12 - 0
bootstrap/cache/packages.php

@@ -103,6 +103,18 @@
       0 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
     ),
   ),
+  'tymon/jwt-auth' => 
+  array (
+    'aliases' => 
+    array (
+      'JWTAuth' => 'Tymon\\JWTAuth\\Facades\\JWTAuth',
+      'JWTFactory' => 'Tymon\\JWTAuth\\Facades\\JWTFactory',
+    ),
+    'providers' => 
+    array (
+      0 => 'Tymon\\JWTAuth\\Providers\\LaravelServiceProvider',
+    ),
+  ),
   'yajra/laravel-oci8' => 
   array (
     'providers' => 

+ 14 - 12
bootstrap/cache/services.php

@@ -35,12 +35,13 @@
     31 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
     32 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
     33 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    34 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    35 => 'App\\Providers\\AppServiceProvider',
-    36 => 'App\\Providers\\AuthServiceProvider',
-    37 => 'App\\Providers\\BroadcastServiceProvider',
-    38 => 'App\\Providers\\EventServiceProvider',
-    39 => 'App\\Providers\\RouteServiceProvider',
+    34 => 'Tymon\\JWTAuth\\Providers\\LaravelServiceProvider',
+    35 => 'Yajra\\Oci8\\Oci8ServiceProvider',
+    36 => 'App\\Providers\\AppServiceProvider',
+    37 => 'App\\Providers\\AuthServiceProvider',
+    38 => 'App\\Providers\\BroadcastServiceProvider',
+    39 => 'App\\Providers\\EventServiceProvider',
+    40 => 'App\\Providers\\RouteServiceProvider',
   ),
   'eager' => 
   array (
@@ -65,12 +66,13 @@
     18 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
     19 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
     20 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    21 => 'Yajra\\Oci8\\Oci8ServiceProvider',
-    22 => 'App\\Providers\\AppServiceProvider',
-    23 => 'App\\Providers\\AuthServiceProvider',
-    24 => 'App\\Providers\\BroadcastServiceProvider',
-    25 => 'App\\Providers\\EventServiceProvider',
-    26 => 'App\\Providers\\RouteServiceProvider',
+    21 => 'Tymon\\JWTAuth\\Providers\\LaravelServiceProvider',
+    22 => 'Yajra\\Oci8\\Oci8ServiceProvider',
+    23 => 'App\\Providers\\AppServiceProvider',
+    24 => 'App\\Providers\\AuthServiceProvider',
+    25 => 'App\\Providers\\BroadcastServiceProvider',
+    26 => 'App\\Providers\\EventServiceProvider',
+    27 => 'App\\Providers\\RouteServiceProvider',
   ),
   'deferred' => 
   array (

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeMaterialSuppliers extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::dropIfExists('material_supplier');
+        Schema::create('material_suppliers', function (Blueprint $table) {
+            $table->bigInteger('material_id');
+            $table->bigInteger('supplier_id');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('material_suppliers');
+    }
+}

+ 8 - 0
resources/views/maintenance/supplier/_create.blade.php

@@ -51,6 +51,14 @@
                             <textarea name="specification" id="add-opening-bank " cols="30" rows="5"  class="form-control form-text col-10" v-model="addSupplier.opening_bank "></textarea>
                         </div>
                     </div>
+                    <div class="form-group row">
+                        <label for="add-bank-account " class="col-sm-3 col-form-label text-right">耗材类型</label>
+                        <select id="material_id" class="selectpicker" multiple data-live-search="true" title="耗材类型(多选)"
+                                v-model="material_id">
+                            <option v-for="material in materials" :value="material.id">@{{ material.name }}</option>
+                        </select>
+                        <label hidden><input name="material_id" type="text" :value="material_id"></label>
+                    </div>
                 </form>
             </div>
             <div class="modal-footer">

+ 7 - 0
resources/views/maintenance/supplier/_edit.blade.php

@@ -51,6 +51,13 @@
                             <textarea name="specification" id="edit-opening-bank " cols="30" rows="5"  class="form-control form-text col-10" v-model="editSupplier.opening_bank "></textarea>
                         </div>
                     </div>
+                    <div class="form-group row">
+                        <label for="add-bank-account " class="col-sm-3 col-form-label text-right">耗材类型</label>
+                        <select id="material_id" class="selectpicker" multiple data-live-search="true" title="耗材类型(多选)" v-model="material_id">
+                            <option v-for="material in materials" :value="material.id">@{{ material.name }}</option>
+                        </select>
+                        <label hidden><input name="material_id" type="text" :value="material_id"></label>
+                    </div>
                 </form>
             </div>
             <div class="modal-footer">

+ 16 - 4
resources/views/maintenance/supplier/index.blade.php

@@ -28,6 +28,12 @@
             el:'#supplier',
             data:{
                 suppliers:{!! $suppliers->toJson() !!}['data'],
+                materials : [
+                        @foreach($materials as $material)
+                    {id:"{{$material->id}}",name:"{{$material->name}}"},
+                    @endforeach
+                ],
+                material_id:{!! old('material_id') ? json_encode(old('material_id')) : '[]' !!},
                 editSupplier:{},
                 addSupplier:{},
                 index:''
@@ -53,18 +59,23 @@
                         tempTip.show('删除当前项目耗材失败:'+err);
                     });
                 },
-                edit(suppliers,i){
-                    this.editSupplier = JSON.parse(JSON.stringify(suppliers));
+                edit(supplier,i){
+                    this.editSupplier = JSON.parse(JSON.stringify(supplier));
+                    this.material_id= [];
+                    supplier.material.forEach((item)=>{
+                        this.material_id.push(item.id);
+                    });
                     this.index = i;
                     $('#edit-supplier').modal('show');
                 },
                 update(){
                     let url = '{{url('apiLocal/supplier/update')}}';
-                    let params = this.editSupplier;
+                    let params = {editSupplier:this.editSupplier,material_id:this.material_id};
                     window.tempTip.postBasicRequest(url,params,res=>{
                         this.$set(this.suppliers,this.index,res);
                         this.index = null;
                         this.editSupplier = {};
+                        this.material_id = [];
                         $("#edit-supplier").modal('hide');
                         return "修改完成";
                     },true);
@@ -74,10 +85,11 @@
                 },
                 create(){
                     let url = '{{url('apiLocal/supplier/store')}}';
-                    let params = this.addSupplier;
+                    let params = {addSupplier:this.addSupplier,material_id:this.material_id};
                     window.tempTip.postBasicRequest(url,params,res=>{
                         this.$set(this.suppliers,this.suppliers.length,res);
                         this.addSupplier = {};
+                        this.material_id = [];
                         $("#add-supplier").modal('hide');
                         return "创建成功";
                     },true);

+ 1 - 1
resources/views/procurement/finance/_fillInvoiceNumber.blade.php

@@ -1,5 +1,5 @@
 <div class="modal " id="fill-invoice-number" tabindex="-1" >
-    <div class="modal-dialog modal-lg modal-dialog-centered">
+    <div class="modal-dialog modal-lg">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title text-center">填写发票号</h5>

+ 1 - 5
resources/views/procurement/finance/monthlyBillReport.blade.php

@@ -29,15 +29,12 @@
                 <td>
                     <input class="checkItem" type="checkbox" :value="procurementTotalBill.id" v-model="checkData">
                 </td>
-                <td class="text-primary">@{{ procurementTotalBill.id }}</td>
+                <td >@{{ procurementTotalBill.id }}</td>
                 <td class="text-muted">@{{ procurementTotalBill.counting_month }}</td>
                 <td class="text-muted">@{{ procurementTotalBill.created_at.substr(0,10) }}</td>
                 <td class="text-muted">@{{ procurementTotalBill.supplier_name }}</td>
                 <td>@{{ procurementTotalBill.total_payable }}</td>
                 <td><span>@{{ procurement_total_bill_status[procurementTotalBill.status] }}</span></td>
-                <td>
-                    <span class="btn btn-sm btn-outline-success">查看对账单</span>
-                </td>
             </tr>
         </table>
         <div class="text-info h5 btn btn">{{$procurementTotalBills->count()}}/@{{ sum }}</div>
@@ -100,7 +97,6 @@
                     {name: 'supplier', value: '供应商',},
                     {name: 'total_payable', value: '总金额',},
                     {name: 'status', value: '状态'},
-                    {name: '', value: '操作', neglect: true},
                 ];
 
                 let _this = this;

+ 9 - 19
resources/views/procurement/procurement/index.blade.php

@@ -86,31 +86,21 @@
                     <input class="checkItem" type="checkbox" :value="procurement.id" v-model="checkData">
                 </td>
                 <td class="">@{{ procurement.code }}</td>
-                <td v-if="procurement.owner_material.owner">@{{ procurement.owner_material.owner.name }}</td>
+                <td><span v-if="procurement.owner_material.owner">@{{ procurement.owner_material.owner.name }}</span></td>
                 <td>@{{ procurement_type[procurement.type] }}</td>
-                <td v-if="procurement.owner_material.owner.customer">@{{
-                    procurement.owner_material.owner.customer.company_name }}
-                </td>
-                <td class="tooltipTarget" style="max-width: 200px;overflow:hidden"
-                    v-if="procurement.owner_material.material">@{{ procurement.owner_material.material.code }}
-                </td>
-                <td class="text-muted" v-if="procurement.owner_material.material">@{{
-                    procurement.owner_material.material.name }}
-                </td>
-                <td class="text-muted" v-if="procurement.owner_material">@{{ procurement.owner_material.size }}</td>
-                <td class="text-muted" v-if="procurement.owner_material">@{{ procurement.owner_material.special }}</td>
-                <td class="text-muted" v-if="procurement.owner_material">@{{ procurement.owner_material.specification
-                    }}
-                </td>
+                <td><span v-if="procurement.owner_material.owner.customer">@{{ procurement.owner_material.owner.customer.company_name }}</span></td>
+                <td class="tooltipTarget" style="max-width: 200px;overflow:hidden"><span v-if="procurement.owner_material.material">@{{ procurement.owner_material.material.code }}</span></td>
+                <td class="text-muted"><span v-if="procurement.owner_material.material">@{{ procurement.owner_material.material.name }}</span></td>
+                <td class="text-muted"><span v-if="procurement.owner_material">@{{ procurement.owner_material.size }}</span></td>
+                <td class="text-muted"><span v-if="procurement.owner_material">@{{ procurement.owner_material.special }}</span></td>
+                <td class="text-muted"><span v-if="procurement.owner_material">@{{ procurement.owner_material.specification }}</span></td>
                 <td></td>
                 <td>@{{ procurement.quantity }}</td>
                 <td><span>@{{ procurement.unit_price }}</span></td>
                 <td><span></span></td>
-                <td>@{{ procurement.quantity*procurement.unit_price }}</td>
+                <td><span>@{{ procurement.quantity*procurement.unit_price }}</span></td>
                 <td><span>@{{ procurement_status[procurement.status] }}</span></td>
-                <td v-if="procurement.owner_material.owner.customer">@{{ procurement.owner_material.owner.customer.phone
-                    }}
-                </td>
+                <td><span v-if="procurement.owner_material.owner.customer">@{{ procurement.owner_material.owner.customer.phone }}</span></td>
                 <td>
                     <span v-if="procurement_status[procurement.status]!='取消订单'">
                         <span class="btn btn-sm btn-outline-danger" v-if="!procurement.supplier_id"