Sfoglia il codice sorgente

Merge branch 'pruchasing_system' into zengjun

ajun 5 anni fa
parent
commit
b262ee9d7b
50 ha cambiato i file con 2089 aggiunte e 5 eliminazioni
  1. 27 0
      app/Configuration.php
  2. 71 0
      app/Filters/ConfigurationFilters.php
  3. 61 0
      app/Filters/MaterialFilters.php
  4. 114 0
      app/Filters/OwnerMaterialFilters.php
  5. 72 0
      app/Filters/SupplierFilters.php
  6. 48 0
      app/Http/Controllers/ConfigurationController.php
  7. 60 0
      app/Http/Controllers/MaterialController.php
  8. 83 0
      app/Http/Controllers/OwnerMaterialController.php
  9. 43 0
      app/Http/Controllers/SupplierController.php
  10. 20 0
      app/Material.php
  11. 41 0
      app/OwnerMaterial.php
  12. 14 0
      app/Services/MaterialService.php
  13. 28 0
      app/Supplier.php
  14. 1 1
      app/UploadFile.php
  15. 18 0
      database/factories/ConfigurationFactory.php
  16. 13 0
      database/factories/MaterialFactory.php
  17. 17 0
      database/factories/OwnerMaterialFactory.php
  18. 20 0
      database/factories/SupplierFactory.php
  19. 33 0
      database/migrations/2021_02_01_132214_create_materials_table.php
  20. 38 0
      database/migrations/2021_02_01_172827_create_owner_material_table.php
  21. 39 0
      database/migrations/2021_02_02_141649_create_suppliers_table.php
  22. 31 0
      database/migrations/2021_02_02_142307_create_table_material_supplier.php
  23. 35 0
      database/migrations/2021_02_02_155946_create_configurations_table.php
  24. 40 0
      database/migrations/2021_02_03_091623_add_authorrities_to_materials_owner_material_suppliers_configurations.php
  25. 17 0
      database/seeds/ConfigurationSeeder.php
  26. 17 0
      database/seeds/MaterialSeeder.php
  27. 18 0
      database/seeds/OwnerMaterialSeeder.php
  28. 17 0
      database/seeds/SupplierSeeder.php
  29. 2 2
      resources/views/customer/customer/tag/index.blade.php
  30. 2 2
      resources/views/customer/customerLogStatus/index.blade.php
  31. 38 0
      resources/views/maintenance/configuration/_create.blade.php
  32. 38 0
      resources/views/maintenance/configuration/_edit.blade.php
  33. 32 0
      resources/views/maintenance/configuration/_table.blade.php
  34. 93 0
      resources/views/maintenance/configuration/index.blade.php
  35. 28 0
      resources/views/maintenance/material/_create.blade.php
  36. 28 0
      resources/views/maintenance/material/_edit.blade.php
  37. 22 0
      resources/views/maintenance/material/_table.blade.php
  38. 104 0
      resources/views/maintenance/material/index.blade.php
  39. 16 0
      resources/views/maintenance/menu.blade.php
  40. 62 0
      resources/views/maintenance/ownerMaterial/_create.blade.php
  41. 62 0
      resources/views/maintenance/ownerMaterial/_edit.blade.php
  42. 47 0
      resources/views/maintenance/ownerMaterial/_table.blade.php
  43. 27 0
      resources/views/maintenance/ownerMaterial/_uploadFile.blade.php
  44. 169 0
      resources/views/maintenance/ownerMaterial/index.blade.php
  45. 62 0
      resources/views/maintenance/supplier/_create.blade.php
  46. 62 0
      resources/views/maintenance/supplier/_edit.blade.php
  47. 32 0
      resources/views/maintenance/supplier/_table.blade.php
  48. 88 0
      resources/views/maintenance/supplier/index.blade.php
  49. 30 0
      routes/apiLocal.php
  50. 9 0
      routes/web.php

+ 27 - 0
app/Configuration.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+use App\Traits\LogModelChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class Configuration extends Model
+{
+    use LogModelChanging;
+    use ModelTimeFormat;
+    protected $fillable = [
+        'name','value','description','operator'
+    ];
+
+    public function operator():BelongsTo
+    {
+        return $this->belongsTo(User::class,'operator');
+    }
+
+    public function scopeFilter($query,$filter)
+    {
+        return $filter->apply($query);
+    }
+}

+ 71 - 0
app/Filters/ConfigurationFilters.php

@@ -0,0 +1,71 @@
+<?php
+
+
+namespace App\Filters;
+
+
+use Illuminate\Http\Request;
+
+class ConfigurationFilters
+{
+    protected $request;
+    protected $queryBuilder;
+    protected $filters = [];
+    protected $array_filter;
+    protected $params = [
+        'name', 'contact_man', 'phone', 'invoice_title', 'bank', 'bank_account', 'opening_bank'
+    ];
+
+    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 afterApply()
+    {
+
+    }
+
+    private function name($name)
+    {
+
+    }
+
+    private function contact_man($contact_man)
+    {
+
+    }
+
+    private function phone($phone)
+    {
+
+    }
+
+    private function invoice_title($invoice_title)
+    {
+
+    }
+
+    private function opening_bank($opening_bank)
+    {
+
+    }
+
+    private function bank($bank)
+    {
+
+    }
+}

+ 61 - 0
app/Filters/MaterialFilters.php

@@ -0,0 +1,61 @@
+<?php
+
+
+namespace App\Filters;
+
+use Illuminate\Http\Request;
+
+class MaterialFilters
+{
+    protected $request;
+    protected $queryBuilder;
+    protected $filters = [];
+    protected $array_filter;
+    protected $params = ['code','name'];
+
+    public function __construct(Request $request)
+    {
+        $this->request = $request;
+        $this->params = $request->all();
+        $this->array_filter = array_filter($this->request->only($this->filters));
+    }
+
+    private function isSearchLike($str)
+    {
+        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;
+    }
+
+    public function apply($builder)
+    {
+        $this->queryBuilder = $builder;
+        foreach ($this->array_filter as $filter => $value) {
+            if (method_exists($this, $filter)) {
+                $this->$filter($value, $this->queryBuilder);
+            }
+        }
+        return $this->queryBuilder;
+    }
+
+    public function code($code)
+    {
+        $this->searchWay($this->queryBuilder,$code,'code');
+    }
+
+    public function name($name)
+    {
+        $this->searchWay($this->queryBuilder,$name,'name');
+    }
+}

