ANG YU 4 tahun lalu
induk
melakukan
d3d8f8c936

+ 106 - 0
app/Http/Controllers/OwnerSundryFeeDetailSettlementBillController.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Interfaces\SettlementBillControllerInterface;
+use App\Owner;
+use App\OwnerBillReport;
+use App\OwnerBillReportArchive;
+use App\Services\OwnerBillReportArchiveService;
+use App\Services\OwnerSundryFeeDetailService;
+use App\Traits\SettlementBillTrait;
+use Illuminate\Http\RedirectResponse;
+use Illuminate\Http\Request;
+use Oursdreams\Export\Export;
+
+class OwnerSundryFeeDetailSettlementBillController extends Controller implements SettlementBillControllerInterface
+{
+    use SettlementBillTrait;
+
+    /** @var OwnerBillReportArchiveService $archiveService */
+    private $archiveService;
+
+    /** @var OwnerSundryFeeDetailService $service */
+    private $service;
+
+    /**
+     * OwnerSundryFeeDetailSettlementBillController constructor.
+     */
+    public function __construct()
+    {
+        $this->archiveService = app('OwnerBillReportArchiveService');
+        $this->service = app('OwnerSundryFeeDetailService');
+        $this->middleware('auth');
+    }
+
+
+    public function index(Request $request)
+    {
+        $paginateParams = $request->input();
+        list($permittingOwnerIds, $counting_month, $owner_id) = $this->getRequestParams($request->year, $request->month, $request->owner_id);
+        $owner_sundry_fee_details = $this->service->get([
+            'counting_month' => $counting_month,
+            'owner_id' => $owner_id,
+            'paginateParams' => $paginateParams,
+        ]);
+        $owners = Owner::query()->selectRaw("id,name")->whereIn('id', $permittingOwnerIds)->get();
+        $owner = Owner::query()->selectRaw("name,id")->find($owner_id);
+        $isArchived = $this->archiveService->isArchived($counting_month, $owner_id, $this->service::TYPE);
+        $request = $this->buildRequest($request, $counting_month);
+        return view('finance.settlementBills.ownerSundryFee.index', compact('owner_sundry_fee_details', 'paginateParams', 'owners', 'owner', 'request', 'isArchived'));
+    }
+
+    /**
+     * @param Request $request
+     * @return RedirectResponse
+     */
+    public function confirmBill(Request $request): RedirectResponse
+    {
+        list($permittingOwnerIds, $counting_month, $owner_id) = $this->getRequestParams($request->year, $request->month, $request->owner_id);
+        $billReport = OwnerBillReport::query()
+            ->select('id')
+            ->where('owner_id', $owner_id)
+            ->where('counting_month', $counting_month)
+            ->firstOr(function () {
+                return new OwnerBillReport();
+            });
+        OwnerBillReportArchive::query()->create([
+            'owner_bill_report_id' => $billReport->id ?? null,
+            'owner_id' => $owner_id,
+            'counting_month' => $counting_month,
+            'type' => $this->service::TYPE,
+            'archiver_id' => auth()->id(),
+            'archived_at' => now(),
+            'information' => [],
+        ]);
+        return back()->with('success', '确认成功');
+    }
+
+    public function export(Request $request)
+    {
+        list($permittingOwnerIds, $counting_month, $owner_id) = $this->getRequestParams($request->year, $request->month, $request->owner_id);
+
+        $query = $this->service->getSql($owner_id, $counting_month);
+        if (!$request->exists('checkAllSign')) {
+            $query->whereIn('id', explode(',', $request['data']));
+        }
+        $details = $query->get();
+        $row = ['货主', '日期', '作业类型', '费用描述', '快递单号', '承运商', '数量', '单价', '收费金额', '备注'];
+        $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, "杂项费");
+    }
+}

+ 17 - 0
app/Http/Controllers/OwnerSundryFeeDetailsController.php

