Quellcode durchsuchen

Merge branch 'Haozi' of ssh://was.baoshi56.com:10022/var/git/bswas

LD vor 5 Jahren
Ursprung
Commit
5fc90dc27d
28 geänderte Dateien mit 771 neuen und 204 gelöschten Zeilen
  1. 4 2
      app/Http/Controllers/MaterialController.php
  2. 3 2
      app/Http/Controllers/OwnerMaterialController.php
  3. 40 42
      app/Http/Controllers/SupplierController.php
  4. 65 0
      app/Http/Requests/Material/MaterialRequest.php
  5. 74 0
      app/Http/Requests/OwnerMaterial/OwnerMaterialRequest.php
  6. 91 0
      app/Http/Requests/Supplier/SupplierRequest.php
  7. 1 1
      resources/views/maintenance/city/index.blade.php
  8. 2 1
      resources/views/maintenance/emails/index.blade.php
  9. 1 0
      resources/views/maintenance/log/index.blade.php
  10. 13 7
      resources/views/maintenance/material/_create.blade.php
  11. 13 7
      resources/views/maintenance/material/_edit.blade.php
  12. 42 31
      resources/views/maintenance/material/index.blade.php
  13. 32 7
      resources/views/maintenance/ownerMaterial/_create.blade.php
  14. 29 7
      resources/views/maintenance/ownerMaterial/_edit.blade.php
  15. 3 0
      resources/views/maintenance/ownerMaterial/_uploadFile.blade.php
  16. 86 23
      resources/views/maintenance/ownerMaterial/index.blade.php
  17. 1 1
      resources/views/maintenance/priceModel/waybillPriceModel/index.blade.php
  18. 1 1
      resources/views/maintenance/province/index.blade.php
  19. 68 13
      resources/views/maintenance/supplier/_create.blade.php
  20. 60 13
      resources/views/maintenance/supplier/_edit.blade.php
  21. 9 0
      resources/views/maintenance/supplier/_table.blade.php
  22. 113 31
      resources/views/maintenance/supplier/index.blade.php
  23. 4 3
      resources/views/maintenance/taxRate/index.blade.php
  24. 2 0
      resources/views/maintenance/unit/index.blade.php
  25. 2 2
      resources/views/maintenance/userLabor/index.blade.php
  26. 1 0
      resources/views/maintenance/userWorkgroup/index.blade.php
  27. 1 0
      resources/views/maintenance/warehouse/index.blade.php
  28. 10 10
      routes/apiLocal.php

+ 4 - 2
app/Http/Controllers/MaterialController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Components\AsyncResponse;
 use App\Exceptions\WarningException;
 use App\Filters\MaterialFilters;
+use App\Http\Requests\Material\MaterialRequest;
 use App\Material;
 use Illuminate\Http\Request;
 
@@ -19,7 +20,7 @@ class MaterialController extends Controller
         return view('maintenance/material/index',compact('materials'));
     }
 
-    public function storeApi(Request $request):array
+    public function storeApi(MaterialRequest $request):array
     {
         $this->gate('耗材类型-编辑');
         $material = Material::query()->where('code',$request['code'])->first();
@@ -32,9 +33,10 @@ class MaterialController extends Controller
         }
     }
 
-    public function updateApi(Request $request):array
+    public function updateApi(MaterialRequest $request):array
     {
         $this->gate('耗材类型-编辑');
+        /** @var Material $material */
         $material = Material::query()->find($request['id']);
         try {
             $material->update($request->all(['code', 'name']));

+ 3 - 2
app/Http/Controllers/OwnerMaterialController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Components\AsyncResponse;
 use App\Exceptions\Exception;
 use App\Filters\OwnerMaterialFilters;
+use App\Http\Requests\OwnerMaterial\OwnerMaterialRequest;
 use App\Material;
 use App\OwnerMaterial;
 use App\Services\OwnerService;
@@ -28,7 +29,7 @@ class OwnerMaterialController extends Controller
         return view('/maintenance/ownerMaterial/index',compact('ownerMaterials','owners','materials'));
     }
 
-    public function storeApi(Request  $request):array
+    public function storeApi(OwnerMaterialRequest  $request):array
     {
         $this->gate('项目耗材-编辑');
         $params = $request->all(['owner_id', 'material_id', 'material_code', 'size', 'special', 'specification']);
@@ -42,7 +43,7 @@ class OwnerMaterialController extends Controller
         }
     }
 