+ 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);
+
+    }
+
+}

+ 72 - 0
app/Filters/SupplierFilters.php

@@ -0,0 +1,72 @@
+<?php
+
+
+namespace App\Filters;
+
+use Illuminate\Http\Request;
+
+class SupplierFilters
+{
+    protected $request;
+    protected $queryBuilder;
+    protected $filters = [];
+    protected $array_filter;
+    protected $params = [
+        'name','contact_man','phone','invoice_title','bank','bank_account','opening_bank'
+    ];
+    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 afterApply()
+    {
+
+    }
+
+    private function name($name)
+    {
+        $this->queryBuilder->where('name','like',"{$name}%");
+    }
+
+    private function contact_man($contact_man)
+    {
+        $this->queryBuilder->where('contact_man','like',"{$contact_man}%");
+    }
+
+    private function phone($phone)
+    {
+        $this->queryBuilder->where('phone','like',"{$phone}%");
+    }
+
+    private function invoice_title($invoice_title)
+    {
+        $this->queryBuilder->where('invoice_title','like',"{$invoice_title}%");
+    }
+
+    private function bank($bank)
+    {
+        $this->queryBuilder->where('bank','like',"{$bank}%");
+    }
+    private function bank_account($bank_account)
+    {
+        $this->queryBuilder->where('bank_account','like',"{$bank_account}%");
+    }
+    private function opening_bank($opening_bank)
+    {
+        $this->queryBuilder->where('opening_bank','like',"{$opening_bank}%");
+    }
+
+}

+ 48 - 0
app/Http/Controllers/ConfigurationController.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\Configuration;
+use App\Filters\ConfigurationFilters;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class ConfigurationController extends Controller
+{
+    use AsyncResponse;
+    public function index(Request $request,ConfigurationFilters $filters)
+    {
+        $this->gate('系统配置');
+        $configurations = Configuration::query()->orderBy('id')->filter($filters)->paginate($request['paginate'] ?? 50);
+        return view('/maintenance/configuration/index',compact('configurations'));
+    }
+
+    public function storeApi(Request $request)
+    {
+        $this->gate('系统配置-编辑');
+        $params = $request->all();
+        $params['operator'] = Auth::user()['id'];
+        $configuration = Configuration::query()->create($params);
+        if($configuration)$this->success($configuration->loadMissing('operator'));
+        $this->error('创建失败');
+    }
+
+    public function updateApi(Request $request)
+    {
+        $this->gate('系统配置-编辑');
+        $configuration = Configuration::query()->find($request['id']);
+        if(!$configuration)$this->error('更新异常');
+        $params = $request->only(['name','value','description']);
+        $params['operator'] = Auth::user()['id'];
+        $configuration->update($params);
+        $this->success($configuration->loadMissing('operator'));
+    }
+
+    public function destroyApi($id)
+    {
+        $this->gate('系统配置-删除');
+        Configuration::query()->where('id',$id)->delete();
+        $this->success();
+    }
+}

+ 60 - 0
app/Http/Controllers/MaterialController.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\Exceptions\WarningException;
+use App\Filters\MaterialFilters;
+use App\Material;
+use Illuminate\Http\Request;
+
+class MaterialController extends Controller
+{
+    // 耗材
+    use AsyncResponse;
+    public function index(Request $request,MaterialFilters  $filter)
+    {
+        $this->gate('耗材');
+        $materials  = Material::query()->orderByDesc('id')->filter($filter)->paginate($request['paginate'] ?? 50);
+        return view('maintenance/material/index',compact('materials'));
+    }
+
+    public function storeApi(Request $request):array
+    {
+        $this->gate('耗材-编辑');
+        $material = Material::query()->where('code',$request['code'])->first();
+        if($material)return ['success' => false,'message'=>'code对应的耗材已存在'];
+        try {
+            $material = Material::query()->create($request->all(['code', 'name']));
+            return ['success'=>true,'data'=>$material];
+        } catch (\Exception $e) {
+            return ['success' => false,'message' => $e->getMessage()];
+        }
+    }
+
+    public function updateApi(Request $request):array
+    {
+        $this->gate('耗材-编辑');
+        $material = Material::query()->find($request['id']);
+        try {
+            $material->update($request->all(['code', 'name']));
+            return ['success' => true,'date'=>$material];
+        } catch (WarningException $e) {
+            return ['success'=>false,'message'=>$e->getMessage()];
+        }
+    }
+
+    public function destroyApi($id):array
+    {
+        $this->gate('耗材-删除');
+        /** @var Material $material */
+        $material = Material::query()->find($id);
+        try {
+            $bool = $material->delete();
+            if($bool>0)return ['success'=>true];
+            else return ['success'=>false,'message'=>'删除失败'];
+        } catch (WarningException $e) {
+            return ['success'=>false,'message'=>$e->getMessage()];
+        }
+    }
+}

