Просмотр исходного кода

修改Material index页面先渲染完成后展示

ajun 5 лет назад
Родитель
Сommit
7b682d36ef

+ 114 - 0
app/Filters/OwnerMaterialFilters.php

@@ -0,0 +1,114 @@
+<?php
+
+
+namespace App\Filters;
+
+
+use App\Material;
+use App\User;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+
+class OwnerMaterialFilters
+{
+    protected $request;
+    protected $queryBuilder;
+    protected $materialQuery;
+    protected $userQuery;
+    protected $filters = [];
+    protected $array_filter;
+    protected $params = [
+        'owner_id','material_code','user_name','created_at_start','created_at_end','special'
+    ];
+
+    public function __construct(Request $request)
+    {
+        $this->request = $request;
+    }
+
+    public function apply($builder)
+    {
+        $this->queryBuilder = $builder;
+        $filters = array_filter($this->request->only($this->filters));
+        foreach ($filters as $filter => $value) {
+            if (method_exists($this, $filter)) {
+                $this->$filter($value, $this->queryBuilder);
+            }
+        }
+        $this->afterApply();
+        return $this->queryBuilder;
+    }
+
+    private function isSearchLike($str):bool
+    {
+        if (substr($str, 0, 1) == "%" || substr($str, strlen($str) - 1, 1) == "%") {
+            return true;
+        }
+        return false;
+    }
+
+    private function searchWay($query, $param, $column)
+    {
+        if ($this->isSearchLike($param)) {
+            $query->where($column, 'like', $param);
+        } else {
+            $query->whereIn($column, array_filter(preg_split('/[,, ]+/is', $param)));
+        }
+        return $query;
+    }
+
+    private function getMaterialQuery():Builder
+    {
+        if(!$this->materialQuery)
+            $this->materialQuery = Material::query()->selectRaw('id');
+        return $this->materialQuery;
+    }
+
+    private function getUserQuery():Builder
+    {
+        if(!$this->userQuery)
+            $this->userQuery = User::query()->selectRaw('id');
+        return $this->userQuery;
+    }
+
+    public function owner_Id($owner_id)
+    {
+        $this->searchWay($this->queryBuilder,$owner_id,'owner_id');
+    }
+
+    public function material_code($material_code)
+    {
+        $this->getMaterialQuery()->where('code','like',"{$material_code}%");
+    }
+
+    public function user_name($user_name)
+    {
+        $this->getUserQuery()->where('name','like',"{$user_name}%");
+    }
+
+    public function created_at_start($created_at)
+    {
+        $this->queryBuilder->where('created_at','>=',"{$created_at} 00:00:00");
+    }
+
+    public function created_at_end($created_at)
+    {
+        $this->queryBuilder->where('created_at','<=',"{$created_at} 23:59:59");
+    }
+
+    public function special($special)
+    {
+        $this->queryBuilder->where('special','like',"{$special}%");
+    }
+
+    public function afterApply()
+    {
+        if($this->userQuery)
+            $this->queryBuilder->whereIn('initiator',$this->userQuery);
+
+        if($this->materialQuery)
+            $this->queryBuilder->whereIn('material_id',$this->userQuery);
+
+    }
+
+}

+ 33 - 8
app/Http/Controllers/OwnerMaterialController.php

@@ -2,28 +2,53 @@
 
 namespace App\Http\Controllers;
 
+use App\Components\AsyncResponse;
+use App\Filters\OwnerMaterialFilters;
+use App\Material;
 use App\OwnerMaterial;
+use App\Services\OwnerService;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 
 class OwnerMaterialController extends Controller
 {
-    public function index(Request $request)
+    use AsyncResponse;
+    public function index(Request $request,OwnerMaterialFilters $filters)
     {
-
+        $ownerMaterials = OwnerMaterial::query()->with(['owner','material','initiator','uploadFile'])->orderByDesc('id')->filter($filters)->paginate($request['paginate'] ?? 50);
+        $owners = app(OwnerService::class)->getAuthorizedOwners();
+        $materials = Material::all();
+        return view('/maintenance/ownerMaterial/index',compact('ownerMaterials','owners','materials'));
     }
 
-    public function storeApi()
+    public function storeApi(Request  $request):array
     {
-        
+        $params = $request->all(['owner_id', 'material_id', 'material_code', 'size', 'special', 'specification']);
+        $params['initiator'] = Auth::user()['id'];
+        try {
+            $material = OwnerMaterial::query()->create($params);
+            if ($material) return ['success' => true,'data' => $material->loadMissing(['owner','material','initiator','uploadFile'])];
+            else return ['success' => false, 'message' => '添加失败'];
+        } catch (\Exception $e) {
+            return ['success' => false,'message' => $e->getMessage()];
+        }
     }
 
-    public function updateApi()
+    public function updateApi(Request $request)
     {
-        
+        //$this->gate("xx");
+        $material = OwnerMaterial::query()->find($request['id']);
+        if(!$material)$this->error("对应的项目耗材没有找到");
+        $bool = $material->update($request->all(['owner_id', 'material_id', 'material_code', 'size', 'special', 'specification']));
+        if($bool==0)$this->error("更新异常");
+        $this->success($material->loadMissing(['owner','material','initiator','uploadFile']));
     }
 
-    public function destroyApi()
+    public function destroyApi($id)
     {
-        
+        $ownerMaterial = OwnerMaterial::query()->find($id);
+        if(!$ownerMaterial)$this->error('对应的项目耗材没有找到');
+        $ownerMaterial->delete();
+        $this->success();
     }
 }