@@ -4,15 +4,32 @@ namespace App\Http\Controllers;
 
 use App\Filters\OwnerSundryFeeDetailFilters;
 use App\Owner;
+use App\OwnerBillReport;
+use App\OwnerBillReportArchive;
 use App\OwnerSundryFeeDetail;
+use App\Services\OwnerBillReportArchiveService;
+use App\Services\OwnerSundryFeeDetailService;
+use App\Traits\SettlementBillTrait;
 use Illuminate\Http\Request;
 use App\Http\Requests\OwnerSundryFeeDetailRequest;
 use Oursdreams\Export\Export;
 
 class OwnerSundryFeeDetailsController extends Controller
 {
+    use SettlementBillTrait;
+
+
+
+    /** @var OwnerBillReportArchiveService $archiveService */
+    private $archiveService;
+
+    /** @var OwnerSundryFeeDetailService $service */
+    private $service;
+
     public function __construct()
     {
+        $this->archiveService = app('OwnerBillReportArchiveService');
+        $this->service = app('OwnerSundryFeeDetailService');
         $this->middleware('auth');
     }
 

+ 1 - 1
app/OwnerBillReportArchive.php

@@ -36,7 +36,7 @@ class OwnerBillReportArchive extends Model
             '物流费' => 8,
             '包材费' => 9,
             '加工费' => 10,
-            '杂项' => 11,
+            '杂项' => 11,
             '卸货费' => 12,
         ],
     ];

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -152,6 +152,7 @@ use App\Services\OwnerStoreFeeDetailService;
 use App\Services\OwnerStoreFeeReportService;
 use App\Services\OwnerStoreOutFeeDetailService;
 use App\Services\OwnerStoreOutFeeReportService;
+use App\Services\OwnerSundryFeeDetailService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -307,6 +308,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OwnerStoreFeeReportService',OwnerStoreFeeReportService::class);
         app()->singleton('OwnerStoreOutFeeDetailService',OwnerStoreOutFeeDetailService::class);
         app()->singleton('OwnerStoreOutFeeReportService',OwnerStoreOutFeeReportService::class);
+        app()->singleton('OwnerSundryFeeDetailService',OwnerSundryFeeDetailService::class);
         app()->singleton('PackageService', PackageService::class);
         app()->singleton('PackageStatisticsService', PackageStatisticsService::class);
         app()->singleton('PrintPartService',PrintPartService::class);

+ 49 - 0
app/Services/OwnerSundryFeeDetailService.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\OwnerSundryFeeDetail;
+use Carbon\Carbon;
+use Illuminate\Contracts\Pagination\LengthAwarePaginator;
+use Illuminate\Database\Eloquent\Builder;
+
+class OwnerSundryFeeDetailService implements \App\Interfaces\SettlementBillDetailInterface
+{
+    use ServiceAppAop;
+
+    protected $modelClass = OwnerSundryFeeDetail::class;
+    /** @var OwnerBillReportArchiveService $archiveService */
+    private $archiveService;
+    const TYPE = '杂项费';
+
+    public function get(array $kvPairs): LengthAwarePaginator
+    {
+        return $this->getSql($kvPairs['owner_id'], $kvPairs['counting_month'])->paginate($kvPairs['paginateParams']['paginate'] ?? 50);
+    }
+
+    public function getSql($owner_id, $counting_month): Builder
+    {
+        $start = Carbon::parse($counting_month)->startOfMonth()->startOfDay()->toDateTimeString();
+        $end = Carbon::parse($counting_month)->endOfMonth()->endOfDay()->toDateTimeString();
+        return OwnerSundryFeeDetail::query()
+            ->with(['owner', 'logistic'])
+            ->where('owner_id', $owner_id)
+            ->whereBetween('created_at', [$start, $end]);
+    }
+
+    public function switchType($type)
+    {
+        // TODO: Implement switchType() method.
+    }
+
+    public function buildExport($details): array
+    {
+        // TODO: Implement buildExport() method.
+    }
+
+    public function add(array $model)
+    {
+        // TODO: Implement add() method.
+    }
+}