+ 83 - 0
app/Http/Controllers/OwnerMaterialController.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\Exceptions\Exception;
+use App\Filters\OwnerMaterialFilters;
+use App\Material;
+use App\OwnerMaterial;
+use App\Services\OwnerService;
+use App\UploadFile;
+use Faker\Provider\Uuid;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class OwnerMaterialController extends Controller
+{
+    use AsyncResponse;
+    public function index(Request $request,OwnerMaterialFilters $filters)
+    {
+        $this->gate('项目耗材');
+        $ownerMaterials = OwnerMaterial::query()->with(['owner','material','initiator','file'])->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(Request  $request):array
+    {
+        $this->gate('项目耗材-编辑');
+        $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(Request $request)
+    {
+        $this->gate('项目耗材-编辑');
+        $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($id)
+    {
+        $this->gate('项目耗材-删除');
+        $ownerMaterial = OwnerMaterial::query()->find($id);
+        if(!$ownerMaterial)$this->error('对应的项目耗材没有找到');
+        $ownerMaterial->delete();
+        $this->success();
+    }
+
+    public function uploadFileApi(Request $request)
+    {
+        $this->gate('项目耗材-文件上传');
+        $ownerMaterial = OwnerMaterial::query()->find($request['id']);
+        if(!$ownerMaterial)$this->error('项目耗材不存在');
+        try {
+            $file = $request->file('file');
+            $fileType = $file->getMimeType();// 文件类型
+            $fileName = strtolower($file->getClientOriginalExtension());// 文件名
+            $path = $file->storeAs("ownerMaterial", Uuid::uuid() . "." . $fileName);
+            $file = UploadFile::query()->create([
+                'table_name' => 'owner_material',
+                'table_id' => $ownerMaterial['id'],
+                'url' => $path,
+                'type' => $fileType,
+                "file_name" => $file->getClientOriginalName()
+            ]);
+            $this->success($ownerMaterial->loadMissing(['owner', 'material', 'initiator', 'file']));
+        } catch (Exception $e) {
+            $this->error($e->getMessage());
+        }
+    }
+}

+ 43 - 0
app/Http/Controllers/SupplierController.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\Filters\SupplierFilters;
+use App\Supplier;
+use Illuminate\Http\Request;
+
+class SupplierController extends Controller
+{
+    use AsyncResponse;
+    public function index(Request $request,SupplierFilters $filters)
+    {
+        $this->gate('供应商');
+        $suppliers = Supplier::query()->orderByDesc('id')->filter($filters)->paginate($request['paginate']??50);
+        return view('/maintenance/supplier/index',compact('suppliers'));
+    }
+
+    public function storeApi(Request $request)
+    {
+        $this->gate('供应商-编辑');
+        $supplier = Supplier::query()->create($request->all());
+        $this->success($supplier);
+    }
+
+    public function updateApi(Request $request)
+    {
+        $this->gate('供应商-编辑');
+        $supplier = Supplier::query()->find($request['id']);
+        $bool= $supplier->update($request->only(['name','contact_man','phone','invoice_title','bank','bank_account','opening_bank']));
+        if($bool)$this->success($supplier);
+        $this->error('更新异常');
+    }
+
+    public function destroyApi($id)
+    {
+        $this->gate('供应商-删除');
+        $supplier = Supplier::query()->find($id);
+        $supplier->delete();
+        $this->success();
+    }
+}

+ 20 - 0
app/Material.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App;
+
+use App\Filters\MaterialFilters;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\LogModelChanging;
+
+class Material extends Model
+{
+    use LogModelChanging;
+
+    protected $fillable = ['name','code'];
+
+    public function scopeFilter($query, $filters)
+    {
+        return $filters->apply($query);
+    }
+}

+ 41 - 0
app/OwnerMaterial.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+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()
+    {
+        return $this->belongsTo(Owner::class);
+    }
+
+    public function material()
+    {
+        return $this->belongsTo(Material::class);
+    }
+
+    public function initiator()
+    {
+        return $this->belongsTo(User::class,'initiator','id');
+    }
+
+    public function file()
+    {
+        return $this->hasOne(UploadFile::class,'table_id','id')->where('table_name','owner_material');
+    }
+
+    public function scopeFilter($query,$filters)
+    {
+        return $filters->apply($query);
+    }
+}

+ 14 - 0
app/Services/MaterialService.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Services;
+
+use App\Material;
+use App\Traits\ServiceAppAop;
+
+class MaterialService
+{
+    use ServiceAppAop;
+    protected $modelClass = Material::class;
+
+
+}

+ 28 - 0
app/Supplier.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\LogModelChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class Supplier extends Model
+{
+    use LogModelChanging;
+    use ModelTimeFormat;
+    use SoftDeletes;
+    protected $fillable = ['name','contact_man','phone','invoice_title','bank','bank_account','opening_bank'];
+
+    public function material():BelongsToMany
+    {
+        return $this->belongsToMany(Material::class,'material_supplier','supplier_id','material_id','id','material_id');
+    }
+
+    public function scopeFilter($query,$filters)
+    {
+        return $filters->apply($query);
+    }
+}

+ 1 - 1
app/UploadFile.php

@@ -11,6 +11,6 @@ class UploadFile extends Model
     use ModelLogChanging;
 
     protected $fillable=[
-        'table_name','table_id','url','type',"name"
+        'table_name','table_id','url','type',"file_name"
     ];
 }

+ 18 - 0
database/factories/ConfigurationFactory.php

@@ -0,0 +1,18 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\Configuration;
+use Faker\Generator as Faker;
+use \Illuminate\Database\Eloquent\Factory;
+
+$factory->define(Configuration::class, function (Faker $faker) {
+    return [
+        'name' => $faker->domainName,
+        'value' => $faker->title,
+        'description' => $faker->title(100),
+        'created_at' => $faker->dateTime,
+        'updated_at' =>$faker->dateTime,
+        'operator' => 1
+    ];
+});

+ 13 - 0
database/factories/MaterialFactory.php

@@ -0,0 +1,13 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\Material;
+use Faker\Generator as Faker;
+
+$factory->define(Material::class, function (Faker $faker) {
+    return [
+        'code' => $faker->name(10),
+        'name' => $faker->name(20),
+    ];
+});

+ 17 - 0
database/factories/OwnerMaterialFactory.php

@@ -0,0 +1,17 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OwnerMaterial;
+use Faker\Generator as Faker;
+
+$factory->define(OwnerMaterial::class, function (Faker $faker) {
+    return [
+        'owner_id' => 1,
+        'material_id' => 1,
+        'material_code' => \Illuminate\Support\Str::random(5),
+        'size' => \Illuminate\Support\Str::random(10),
+        'special'=>\Illuminate\Support\Str::random(10),
+        'specification' => \Illuminate\Support\Str::random(10),
+        'initiator'=>1];
+});

+ 20 - 0
database/factories/SupplierFactory.php

@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @var Factory $factory
+ */
+
+use App\Supplier;
+use Faker\Generator as Faker;
+use \Illuminate\Database\Eloquent\Factory;
+$factory->define(Supplier::class, function (Faker $faker) {
+    return [
+        'name' => $faker->userName,
+        'contact_man' => $faker->bankAccountNumber,
+        'phone' => $faker->phoneNumber,
+        'invoice_title' => $faker->jobTitle,
+        'bank' => $faker->domainName,
+        'bank_account' => $faker->bankAccountNumber,
+        'opening_bank' => $faker->address
+    ];
+});

+ 33 - 0
database/migrations/2021_02_01_132214_create_materials_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateMaterialsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('materials', function (Blueprint $table) {
+            $table->id();
+            $table->string('code',20)->unique()->comment('编号');
+            $table->string('name',50)->comment('名称');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('materials');
+    }
+}

+ 38 - 0
database/migrations/2021_02_01_172827_create_owner_material_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOwnerMaterialTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('owner_material', function (Blueprint $table) {
+            $table->id();
+            $table->bigInteger('owner_id')->index()->comment('货主');
+            $table->bigInteger('material_id')->index()->comment('耗材');
+            $table->string('material_code',30)->comment('耗材编码');
+            $table->string('size')->comment('尺寸');
+            $table->string('special')->nullable()->comment('特殊要求');
+            $table->text('specification')->nullable()->comment('材质规格');
+            $table->bigInteger('initiator')->comment('创建者');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('owner_materials');
+    }
+}

+ 39 - 0
database/migrations/2021_02_02_141649_create_suppliers_table.php

@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateSuppliersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('suppliers', function (Blueprint $table) {
+            $table->id();
+            $table->string('name',30)->comment('名称');
+            $table->string('contact_man',30)->comment('联系人');
+            $table->string('phone')->comment('电话');
+            $table->string('invoice_title')->comment('发票抬头');
+            $table->string('bank',30)->comment('账户银行');
+            $table->string('bank_account',50)->comment('收款账户');
+            $table->string('opening_bank',50)->comment('开户行');
+            $table->timestamps();
+            $table->softDeletes();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('suppliers');
+    }
+}

+ 31 - 0
database/migrations/2021_02_02_142307_create_table_material_supplier.php

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

+ 35 - 0
database/migrations/2021_02_02_155946_create_configurations_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateConfigurationsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('configurations', function (Blueprint $table) {
+            $table->id();
+            $table->string('name')->index()->comment('名称');
+            $table->string('value')->index()->comment('值');
+            $table->string('description')->nullable()->comment('描述');
+            $table->bigInteger('operator')->comment('操作员');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('configurations');
+    }
+}

+ 40 - 0
database/migrations/2021_02_03_091623_add_authorrities_to_materials_owner_material_suppliers_configurations.php

@@ -0,0 +1,40 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+use App\Authority;
+
+class AddAuthorritiesToMaterialsOwnerMaterialSuppliersConfigurations extends Migration
+{
+    private $names = [
+        '耗材类型', '耗材类型-编辑','耗材类型-删除',
+        '项目耗材', '项目耗材-编辑','项目耗材-删除','项目耗材-文件上传',
+        '供应商', '供应商-编辑','供应商-删除',
+        '系统配置','系统配置-编辑','系统配置-删除',
+    ];
+
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->names as $name) {
+            if(!Authority::query()->where('name',$name)->exists())
+                Authority::query()->create(['name'=>$name,'alias_name'=>$name]);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Authority::query()->whereIn('name',$this->names)->delete();
+    }
+}