+ 13 - 0
app/OwnerMaterial.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\LogModelChanging;
@@ -9,6 +10,8 @@ use App\Traits\LogModelChanging;
 class OwnerMaterial extends Model
 {
     use LogModelChanging;
+    use ModelTimeFormat;
+    protected $table = 'owner_material';
     protected $fillable = ['owner_id','material_id','material_code','size','special','specification','initiator'];
 
     public function owner()
@@ -25,4 +28,14 @@ class OwnerMaterial extends Model
     {
         return $this->belongsTo(User::class,'initiator','id');
     }
+
+    public function uploadFile()
+    {
+        return $this->hasOne(UploadFile::class,'table_id','id')->where('table_name','owner_material');
+    }
+
+    public function scopeFilter($query,$filters)
+    {
+        return $filters->apply($query);
+    }
 }

+ 3 - 0
resources/views/maintenance/menu.blade.php

@@ -105,6 +105,9 @@
                 <li class="nav-item">
                     <a class="nav-link text-muted" href="{{url('maintenance/material')}}" :class="{active:isActive('material',2)}">耗材类型</a>
                 </li>
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/ownerMaterial')}}" :class="{active:isActive('ownerMaterial',2)}">项目耗材</a>
+                </li>
         </ul>
     </div>
 </div>

+ 62 - 0
resources/views/maintenance/ownerMaterial/_create.blade.php

@@ -0,0 +1,62 @@
+<div class="modal " id="add-ownerMaterial" tabindex="-1" >
+    <div class="modal-dialog modal-lg modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加项目耗材</h5>
+                <button type="button" class="close" data-dismiss="modal">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form class="form">
+                    <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">
+                                <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>
+                    </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">
+                        </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">
+                                <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>
+                    </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">
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="add-special" class="col-sm-2 col-form-label text-right">特殊要求</label>
+                        <div class="col-sm-10 form-inline">
+                            <textarea name="special" id="add-special" cols="30" rows="3" class="form-control form-text col-10" v-model="addOwnerMaterial.special"></textarea>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="add-specification" class="col-sm-2 col-form-label text-right">材质规格</label>
+                        <div class="col-sm-10 form-inline">
+                            <textarea name="specification" id="add-specification" cols="30" rows="5" class="form-control form-text col-10" v-model="addOwnerMaterial.specification"></textarea>
+                        </div>
+                    </div>
+                </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>
+            </div>
+        </div>
+    </div>
+</div>

+ 62 - 0
resources/views/maintenance/ownerMaterial/_edit.blade.php

@@ -0,0 +1,62 @@
+<div class="modal " id="edit-ownerMaterial" tabindex="-1" >
+    <div class="modal-dialog modal-lg modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">添加项目耗材</h5>
+                <button type="button" class="close" data-dismiss="modal" @click="editOwnerMaterial={}">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form class="form">
+                    <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 name="owner-id" id="edit-owner-id" class="form-control col-sm-5" v-model="editOwnerMaterial.owner_id">
+                                <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>
+                    </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" name="material-code" id="edit-material-code" class="form-control col-sm-10" v-model="editOwnerMaterial.material_code" placeholder="耗材编码" >
+                        </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 name="material-id" id="edit-material-id" class="form-control col-sm-5" v-model="editOwnerMaterial.material_id">
+                                <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>
+                    </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" name="size" v-model="editOwnerMaterial.size" placeholder="项目耗材尺寸">
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="edit-special" class="col-sm-2 col-form-label text-right">特殊要求</label>
+                        <div class="col-sm-10 form-inline">
+                            <textarea name="special" id="edit-special" cols="30" rows="3" v-model="editOwnerMaterial.special" class="form-control form-text col-10"></textarea>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="edit-specification" class="col-sm-2 col-form-label text-right">材质规格</label>
+                        <div class="col-sm-10 form-inline">
+                            <textarea name="specification" id="edit-specification" cols="30" rows="5"  class="form-control form-text col-10">@{{ editOwnerMaterial.specification }}</textarea>
+                        </div>
+                    </div>
+                </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-primary" @click="update">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 34 - 0
resources/views/maintenance/ownerMaterial/_table.blade.php