-    public function updateApi(Request $request)
+    public function updateApi(OwnerMaterialRequest $request)
     {
         $this->gate('项目耗材-编辑');
         $material = OwnerMaterial::query()->find($request['id']);

+ 40 - 42
app/Http/Controllers/SupplierController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
 use App\Filters\SupplierFilters;
+use App\Http\Requests\Supplier\SupplierRequest;
 use App\Material;
 use App\MaterialSupplier;
 use App\Supplier;
@@ -12,76 +13,73 @@ use Illuminate\Http\Request;
 class SupplierController extends Controller
 {
     use AsyncResponse;
-    public function index(Request $request,SupplierFilters $filters)
+
+    public function index(Request $request, SupplierFilters $filters)
     {
         $this->gate('供应商');
-        $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'));
+        $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)
+    public function storeApi(SupplierRequest $request)
     {
         $this->gate('供应商-编辑');
-        $supplier = Supplier::query()->create($request->addSupplier);
-        $material_supplier=[];
-        foreach ($request->material_id as $item){
-            $material_supplier[]=[
-              'material_id'=>$item,
-              'supplier_id'=>$supplier->id,
+        $supplier = Supplier::query()->create($request->all());
+        $material_supplier = [];
+        foreach ($request['material_id'] as $item) {
+            $material_supplier[] = [
+                'material_id' => $item,
+                'supplier_id' => $supplier['id'],
             ];
         }
         MaterialSupplier::query()->insert($material_supplier);
+        $supplier->loadMissing('material');
         $this->success($supplier);
     }
 
-    public function updateApi(Request $request)
+    public function updateApi(SupplierRequest $request)
     {
         $this->gate('供应商-编辑');
-        $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'));
+        $material_suppliers = MaterialSupplier::query()->where('supplier_id', $request['id'])->get();
+        $this->updateMaterial($material_suppliers, $request['material_id'], $request['id']);
+        /** @var Supplier $supplier */
+        $supplier = Supplier::query()->find($request['id']);
+        $bool = $supplier->update($request->all());
+        if ($bool) $this->success($supplier->loadMissing('material'));
         $this->error('更新异常');
     }
 
     public function destroyApi($id)
     {
         $this->gate('供应商-删除');
+        /** @var Supplier $supplier */
         $supplier = Supplier::query()->find($id);
         $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'];
+
+    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;
+        $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,
+        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();
+        if (count($addMaterial) > 0) MaterialSupplier::query()->insert($addMaterial);
+        foreach ($deletes as $delete) {
+            MaterialSupplier::query()->where('material_id', $delete)->where('supplier_id', $supplier_id)->delete();
         }
     }
 }

+ 65 - 0
app/Http/Requests/Material/MaterialRequest.php

@@ -0,0 +1,65 @@
+<?php
+
+
+namespace App\Http\Requests\Material;
+use App\Traits\RequestApiFormValidation;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Route;
+
+
+class MaterialRequest extends FormRequest
+{
+    use RequestApiFormValidation;
+
+    public function authorize(): bool
+    {
+        return true;
+    }
+
+    protected $storeApiRules =[
+        'name' => 'required',
+        'code' => 'required',
+    ];
+    protected $storeApiMessage = [
+        'name.required' => '耗材类型名称为必填项',
+        'code.required' => '编号为必填项'
+    ];
+
+    protected $updateApiRules = [
+        'name' => 'required',
+        'code' => 'required',
+        'id' =>  'required'
+    ];
+
+    protected $updateApiMessage = [
+        'name.required' => '名称不能为空',
+        'code.required' => '编号不能为空',
+        'id.required' => '未选中耗材类型',
+    ];
+
+
+    public function rules():array
+    {
+        $routeName = Route::currentRouteName();
+        switch ($routeName){
+            case 'material.storeApi':
+                return $this->storeApiRules;
+            case 'material.updateApi':
+                return $this->updateApiRules;
+            default:
+                return [];
+        }
+    }
+    public function messages():array
+    {
+        $routeName = Route::currentRouteName();
+        switch ($routeName){
+            case 'material.storeApi':
+                return $this->storeApiMessage;
+            case 'material.updateApi':
+                return $this->updateApiMessage;
+            default:
+                return [];
+        }
+    }
+}

+ 74 - 0
app/Http/Requests/OwnerMaterial/OwnerMaterialRequest.php

@@ -0,0 +1,74 @@
+<?php
+
+
+namespace App\Http\Requests\OwnerMaterial;
+
+use App\Traits\RequestApiFormValidation;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Route;
+
+class OwnerMaterialRequest extends FormRequest
+{
+    use RequestApiFormValidation;
+
+    use RequestApiFormValidation;
+
+    public function authorize(): bool
+    {
+        return true;
+    }
+
+
+    protected $storeApiRules = [
+        'owner_id' => 'required',       // 货主
+        'material_id' => 'required',    // 耗材
+        'size' => 'required',    // size
+        'material_code' => 'required',  // 耗材编码
+    ];
+    protected $storeApiMessage = [
+        'owner_id.required' => '货主为必选项',
+        'material_id.required' => '耗材为必选项',
+        'size.required' => '尺寸为必填项',
+        'material_code.required' => '耗材编码为必填项',
+    ];
+
+    protected $updateApiRules = [
+        'owner_id' => 'required',       // 货主
+        'material_id' => 'required',    // 耗材
+        'size' => 'required',    // size
+        'material_code' => 'required',  // 耗材编码
+    ];
+    protected $updateApiMessage = [
+        'owner_id.required' => '货主为必选项',
+        'material_id.required' => '耗材为必选项',
+        'size.required' => '尺寸为必填项',
+        'material_code.required' => '耗材编码为必填项',
+    ];
+
+    public function rules(): array
+    {
+        $routeName = Route::currentRouteName();
+        switch ($routeName) {
+            case 'ownerMaterial.storeApi':
+                return $this->storeApiRules;
+            case 'ownerMaterial.updateApi':
+                return $this->updateApiRules;
+            default:
+                return [];
+        }
+    }
+
+    public function messages(): array
+    {
+        $routeName = Route::currentRouteName();
+        switch ($routeName) {
+            case 'ownerMaterial.storeApi':
+                return $this->storeApiMessage;
+            case 'ownerMaterial.updateApi':
+                return $this->updateApiMessage;
+            default:
+                return [];
+        }
+    }
+
+}

+ 91 - 0
app/Http/Requests/Supplier/SupplierRequest.php

@@ -0,0 +1,91 @@
+<?php
+
+
+namespace App\Http\Requests\Supplier;
+
+use App\Traits\RequestApiFormValidation;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Route;
+
+class SupplierRequest extends FormRequest
+{
+    use RequestApiFormValidation;
+
+    protected $storeApiRules = [
+        'name' => 'required',
+        'contact_man' => 'required',
+        'phone' => 'required|numeric',
+        'invoice_title' => 'required',
+        'bank' => 'required',
+        'bank_account' => 'required',
+        'opening_bank' => 'required',
+        'material_id'=> 'required'
+    ];
+    protected $storeApiMessage = [
+        'name.required' => '供应商能为必填项',
+        'contact_man.required' => '联系人为必填项',
+        'phone.required' => '联系电话为必填项',
+        'phone.numeric' => '联系电话必须由数字组成',
+        'invoice_title.required' => '发票抬头为必填项',
+        'bank.required' =>  '账户银行为必填项',
+        'bank_account.required' => '收款账号为必填项',
+        'opening_bank.required' => '开户银行为必填项',
+        'material_id.required' => '耗材类型为必选项',
+    ];
+
+    protected $updateApiRules = [
+        'name' => 'required',
+        'contact_man' => 'required',
+        'phone' => 'required|numeric',
+        'invoice_title' => 'required',
+        'bank' => 'required',
+        'bank_account' => 'required',
+        'opening_bank' => 'required',
+        'material_id'=> 'required'
+
+    ];
+    protected $updateMessage = [
+        'name.required' => '供应商能为必填项',
+        'contact_man.required' => '联系人为必填项',
+        'phone.required' => '联系电话为必填项',
+        'phone.numeric' => '联系电话必须由数字组成',
+        'invoice_title.required' => '发票抬头为必填项',
+        'bank.required' =>  '账户银行为必填项',
+        'bank_account.required' => '收款账号为必填项',
+        'opening_bank.required' => '开户银行必填项',
+        'material_id.required' => '耗材类型为必选项',
+    ];
+
+
+    public function authorize(): bool
+    {
+        return true;
+    }
+
+
+    public function rules(): array
+    {
+        $routeName = Route::currentRouteName();
+        switch ($routeName) {
+            case 'supplier.storeApi':
+                return $this->storeApiRules;
+            case 'supplier.updateApi':
+                return $this->updateApiRules;
+            default:
+                return [];
+        }
+    }
+
+    public function messages(): array
+    {
+        $routeName = Route::currentRouteName();
+        switch ($routeName) {
+            case 'supplier.storeApi':
+                return $this->storeApiMessage;
+            case 'supplier.updateApi':
+                return $this->updateMessage;
+            default:
+                return [];
+        }
+    }
+}

+ 1 - 1
resources/views/maintenance/city/index.blade.php

@@ -20,7 +20,7 @@
                         <th>录入时间</th>
                         <th>操作</th>
                     </tr>
-                    <tr v-for="city in cities" @click="selectTr===city.id ? selectTr=0 : selectTr=city.id " :class="selectTr===city.id ? 'focusing':'">
+                    <tr v-for="(city,i) in cities" @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td class="text-muted">@{{city.id}}</td>
                         <td>
                             @{{ city.province }}

+ 2 - 1
resources/views/maintenance/emails/index.blade.php

@@ -21,7 +21,7 @@
                         <th>邮件模板</th>
                         <th>操作</th>
                     </tr>
-                    <tr v-for="(emailEvent,i) in emailEvents">
+                    <tr v-for="(emailEvent,i) in emailEvents" @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td width="50">@{{ i+1 }}</td>
                         <td width="50">@{{ emailEvent.name }}</td>
                         <td width="100">
@@ -103,6 +103,7 @@
                 emailEvents: {!!  $emailEvents->toJson() !!}['data'],
                 roles: {!!  $roles->toJson() !!},
                 addRolesFlag: false,
+                selectTr:0,
             },
             methods: {
                 /**

+ 1 - 0
resources/views/maintenance/log/index.blade.php

@@ -60,6 +60,7 @@
             el: "#list",
             data: {
                 logs: {!! json_encode($logs->toArray()['data'])??[] !!},
+                selectTr:0,
             },
             mounted: function () {
                 let data = [

+ 13 - 7
resources/views/maintenance/material/_create.blade.php

@@ -3,25 +3,31 @@
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title" id="add-title">添加耗材类型</h5>
-                <button type="button" class="close"  data-dismiss="modal">
+                <button type="button" class="close"  data-dismiss="modal" @click="addMaterial={}">
                     <span>&times;</span>
                 </button>
             </div>
             <div class="modal-body">
                 <form>
                     <div class="form-group">
-                        <label for="material-code">编号</label>
-                        <input type="text" id="material-code" class="form-control" v-model="addMaterial.code">
+                        <label for="add-material-code">编号</label>
+                        <input type="text" id="add-material-code" class="form-control" v-model="addMaterial.code" :class="materialError.code ? 'is-invalid':''" @click="materialError.code = null">
+                        <div class="invalid-feedback" v-if="materialError.code">
+                            @{{ materialError.code[0] }}
+                        </div>
                     </div>
                     <div class="form-group">
-                        <label for="material-name">名称</label>
-                        <input type="text" id="material-name" class="form-control" v-model="addMaterial.name">
+                        <label for="add-material-name">名称</label>
+                        <input type="text" id="add-material-name" class="form-control" v-model="addMaterial.name" :class="materialError.name ? 'is-invalid':''" @click="materialError.name = null">
+                        <div class="invalid-feedback" v-if="materialError.name">
+                            @{{ materialError.name[0] }}
+                        </div>
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary"  data-dismiss="modal">关闭</button>
-                <button type="button" class="btn btn-primary" @click="create">提交</button>
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="addMaterial={}">关闭</button>
+                <button type="button" class="btn btn-primary" @click="create(addMaterial)">提交</button>
             </div>
         </div>
     </div>

+ 13 - 7
resources/views/maintenance/material/_edit.blade.php

@@ -3,25 +3,31 @@
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title" id="edit-title" >修改耗材类型</h5>
-                <button type="button" class="close"  data-dismiss="modal" @click="editMaterial={}">
+                <button type="button" class="close"  data-dismiss="modal" @click="editMaterial={},selectIndex=null">
                     <span>&times;</span>
                 </button>
             </div>
             <div class="modal-body">
                 <form>
                     <div class="form-group">
-                        <label for="material-code">编号</label>
-                        <input type="text" id="material-code" class="form-control" v-model="editMaterial.code">
+                        <label for="edit-material-code">编号</label>
+                        <input type="text" id="edit-material-code" class="form-control" v-model="editMaterial.code" :class="materialError.code ? 'is-invalid':''" @click="materialError.code = null">
+                        <div class="invalid-feedback" v-if="materialError.code">
+                            @{{ materialError.code[0] }}
+                        </div>
                     </div>
                     <div class="form-group">
-                        <label for="material-name">名称</label>
-                        <input type="text" id="material-name" class="form-control" v-model="editMaterial.name">
+                        <label for="edit-material-name">名称</label>
+                        <input type="text" id="edit-material-name" class="form-control" v-model="editMaterial.name"  :class="materialError.name ? 'is-invalid':''" @click="materialError.name = null">
+                        <div class="invalid-feedback" v-if="materialError.name">
+                            @{{ materialError.name[0]  }}
+                        </div>
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="editMaterial={}">关闭</button>
-                <button type="button" class="btn btn-primary" @click="update">提交</button>
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="editMaterial={},selectIndex=null">关闭</button>
+                <button type="button" class="btn btn-primary" @click="update(editMaterial,selectIndex)">提交</button>
             </div>
         </div>
     </div>

+ 42 - 31
resources/views/maintenance/material/index.blade.php

@@ -20,7 +20,6 @@
                 @include('maintenance.material._table')
             </div>
         </div>
-
     </div>
 @endsection
 @section('lastScript')
@@ -30,71 +29,83 @@
         data:{
             materials:{!! $materials->toJson() !!}['data'],
             editMaterial:{},
-            index:'',
             addMaterial:{},
-            selectTr:0
+            selectTr:0,
+            selectIndex:0,
+            materialError:{},
+        },
+        created(){
         },
         mounted() {
           $('#material_div').removeClass('d-none');
         },
         methods:{
             destroy(id,index){
-                axios.delete('{{url("apiLocal/material/destroy")}}/'+id).then(res=>{
-                    if(res.data.success){
+                window.tempTip.setIndex(1099);
+                window.tempTip.confirm("是否删除当前耗材?",()=>{
+                    window.axios.delete('{{url("apiLocal/material/destroy")}}/'+id).then(res=>{
+                        if(res.data.success){
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess('删除成功');
+                            this.$delete(this.materials,index);
+                            return;
+                        }
+                        tempTip.setDuration(3000);
+                        tempTip.show(res.data.message);
+                    }).catch(err=>{
                         tempTip.setDuration(3000);
-                        tempTip.showSuccess('删除成功');
-                        this.$delete(this.materials,index);
-                        return;
-                    }
-                    tempTip.setDuration(3000);
-                    tempTip.show(res.data.message);
-                }).catch(err=>{
-                    tempTip.setDuration(3000);
-                    tempTip.show(err);
+                        tempTip.show(err);
+                    });
                 });
             },
             edit(material,i){
                 this.editMaterial =JSON.parse(JSON.stringify(material));
-                this.index = i;
+                this.selectIndex = i;
                 $('#editModal').modal('show');
             },
             store(){
                 this.addMaterial = {};
                 $('#addModal').modal('show');
             },
-            update(index){
-                axios.post('{{url('apiLocal/material/update')}}',this.material)
+            // 耗材更新
+            update(material,index){
+                window.tempTip.setDuration(3000);
+                window.tempTip.setIndex(1099);
+                window.axios.post('{{url('apiLocal/material/update')}}',material)
                     .then(res=>{
                         if(res.data.success){
                             $('#editModal').modal('hide');
-                            tempTip.setDuration(3000);
-                            tempTip.showSuccess('修改成功');
+                            window.tempTip.showSuccess('修改成功');
                             this.$set(this.materials,index,res.data.data);
-                            this.index = '';
+                            this.selectIndex = 0;
+                            return;
+                        }else if(res.data.errors){
+                            this.materialError = res.data.errors;
                             return;
                         }
-                        tempTip.setDuration(3000);
-                        tempTip.show(res.data.message);
+                        window.tempTip.show(res.data.message);
                     }).catch(err=>{
-                    tempTip.setDuration(3000);
-                    tempTip.show(err);
+                        window.tempTip.show(err);
                 });
             },
-            create(){
-                axios.post('{{url('apiLocal/material/store')}}',this.addMaterial)
+            // 耗材创建
+            create(addMaterial){
+                window.tempTip.setDuration(3000);
+                window.tempTip.setIndex(1099);
+                axios.post('{{url('apiLocal/material/store')}}',addMaterial)
                     .then(res=>{
                         if(res.data.success){
                             $('#addModal').modal('hide');
+                            window.tempTip.showSuccess('添加成功');
                             this.addMaterial={};
-                            tempTip.setDuration(3000);
-                            tempTip.showSuccess('添加成功');
-                            this.$set(this.materials,this.materials.length,res.data.data);
+                            this.materials.unshift(res.data.data);
+                            return;
+                        }else if(res.data.errors){
+                            this.materialError = res.data.errors;
                             return;
                         }
-                        tempTip.setDuration(3000);
                         tempTip.show(res.data.message);
                     }).catch(err=>{
-                        tempTip.setDuration(3000);
                         tempTip.show(err);
                 });
             }

+ 32 - 7
resources/views/maintenance/ownerMaterial/_create.blade.php

@@ -12,32 +12,57 @@
                     <div class="form-group row">
                         <label for="add-owner-id" class="col-sm-2 col-form-label text-right">货主</label>
                         <div class="col-sm-10 form-inline">
-                            <select name="owner_id" id="add-owner-id" class="form-control col-sm-5 required" v-model="addOwnerMaterial.owner_id">
+
+                            <select name="owner_id" id="add-owner-id" class="form-control col-sm-5 required" v-model="addOwnerMaterial.owner_id"
+                                    :class="materialErrors.owner_id?'is-invalid':''"
+                                    @focus="materialErrors.owner_id= null">
                                 <option v-for="(owner,i) in filterOwners"  :value="owner.id">@{{ owner.name }}</option>
                             </select>
-                            <input type="text" placeholder="输入货主进行筛选" class="form-control col-sm-4 offset-1" @change="filterOwner($event)">
+                            <input type="text" placeholder="输入货主进行筛选" class="form-control col-sm-4 offset-1" id="filterOwnerName" @change="filterOwner($event)">
+                            <div class="invalid-feedback" v-if="materialErrors.owner_id">
+                                @{{ materialErrors.owner_id[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-material-code" class="col-sm-2 col-form-label text-right">耗材编码</label>
                         <div class="col-sm-10 form-inline">
-                            <input type="text" name="material-code" id="add-material-code" class="form-control col-sm-10" placeholder="耗材编码" v-model="addOwnerMaterial.material_code">
+                            <input type="text" name="material-code" id="add-material-code" class="form-control col-sm-10" placeholder="耗材编码" v-model="addOwnerMaterial.material_code"
+                                   :class="materialErrors.material_code?'is-invalid':''"
+                                   @change="materialErrors.material_code= null">
+                            <div class="invalid-feedback" v-if="materialErrors.material_code">
+                                @{{ materialErrors.material_code[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add_material_id" class="col-sm-2 col-form-label text-right">耗材</label>
                         <div class="col-sm-10 form-inline">
-                            <select name="material_id" id="add_material_id" class="form-control col-sm-5" required v-model="addOwnerMaterial.material_id">
+                            <select name="material_id" id="add_material_id" class="form-control col-sm-5" required
+                                    v-model="addOwnerMaterial.material_id"
+                                    :class="materialErrors.material_id?'is-invalid':''"
+                                    @focus="materialErrors.material_id= null">
                                 <option v-for="(materials,i) in filterMaterials"  :value="materials.id">@{{ materials.code }}</option>
                             </select>
                             <input type="text" placeholder="输入耗材进行筛选" class="form-control col-m-4 offset-1" @change="filterMaterial($event)">
+                            <div class="invalid-feedback" v-if="materialErrors.material_id">
+                                @{{ materialErrors.material_id[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-size" class="col-sm-2 col-form-label text-right">尺寸</label>
                         <div class="col-sm-10 form-inline">
-                            <input type="text" id="add-size" class="form-control col-10" name="size" placeholder="项目耗材尺寸" v-model="addOwnerMaterial.size">
+                            <input type="text" id="add-size" class="form-control col-10" name="size" placeholder="项目耗材尺寸" v-model="addOwnerMaterial.size"
+                                   :class="materialErrors.size?'is-invalid':''"
+                                   @focus="materialErrors.size = null"
+                                   @input="materialErrors.size = null"
+                            >
+                            <div class="invalid-feedback" v-if="materialErrors.size">
+                                @{{ materialErrors.size[0] }}
+                            </div>
                         </div>
+
                     </div>
                     <div class="form-group row">
                         <label for="add-special" class="col-sm-2 col-form-label text-right">特殊要求</label>
@@ -54,8 +79,8 @@
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="addOwnerMaterial={}">关闭</button>
-                <button type="button" class="btn btn-primary" @click="create">提交</button>
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal" >关闭</button>
+                <button type="button" class="btn btn-primary" @click="create(addOwnerMaterial)">提交</button>
             </div>
         </div>
     </div>

+ 29 - 7
resources/views/maintenance/ownerMaterial/_edit.blade.php

@@ -3,7 +3,7 @@
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title text-center">项目耗材编辑</h5>
-                <button type="button" class="close" data-dismiss="modal" @click="editOwnerMaterial={}">
+                <button type="button" class="close" data-dismiss="modal" >
                     <span>&times;</span>
                 </button>
             </div>
@@ -12,31 +12,53 @@
                     <div class="form-group row">
                         <label for="edit-owner-id" class="col-sm-2 col-form-label text-right">货主</label>
                         <div class="col-sm-10 form-inline">
-                            <select   id="edit-owner-id" class="form-control col-sm-5" v-model="editOwnerMaterial.owner_id">
+                            <select   id="edit-owner-id" class="form-control col-sm-5" v-model="editOwnerMaterial.owner_id"
+                                      :class="materialErrors.owner_id?'is-invalid':''"
+                                      @focus="materialErrors.owner_id= null">
                                 <option v-for="(owner,i) in filterOwners"  :value="owner.id">@{{ owner.name }}</option>
                             </select>
-                            <input type="text" placeholder="输入货主进行筛选" class="form-control col-sm-4 offset-1" @change="filterOwner($event)">
+                            <input type="text" placeholder="输入货主进行筛选" class="form-control col-sm-4 offset-1" id="editOwnerName" @change="filterOwner($event)">
+                            <div class="invalid-feedback" v-if="materialErrors.owner_id">
+                                @{{ materialErrors.owner_id[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-material-code" class="col-sm-2 col-form-label text-right">耗材编码</label>
                         <div class="col-sm-10 form-inline">
-                            <input type="text"  id="edit-material-code" class="form-control col-sm-10" v-model="editOwnerMaterial.material_code" placeholder="耗材编码" >
+                            <input type="text"  id="edit-material-code" class="form-control col-sm-10" placeholder="耗材编码"
+                                   v-model="editOwnerMaterial.material_code"
+                                   :class="materialErrors.material_code?'is-invalid':''"
+                                   @focus="materialErrors.material_code= null">
+                            <div class="invalid-feedback" v-if="materialErrors.material_code">
+                                @{{ materialErrors.material_code[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-material-id" class="col-sm-2 col-form-label text-right">耗材</label>
                         <div class="col-sm-10 form-inline">
-                            <select  id="edit-material-id" class="form-control col-sm-5" v-model="editOwnerMaterial.material_id">
+                            <select  id="edit-material-id" class="form-control col-sm-5"
+                                     v-model="editOwnerMaterial.material_id"
+                                     :class="materialErrors.material_id?'is-invalid':''"
+                                     @focus="materialErrors.material_id = null">
                                 <option v-for="(materials,i) in filterMaterials"  :value="materials.id">@{{ materials.code }}</option>
                             </select>
                             <input type="text" placeholder="输入耗材进行筛选" class="form-control col-m-4 offset-1" @change="filterMaterial($event)">
+                            <div class="invalid-feedback" v-if="materialErrors.material_id">
+                                @{{ materialErrors.material_id[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-size" class="col-sm-2 col-form-label text-right">尺寸</label>
                         <div class="col-sm-10 form-inline">
-                            <input type="text" id="edit-size" class="form-control col-10"   v-model="editOwnerMaterial.size" placeholder="项目耗材尺寸">
+                            <input type="text" id="edit-size" class="form-control col-10"   v-model="editOwnerMaterial.size" placeholder="项目耗材尺寸"
+                                   :class="materialErrors.size?'is-invalid':''"
+                                   @focus="materialErrors.size = null">
+                            <div class="invalid-feedback" v-if="materialErrors.size">
+                                @{{ materialErrors.size[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
@@ -54,7 +76,7 @@
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="editOwnerMaterial={}">关闭</button>
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal" >关闭</button>
                 <button type="button" class="btn btn-primary" @click="update">保存</button>
             </div>
         </div>

+ 3 - 0
resources/views/maintenance/ownerMaterial/_uploadFile.blade.php

@@ -17,6 +17,9 @@
                 <div>
                     <input type="file" class=" form-control-file" id="updatafile-input" ref="file">
                 </div>
+                <div>
+                    <span class="text-secondary mt-1">文件大小不能超过10mb</span>
+                </div>
             </div>
             <div class="modal-footer">
                 <button class="btn btn-success" data-dismiss="modal" @click="editOwnerMaterial={}">取消</button>

+ 86 - 23
resources/views/maintenance/ownerMaterial/index.blade.php

@@ -3,7 +3,7 @@
 @section('title','项目耗材')
 
 @section('content')
-    <nav class="nav2">
+    <nav id="nav2">
         @component('maintenance.menu')@endcomponent
     </nav>
 
@@ -41,6 +41,7 @@
             index:'',
             filterOwners:'',
             filterMaterials:'',
+            materialErrors:{},
             uploadError: null,
             selectTr:0
         },
@@ -89,37 +90,71 @@
                 });
             },
             edit(ownerMaterial,i){
+                this.materialErrors = {};
                 this.editOwnerMaterial = JSON.parse(JSON.stringify(ownerMaterial));
+                this.filterMaterials = JSON.parse(JSON.stringify(this.materials));
+                this.filterOwners = JSON.parse(JSON.stringify(this.owners));
+                $('#editOwnerName').val('');
                 this.index = i;
                 $('#edit-ownerMaterial').modal('show');
             },
             update(){
                 let url = '{{url('apiLocal/ownerMaterial/update')}}';
                 let params = this.editOwnerMaterial;
-                window.tempTip.postBasicRequest(url,params,res=>{
-                    this.fileType(res);
-                    this.$set(this.ownerMaterials,this.index,res);
-                    this.index = null;
-                    this.editOwnerMaterial = {};
-                    $("#edit-ownerMaterial").modal('hide');
-                    return "修改完成";
-                },true);
+                if(!this.validateOwnerMaterial(params))return;
+                window.tempTip.setIndex(1099);
+                window.tempTip.setDuration(3000);
+                window.axios.post(url,params).then(res=>{
+                    if(res.data.success){
+                        this.fileType(res.data);
+                        this.$set(this.ownerMaterials,this.index,res.data.data);
+                        this.index = null;
+                        $("#edit-ownerMaterial").modal('hide');
+                        window.tempTip.showSuccess('修改成功');
+                        return ;
+                    }else if (res.data.errors){
+                        this.materialErrors = res.data.errors;
+                        return ;
+                    }
+                    window.tempTip.show('修改成功');
+                }).catch(err=>{
+                    window.tempTip.show(err);
+                });
             },
             store(){
+                this.addOwnerMaterial = {};
+                this.materialErrors = {};
+                $('#filterOwnerName').val('');
+                this.filterMaterials = JSON.parse(JSON.stringify(this.materials));
+                this.filterOwners = JSON.parse(JSON.stringify(this.owners));
                 $('#add-ownerMaterial').modal('show');
             },
-            create(){
+            create(params){
                 let url = '{{url('apiLocal/ownerMaterial/store')}}';
-                let params = this.addOwnerMaterial;
-                window.tempTip.postBasicRequest(url,params,res=>{
-                    this.$set(this.ownerMaterials,this.ownerMaterials.length,res);
-                    this.addOwnerMaterial = {};
-                    $("#add-ownerMaterial").modal('hide');
-                    return "OK";
-                },true);
+                if(!this.validateOwnerMaterial(params))return;
+                window.tempTip.setIndex(1099);
+                window.tempTip.setDuration(3000);
+                window.axios.post(url,params).then(res=>{
+                    if(res.data.success){
+                        this.fileType(res.data.data);
+                        this.ownerMaterials.unshift(res.data.data);
+                        this.addOwnerMaterial = {};
+                        $("#add-ownerMaterial").modal('hide');
+                        window.tempTip.showSuccess('创建成功');
+                        return ;
+                    }else if (res.data.errors){
+                        this.materialErrors = res.data.errors;
+                        return ;
+                    }
+                    window.tempTip.show('创建失败');
+                }).catch(err=>{
+                    window.tempTip.show(err);
+                });
             },
             uploadModal(ownerMaterial,i){
                 this.editOwnerMaterial = JSON.parse(JSON.stringify(ownerMaterial));
+                this.filterMaterials = JSON.parse(JSON.stringify(this.materials));
+                this.filterOwners = JSON.parse(JSON.stringify(this.owners));
                 this.index = i;
                 $('#uploadFile').modal('show');
             },
@@ -131,7 +166,13 @@
                 let data = new FormData();
                 let file = this.$refs.file.files[0];
                 if(file===null){
-                    if (!confirm('请选则上传文件')) return;
+                    if (!confirm('请选择上传文件')) return;
+                }
+                if (file.size >=10485760){
+                    tempTip.setDuration(3000);
+                    tempTip.setDuration(1099);
+                    tempTip.show("图片大小不能超过10MB!");
+                    return;
                 }
                 data.append('file',file);
                 data.append('id',this.editOwnerMaterial.id);
@@ -146,23 +187,45 @@
             },
             filterMaterial(e){
                 let value = $(e.target).val();
-                if(value==='' || value===null)this.filterMaterials = this.materials;
+                let materials = JSON.parse(JSON.stringify(this.materials));
+                if(value==='' || value===null)this.filterMaterials = materials;
                 else {
-                    this.filterMaterials = this.materials.filter(function(item){
+                    this.filterMaterials = materials.filter(function(item){
                         return item.code.indexOf(value) !== -1;
                     });
                 }
             },
             filterOwner(e){
                 let value = $(e.target).val();
-                if(value==='' || value===null)this.filterMaterials = this.materials;
+                let owners = JSON.parse(JSON.stringify(this.owners));
+                if(value==='' || value===null)this.filterOwners = owners;
                 else {
-                    this.filterOwners = this.owners.filter(function(item){
+                    this.filterOwners = owners.filter(function(item){
                         return item.name.indexOf(value) !== -1;
                     });
                 }
+            },
+            validateOwnerMaterial(material){
+                let is_validate = true;
+                if(!material.hasOwnProperty('owner_id') || material['owner_id']=== 0){
+                    this.$set(this.materialErrors,'owner_id',['货主为必选项']);
+                    is_validate = false;
+                }
+                if(!material.hasOwnProperty('material_id') || material['owner_id'] === 0 ){
+                    this.$set(this.materialErrors,'material_id',['耗材为必选项']);
+                    is_validate = false;
+                }
+                if((!material.hasOwnProperty('material_code')) || material['material_code'].trim()===''){
+                    this.$set(this.materialErrors,'material_code',['耗材编码为必填项']);
+                    is_validate = false;
+                }
+                if(!material.hasOwnProperty('size')  ||  ((material['size']).trim().length === 0)){
+                    this.$set(this.materialErrors,'size',['耗材编码为必填项']);
+                    is_validate = false;
+                }
+                if(!is_validate)this.$forceUpdate();
+                return is_validate;
             }
-
         }
     });
 </script>

+ 1 - 1
resources/views/maintenance/priceModel/waybillPriceModel/index.blade.php

@@ -57,7 +57,7 @@
                         <th>录入时间</th>
                         <th>操作</th>
                     </tr>
-                    <tr v-for="waybillPriceModel in waybillPriceModels"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
+                    <tr v-for="(waybillPriceModel,i) in waybillPriceModels"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td class="text-muted">@{{waybillPriceModel.id}}</td>
                         <td>@{{waybillPriceModel.logistic}}</td>
                         <td>@{{waybillPriceModel.province}}</td>

+ 1 - 1
resources/views/maintenance/province/index.blade.php

@@ -19,7 +19,7 @@
                         <th>录入时间</th>
                         <th>操作</th>
                     </tr>
-                    <tr v-for="province in provinces"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
+                    <tr v-for="(province,i) in provinces"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td class="text-muted">@{{province.id}}</td>
                         <td>@{{province.name}}</td>
                         <td class="text-muted">@{{province.created_at}}</td>

+ 68 - 13
resources/views/maintenance/supplier/_create.blade.php

@@ -1,9 +1,9 @@
-<div class="modal " id="add-supplier" tabindex="-1" >
+<div class="modal " id="add-supplier" tabindex="-1">
     <div class="modal-dialog modal-lg modal-dialog-centered">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title text-center">供应商添加</h5>
-                <button type="button" class="close" data-dismiss="modal" @click="addSupplier={}">
+                <button type="button" class="close" data-dismiss="modal">
                     <span>&times;</span>
                 </button>
             </div>
@@ -12,58 +12,113 @@
                     <div class="form-group row">
                         <label for="add-name" class="col-sm-3 col-form-label text-right">名称</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text"id="add-name" class="form-control col-9"  v-model="addSupplier.name"  placeholder="供应商名称" >
+                            <input type="text" id="add-name" class="form-control col-9" v-model="addSupplier.name"
+                                   placeholder="供应商名称"
+                                   :class="supplierErrors.name?'is-invalid':''"
+                                   @focus="supplierErrors.name= null"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.name">
+                                @{{ supplierErrors.name[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-contact-man" class="col-sm-3 col-form-label text-right">联系人</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" name="material-code" id="add-contact-man" class="form-control col-9" v-model="addSupplier.contact_man" placeholder="联系人" >
+                            <input type="text" name="material-code" id="add-contact-man" class="form-control col-9"
+                                   v-model="addSupplier.contact_man" placeholder="联系人"
+                                   :class="supplierErrors.contact_man?'is-invalid':''"
+                                   @focus="supplierErrors.contact_man=null"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.contact_man">
+                                @{{ supplierErrors.contact_man[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-phone" class="col-sm-3 col-form-label text-right">联系电话</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" name="material-code" id="add-phone" class="form-control col-9" v-model="addSupplier.phone" placeholder="联系电话" >
+                            <input type="text" name="material-code" id="add-phone" class="form-control col-9"
+                                   v-model="addSupplier.phone" placeholder="联系电话"
+                                   :class="supplierErrors.phone?'is-invalid':''"
+                                   @focus="supplierErrors.phone=null"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.phone">
+                                @{{ supplierErrors.phone[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-invoice-title" class="col-sm-3 col-form-label text-right">发票抬头</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" id="add-invoice-title"  class="form-control col-9" v-model="addSupplier.invoice_title" placeholder="发票抬头">
+                            <input type="text" id="add-invoice-title" class="form-control col-9"
+                                   v-model="addSupplier.invoice_title" placeholder="发票抬头"
+                                   :class="supplierErrors.invoice_title?'is-invalid':''"
+                                   @focus="supplierErrors.invoice_title=null"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.invoice_title">
+                                @{{ supplierErrors.invoice_title[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-bank" class="col-sm-3 col-form-label text-right">账户银行</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" id="add-bank" class="form-control col-9" name="size" v-model="addSupplier.bank" placeholder="账户银行">
+                            <input type="text" id="add-bank" class="form-control col-9" name="size"
+                                   v-model="addSupplier.bank" placeholder="账户银行"
+                                   :class="supplierErrors.bank?'is-invalid':''"
+                                   @focus="supplierErrors.bank=null "
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.bank">
+                                @{{ supplierErrors.bank[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-bank-account " class="col-sm-3 col-form-label text-right">收款账户</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" id="add-bank-account " class="form-control col-9" name="size" v-model="addSupplier.bank_account " placeholder="账户银行">
+                            <input type="text" id="add-bank-account " class="form-control col-9" name="size"
+                                   v-model="addSupplier.bank_account " placeholder="账户银行"
+                                   :class="supplierErrors.bank_account?'is-invalid':''"
+                                   @focus="supplierErrors.bank_account=null "
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.bank_account">
+                                @{{ supplierErrors.bank_account[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="add-opening-bank " class="col-sm-3 col-form-label text-right">开户行</label>
                         <div class="col-sm-9 form-inline">
-                            <textarea name="specification" id="add-opening-bank " cols="30" rows="5"  class="form-control form-text col-10" v-model="addSupplier.opening_bank "></textarea>
+                            <textarea name="specification" id="add-opening-bank " cols="30" rows="5"
+                                      class="form-control form-text col-10"
+                                      :class="supplierErrors.opening_bank?'is-invalid':''"
+                                      @focus="supplierErrors.opening_bank=null"
+                                      v-model="addSupplier.opening_bank "></textarea>
+                            <div class="invalid-feedback" v-if="supplierErrors.opening_bank">
+                                @{{ supplierErrors.opening_bank[0] }}
+                            </div>
                         </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">
+                                v-model="addSupplier.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>
+                        <label hidden><input name="material_id" type="text" :value="addSupplier.material_id"></label>
+                    </div>
+                    <div class="form-group row">
+                        <label class="col-sm-3 col-form-label text-right "></label>
+                        <span class="text-danger" v-if="supplierErrors.material_id ">
+                                @{{ supplierErrors.material_id[0] }}
+                        </span>
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="addSupplier={}">关闭</button>
-                <button type="button" class="btn btn-primary" @click="create">提交</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary" @click="create(addSupplier)">提交</button>
             </div>
         </div>
     </div>

+ 60 - 13
resources/views/maintenance/supplier/_edit.blade.php

@@ -3,7 +3,7 @@
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title text-center">供应商编辑</h5>
-                <button type="button" class="close" data-dismiss="modal" @click="editOwnerMaterial={}">
+                <button type="button" class="close" data-dismiss="modal" >
                     <span>&times;</span>
                 </button>
             </div>
@@ -12,57 +12,104 @@
                     <div class="form-group row">
                         <label for="edit-name" class="col-sm-3 col-form-label text-right">名称</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text"id="edit-name" class="form-control col-sm-10"  v-model="editSupplier.name"  placeholder="供应商名称" >
+                            <input type="text"id="edit-name" class="form-control col-sm-10"  v-model="editSupplier.name"  placeholder="供应商名称"
+                                   :class="supplierErrors.name?'is-invalid':''"
+                                   @focus="supplierErrors.name!==null ? supplierErrors.name=null:''"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.name">
+                                @{{ supplierErrors.name[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-contact-man" class="col-sm-3 col-form-label text-right">联系人</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" name="material-code" id="edit-contact-man" class="form-control col-sm-10" v-model="editSupplier.contact_man" placeholder="联系人" >
+                            <input type="text" name="material-code" id="edit-contact-man" class="form-control col-sm-10" v-model="editSupplier.contact_man" placeholder="联系人"
+                                   :class="supplierErrors.contact_man?'is-invalid':''"
+                                   @focus="supplierErrors.contact_man!==null ? supplierErrors.contact_man=null:''"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.contact_man">
+                                @{{ supplierErrors.contact_man[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-phone" class="col-sm-3 col-form-label text-right">联系电话</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" name="phone" id="edit-phone" class="form-control col-9" v-model="editSupplier.phone" placeholder="联系电话" >
+                            <input type="text" name="phone" id="edit-phone" class="form-control col-9" v-model="editSupplier.phone" placeholder="联系电话"
+                                   :class="supplierErrors.phone?'is-invalid':''"
+                                   @focus="supplierErrors.phone!==null ? supplierErrors.phone=null:''"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.phone">
+                                @{{ supplierErrors.phone[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-invoice-title" class="col-sm-3 col-form-label text-right">发票抬头</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" id="edit-invoice-title"  class="form-control col-10" v-model="editSupplier.invoice_title" placeholder="发票抬头">
+                            <input type="text" id="edit-invoice-title"  class="form-control col-10" v-model="editSupplier.invoice_title" placeholder="发票抬头"
+                                   :class="supplierErrors.invoice_title?'is-invalid':''"
+                                   @focus="supplierErrors.invoice_title!==null ? supplierErrors.invoice_title=null:''"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.invoice_title">
+                                @{{ supplierErrors.invoice_title[0]  }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-bank" class="col-sm-3 col-form-label text-right">账户银行</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" id="edit-bank" class="form-control col-10" name="size" v-model="editSupplier.bank" placeholder="账户银行">
+                            <input type="text" id="edit-bank" class="form-control col-10" name="size" v-model="editSupplier.bank" placeholder="账户银行"
+                                   :class="supplierErrors.bank?'is-invalid':''"
+                                   @focus="supplierErrors.bank!==null ? supplierErrors.bank=null:''"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.bank">
+                                @{{ supplierErrors.bank[0]}}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-bank-account " class="col-sm-3 col-form-label text-right">收款账户</label>
                         <div class="col-sm-9 form-inline">
-                            <input type="text" id="edit-bank-account " class="form-control col-10" name="size" v-model="editSupplier.bank_account " placeholder="账户银行">
+                            <input type="text" id="edit-bank-account " class="form-control col-10" name="size" v-model="editSupplier.bank_account " placeholder="账户银行"
+                                   :class="supplierErrors.bank_account?'is-invalid':''"
+                                   @focus="supplierErrors.bank_account!==null ? supplierErrors.bank_account=null:''"
+                            >
+                            <div class="invalid-feedback" v-if="supplierErrors.bank_account">
+                                @{{ supplierErrors.bank_account[0] }}
+                            </div>
                         </div>
                     </div>
                     <div class="form-group row">
                         <label for="edit-opening-bank " class="col-sm-3 col-form-label text-right">开户行</label>
                         <div class="col-sm-9 form-inline">
-                            <textarea name="specification" id="edit-opening-bank " cols="30" rows="5"  class="form-control form-text col-10" v-model="editSupplier.opening_bank "></textarea>
+                            <textarea name="specification" id="edit-opening-bank " cols="30" rows="5"  class="form-control form-text col-10" v-model="editSupplier.opening_bank "
+                                      :class="supplierErrors.opening_bank?'is-invalid':''"
+                                      @focus="supplierErrors.opening_bank!==null ? supplierErrors.opening_bank=null:''"></textarea>
+                            <div class="invalid-feedback" v-if="supplierErrors.opening_bank">
+                                @{{ supplierErrors.opening_bank[0] }}
+                            </div>
                         </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">
+                        <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="editSupplier.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>
+                        <label hidden><input name="material_id" type="text" :value="editSupplier.material_id"></label>
+                    </div>
+                    <div class="form-group row">
+                        <label  class="col-sm-3 col-form-label text-right"></label>
+                        <span class="text-danger" v-if="supplierErrors.material_id">
+                                @{{ supplierErrors.material_id[0] }}
+                        </span>
                     </div>
                 </form>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="editSupplier={}">关闭</button>
-                <button type="button" class="btn btn-primary" @click="update">保存</button>
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary" @click="update(editSupplier,selectIndex)">保存</button>
             </div>
         </div>
     </div>

+ 9 - 0
resources/views/maintenance/supplier/_table.blade.php

@@ -8,6 +8,7 @@
         <th>账户银行</th>
         <th>收款账户</th>
         <th>开户行</th>
+        <th>绑定耗材</th>
         <th>操作</th>
     </tr>
     <tr class="text-center" v-for="(supplier,i) in suppliers"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
@@ -19,6 +20,14 @@
         <td>@{{ supplier.bank }}</td>
         <td>@{{ supplier.bank_account}}</td>
         <td>@{{ supplier.opening_bank}}</td>
+        <td>
+            <template v-show="supplier.material">
+                <div class="up" :id="'supplier' + i">
+                    <p v-for="material in supplier.material" class="border-bottom">@{{ material.name }}</p>
+                </div>
+            </template>
+            <p v-if="supplier.material.length > 0" class="text-primary" @click="show('supplier'+i,$event)">点击展开</p>
+        </td>
         <td>
             @can('供应商-编辑')
                 <button type="button" class="btn btn-sm btn-outline-primary" @click="edit(supplier,i)">编辑</button>

+ 113 - 31
resources/views/maintenance/supplier/index.blade.php

@@ -1,7 +1,7 @@
 @extends('layouts.app')
 @section('title','供应商')
 @section('content')
-    <nav class="nav2">
+    <nav id="nav2">
         @component('maintenance.menu')@endcomponent
     </nav>
     <div class="container-fluid d-none" id="supplier">
@@ -34,67 +34,149 @@
                     @endforeach
                 ],
                 material_id:{!! old('material_id') ? json_encode(old('material_id')) : '[]' !!},
-                editSupplier:{},
-                addSupplier:{},
-                index:'',
-                selectTr:0
+                editSupplier:{material_id:[]},
+                addSupplier:{material_id:[]},
+                supplierErrors:{},
+                index:''  ,
+                selectTr:0,
+                selectIndex:0,
             },
             mounted(){
+                $(".up").slideUp();
+                $("#xx").slideDown();
                 $('#supplier').removeClass('d-none');
             },
+            watch:{
+                'editSupplier.material_id':function(){
+                    this.supplierErrors.material_id =[];
+                },
+                'addSupplier.material_id':function(){
+                    this.supplierErrors.material_id = [];
+                },
+            },
             methods:{
+                show(id,$e){
+                    $("#"+id).slideToggle();
+                    let value= $($e.target).html();
+                    if(value=== '点击展开'){
+                        value = '点击收起';
+                    }else if(value === '点击收起'){
+                        value ='点击展开'
+                    }
+                    $($e.target).html(value);
+                },
                 destroy(id,index){
                     if (!confirm('是否删除当前供应商')) return;
+                    tempTip.setIndex(1009);
+                    tempTip.setDuration(3000);
                     axios.delete('{{url('apiLocal/supplier')}}/'+id).then(res=>{
                         if(res.data.success){
-                            tempTip.setIndex(100);
-                            tempTip.setDuration(3000);
                             tempTip.showSuccess('删除成功');
                             this.$delete(this.suppliers,index);
                             return ;
                         }
-                        tempTip.setDuration(3000);
                         tempTip.show(res.data.message);
                     }).catch(err=>{
-                        tempTip.setDuration(3000);
                         tempTip.show('删除当前项目耗材失败:'+err);
                     });
                 },
                 edit(supplier,i){
+                    this.selectIndex = i;
                     this.editSupplier = JSON.parse(JSON.stringify(supplier));
-                    this.material_id= [];
+                    this.editSupplier.material_id = [];
+                    this.supplierErrors = {material_id:[]};     // 重置异常信息
                     supplier.material.forEach((item)=>{
-                        this.material_id.push(item.id);
+                        this.editSupplier.material_id.push(item.id);
                     });
-                    this.index = i;
                     $('#edit-supplier').modal('show');
                 },
-                update(){
+                update(editSupplier,index){
+                    this.supplierErrors = {material_id:[]};     // 重置异常信息
                     let url = '{{url('apiLocal/supplier/update')}}';
-                    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);
+                    window.tempTip.setIndex(1099);
+                    window.tempTip.setDuration(2000);
+                    if(!this.validatePhone(editSupplier))return;
+                    window.axios.post(url,editSupplier).then(res=>{
+                        if(res.data.success){
+                            this.$set(this.suppliers,index,res.data.data);
+                            this.selectIndex = null;
+                            this.editSupplier = {material_id:[]};
+                            $("#edit-supplier").modal('hide');
+                            window.tempTip.showSuccess("修改成功")
+                            return;
+                        }else if(res.data.errors){
+                            this.supplierErrors =res.data.errors;
+                            return;
+                        }
+                        window.tempTip.show(res.data.message ?? '修改失败')
+                    }).catch(err=>{
+                        window.tempTip.showSuccess(err)
+                    });
                 },
                 store(){
+                    this.addSupplier = {material_id:[]};
+                    this.supplierErrors = {material_id:null};
                     $('#add-supplier').modal('show');
                 },
-                create(){
+                create(supplier){
                     let url = '{{url('apiLocal/supplier/store')}}';
-                    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);
+                    window.tempTip.setIndex(1099);
+                    window.tempTip.setDuration(2000);
+                    if(!this.validatePhone(supplier))return;
+                    window.axios.post(url,supplier).then(res=>{
+                        if(res.data.success){
+                            this.suppliers.unshift(res.data.data);
+                            this.addSupplier = {material_id:[]};
+                            window.tempTip.showSuccess("创建成功");
+                            $("#add-supplier").modal('hide');
+                            return;
+                        }else if(res.data.errors){
+                            this.supplierErrors =res.data.errors;
+                            return;
+                        }
+                        window.tempTip.show(res.data.message ?? '创建失败')
+                    }).catch(err=>{
+                        window.tempTip.showSuccess(err)
+                    });
                 },
+                validatePhone(param){
+                    let is_validate = true;
+                    if(!(/^1[34578]\d{9}$/.test(param['phone']))){
+                        this.$set(this.supplierErrors,'phone',['请输入正确的联系号码','']);
+                        is_validate = false;
+                    }
+                    if(!param.hasOwnProperty('name') || (param['name'].trim().length === 0)){
+                        this.$set(this.supplierErrors,'name',['供应商为必填项']);
+                        is_validate = false;
+                    }
+                    if(!param.hasOwnProperty('contact_man') || (param['contact_man'].trim().length === 0)){
+                        this.$set(this.supplierErrors,'contact_man',['联系人为必填项']);
+                        is_validate = false;
+                    }
+
+                    if(!param.hasOwnProperty('invoice_title') || (param['invoice_title'].trim().length === 0)){
+                        this.$set(this.supplierErrors,'invoice_title',['发票抬头为必填项']);
+                        is_validate = false;
+                    }
+                    if(!param.hasOwnProperty('bank') || (param['bank'].trim().length === 0)){
+                        this.$set(this.supplierErrors,'bank',['账户银行必填项']);
+                        is_validate = false;
+                    }
+                    if(!param.hasOwnProperty('bank_account') || (param['bank_account'].trim().length === 0)){
+                        this.$set(this.supplierErrors,'bank_account',['收款账户为必填项']);
+                        is_validate = false;
+                    }
+                    if(!param.hasOwnProperty('opening_bank') || (param['opening_bank'].trim().length === 0)){
+                        this.$set(this.supplierErrors,'opening_bank',['开户行为必填项']);
+                        is_validate = false;
+                    }
+                    if(!param.hasOwnProperty('material_id') || (param['material_id'].length === 0)){
+                        this.$set(this.supplierErrors,'material_id',['耗材类型为必填项']);
+                        is_validate = false;
+                    }
+                    if(!is_validate)this.$forceUpdate();
+                    return is_validate;
+                }
             }
         })
     </script>

+ 4 - 3
resources/views/maintenance/taxRate/index.blade.php

@@ -1,5 +1,5 @@
 @extends('layouts.app')
-@section('title')设置@endsection
+@section('title')税率@endsection
 @section('content')
     <span id="nav2">
        @component('maintenance.menu')@endcomponent
@@ -19,7 +19,7 @@
                         <th>最后操作时间</th>
                         <th></th>
                     </tr>
-                    <tr v-for="(taxRate,i) in taxRates">
+                    <tr v-for="(taxRate,i) in taxRates" @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                         <td>@{{ i+1 }}</td>
                         <td>@{{ taxRate.value }}%</td>
                         <td class="text-muted">@{{ taxRate.created_at }}</td>
@@ -43,6 +43,7 @@
                     @foreach($taxRates as $taxRate)@json($taxRate),@endforeach
                 ],
                 taxRate:{},
+                selectTr:0,
             },
             methods:{
                 openModal(model){
@@ -85,4 +86,4 @@
             },
         });
     </script>
-@stop
+@stop

+ 2 - 0
resources/views/maintenance/unit/index.blade.php

@@ -43,6 +43,7 @@
                     </tr>
                     <tbody id="parent">
                         <tr v-for="(u,i) in units" draggable="true" :id="'unit-'+u.id" :data-order="u.sequence" :data-id="u.id"
+                            @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''"
                             @drop="drop($event)" @dragover="dragover($event)" @dragstart="dragstart(u.id)" style="cursor: move">
                             <td class="text-muted">@{{u.id}}</td>
                             <td>@{{u.name}}</td>
@@ -75,6 +76,7 @@
                     {id:'{{$unit->id}}',name:'{{$unit->name}}',created_at:'{{$unit->created_at}}',sequence:'{{$unit->sequence}}'},
                     @endforeach
                 ],
+                selectTr:0,
                 unit:{},
                 errors:{},
                 dragoverId:"",

+ 2 - 2
resources/views/maintenance/userLabor/index.blade.php

@@ -31,7 +31,7 @@
                                 </tr>
                                 </thead>
                                 <tbody>
-                                <tr v-for="(processDailyParticipant,i) in processDailyParticipants"  @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
+                                <tr v-for="(processDailyParticipant,i) in processDailyParticipants" >
                                     <td v-if="processDailyParticipant.process_daily">@{{ processDailyParticipant.process_daily.process_code }}</td>
                                     <td>@{{ processDailyParticipant.started_at }}</td>
                                     <td>@{{ processDailyParticipant.ended_at }}</td>
@@ -88,7 +88,7 @@
                     <th>操作</th>
                     <th>解除绑定设备</th>
                 </tr>
-                <tr v-for="(userLabor,i) in userLabors">
+                <tr v-for="(userLabor,i) in userLabors" @click="selectTr===i+1?selectTr=0:selectTr=i+1" :class="selectTr===i+1?'focusing' : ''">
                     <td>@{{ i+1 }}</td>
                     <td class="text-muted"><span v-if="userLabor.user_detail">@{{userLabor.user_detail.full_name}}</span></td>
                     <td><span v-if="userLabor.user_detail">@{{userLabor.user_detail.mobile_phone}}</span></td>

+ 1 - 0
resources/views/maintenance/userWorkgroup/index.blade.php

@@ -55,6 +55,7 @@
                         },
                     @endforeach
                 ],
+                selectTr:0,
             },
             methods:{
                 edit:function(id){

+ 1 - 0
resources/views/maintenance/warehouse/index.blade.php

@@ -56,6 +56,7 @@
                         code:'{{$warehouse->code}}',created_at:'{{$warehouse->created_at}}'},
                     @endforeach
                 ],
+                selectTr:0,
             },
             methods:{
                 edit:function(id){

+ 10 - 10
routes/apiLocal.php

@@ -123,24 +123,24 @@ Route::group(['prefix'=>'control'],function () {
 
 /** 耗材 */
 Route::group(['prefix' => 'material'],function(){
-    Route::post('store','MaterialController@storeApi');
-    Route::post('update','MaterialController@updateApi');
-    Route::delete('destroy/{id}','MaterialController@destroyApi');
+    Route::post('store','MaterialController@storeApi')->name('material.storeApi');
+    Route::post('update','MaterialController@updateApi')->name('material.updateApi');
+    Route::delete('destroy/{id}','MaterialController@destroyApi')->name('material.destroyApi');
 });
 
 /** 项目耗材 */
 Route::group(['prefix' => 'ownerMaterial'],function(){
-    Route::post('store','OwnerMaterialController@storeApi');
-    Route::post('update','OwnerMaterialController@updateApi');
-    Route::delete('{id}','OwnerMaterialController@destroyApi');
-    Route::post('uploadFile','OwnerMaterialController@fileApi');
+    Route::post('store','OwnerMaterialController@storeApi')->name('ownerMaterial.storeApi');
+    Route::post('update','OwnerMaterialController@updateApi')->name('ownerMaterial.updateApi');
+    Route::delete('{id}','OwnerMaterialController@destroyApi')->name('ownerMaterial.destroyApi');
+    Route::post('uploadFile','OwnerMaterialController@fileApi')->name('ownerMaterial.uploadFile');
 });
 
 /** 供应商 */
 Route::group(['prefix' => 'supplier'],function(){
-    Route::post('store','SupplierController@storeApi');
-    Route::post('update','SupplierController@updateApi');
-    Route::delete('{id}','SupplierController@destroyApi');
+    Route::post('store','SupplierController@storeApi')->name('supplier.storeApi');
+    Route::post('update','SupplierController@updateApi')->name('supplier.updateApi');
+    Route::delete('{id}','SupplierController@destroyApi')->name('supplier.destroyApi');
 });
 /** 系统配置 */
 Route::group(['prefix' => 'configuration'],function(){