+ 17 - 0
database/seeds/ConfigurationSeeder.php

@@ -0,0 +1,17 @@
+<?php
+
+use Illuminate\Database\Seeder;
+use App\Configuration;
+class ConfigurationSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $configurations = factory(Configuration::class)->times(100)->make()->toArray();
+        Configuration::query()->insert($configurations);
+    }
+}

+ 17 - 0
database/seeds/MaterialSeeder.php

@@ -0,0 +1,17 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class MaterialSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $materials = factory(\App\Material::class)->times(60)->make()->toArray();
+        \App\Material::query()->insert($materials);
+    }
+}

+ 18 - 0
database/seeds/OwnerMaterialSeeder.php

@@ -0,0 +1,18 @@
+<?php
+
+use App\OwnerMaterial;
+use Illuminate\Database\Seeder;
+
+class OwnerMaterialSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $ownerMaterials =  factory(OwnerMaterial::class)->times(120)->make()->toArray();
+        OwnerMaterial::query()->insert($ownerMaterials);
+    }
+}

+ 17 - 0
database/seeds/SupplierSeeder.php

@@ -0,0 +1,17 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class SupplierSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $params = factory(\App\Supplier::class)->times(100)->make()->toArray();
+        \App\Supplier::query()->insert($params);
+    }
+}

+ 2 - 2
resources/views/customer/customer/tag/index.blade.php

@@ -10,7 +10,7 @@
         @include("customer.customer.tag._edit")
         <div class="card">
             <div class="card-body">
-                <div class="row pull-right">
+                <div class="row pull-left ml-1">
                     @can("客户-客户标签-录入")<button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>@endcan
                 </div>
                 <table class="table table-striped table-hover">
@@ -104,4 +104,4 @@
             },
         });
     </script>
-@stop
+@stop

+ 2 - 2
resources/views/customer/customerLogStatus/index.blade.php

