Преглед на файлове

OwnerMaterial创建编辑校验

ajun преди 5 години
родител
ревизия
6468da349c

+ 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']);

+ 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 [];
+        }
+    }
+
+}

+ 31 - 6
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)">
+                            <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>

+ 28 - 6
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)">
+                            <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>

+ 64 - 16
resources/views/maintenance/ownerMaterial/index.blade.php

@@ -41,6 +41,7 @@
             index:'',
             filterOwners:'',
             filterMaterials:'',
+            materialErrors:{},
             uploadError: null,
             selectTr:0
         },
@@ -89,6 +90,7 @@
                 });
             },
             edit(ownerMaterial,i){
+                this.materialErrors = {};
                 this.editOwnerMaterial = JSON.parse(JSON.stringify(ownerMaterial));
                 this.index = i;
                 $('#edit-ownerMaterial').modal('show');
@@ -96,27 +98,52 @@
             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 = {};
                 $('#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));
@@ -169,6 +196,27 @@
                         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;
             }
         }
     });

+ 4 - 4
routes/apiLocal.php

@@ -121,10 +121,10 @@ Route::group(['prefix' => 'material'],function(){
 
 /** 项目耗材 */
 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');
 });
 
 /** 供应商 */