+ 3 - 0
database/factories/OwnerSundryFeeDetailFactory.php

@@ -17,5 +17,8 @@ $factory->define(App\OwnerSundryFeeDetail::class, function (Faker $faker) {
         'logistic_id' => random_int(1, 10),
         'amount' => random_int(1, 10),
         'price' => random_int(1, 10),
+
+        'created_at' => now()->subMonth()->startOfMonth()->addDays(random_int(0, 28)),
+        'updated_at' => now()->subMonth()->startOfMonth()->addDays(random_int(0, 28)),
     ];
 });

+ 2 - 1
database/seeds/OwnerSundryFeeDetailsTableSeeder.php

@@ -7,7 +7,8 @@ class OwnerSundryFeeDetailsTableSeeder extends Seeder
 {
     public function run()
     {
-        factory(OwnerSundryFeeDetail::class)->times(50)->create();
+        OwnerSundryFeeDetail::query()->truncate();
+        factory(OwnerSundryFeeDetail::class)->times(100)->create(['owner_id'=>8]);
     }
 
 }

+ 0 - 63
resources/views/finance/settlementBills/ownerSundryFee/create_and_edit.blade.php

@@ -1,63 +0,0 @@
-@extends('layouts.app')
-
-@section('content')
-<div class="container">
-  <div class="col-md-10 offset-md-1">
-    <div class="card ">
-      <div class="card-body">
-        @if($owner_sundry_fee_detail->id)
-          <form action="{{ route('ownerSundryFeeDetails.update', $owner_sundry_fee_detail->id) }}" method="POST" accept-charset="UTF-8">
-          <input type="hidden" name="_method" value="PUT">
-        @else
-          <form action="{{ route('ownerSundryFeeDetails.store') }}" method="POST" accept-charset="UTF-8">
-        @endif
-      @include('shared._error')
-
-          <input type="hidden" name="_token" value="{{ csrf_token() }}">
-                <div class="form-group">
-                    <select class="form-control" name="type" required>
-                        <option value="" hidden disabled {{ $owner_sundry_fee_detail->id ? '' : 'selected' }}>请选择分类</option>
-                        @foreach ($types as $value)
-                            <option value="{{ $value }}" {{ $owner_sundry_fee_detail->type == $value ? 'selected' : '' }}>
-                                {{ $value }}
-                            </option>
-                        @endforeach
-                    </select>
-                </div>
-              <div class="form-group">
-                  <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 }}
-                          </option>
-                      @endforeach
-                  </select>
-              </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 ) }}" />
-                </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 ) }}" />
-                </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="well well-sm">
-            <button type="submit" class="btn btn-primary">保存</button>
-            <a class="btn btn-link float-xs-right" href="{{ route('ownerSundryFeeDetails.index') }}"> <- 返回</a>
-          </div>
-        </form>
-      </div>
-    </div>
-  </div>
-</div>
-
-@endsection

+ 123 - 32
resources/views/finance/settlementBills/ownerSundryFee/index.blade.php

@@ -1,45 +1,76 @@
 @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="container-fluid">