@@ -11,7 +11,7 @@
         <div class="card">
             <div class="card-body">
                 @include("customer.customerLogStatus._edit")
-                <div class="row pull-right">
+                <div class="row pull-left ml-1">
                     @can("客户-客户状态-录入")<button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>@endcan
                 </div>
                 <table class="table table-striped table-bordered table-hover">
@@ -106,4 +106,4 @@
             },
         });
     </script>
-@endsection
+@endsection

+ 38 - 0
resources/views/maintenance/configuration/_create.blade.php

@@ -0,0 +1,38 @@
+<div class="modal " id="add-configuration" 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="addConfiguration={}">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form class="form">
+                    <div class="form-group row">
+                        <label for="add-name" class="col-sm-2 col-form-label text-right">名称</label>
+                        <div class="col-sm-10 form-inline">
+                            <input type="text" name="name" id="add-name" class="form-control col-sm-10" placeholder="输入配置名称" v-model="addConfiguration.name">
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="add-value" class="col-sm-2 col-form-label text-right">值</label>
+                        <div class="col-sm-10 form-inline">
+                            <input type="text" id="add-value" class="form-control col-10" name="value" placeholder="输入配置值" v-model="addConfiguration.value">
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="add-description" class="col-sm-2 col-form-label text-right">描述</label>
+                        <div class="col-sm-10 form-inline">
+                            <textarea name="description" id="add-description" cols="30" rows="5"  class="form-control form-text col-10" v-model="addConfiguration.description"></textarea>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="addConfiguration={}">关闭</button>
+                <button type="button" class="btn btn-primary" @click="create">提交</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 38 - 0
resources/views/maintenance/configuration/_edit.blade.php

@@ -0,0 +1,38 @@
+<div class="modal " id="edit-configuration" 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="editConfiguration={}">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form class="form">
+                    <div class="form-group row">
+                        <label for="add-name" class="col-sm-2 col-form-label text-right">名称</label>
+                        <div class="col-sm-10 form-inline">
+                            <input type="text" name="name" id="add-name" class="form-control col-sm-10" placeholder="输入配置名称" v-model="editConfiguration.name">
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="add-value" class="col-sm-2 col-form-label text-right">值</label>
+                        <div class="col-sm-10 form-inline">
+                            <input type="text" id="add-value" class="form-control col-10" name="value" placeholder="输入配置值" v-model="editConfiguration.value">
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="add-description" class="col-sm-2 col-form-label text-right">描述</label>
+                        <div class="col-sm-10 form-inline">
+                            <textarea name="description" id="add-description" cols="30" rows="5"  class="form-control form-text col-10" v-model="editConfiguration.description"></textarea>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary"  data-dismiss="modal" @click="editConfiguration={}">关闭</button>
+                <button type="button" class="btn btn-primary" @click="update">保存</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 32 - 0
resources/views/maintenance/configuration/_table.blade.php

@@ -0,0 +1,32 @@
+<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>
+    </tr>
+    <tr class="text-center" v-for="(configuration,i) in configurations" :key="configuration.id">
+        <td>@{{ i+1 }}</td>
+        <td>@{{ configuration.name }}</td>
+        <td>@{{ configuration.value  }}</td>
+        <td>@{{ configuration.description  }}</td>
+        <td>
+            <span v-if="configuration.operator">@{{ configuration.operator.name }}</span>
+        </td>
+        <td>@{{ configuration.created_at }}</td>
+        <td>@{{ configuration.updated_at }}</td>
+        <td>
+            @can('系统配置-编辑')
+                <button type="button" class="btn btn-sm btn-outline-primary" @click="edit(configuration,i)">编辑</button>
+            @endcan
+            @can('系统配置-删除')
+                <button type="button" class="btn btn-sm btn-outline-danger" @click="destroy(configuration.id,i)">删除</button>
+            @endcan
+        </td>
+    </tr>
+</table>
+{{$configurations->links()}}

+ 93 - 0
resources/views/maintenance/configuration/index.blade.php

@@ -0,0 +1,93 @@
+@extends('layouts.app')
+
+@section('title','系统配置')
+
+@section('content')
+    <nav class="nav2">
+        @component('maintenance.menu')@endcomponent
+    </nav>
+
+    <div class="container-fluid d-none" id="configuration">
+        <div class="card">
+            @can('系统配置-编辑')
+                @include('maintenance.configuration._create')
+                @include('maintenance.configuration._edit')
+            @endcan
+            <div class="card-body">
+                <div class="row pull-left m-1">
+                    @can('系统配置-编辑')
+                        <button class="btn btn-outline-info mb-1 mr-3" @click="store"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                    @endcan
+                </div>
+                @include('maintenance.configuration._table')
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        let vue = new Vue({
+            el:"#configuration",
+            data:{
+                configurations:{!! $configurations->toJson() !!}['data'],
+                addConfiguration:{},
+                editConfiguration:{},
+                index:'',
+            },
+            mounted(){
+                $('#configuration').removeClass('d-none');
+            },
+            methods:{
+                destroy(id,index){
+                    if (!confirm('是否删除当前项目耗材')) return;
+                    axios.delete('{{url('apiLocal/configuration')}}/'+id).then(res=>{
+                        if(res.data.success){
+                            tempTip.setIndex(100);
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess('删除成功');
+                            this.$delete(this.configurations,index);
+                            return ;
+                        }
+                        tempTip.setDuration(3000);
+                        tempTip.show(res.data.message);
+                    }).catch(err=>{
+                        tempTip.setDuration(3000);
+                        tempTip.show('删除当前项目耗材失败:'+err);
+                    });
+                },
+                edit(configuration,i){
+                    this.editConfiguration = JSON.parse(JSON.stringify(configuration));
+                    this.index = i;
+                    $('#edit-configuration').modal('show');
+                },
+                update(){
+                    let url = '{{url('apiLocal/configuration/update')}}';
+                    let params = this.editConfiguration;
+                    window.tempTip.postBasicRequest(url,params,res=>{
+                        this.$set(this.configurations,this.index,res);
+                        this.index = null;
+                        this.editConfiguration = {};
+                        $("#edit-configuration").modal('hide');
+                        return "修改完成";
+                    },true);
+                },
+                store(){
+                    $('#add-configuration').modal('show');
+                },
+                create(){
+                    let url = '{{url('apiLocal/configuration/store')}}';
+                    let params = this.addConfiguration;
+                    window.tempTip.postBasicRequest(url,params,res=>{
+                        this.configurations.unshift(res);
+                        this.$forceUpdate();
+                        this.addConfiguration = {};
+                        $("#add-configuration").modal('hide');
+                        return "添加成功";
+                    },true);
+                }
+            }
+        });
+    </script>
+@endsection
+

