ANG YU 4 lat temu
rodzic
commit
9c7ddd7bb1

+ 46 - 7
app/Http/Controllers/OwnerSundryFeeDetailsController.php

@@ -7,6 +7,7 @@ use App\Owner;
 use App\OwnerSundryFeeDetail;
 use Illuminate\Http\Request;
 use App\Http\Requests\OwnerSundryFeeDetailRequest;
+use Oursdreams\Export\Export;
 
 class OwnerSundryFeeDetailsController extends Controller
 {
@@ -18,9 +19,12 @@ class OwnerSundryFeeDetailsController extends Controller
     public function index(Request $request, OwnerSundryFeeDetailFilters $filters)
     {
         $paginateParams = $request->input();
-        $owner_sundry_fee_details = OwnerSundryFeeDetail::query()->filter($filters)->with('owner')->orderByDesc('updated_at')->paginate($request->paginate ?? 50);
+        $owner_sundry_fee_details = OwnerSundryFeeDetail::query()
+            ->filter($filters)->with('owner', 'logistic')
+            ->orderByDesc('updated_at')
+            ->paginate($request->paginate ?? 50);
         $owners = Owner::all();
-        return view('customer.ownerSundryFee.index', compact('owner_sundry_fee_details', 'paginateParams','owners'));
+        return view('customer.ownerSundryFee.index', compact('owner_sundry_fee_details', 'paginateParams', 'owners'));
     }
 
     public function show($owner_sundry_fee_detail)
@@ -39,12 +43,15 @@ class OwnerSundryFeeDetailsController extends Controller
             '其他',
         ];
         $owners = Owner::all();
-        return view('customer.ownerSundryFee.create_and_edit', compact('owner_sundry_fee_detail', 'types','owners'));
+        $logistics = \App\Logistic::all();
+        return view('customer.ownerSundryFee.create_and_edit', compact('owner_sundry_fee_detail', 'types', 'owners', 'logistics'));
     }
 
     public function store(OwnerSundryFeeDetailRequest $request)
     {
-        $owner_sundry_fee_detail = OwnerSundryFeeDetail::create($request->all());
+        $data = $request->all();
+        $data['fee'] = $data['amount'] * $data['price'];
+        $owner_sundry_fee_detail = OwnerSundryFeeDetail::create($data);
         return redirect()->route('ownerSundryFeeDetails.index', $owner_sundry_fee_detail->id)->with('success', '创建成功');
     }
 
@@ -60,15 +67,17 @@ class OwnerSundryFeeDetailsController extends Controller
             '其他',
         ];
         $owners = Owner::all();
-
-        return view('customer.ownerSundryFee.create_and_edit', compact('owner_sundry_fee_detail','types','owners'));
+        $logistics = \App\Logistic::all();
+        return view('customer.ownerSundryFee.create_and_edit', compact('owner_sundry_fee_detail', 'types', 'owners', 'logistics'));
     }
 
     public function update(OwnerSundryFeeDetailRequest $request, $owner_sundry_fee_detail)
     {
         $owner_sundry_fee_detail = OwnerSundryFeeDetail::find($owner_sundry_fee_detail);
         $this->authorize('update', $owner_sundry_fee_detail);
-        $owner_sundry_fee_detail->update($request->all());
+        $data = $request->all();
+        $data['fee'] = $data['amount'] * $data['price'];
+        $owner_sundry_fee_detail->update($data);
         return redirect()->route('ownerSundryFeeDetails.index', $owner_sundry_fee_detail->id)->with('success', '更新成功');
     }
 
@@ -79,4 +88,34 @@ class OwnerSundryFeeDetailsController extends Controller
         $owner_sundry_fee_detail->delete();
         return redirect()->route('ownerSundryFeeDetails.index')->with('success', '删除成功');
     }
+
+    public function export(Request $request, OwnerSundryFeeDetailFilters $filters)
+    {
+        $query = OwnerSundryFeeDetail::query()
+            ->filter($filters)->with('owner', 'logistic');
+
+        $row = ['货主', '日期', '作业类型', '费用描述', '快递单号', '承运商', '数量', '单价', '收费金额', '备注'];
+        if (!$request->exists('checkAllSign')) {
+            $query->whereIn('id', explode(',', $request['data']));
+        }
+        $details = $query
+            ->orderByDesc('updated_at')
+            ->get();
+        $json = [];
+        foreach ($details as $detail) {
+            $json[] = [
+                $detail->owner->name ?? '',
+                $detail->created_at ?? '',
+                $detail->type ?? '',
+                $detail->fee_explain ?? '',
+                $detail->logistic_name ?? '',
+                $detail->logistic->name ?? '',
+                $detail->amount ?? '',
+                $detail->price ?? '',
+                $detail->fee ?? '',
+                $detail->remark ?? '',
+            ];
+        }
+        return Export::make($row, $json, "杂项费");
+    }
 }