+            <div id="form_div"></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>
+            <div class="row">
+                <div  class="col-3">
+                    <div class="row pt-2">
+                        <span class="fa fa-user fa-4x offset-md-3" style="color: #4c2584;opacity: 0.3"></span>
+                        <span class="ml-4 mt-2"><h5 class="font-weight-bold">{{ $owner->name }}</h5><p class="text-muted">货主</p></span>
+                    </div>
+                </div>
+                <div  v-if="(isArchived===1)" class="col-3">
+                    <div class="row pt-2">
+                        <span  class="fa fa-check-circle  fa-4x offset-md-3" aria-hidden="true" style="color: #4c2584;opacity: 0.3"></span>
+                        <span  class="ml-4 mt-2"><h5 class="font-weight-bold">已确认</h5></span>
+                    </div>
+                </div>
+                <div v-else class="col-3">
+                    <div class="row pt-2">
+                        <form action="{{ 'ownerSundryFee/confirmBill' }}" method="post" style="display: inline-block;"
+                              onsubmit="return confirm('您确定要确认金额吗?');">
+                            {{ csrf_field() }}
+                            <input type="hidden" name="owner_id" value="{{ $request['owner_id']??'' }}">
+                            <input type="hidden" name="year" value="{{ $request['year']??'' }}">
+                            <input type="hidden" name="month" value="{{ $request['month']??'' }}">
+                            <span class="ml-4 mt-2">
+                              <button type="submit" class="btn btn-success btn-lg">
+                                <i class="far fa-trash-alt"></i> 确认金额
+                            </button>
+                            </span>
+
+                        </form>
+                    </div>
+                </div>
+            </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>
-                        <button @click="edit(owner_sundry_fee_detail.id)" type="button"
-                                class="btn btn-outline-primary btn-sm">改
-                        </button>
-                        <form :action="targetUrl(owner_sundry_fee_detail.id)" method="post"
-                              style="display: inline-block;"
-                              onsubmit="return confirm('您确定要删除吗?');">
-                            {{ csrf_field() }}
-                            {{ method_field('DELETE') }}
-                            <button type="submit" class="btn btn-outline-danger btn-sm">
-                                <i class="far fa-trash-alt"></i> 删
-                            </button>
-                        </form>
-                    </td>
                 </tr>
             </table>
             <div class="text-info h5 btn btn">{{$owner_sundry_fee_details->count()}}
                 /{{$owner_sundry_fee_details->total()}}</div>
             {{$owner_sundry_fee_details->appends($paginateParams)->links()}}
         </div>
-        <textarea id="clipboardDiv" style="opacity:0"></textarea>
+        <textarea hidden id="clipboardDiv" style="opacity:0"></textarea>
     </div>
 @endsection
 @section('lastScript')
@@ -50,12 +81,12 @@
         let vue = new Vue({
             el: "#list",
             data: {
-                owner_sundry_fee_details: [
-                    @foreach($owner_sundry_fee_details as $owner_sundry_fee_detail)
-                        {!! $owner_sundry_fee_detail !!},
-                    @endforeach
-                ],
+                owner_sundry_fee_details: [@foreach($owner_sundry_fee_details as $owner_sundry_fee_detail){!! $owner_sundry_fee_detail !!},@endforeach],
+                owners: [@foreach($owners as $owner){name: '{{ $owner->id }}', value: '{{ $owner->name}}'},@endforeach],
                 selectTr: 0,
+                isArchived: {!! $isArchived !!},
+                request: {!! $request !!},
+                owner: {!! $owner !!},
             },
             created() {
             },
@@ -64,11 +95,65 @@
                 let _this = this;
                 $(".up").slideUp();
                 let data = [
-                    []
+                    [
+                        {
+                            name: 'owner_id',
+                            type: 'select',
+                            tip: ['多货主权限选择查看指定货主,默认为权限下的第一个货主'],
+                            placeholder: ['货主'],
+                            data: _this.owners,
+                        },
+                        {
+                            name: 'year',
+                            type: 'select',
+                            tip: ['默认为时间上一个月所属年份'],
+                            placeholder: ['年'],
+                            data: [
+                                {name: 2021, value: 2021},
+                                {name: 2022, value: 2022},
+                                {name: 2023, value: 2023},
+                                {name: 2024, value: 2024},
+                                {name: 2025, value: 2025},
+                                {name: 2026, value: 2026},
+                                {name: 2027, value: 2027},
+                                {name: 2028, value: 2028},
+                                {name: 2029, value: 2029},
+                                {name: 2030, value: 2030},
+                                {name: 2031, value: 2031},
+                                {name: 2032, value: 2032},
+                                {name: 2033, value: 2033},
+                                {name: 2034, value: 2034},
+                                {name: 2035, value: 2035},
+                                {name: 2036, value: 2036},
+
+                            ],
+                        },
+                        {
+                            name: 'month',
+                            type: 'select',
+                            tip: ['默认为上一月'],
+                            placeholder: ['月'],
+                            data: [
+                                {name: 1, value: 1},
+                                {name: 2, value: 2},
+                                {name: 3, value: 3},
+                                {name: 4, value: 4},
+                                {name: 5, value: 5},
+                                {name: 6, value: 6},
+                                {name: 7, value: 7},
+                                {name: 8, value: 8},
+                                {name: 9, value: 9},
+                                {name: 10, value: 10},
+                                {name: 11, value: 11},
+                                {name: 12, value: 12},
+                            ],
+                        },
+                    ]
                 ];
                 _this.form = new query({
                     el: '#form_div',
                     condition: data,
+                    appendDom : "btn",
                 });
                 _this.form.init();
                 let column = [
@@ -77,9 +162,12 @@
                     {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: '操作'},
                 ];
                 new Header({
                     el: "table",
@@ -91,12 +179,15 @@
                 }).init();
             },
             methods: {
-                edit(id) {
-                    location.href = "{{url('finance/settlementBills/ownerSundryFeeDetails')}}/" + id + "/edit";
+                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);
+                    }
                 },