+ 28 - 0
resources/views/maintenance/material/_create.blade.php

@@ -0,0 +1,28 @@
+<div class="modal fade " id="addModal" tabindex="1" aria-labelledby="title" >
+    <div class="modal-dialog modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="add-title">添加耗材类型</h5>
+                <button type="button" class="close"  data-dismiss="modal">
+                    <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">
+                    </div>
+                    <div class="form-group">
+                        <label for="material-name">名称</label>
+                        <input type="text" id="material-name" class="form-control" v-model="addMaterial.name">
+                    </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>
+            </div>
+        </div>
+    </div>
+</div>

+ 28 - 0
resources/views/maintenance/material/_edit.blade.php

@@ -0,0 +1,28 @@
+<div class="modal fade " id="editModal" tabindex="1" aria-labelledby="title" >
+    <div class="modal-dialog modal-dialog-centered">
+        <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={}">
+                    <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">
+                    </div>
+                    <div class="form-group">
+                        <label for="material-name">名称</label>
+                        <input type="text" id="material-name" class="form-control" v-model="editMaterial.name">
+                    </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>
+            </div>
+        </div>
+    </div>
+</div>

+ 22 - 0
resources/views/maintenance/material/_table.blade.php

@@ -0,0 +1,22 @@
+<table class="table table-striped table-sm table-hover" id="list">
+    <tr class="text-center">
+        <th>序号</th>
+        <th>编号</th>
+        <th>名称</th>
+        <th>操作</th>
+    </tr>
+    <tr class="text-center" v-for="(material,i) in materials">
+        <td>@{{ i+1 }}</td>
+        <td>@{{ material.code }}</td>
+        <td>@{{ material.name }}</td>
+        <td>
+            @can('耗材类型-编辑')
+                <button class="btn btn-sm btn-outline-primary" @click="edit(material,i)">编辑</button>
+            @endcan
+            @can('耗材类型-删除')
+                <button class="btn btn-sm btn-outline-danger" @click="destroy(material.id,i)">删除</button>
+            @endcan
+        </td>
+    </tr>
+</table>
+{{ $materials->links() }}

+ 104 - 0
resources/views/maintenance/material/index.blade.php

@@ -0,0 +1,104 @@
+@extends('layouts.app')
+@section('title','耗材类型')
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+    </span>
+    <div class="container-fluid d-none" id="material_div">
+        @can('耗材类型-编辑')
+            @include('maintenance.material._edit')
+            @include('maintenance.material._create')
+        @endcan
+        <div class="card">
+            <div class="card_body">
+                <div class="row pull-left m-1">
+                    @can('耗材类型-编辑')
+                        <button class="btn btn-outline-info mb-1 mr-3" @click="store"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                    @endcan
+                </div>
+                @include('maintenance.material._table')
+            </div>
+        </div>
+
+    </div>
+@endsection
+@section('lastScript')
+<script>
+    let vue = new Vue({
+        el:'#material_div',
+        data:{
+            materials:{!! $materials->toJson() !!}['data'],
+            editMaterial:{},
+            index:'',
+            addMaterial:{},
+        },
+        mounted() {
+          $('#material_div').removeClass('d-none');
+        },
+        methods:{
+            destroy(id,index){
+                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.show(err);
+                });
+            },
+            edit(material,i){
+                this.editMaterial =JSON.parse(JSON.stringify(material));
+                this.index = i;
+                $('#editModal').modal('show');
+            },
+            store(){
+                this.addMaterial = {};
+                $('#addModal').modal('show');
+            },
+            update(index){
+                axios.post('{{url('apiLocal/material/update')}}',this.material)
+                    .then(res=>{
+                        if(res.data.success){
+                            $('#editModal').modal('hide');
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess('修改成功');
+                            this.$set(this.materials,index,res.data.data);
+                            this.index = '';
+                            return;
+                        }
+                        tempTip.setDuration(3000);
+                        tempTip.show(res.data.message);
+                    }).catch(err=>{
+                    tempTip.setDuration(3000);
+                    tempTip.show(err);
+                });
+            },
+            create(){
+                axios.post('{{url('apiLocal/material/store')}}',this.addMaterial)
+                    .then(res=>{
+                        if(res.data.success){
+                            $('#addModal').modal('hide');
+                            this.addMaterial={};
+                            tempTip.setDuration(3000);
+                            tempTip.showSuccess('添加成功');
+                            this.$set(this.materials,this.materials.length,res.data.data);
+                            return;
+                        }
+                        tempTip.setDuration(3000);
+                        tempTip.show(res.data.message);
+                    }).catch(err=>{
+                        tempTip.setDuration(3000);
+                        tempTip.show(err);
+                });
+            }
+        }
+    });
+</script>
+
+@endsection

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

@@ -103,6 +103,22 @@
                 <li class="nav-item">
                     <a target="maintenance/log" class="nav-link text-muted" href="{{url('maintenance/log')}}" :class="{active:isActive('log',2)}">日志</a>
                 </li> @endcan