+ 6 - 1
app/OwnerSundryFeeDetail.php

@@ -15,7 +15,7 @@ class OwnerSundryFeeDetail extends Model
     use ModelTimeFormat;
     use SoftDeletes;
 
-    protected $fillable = ['type', 'fee_explain', 'remark', 'fee', 'changable','owner_id'];
+    protected $fillable = ['type', 'fee_explain', 'remark', 'fee', 'changable', 'owner_id', 'logistic_number', 'logistic_id', 'amount', 'price',];
 
 
     static public $enums = [
@@ -63,6 +63,11 @@ class OwnerSundryFeeDetail extends Model
         return $this->belongsTo(Owner::class);
     }
 
+    public function logistic(): BelongsTo
+    {
+        return $this->belongsTo(Logistic::class);
+    }
+
     public function scopeFilter($query, $filters)
     {
         return $filters->apply($query);

+ 11 - 1
database/factories/OwnerSundryFeeDetailFactory.php

@@ -5,7 +5,17 @@ use Illuminate\Database\Eloquent\Factory;
 
 /** @var Factory $factory */
 $factory->define(App\OwnerSundryFeeDetail::class, function (Faker $faker) {
+    $types = ['材料', '垫付', '人工', '其他'];
     return [
-        // 'name' => $faker->name,
+        'owner_id' => random_int(1, 10),
+        'type' => $faker->randomElement($types),
+        'fee_explain' => $faker->sentence,
+        'remark' => $faker->sentence,
+        'fee' => random_int(10, 1000),
+        'changable' => 1,
+        'logistic_number' => $faker->uuid,
+        'logistic_id' => random_int(1, 10),
+        'amount' => random_int(1, 10),
+        'price' => random_int(1, 10),
     ];
 });

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

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddLogisticNumberAndLogisticIdAndAmountAndPriceToOwnerSundryFeeDetails extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('owner_sundry_fee_details', function (Blueprint $table) {
+            $table->string('logistic_number')->nullable();
+            $table->integer('logistic_id')->nullable()->index();
+            $table->integer('amount')->default(1)->comment('数量');
+            $table->decimal('price')->comment('单价');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('owner_sundry_fee_details', function (Blueprint $table) {
+            $table->dropColumn('logistic_number');
+            $table->dropColumn('logistic_id');
+            $table->dropColumn('amount');
+            $table->dropColumn('price;');
+        });
+    }
+}

+ 1 - 7
database/seeds/OwnerSundryFeeDetailsTableSeeder.php

@@ -7,13 +7,7 @@ class OwnerSundryFeeDetailsTableSeeder extends Seeder
 {
     public function run()
     {
-        $owner_sundry_fee_details = factory(OwnerSundryFeeDetail::class)->times(50)->make()->each(function ($owner_sundry_fee_detail, $index) {
-            if ($index == 0) {
-                // $owner_sundry_fee_detail->field = 'value';
-            }
-        });
-
-        OwnerSundryFeeDetail::insert($owner_sundry_fee_details->toArray());
+        factory(OwnerSundryFeeDetail::class)->times(50)->create();
     }
 
 }

+ 107 - 16
resources/views/customer/ownerSundryFee/create_and_edit.blade.php

@@ -1,7 +1,7 @@
 @extends('layouts.app')
 
 @section('content')
-<div class="container">
+<div class="container d-none" id="create">
   <div class="col-md-10 offset-md-1">
     <div class="card ">
       <div class="card-body">
@@ -27,31 +27,50 @@
                 </div>
               <div class="form-group">
                   <label for="fee_explain-field">货主</label>
-                  <select class="form-control" name="owner_id" required>
-                      <option value="" hidden disabled {{ $owner_sundry_fee_detail->id ? '' : 'selected' }}>请选择货主</option>
-                      @foreach ($owners as $value)
-                          <option value="{{ $value->id }}" {{ $owner_sundry_fee_detail->owner_id == $value->id ? 'selected' : '' }}>
-                              {{ $value->name }}
+                  <div class="col-sm-10 form-inline">
+                      <select class="form-control" name="owner_id" required>
+                          <option v-for="owner in filterOwners" :value="owner.id" :selected="owner.id===sundryFee.owner_id">
+                              @{{ owner.name }}
                           </option>
-                      @endforeach
-                  </select>
+                      </select>
+                      <input type="text" placeholder="输入货主进行筛选" class="form-control col-sm-4 offset-1" id="filterOwnerName" @input="filterOwner($event,1)">
+                  </div>
               </div>
                 <div class="form-group">
                 	<label for="fee_explain-field">费用描述</label>
                 	<input class="form-control" type="text" name="fee_explain" id="fee_explain-field" value="{{ old('fee_explain', $owner_sundry_fee_detail->fee_explain ) }}" />
                 </div>
                 <div class="form-group">
-                	<label for="remark-field">备注</label>
-                	<input class="form-control" type="text" name="remark" id="remark-field" value="{{ old('remark', $owner_sundry_fee_detail->remark ) }}" />
+                	<label for="remark-field">快递单号</label>
+                	<input class="form-control" type="text" name="logistic_number" id="logistic_number-field" v-model="sundryFee.logistic_number" @input="logistic_number_returnChange($event)"/>
                 </div>
+              <div class="form-group">
+                  <label for="fee_explain-field">承运商</label>
+                  <div class="col-sm-10 form-inline">
+                      <select class="form-control" name="logistic_id" required>
+                          <option v-for="logistic in filterLogistics" :value="logistic.id" :selected="logistic.id===sundryFee.logistic_id">
+                              @{{ logistic.name }}
+                          </option>
+                      </select>
+                      <input type="text" placeholder="输入承运商进行筛选" class="form-control col-sm-4 offset-1" id="filterLogisticName" @input="filterLogistic($event,1)">
+                  </div>
+              </div>
+              <div class="form-group">
+                  <label for="remark-field">数量</label>
+                  <input class="form-control" type="number" name="amount" id="amount-field" v-model="sundryFee.amount" />
+              </div>
+              <div class="form-group">
+                  <label for="remark-field">单价</label>
+                  <input class="form-control" type="number" name="price" id="price-field" v-model="sundryFee.price" />
+              </div>
                 <div class="form-group">
                     <label for="fee-field">收费金额</label>
-                    <input class="form-control" type="number" name="fee" id="fee-field" value="{{ old('fee', $owner_sundry_fee_detail->fee ) }}" />
+                    <input  disabled class="form-control" type="number" name="fee" id="fee-field" v-model="getFee" />
                 </div>
-{{--                <div class="form-group">--}}
-{{--                    <label for="changable-field">Changable</label>--}}
-{{--                    <input class="form-control" type="text" name="changable" id="changable-field" value="{{ old('changable', $owner_sundry_fee_detail->changable ) }}" />--}}
-{{--                </div>--}}
+              <div class="form-group">
+                  <label for="remark-field">备注</label>
+                  <input class="form-control" type="text" name="remark" id="remark-field" value="{{ old('remark', $owner_sundry_fee_detail->remark ) }}" />
+              </div>
           <div class="well well-sm">
             <button type="submit" class="btn btn-primary">保存</button>
             <a class="btn btn-link float-xs-right" href="{{ route('ownerSundryFeeDetails.index') }}"> <- 返回</a>
@@ -61,5 +80,77 @@
     </div>
   </div>
 </div>
-
+@endsection
+@section('lastScript')
+    <script>
+        let vue = new Vue({
+            el: "#create",
+            data: {
+                sundryFee: {!! $owner_sundry_fee_detail !!},
+                logistics:[@foreach($logistics as $logistic){!! $logistic !!},@endforeach],
+                owners:[@foreach($owners as $owner){!! $owner !!},@endforeach],
+                createSundayFee: {},
+                filterOwners: [],
+                filterLogistics: []
+            },
+            created() {
+            },
+            mounted() {
+                $('#create').removeClass('d-none');
+                this.filterOwners = this.owners;
+                this.filterLogistics = this.logistics;
+                this.sundryFee ? this.sundryFee : {};
+            },
+            computed: {
+                getFee() {
+                    return this.sundryFee.amount*this.sundryFee.price;
+                }
+            },
+            methods: {
+                filterOwner(e,type){
+                    let value = $(e.target).val();
+                    let owners = this.owners;
+                    if(value==='' || value===null)this.filterOwners = owners;
+                    else {
+                        this.filterOwners = owners.filter(function(item){
+                            return item.name.indexOf(value) !== -1;
+                        });
+                        if(this.filterOwners.length>0){
+                            if(type===1)this.sundryFee.owner_id = this.filterOwners[0]['id'];
+                            if(type===2)this.sundryFee.owner_id = this.filterOwners[0]['id'];
+                        }
+                    }
+                },
+                filterLogistic(e,type){
+                    let value = $(e.target).val();
+                    let logistics = this.logistics;
+                    if(value==='' || value===null)this.filterOwners = logistics;
+                    else {
+                        this.filterLogistics = logistics.filter(function(item){
+                            return item.name.indexOf(value) !== -1;
+                        });
+                        if(this.filterLogistics.length>0){
+                            if(type===1)this.sundryFee.logistic_id = this.filterLogistics[0]['id'];
+                            if(type===2)this.sundryFee.logistic_id = this.filterLogistics[0]['id'];
+                        }
+                    }
+                },
+                logistic_number_returnChange(e){
+                    let number=$(e.target).val();
+                    if(!number)return;
+                    let url='{{"/apiLocal/logistic/numberFeatures/computeLogisticByNumber"}}';
+                    axios.post(url,{logistic_number_return:number}).then(response=> {
+                        if(response.data.success==='true'){
+                            if(response.data.logistic){
+                                this.$set(this.sundryFee,'logistic_id',response.data.logistic.id);
+                            }
+                        }
+                    }).catch(function (response) {
+                        console.log(response);
+                    });
+                },
+            },
+            filters: {},
+        });
+    </script>
 @endsection

+ 32 - 4
resources/views/customer/ownerSundryFee/index.blade.php

@@ -1,22 +1,36 @@
 @extends('layouts.app')
-
 @section('content')
     @include('shared._messages')
     @include('shared._error')
     <div id="list" class="d-none">
         <div class="container-fluid">
             <div id="form_div"></div>
-            <div class="form-inline" id="btn"></div>
+            <div class="ml-3 form-inline" id="btn">
+                    <span class="dropdown">
+                        <button type="button"
+                                class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
+                                data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">导出Excel
+                        </button>
+                        <div class="dropdown-menu">
+                            <a class="dropdown-item" @click="sundryFeeExport(false)" href="javascript:">导出勾选内容</a>
+                            <a class="dropdown-item" @click="sundryFeeExport(true)" href="javascript:">导出所有页</a>
+                        </div>
+                    </span>
+            </div>
             <table class="table table-striped table-sm text-nowrap table-hover" id="table">
                 <tr v-for="(owner_sundry_fee_detail,i) in owner_sundry_fee_details"
                     @click="selectTr===i+1?selectTr=0:selectTr=i+1"
                     :class="selectTr===i+1?'focusing' : ''">
                     <td><input class="checkItem" type="checkbox" :value="owner_sundry_fee_detail.id"></td>
                     <td>@{{ i+1 }}</td>
-                    <td>@{{ owner_sundry_fee_detail.owner.name }}</td>
+                    <td>@{{ owner_sundry_fee_detail.owner ? owner_sundry_fee_detail.owner.name : ''}}</td>
                     <td>@{{ owner_sundry_fee_detail.created_at }}</td>
                     <td>@{{ owner_sundry_fee_detail.type }}</td>
                     <td>@{{ owner_sundry_fee_detail.fee_explain }}</td>
+                    <td>@{{ owner_sundry_fee_detail.logistic_number }}</td>
+                    <td>@{{ owner_sundry_fee_detail.logistic? owner_sundry_fee_detail.logistic.name:'' }}</td>
+                    <td>@{{ owner_sundry_fee_detail.amount }}</td>
+                    <td>@{{ owner_sundry_fee_detail.price }}</td>
                     <td>@{{ owner_sundry_fee_detail.fee }}</td>
                     <td>@{{ owner_sundry_fee_detail.remark }}</td>
                     <td>
@@ -81,6 +95,7 @@
                 _this.form = new query({
                     el: '#form_div',
                     condition: data,
+                    appendDom : "btn",
                 });
                 _this.form.init();
                 let column = [
@@ -89,6 +104,10 @@
                     {name: 'created_at', value: '日期'},
                     {name: 'type', value: '作业类型'},
                     {name: 'fee_explain', value: '费用描述'},
+                    {name: 'logistic_number', value: '快递单号'},
+                    {name: 'logistic_name', value: '承运商'},
+                    {name: 'amount', value: '数量'},
+                    {name: 'price', value: '单价'},
                     {name: 'fee', value: '收费金额'},
                     {name: 'remark', value: '备注'},
                     {name: 'operation', value: '操作'},
@@ -108,7 +127,16 @@
                 },
                 targetUrl(id) {
                     return "{{ url('customer/ownerSundryFeeDetails') }}/" + id;
-                }
+                },
+                sundryFeeExport(sign) {
+                    let url = '{{url('customer/ownerSundryFee/export')}}';
+                    let token = '{{ csrf_token() }}';
+                    if (sign) {
+                        excelExport(true, checkData, url, this.total, token);
+                    } else {
+                        excelExport(false, checkData, url, null, token);
+                    }
+                },
             },
             filters: {},
         });

+ 5 - 0
routes/web.php

@@ -793,6 +793,11 @@ Route::group(['prefix'=>'finance'],function(){
 /** 客户 */
 Route::group(['prefix'=>'customer'],function(){
     /** 项目 */
+    //杂项费
+    Route::group(['prefix' => 'ownerSundryFee'], function () {
+        Route::any('export','OwnerSundryFeeDetailsController@export');
+
+    });
     Route::group(['prefix'=>'project'],function(){
         Route::group(['prefix'=>'index'],function(){
             Route::match(['GET','POST'],'export','CustomerController@projectIndexExport');