-                targetUrl(id) {
-                    return "{{ url('finance/settlementBills/ownerSundryFeeDetails') }}/" + id;
-                }
             },
             filters: {},
         });

+ 0 - 43
resources/views/finance/settlementBills/ownerSundryFee/show.blade.php

@@ -1,43 +0,0 @@
-@extends('layouts.app')
-@section('content')
-    <div class="container">
-        <div class="col-md-10 offset-md-1">
-            <div class="card ">
-                <div class="card-body">
-                    <div class="card-block bg-light">
-                        <div class="row">
-                            <div class="col-md-6">
-                                <a class="btn btn-link" href="{{ route('ownerSundryFeeDetails.index') }}"><- Back</a>
-                            </div>
-                            <div class="col-md-6">
-                                <a class="btn btn-sm btn-warning float-right mt-1"
-                                   href="{{ route('ownerSundryFeeDetails.edit', $owner_sundry_fee_detail->id) }}">
-                                    Edit
-                                </a>
-                            </div>
-                        </div>
-                    </div>
-                    <br>
-
-                    <label>Type</label>
-                    <p>
-                        {{ $owner_sundry_fee_detail->type }}
-                    </p> <label>Fee_explain</label>
-                    <p>
-                        {{ $owner_sundry_fee_detail->fee_explain }}
-                    </p> <label>Remark</label>
-                    <p>
-                        {{ $owner_sundry_fee_detail->remark }}
-                    </p> <label>Fee</label>
-                    <p>
-                        {{ $owner_sundry_fee_detail->fee }}
-                    </p> <label>Changable</label>
-                    <p>
-                        {{ $owner_sundry_fee_detail->changable }}
-                    </p>
-                </div>
-            </div>
-        </div>
-    </div>
-
-@endsection

+ 6 - 0
routes/web.php

@@ -814,6 +814,12 @@ Route::group(['prefix'=>'finance'],function(){
             Route::get('detail', 'OwnerStoreOutFeeDetailController@index');
             Route::get('report', 'OwnerStoreOutFeeReportController@index');
         });
+//        Route::get('storeOutFee', 'OwnerSundryFeeDetailsController@settlementBillsIndex');
+        Route::group(['prefix' => 'ownerSundryFee'], function () {
+            Route::get('', 'OwnerSundryFeeDetailSettlementBillController@index');
+            Route::post('confirmBill', 'OwnerSundryFeeDetailSettlementBillController@confirmBill');
+            Route::post('export', 'OwnerSundryFeeDetailSettlementBillController@export');
+        });
     });
 });