+            @can('耗材类型')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/material')}}" :class="{active:isActive('material',2)}">耗材类型</a>
+                </li>@endcan
+            @can('项目耗材')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/ownerMaterial')}}" :class="{active:isActive('ownerMaterial',2)}">项目耗材</a>
+                </li>@endcan
+            @can('供应商')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/supplier')}}" :class="{active:isActive('supplier',2)}">供应商</a>
+                </li>@endcan
+            @can('系统配置')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/configuration')}}" :class="{active:isActive('configuration',2)}">系统配置</a>
+                </li>@endcan
         </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 text-center">项目耗材添加</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 text-center">项目耗材编辑</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   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"  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  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"   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   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   id="edit-specification" cols="30" rows="5"  class="form-control form-text col-10" v-model="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>

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

@@ -0,0 +1,47 @@
+<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>
+            <div align="center" @mouseleave="hideFile('file_'+ownerMaterial.id)" @mouseenter="showFile('file_'+ownerMaterial.id,ownerMaterial.url)">
+                @can('项目耗材-文件上传')
+                    <button type="button" class="btn btn-sm btn-outline-dark" v-if="!ownerMaterial.file" @click="uploadModal(ownerMaterial,i)">文件上传</button>
+                    <div v-else>
+                        <img  src="{{url('icon/img404-thumbnail.jpg')}}" :src="ownerMaterial.file.url" alt="项目耗材附件" title="项目耗材附件">
+                    </div>
+                @endcan
+            </div>
+        </td>
+        <td>
+            <span v-if="ownerMaterial.initiator">@{{ ownerMaterial.initiator.name }}</span>
+        </td>
+        <td>@{{ ownerMaterial.created_at }}</td>
+        <td>
+            @can('项目耗材-编辑')
+                <button type="button" class="btn btn-sm btn-outline-primary" @click="edit(ownerMaterial,i)">编辑</button>
+            @endcan
+            @can('项目耗材-删除')
+                <button type="button" class="btn btn-sm btn-outline-danger" @click="destroy(ownerMaterial.id,i)">删除</button>
+            @endcan
+        </td>
+    </tr>
+</table>
+{{$ownerMaterials->links()}}

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

@@ -0,0 +1,27 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="uploadFile">
+    <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5>文件上传</h5>
+                <button type="button" class="close" data-dismiss="modal" @click="editOwnerMaterial={}">&times;</button>
+            </div>
+            <div class="modal-body">
+                <div class="container-fluid">
+                    <div class="text-center small row mb-1" v-if="uploadError">
+                        <div class="col-3 text-danger">上传失败</div>
+                        <div class="col-8">
+                            <b v-for="err in uploadError">@{{ err }}<br></b>
+                        </div>
+                    </div>
+                </div>
+                <div>
+                    <input type="file" class=" form-control-file" id="updatafile-input" ref="file">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button class="btn btn-success" data-dismiss="modal" @click="editOwnerMaterial={}">取消</button>
+                <button class="btn btn-success" @click="uploadFile()">开始上传</button>
+            </div>
+        </div>
+    </div>
+</div>

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