@@ -0,0 +1,34 @@
+<table class="table table-striped table-sm table-hover" id="list">
+    <tr class="text-center">
+        <th>序号</th>
+        <th>货主</th>
+        <th>耗材编码</th>
+        <th>尺寸</th>
+        <th>特殊要求</th>
+        <th>材质规格</th>
+        <th>附件</th>
+        <th>创建者</th>
+        <th>创建时间</th>
+        <th>操作</th>
+    </tr>
+    <tr class="text-center" v-for="(ownerMaterial,i) in ownerMaterials">
+        <td>@{{ i+1 }}</td>
+        <td>
+            <span v-if="ownerMaterial.owner">@{{ ownerMaterial.owner.name }}</span>
+        </td>
+        <td>@{{ ownerMaterial.material_code  }}</td>
+        <td>@{{ ownerMaterial.size }}</td>
+        <td>@{{ ownerMaterial.special }}</td>
+        <td>@{{ ownerMaterial.specification }}</td>
+        <td>附件</td>
+        <td>
+            <span v-if="ownerMaterial.initiator">@{{ ownerMaterial.initiator.name }}</span>
+        </td>
+        <td>@{{ ownerMaterial.created_at }}</td>
+        <td>
+            <button type="button" class="btn btn-sm btn-outline-primary" @click="edit(ownerMaterial,i)">编辑</button>
+            <button type="button" class="btn btn-sm btn-outline-danger" @click="destroy(ownerMaterial.id,i)">删除</button>
+        </td>
+    </tr>
+</table>
+{{$ownerMaterials->links()}}

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


+ 114 - 0
resources/views/maintenance/ownerMaterial/index.blade.php

@@ -0,0 +1,114 @@
+@extends('layouts.app')
+
+@section('title','项目耗材')
+
+@section('content')
+    <nav class="nav2">
+        @component('maintenance.menu')@endcomponent
+    </nav>
+
+    <div class="container-fluid d-none" id="owner_material">
+        <div class="card">
+            @include('maintenance.ownerMaterial._create')
+            @include('maintenance.ownerMaterial._edit')
+            <div class="card-body">
+                <div class="row pull-left m-1">
+                    <button class="btn btn-outline-info mb-1 mr-3" @click="store"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                </div>
+                @include('maintenance.ownerMaterial._table')
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+<script>
+    let vue = new Vue({
+        el:"#owner_material",
+        data:{
+            ownerMaterials:{!! $ownerMaterials->toJson() !!}['data'],
+            owners:{!! $owners->toJson() !!},
+            materials:{!! $materials->toJson() !!},
+            addOwnerMaterial:{},
+            editOwnerMaterial:{},
+            index:'',
+            filterOwners:'',
+            filterMaterials:'',
+        },
+        mounted(){
+            $('#owner_material').removeClass('d-none');
+            this.filterOwners = JSON.parse(JSON.stringify(this.owners));
+            this.filterMaterials = JSON.parse(JSON.stringify(this.materials));
+        },
+        methods:{
+            destroy(id,index){
+                if (!confirm('是否删除当前项目耗材')) return;
+                axios.delete('{{url('apiLocal/ownerMaterial')}}/'+id).then(res=>{
+                    if(res.data.success){
+                        tempTip.setIndex(100);
+                        tempTip.setDuration(3000);
+                        tempTip.showSuccess('删除成功');
+                        this.$delete(this.ownerMaterials,index);
+                        return ;
+                    }
+                    tempTip.setDuration(3000);
+                    tempTip.show(res.data.message);
+                }).catch(err=>{
+                    tempTip.setDuration(3000);
+                    tempTip.show('删除当前项目耗材失败:'+err);
+                });
+            },
+            edit(ownerMaterial,i){
+                this.editOwnerMaterial = ownerMaterial;
+                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.$set(this.ownerMaterials,this.index,res);
+                    this.index = null;
+                    this.editOwnerMaterial = {};
+                    $("#edit-ownerMaterial").modal('hide');
+                    return "修改完成";
+                },true);
+            },
+            store(){
+                $('#add-ownerMaterial').modal('show');
+            },
+            create(){
+                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);
+            },
+            filterMaterial(e){
+                let value = $(e.target).val();
+                console.log(value);
+                if(value==='' || value===null)this.filterMaterials = this.materials;
+                else {
+                    this.filterMaterials = this.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;
+                else {
+                    this.filterOwners = this.owners.filter(function(item){
+                        return item.name.indexOf(value) !== -1;
+                    });
+                }
+            }
+
+        }
+    });
+</script>
+@endsection
+

+ 1 - 1
routes/apiLocal.php

@@ -120,5 +120,5 @@ Route::group(['prefix' => 'material'],function(){
 Route::group(['prefix' => 'ownerMaterial'],function(){
     Route::post('store','OwnerMaterialController@storeApi');
     Route::post('update','OwnerMaterialController@updateApi');
-    Route::delete('destroy/{id}','OwnerMaterialController@destroyApi');
+    Route::delete('{id}','OwnerMaterialController@destroyApi');
 });