@@ -0,0 +1,169 @@
+@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">
+            @can('项目耗材-编辑')
+                @include('maintenance.ownerMaterial._create')
+                @include('maintenance.ownerMaterial._edit')
+            @endcan
+            <div class="card-body">
+                <div class="row pull-left m-1">
+                    @can('项目耗材-编辑')
+                        <button class="btn btn-outline-info mb-1 mr-3" @click="store"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                    @endcan
+                </div>
+                @include('maintenance.ownerMaterial._table')
+            </div>
+        </div>
+        @can('项目耗材-文件上传')
+            @include('maintenance.ownerMaterial._uploadFile')
+        @endcan
+    </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:'',
+            uploadError: null,
+            url:'{{ url('') }}',
+        },
+        mounted(){
+            $('#owner_material').removeClass('d-none');
+            this.filterOwners = JSON.parse(JSON.stringify(this.owners));
+            this.filterMaterials = JSON.parse(JSON.stringify(this.materials));
+        },
+        created(){
+            $.each(this.ownerMaterials,function(item){
+                if(item.file){
+                    let url = item.file.url;
+
+                }
+            });
+        },
+        methods:{
+            fileType(ownerMaterial){
+                let file_types = [ 'gif','jpeg','jpg','png','svg'];
+                if(!ownerMaterial.file)ownerMaterial.isImg = false;
+                if(ownerMaterial.file.url){
+                    $.each(file_types,function(item){
+                        let start = item.length-target.length;
+                           let arr = str.substr(start,target.length);
+                           if(arr === target){
+                               ownerMaterial.isImg = true;
+                               return;
+                           }
+                    });
+                }
+            },
+            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 = JSON.parse(JSON.stringify(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);
+            },
+            uploadModal(ownerMaterial,i){
+                this.editOwnerMaterial = ownerMaterial;
+                this.index = i;
+                $('#uploadFile').modal('show');
+            },
+            hideFile(){
+
+            },
+            showFile(){
+
+            },
+            uploadFile(){
+                let url = '{{url('apiLocal/ownerMaterial/uploadFile')}}';
+                let data = new FormData();
+                let file = this.$refs.file.files[0];
+                data.append('file',file);
+                data.append('id',this.editOwnerMaterial.id);
+                window.tempTip.postBasicRequest(url,data,res=>{
+                    this.$set(this.ownerMaterials,this.ownerMaterials.length,res);
+                    this.editOwnerMaterial = {};
+                    this.index = '';
+                    $("#add-ownerMaterial").modal('hide');
+                    return "上传成功";
+                },true);
+            },
+            filterMaterial(e){
+                let value = $(e.target).val();
+                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
+

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

@@ -0,0 +1,62 @@
+<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={}">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form class="form">
+                    <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="供应商名称" >
+                        </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="联系人" >
+                        </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="联系电话" >
+                        </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="发票抬头">
+                        </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="账户银行">
+                        </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="账户银行">
+                        </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>
+                        </div>
+                    </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>
+            </div>
+        </div>
+    </div>
+</div>

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

@@ -0,0 +1,62 @@
+<div class="modal " id="edit-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="editOwnerMaterial={}">
+                    <span>&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <form class="form">
+                    <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="供应商名称" >
+                        </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="联系人" >
+                        </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="联系电话" >
+                        </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="发票抬头">
+                        </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="账户银行">
+                        </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="账户银行">
+                        </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>
+                        </div>
+                    </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>
+            </div>
+        </div>
+    </div>
+</div>

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

@@ -0,0 +1,32 @@
+<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>
+    </tr>
+    <tr class="text-center" v-for="(supplier,i) in suppliers">
+        <td>@{{ i+1 }}</td>
+        <td>@{{ supplier.name }}</td>
+        <td>@{{ supplier.contact_man}}</td>
+        <td>@{{ supplier.phone }}</td>
+        <td>@{{ supplier.invoice_title }}</td>
+        <td>@{{ supplier.bank }}</td>
+        <td>@{{ supplier.bank_account}}</td>
+        <td>@{{ supplier.opening_bank}}</td>
+        <td>
+            @can('供应商-编辑')
+                <button type="button" class="btn btn-sm btn-outline-primary" @click="edit(supplier,i)">编辑</button>
+            @endcan
+            @can('供应商-删除')
+                <button type="button" class="btn btn-sm btn-outline-danger" @click="destroy(supplier.id,i)">删除</button>
+            @endcan
+        </td>
+    </tr>
+</table>
+{{$suppliers->links()}}

+ 88 - 0
resources/views/maintenance/supplier/index.blade.php

@@ -0,0 +1,88 @@
+@extends('layouts.app')
+@section('title','供应商')
+@section('content')
+    <nav class="nav2">
+        @component('maintenance.menu')@endcomponent
+    </nav>
+    <div class="container-fluid d-none" id="supplier">
+        <div class="card">
+            @can('供应商-编辑')
+                @include('maintenance.supplier._create')
+                @include('maintenance.supplier._edit')
+            @endcan
+            <div class="card-body">
+                <div class="row pull-left m-1">
+                    @can('供应商-编辑')
+                        <button class="btn btn-outline-info mb-1 mr-3" @click="store"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>
+                    @endcan
+                </div>
+                @include('maintenance.supplier._table')
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:'#supplier',
+            data:{
+                suppliers:{!! $suppliers->toJson() !!}['data'],
+                editSupplier:{},
+                addSupplier:{},
+                index:''
+            },
+            mounted(){
+                $('#supplier').removeClass('d-none');
+            },
+            methods:{
+                destroy(id,index){
+                    if (!confirm('是否删除当前供应商')) return;
+                    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(suppliers,i){
+                    this.editSupplier = JSON.parse(JSON.stringify(suppliers));
+                    this.index = i;
+                    $('#edit-supplier').modal('show');
+                },
+                update(){
+                    let url = '{{url('apiLocal/supplier/update')}}';
+                    let params = this.editSupplier;
+                    window.tempTip.postBasicRequest(url,params,res=>{
+                        this.$set(this.suppliers,this.index,res);
+                        this.index = null;
+                        this.editSupplier = {};
+                        $("#edit-supplier").modal('hide');
+                        return "修改完成";
+                    },true);
+                },
+                store(){
+                    $('#add-supplier').modal('show');
+                },
+                create(){
+                    let url = '{{url('apiLocal/supplier/store')}}';
+                    let params = this.addSupplier;
+                    window.tempTip.postBasicRequest(url,params,res=>{
+                        this.$set(this.suppliers,this.suppliers.length,res);
+                        this.addSupplier = {};
+                        $("#add-supplier").modal('hide');
+                        return "创建成功";
+                    },true);
+                },
+            }
+        })
+    </script>
+@endsection

+ 30 - 0
routes/apiLocal.php

@@ -109,3 +109,33 @@ Route::group(['prefix'=>'control'],function () {
     Route::post('panel/menu/laborReportsUserGroupsCountApi','ControlPanelController@laborReportsUserGroupsCountApi');
     Route::post('panel/menu/weightApi','ControlPanelController@weightApi');
 });
+
+/** 耗材 */
+Route::group(['prefix' => 'material'],function(){
+    Route::post('store','MaterialController@storeApi');
+    Route::post('update','MaterialController@updateApi');
+    Route::delete('destroy/{id}','MaterialController@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@uploadFileApi');
+});
+
+/** 供应商 */
+Route::group(['prefix' => 'supplier'],function(){
+    Route::post('store','SupplierController@storeApi');
+    Route::post('update','SupplierController@updateApi');
+    Route::delete('{id}','SupplierController@destroyApi');
+});
+/** 系统配置 */
+Route::group(['prefix' => 'configuration'],function(){
+    Route::post('store','ConfigurationController@storeApi');
+    Route::post('update','ConfigurationController@updateApi');
+    Route::delete('{id}','ConfigurationController@destroyApi');
+});
+
+

+ 9 - 0
routes/web.php

@@ -197,6 +197,14 @@ Route::group(['prefix'=>'maintenance'],function(){
         Route::post("get",'RegionController@get');
         Route::post("store",'RegionController@store');
     });
+    /** 耗材 */
+    Route::get('material','MaterialController@index');;
+    /** 项目耗材 */
+    Route::get('ownerMaterial','OwnerMaterialController@index');
+    /** 供应商 */
+    Route::get('supplier','SupplierController@index');
+    /** 系统配置 */
+    Route::get('configuration','ConfigurationController@index');
 
     Route::get('syncRedisLogs','LogController@syncRedisLogs');
     Route::get('region', 'RegionController@index');
@@ -710,3 +718,4 @@ Route::group(['prefix'=>'station'],function(){
 Route::group(['prefix'=>'control'],function () {
    Route::get('panel/menu','ControlPanelController@index') ;
 });
+