瀏覽代碼

Merge branch 'master' into Haozi

hu hao 4 年之前
父節點
當前提交
da8ed969c7

+ 85 - 0
app/Http/Controllers/OwnerBillReportArchiveController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OwnerBillReportArchive;
+use Illuminate\Http\Request;
+
+class OwnerBillReportArchiveController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\OwnerBillReportArchive  $ownerBillReportArchive
+     * @return \Illuminate\Http\Response
+     */
+    public function show(OwnerBillReportArchive $ownerBillReportArchive)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\OwnerBillReportArchive  $ownerBillReportArchive
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(OwnerBillReportArchive $ownerBillReportArchive)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\OwnerBillReportArchive  $ownerBillReportArchive
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, OwnerBillReportArchive $ownerBillReportArchive)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\OwnerBillReportArchive  $ownerBillReportArchive
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(OwnerBillReportArchive $ownerBillReportArchive)
+    {
+        //
+    }
+}

+ 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, "杂项费");
+    }
 }

+ 83 - 19
app/Http/Controllers/SettlementBillOwnerAreaFeeController.php

@@ -2,7 +2,10 @@
 
 namespace App\Http\Controllers;
 
+use App\Owner;
 use App\OwnerAreaReport;
+use App\OwnerBillReport;
+use App\OwnerBillReportArchive;
 use Illuminate\Http\Request;
 
 /**
@@ -22,25 +25,17 @@ class SettlementBillOwnerAreaFeeController extends Controller
 
     public function index(Request $request)
     {
-        list($permittingOwnerIds, $date, $owner_id) = $this->getRequestParams($request);
-        $owners = \App\Owner::query()->find($permittingOwnerIds);
-        $owner = \App\Owner::query()->find($owner_id);
-        $ownerAreas = OwnerAreaReport::query()
-            ->with('ownerStoragePriceModel:id,using_type')
-            ->where('owner_id', $owner_id)
-            ->where('counting_month', $date)
-            ->get();
-
-        $ownerBillReport = \App\OwnerBillReport::query()
-            ->selectRaw('storage_fee')
-            ->where('owner_id', $owner_id)
-            ->where('counting_month', $date)
-            ->first();
-
+        list($permittingOwnerIds, $counting_month, $owner_id) = $this->getRequestParams($request);
+        $isArchived = $this->ownerBillReportArchiveQuery($counting_month, $owner_id)->exists();
+        $isArchived =  $isArchived ? 1 : 2;
+        list($areaReports, $billReport, $price) = $this->get($owner_id, $counting_month);
+        $owners = Owner::query()->find($permittingOwnerIds);
+        $owner = Owner::query()->find($owner_id);
+        return view('finance.settlementBills.areaFee.index', compact('owner', 'owners', 'areaReports', 'billReport', 'price', 'request', 'isArchived'));
     }
 
     /**
-     * @param Request $request
+     * @param Request $request year month owner_id
      * @return array
      */
     private function getRequestParams(Request $request): array
@@ -49,15 +44,84 @@ class SettlementBillOwnerAreaFeeController extends Controller
         $this->userService = app('UserService');
         $permittingOwnerIds = $this->userService->getPermittingOwnerIds(auth()->user());
         if (is_null($request->year) || is_null($request->month)) {
-            $date = now()->subMonth()->startOfMonth()->toDateString();
+            $counting_month = now()->subMonth()->startOfMonth()->toDateString();
         } else {
-            $date = $request->year . '-' . $request->month . '-' . '01';
+            $counting_month = $request->year . '-' . $request->month . '-' . '01';
         }
         if (is_null($request->owner_id)) {
             $owner_id = $permittingOwnerIds[0];
         } else {
             $owner_id = $request->owner_id;
         }
-        return array($permittingOwnerIds, $date, $owner_id);
+        return array($permittingOwnerIds, $counting_month, $owner_id);
+    }
+
+    public function confirmBill(Request $request)
+    {
+        list($permittingOwnerIds, $counting_month, $owner_id) = $this->getRequestParams($request);
+        list($areaReports, $billReport, $price) = $this->get($owner_id, $counting_month);
+        $information = [
+            'areaReports' => $areaReports,
+            'billReport' => $billReport,
+            'price' => $price,
+        ];
+        OwnerBillReportArchive::query()->create([
+            'owner_bill_report_id' => $billReport->id ?? null,
+            'owner_id' => $owner_id,
+            'counting_mouth' => $counting_month,
+            'type' => '仓储费',
+            'archiver_id' => auth()->id(),
+            'archived_at' => now(),
+            'information' => $information,
+        ]);
+        return back();
+    }
+
+    /**
+     * @param $owner_id
+     * @param $counting_month
+     * @return array
+     */
+    private function get($owner_id, $counting_month): array
+    {
+        $archived = $this->ownerBillReportArchiveQuery($counting_month, $owner_id)->first();
+        if ($archived ?? false) {
+            $areaReports = collect($archived->information['areaReports']);
+            $billReport = collect($archived->information['billReport']);
+            $price = $archived->information['price'];
+        } else {
+            $areaReports = OwnerAreaReport::query()
+                ->with('ownerStoragePriceModel:id,using_type,price')
+                ->where('owner_id', $owner_id)
+                ->where('counting_month', $counting_month)
+                ->get();
+            $billReport = OwnerBillReport::query()
+                ->selectRaw('storage_fee')
+                ->where('owner_id', $owner_id)
+                ->where('counting_month', $counting_month)
+                ->firstOr(function () {
+                    return new OwnerBillReport();
+                });
+            $totalArea = $areaReports->reduce(function ($carry, $areaReport) {
+                return $carry + $areaReport->accounting_area;
+            }, 0);
+            try {
+                $price = $billReport->storage_fee ?? 0 / $totalArea;
+            } catch (\Exception $e) {
+                $price = 0;
+            }
+        }
+        return array($areaReports, $billReport, $price);
+    }
+
+    /**
+     * @param $counting_month
+     * @param $owner_id
+     * @return \Illuminate\Database\Eloquent\Builder
+     */
+    private function ownerBillReportArchiveQuery($counting_month, $owner_id): \Illuminate\Database\Eloquent\Builder
+    {
+        return OwnerBillReportArchive::query()->where('counting_mouth', $counting_month)
+            ->where('owner_id', $owner_id)->where('type', '仓储费');
     }
 }

+ 3 - 9
app/Jobs/LogisticYDSync.php

@@ -18,18 +18,12 @@ class LogisticYDSync implements ShouldQueue
     public $timeout = 10;
 
     use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
-    /**
-     *
-     * @var $orderPackageReceivedSyncService OrderPackageReceivedSyncService
-     * @var $orderPackageReceivedSyncService OrderPackageReceivedSyncService
-     * @var $logistic_number string
-     */
+    /** @var $logistic_number string */
 
     protected $logistic_number;
-    /**
-     * @var $logisticYDService LogisticYDService
-     */
+    /** @var $logisticYDService LogisticYDService */
     protected $logisticYDService;
+    /** @var $orderPackageReceivedSyncService OrderPackageReceivedSyncService */
     protected $orderPackageReceivedSyncService;
 
     /**

+ 6 - 9
app/Jobs/LogisticZopSync.php

@@ -23,10 +23,8 @@ class LogisticZopSync implements ShouldQueue
      * @var string $logistic_number
      */
     protected $logistic_number;
-//    /**
-//     * @var LogisticZopService $logistic_zop_service
-//     */
-//    protected $logistic_zop_service;
+     /**@var LogisticZopService $logistic_zop_service **/
+    protected $logistic_zop_service;
     /**
      * @var  OrderPackageReceivedSyncService $order_package_received_sync_service
      */
@@ -40,7 +38,7 @@ class LogisticZopSync implements ShouldQueue
     public function __construct($logistic_number)
     {
         $this->logistic_number = $logistic_number;
-//        $this->logistic_zop_service = app('LogisticZopService');
+        $this->logistic_zop_service = app('LogisticZopService');
         $this->order_package_received_sync_service = app('OrderPackageReceivedSyncService');
     }
 
@@ -52,9 +50,8 @@ class LogisticZopSync implements ShouldQueue
     public function handle()
     {
         LogService::log(LogisticZopSync::class, "JOB-ZOP", $this->logistic_number);
-        $logistic_zop_service = new LogisticZopService();
-        $nativeResponse = $logistic_zop_service->query($this->logistic_number);
-        $formatted_data = $logistic_zop_service->format($nativeResponse,$this->logistic_number);
-        $this->order_package_received_sync_service->update([$formatted_data]);
+        $nativeResponse = $this->logistic_zop_service->query($this->logistic_number);
+        $logisticResponseFormatted = $this->logistic_zop_service->format($nativeResponse,$this->logistic_number);
+        $this->order_package_received_sync_service->update([$logisticResponseFormatted]);
     }
 }

+ 70 - 0
app/OwnerBillReportArchive.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class OwnerBillReportArchive extends Model
+{
+    use ModelLogChanging;
+
+    public $fillable = ['owner_bill_report_id', 'owner_id', 'counting_mouth', 'type', 'archiver_id', 'archived_at', 'information'];
+
+    public $dates = [
+        'archived_at',
+        'counting_mouth'
+    ];
+
+    public $casts = [
+        'information' => 'array',
+    ];
+
+    public $timestamps = false;
+    static public $enums = [
+        'types' => [
+            '' => 0,
+            '仓储费' => 1,
+            '快递费' => 2,
+            '入库费' => 3,
+            '出库费' => 4,
+            '物流费' => 5,
+            '包材费' => 6,
+            '加工费' => 7,
+            '杂项' => 8,
+            '卸货费' => 9,
+        ],
+    ];
+
+    function __construct(array $attributes = [])
+    {
+        foreach (self::$enums as &$enum) {
+            $enum = $enum + array_flip($enum);
+        }
+        parent::__construct($attributes);
+    }
+
+    public function getTypesAttribute($value)
+    {
+        if (!$value) return '';
+        return self::$enums['types'][$value];
+    }
+
+    public function setTypesAttribute($value): int
+    {
+        if (!$value) return 0;
+        $this->attributes['types'] = self::$enums['types'][$value];
+    }
+
+    public function ownerBillReport(): BelongsTo
+    {
+        return $this->belongsTo(OwnerBillReport::class);
+    }
+
+    public function owner(): BelongsTo
+    {
+        return $this->belongsTo(Owner::class);
+    }
+}

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

+ 12 - 8
app/Providers/AppServiceProvider.php

@@ -142,6 +142,7 @@ use App\Services\CommodityMaterialBoxModelService;
 use App\Services\OwnerLogisticFeeDetailService;
 use App\Services\OwnerLogisticFeeReportService;
 use App\Services\LogisticSyncRecordService;
+use App\Services\OwnerBillReportArchiveService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -233,8 +234,11 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('FeatureService',FeatureService::class);
         app()->singleton('ForeignHaiRoboticsService',ForeignHaiRoboticsService::class);
         app()->singleton('ForeignZhenCangService',ForeignZhenCangService::class);
+        app()->singleton('GoodScanWeightService',GoodScanWeightService::class);
+        app()->singleton('HaoChuangWeightService',HaoChuangWeightService::class);
+        app()->singleton('HengLiWeightService',HengLiWeightService::class);
         app()->singleton('InventoryAccountMissionService', InventoryAccountMissionService::class);
-        app()->singleton('LogisticZopService', LogisticZopService::class);
+        app()->singleton('InventoryAccountMissionService',InventoryAccountMissionService::class);
         app()->singleton('InventoryCompareService', InventoryCompareService::class);
         app()->singleton('InventoryDailyLogService', InventoryDailyLogService::class);
         app()->singleton('LaborCompanyService',LaborCompanyService::class);
@@ -242,12 +246,16 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('LogService', LogService::class);
         app()->singleton('LogisticAliJiSuApiService',LogisticAliJiSuApiService::class);
         app()->singleton('LogisticSFService', LogisticSFService::class);
-        app()->singleton('LogisticSyncRecordService', LogisticSyncRecordService::class);
         app()->singleton('LogisticService', LogisticService::class);
+        app()->singleton('LogisticSyncRecordService', LogisticSyncRecordService::class);
+        app()->singleton('LogisticSyncRecordService', LogisticSyncRecordService::class);
         app()->singleton('LogisticYDService', LogisticYDService::class);
         app()->singleton('LogisticYTOService', LogisticYTOService::class);
         app()->singleton('LogisticZopService', LogisticZopService::class);
+        app()->singleton('LogisticZopService', LogisticZopService::class);
         app()->singleton('MaterialBoxService', MaterialBoxService::class);
+        app()->singleton('MenuService',MenuService::class);
+        app()->singleton('NewOrderCountingRecordService',NewOrderCountingRecordService::class);
         app()->singleton('OracleActAllocationDetailService', OracleActAllocationDetailService::class);
         app()->singleton('OracleBasCustomerService', OracleBasCustomerService::class);
         app()->singleton('OracleBasSkuService', OracleBasSkuService::class);
@@ -271,6 +279,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OrderService', OrderService::class);
         app()->singleton('OrderTrackingService', OrderTrackingService::class);
         app()->singleton('OwnerAreaReportService', OwnerAreaReportService::class);
+        app()->singleton('OwnerBillReportArchiveService',OwnerBillReportArchiveService::class);
         app()->singleton('OwnerBillReportService', OwnerBillReportService::class);
         app()->singleton('OwnerFeeDetailService', OwnerFeeDetailService::class);
         app()->singleton('OwnerLogisticFeeDetailService',OwnerLogisticFeeDetailService::class);
@@ -302,6 +311,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('RejectedBillItemService', RejectedBillItemService::class);
         app()->singleton('RejectedBillService', RejectedBillService::class);
         app()->singleton('RejectedService', RejectedService::class);
+        app()->singleton('RoleService',RoleService::class);
         app()->singleton('ShopService', ShopService::class);
         app()->singleton('StationCacheShelfGridService', StationCacheShelfGridService::class);
         app()->singleton('StationRuleBatchService', StationRuleBatchService::class);
@@ -328,12 +338,6 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('WarehouseService', WarehouseService::class);
         app()->singleton('WaybillFinancialService', WaybillFinancialService::class);
         app()->singleton('WeighExceptedService', WeighExceptedService::class);
-        app()->singleton('GoodScanWeightService',GoodScanWeightService::class);
-        app()->singleton('HaoChuangWeightService',HaoChuangWeightService::class);
-        app()->singleton('HengLiWeightService',HengLiWeightService::class);
-        app()->singleton('InventoryAccountMissionService',InventoryAccountMissionService::class);
-        app()->singleton('MenuService',MenuService::class);
-        app()->singleton('RoleService',RoleService::class);
     }
 
     private function registerObserver()

+ 6 - 6
app/RejectedBill.php

@@ -181,12 +181,12 @@ class RejectedBill extends Model
             $orderIssue->joinRejectedBill($this->logistic_number_return);
             return;
         }
-        // 原单退回
-        if($this->logistic_number === '原单退回'){
-            $orderIssue = OrderIssue::query()->where('order_id',function ($query){
-                $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
-            })->first();
-        }
+
+        // 获取是否有快递单号对应问题件订单存在
+        $orderIssue = OrderIssue::query()->where('order_id',function ($query){
+            $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
+        })->first();
+
         if(!$orderIssue){
             $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) {
                 $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $this->logistic_number_return)->first();

+ 34 - 29
app/Services/OrderPackageReceivedSyncService.php

@@ -25,48 +25,52 @@ class OrderPackageReceivedSyncService
      * 2 如果当前时间小于等于初始化时间,执行初始化脚本,将数据库中全部小于等于初始化时间的数据更新
      * @throws Exception
      */
-    public function syncLogisticRoute()
+    public function syncLogisticRoute($is_to_init=false)
     {
         ini_set('max_execution_time', 2 * 60 * 60);
+        ini_set('memory_limit', '1024M');
         LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法", '');
-        //初始化时间 2020-12-31 23:59:59
-        $initDate = Carbon::parse(config('api_logistic.init_date'));
         $query = OrderPackage::query()
             ->select(['logistic_number', 'order_id'])
             ->with(['order' => function ($query) {
-                return $query->with('logistic');
+                return $query->select(['id','logistic_id'])->with('logistic:id,name,code');
             }]);
-        if (Carbon::now()->lte($initDate)) {//当前时间小于等于初始化时间
+        if ($is_to_init) {//当前时间小于等于初始化时间
+            $initDate = Carbon::parse(config('api_logistic.init_date'));
             //初始化查询一个月的数据,exception为否
-            $query = $query->where('sent_at', '>=', $initDate->subDays((int)config('api_logistic.days'))->toDateTimeString())
+            $query = $query->where('sent_at', '>=', $initDate)
                 ->whereNull('received_at');
         } else {//查询20天以内的数据
-            $query = $query->where('sent_at', '>=', now()->subDays(20))
+            $query = $query->where('sent_at', '>=', now()->subDays(config('api_logistic.querying_days'))->startOfDay())
                 ->whereNull('received_at');
         }
-        $query->chunk(2000, function ($orderPackages) {
+        $query->chunkById(1000, function ($orderPackages) {
+            LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法", json_encode(data_get($orderPackages,'*.logistic_number')));
             $logisticNumbers = $this->buildData($orderPackages);
             //sf
             if (array_key_exists('SF', $logisticNumbers)) {
                 $SFLogisticNumbers = $logisticNumbers['SF'];
-                LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-SF", '');
+                LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-SF", json_encode($SFLogisticNumbers));
                 foreach ($SFLogisticNumbers as $logisticNumber) {
+                    LogService::log(OrderPackageReceivedSyncService::class, "同步SF快递单号", $logisticNumber);
                     LogisticSFSync::dispatch($logisticNumber);
                 }
             }
             //更新中通
             if (array_key_exists('ZTO', $logisticNumbers)) {
                 $ZTOLogisticNumbers = $logisticNumbers['ZTO'];
-                LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-ZTO", '');
+                LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-ZTO", json_encode($ZTOLogisticNumbers));
                 foreach ($ZTOLogisticNumbers as $logisticNumber) {
+                    LogService::log(OrderPackageReceivedSyncService::class, "同步ZTO快递单号", $logisticNumber);
                     LogisticZopSync::dispatch($logisticNumber);
                 }
             }
             //更新韵达
             if (array_key_exists('YUNDA', $logisticNumbers)) {
                 $YDLogisticNumbers = $logisticNumbers['YUNDA'];
-                LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-YUNDA", '');
+                LogService::log(OrderPackageReceivedSyncService::class, "同步快递信息定时方法-YUNDA", json_encode($YDLogisticNumbers));
                 foreach ($YDLogisticNumbers as $logistic_number) {
+                    LogService::log(OrderPackageReceivedSyncService::class, "同步YUNDA快递单号", $logisticNumber);
                     LogisticYDSync::dispatch($logistic_number);
                 }
             }
@@ -185,31 +189,31 @@ class OrderPackageReceivedSyncService
 
     /**
      * 根据快递单号更新状态
-     * @param array $orderPackages
+     * @param array $logisticResponses
      */
-    public function update(array $orderPackages)
+    public function update(array $logisticResponses)
     {
-        foreach ($orderPackages as $data) {
-            if (empty($data)) continue;
-            $orderPackage = OrderPackage::query()->where('logistic_number', $data['logistic_number'])->first();
+        foreach ($logisticResponses as $logisticResponse) {
+            if (empty($logisticResponse)) continue;
+            $orderPackage = OrderPackage::query()->where('logistic_number', $logisticResponse['logistic_number'])->first();
             try {
                 if ($orderPackage->order && $orderPackage->order->issue) {
-                    unset($data['exception_type']);
-                    unset($data['exception']);
+                    unset($logisticResponse['exception_type']);
+                    unset($logisticResponse['exception']);
                 }
             } catch (Exception $e) {
-                LogService::log(OrderPackageReceivedSyncService::class, "标记问题件不需要更新异常状态失败", $data['logistic_number'] . '-' . json_encode($e));
+                LogService::log(OrderPackageReceivedSyncService::class, "标记问题件不需要更新异常状态失败", $logisticResponse['logistic_number'] . '-' . json_encode($e));
             }
             //如果已经收货,将异常更新为正常
-            if (array_key_exists('received_at', $data)) {
-                $data['exception_type'] = '无';
-                $data['exception'] = '否';
+            if ($logisticResponse['received_at']??false) {
+                $logisticResponse['exception_type'] = '无';
+                $logisticResponse['exception'] = '否';
             }
-            if (isset($data['status'])) $orderPackage->status = $data['status'];
-            if (isset($data['received_at'])) $orderPackage->received_at = $data['received_at'];
-            if (isset($data['exception'])) $orderPackage->exception = $data['exception'];
-            if (isset($data['transfer_status']) && !empty($data['transfer_status'])) $orderPackage->transfer_status = $data['transfer_status'];
-            if (isset($data['exception_type'])) $orderPackage->exception_type = $data['exception_type'];
+            if (isset($logisticResponse['status'])) $orderPackage->status = $logisticResponse['status'];
+            if (isset($logisticResponse['received_at'])) $orderPackage->received_at = $logisticResponse['received_at'];
+            if (isset($logisticResponse['exception'])) $orderPackage->exception = $logisticResponse['exception'];
+            if (isset($logisticResponse['transfer_status']) && !empty($logisticResponse['transfer_status'])) $orderPackage->transfer_status = $logisticResponse['transfer_status'];
+            if (isset($logisticResponse['exception_type'])) $orderPackage->exception_type = $logisticResponse['exception_type'];
             $orderPackage->save();
         }
     }
@@ -227,6 +231,7 @@ class OrderPackageReceivedSyncService
             try {
                 $logisticCode = $orderPackage->order->logistic->code;
             } catch (Exception $e) {
+                LogService::log(OrderPackageReceivedSyncService::class, "快递同步按照承运商分组异常", json_encode($orderPackage??[]));
                 continue;
             }
             $key = config('api_logistic.logistic.' . $logisticCode);
@@ -362,7 +367,7 @@ class OrderPackageReceivedSyncService
             $conclusion |= ($last_routed_duration > $SHORT_RESPONSE_HOURS && $last_routed_duration < $LONG_RESPONSE_HOURS) ? $IS_SHORT_NO_RESPONSE : 0;
             $conclusion |= ($last_routed_duration > $LONG_RESPONSE_HOURS) ? $IS_LONG_NO_RESPONSE : 0;
             $conclusion |= ($last_routed_duration > $SENDING_RESPONSE_HOURS && $data['status'] == '派送中') ? $IS_SENDING_NO_RESPONSE : 0;
-            $conclusion |= ($delivered_duration > $HAVEN_SECOND_GOT_HOURS && $data['routes_length'] < 3) ? $IS_SECOND_ROUTE_HAVE : 0;//超过指定时间,路由信息小于两
+            $conclusion |= ($delivered_duration > $HAVEN_SECOND_GOT_HOURS && $data['routes_length'] < 3) ? $IS_SECOND_ROUTE_HAVE : 0;//和出库时间比较 超过指定时间,路由信息小于三
             return $conclusion;
         })();
         switch ($conclusion) {
@@ -389,7 +394,7 @@ class OrderPackageReceivedSyncService
         }
         if ($conclusion
             == ($conclusion | $IS_SECOND_ROUTE_HAVE)) {
-            $data['exception_type'] = '件异常';
+            $data['exception_type'] = '件异常';
             $data['exception'] = '是';
 
         }

+ 12 - 11
app/Services/OrderPackageService.php

@@ -223,17 +223,17 @@ class OrderPackageService
         $dataHandlerService = app(DataHandlerService::class);
         $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
 
-        /** 获取所有的 picktotraceid WMS快递单号*/
-        $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid');
-
-         /** WMS定制化操作 订单取消 和 京东快递*/
+        $logistic_numbers = array();
         foreach ($orderHeaders as $orderHeader) {
-            if($orderHeader['sostatus'] == '90'){
-                if($orderHeader['soreference5']=='')$logistic_numbers[] =$orderHeader['orderno'];
-                else $logistic_numbers[] = $orderHeader['soreference5'];
-            }
-            if($orderHeader['userdefine1'] == 'JDKD'){
-                $logistic_numbers[] = $orderHeader['soreference5'];
+            if($orderHeader['sostatus'] == '90') {
+                if($orderHeader['soreference5'] == '') $logistic_numbers[$orderHeader['orderno']] = $orderHeader['orderno'];
+                else $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
+            } elseif ($orderHeader['userdefine1'] == 'JDKD' ){
+                $logistic_numbers[$orderHeader['soreference5']] = $orderHeader['soreference5'];
+            } else {
+                foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
+                    $logistic_numbers[$actAllocationDetail['picktotraceid']] =  $actAllocationDetail['picktotraceid'];
+                }
             }
         }
 
@@ -246,8 +246,9 @@ class OrderPackageService
         $exits_number = data_get($packages,'*.logistic_number');
 
         /** WMS快递单号 和 WAS的快递单号 的差集*/
-        $packages = [];
+        $packages = array();
         $diff_number = array_diff($exits_number,$logistic_numbers);
+
         /** 记录差集对应的OrderPackage的id*/
         foreach ($diff_number as $number) {
             $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps);

+ 13 - 0
app/Services/OwnerBillReportArchiveService.php

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

+ 1 - 1
config/api_logistic.php

@@ -166,5 +166,5 @@ return [
         ],
     ],
     'init_date' => '2021-05-17 23:59:59',
-    'days' => 2,
+    'querying_days' => 15,
 ];

+ 12 - 0
database/factories/OwnerBillReportArchiveFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OwnerBillReportArchive;
+use Faker\Generator as Faker;
+
+$factory->define(OwnerBillReportArchive::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

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

+ 16 - 0
database/seeds/OwnerBillReportArchiveSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class OwnerBillReportArchiveSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

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

+ 55 - 43
resources/views/finance/settlementBills/areaFee/index.blade.php

@@ -13,7 +13,7 @@
                                 data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">导出Excel
                         </button>
                         <div class="dropdown-menu">
-                            <a class="dropdown-item" @click="ownerFeeExport(false)" href="javascript:">导出勾选内容</a>
+{{--                            <a class="dropdown-item" @click="ownerFeeExport(false)" href="javascript:">导出勾选内容</a>--}}
                             <a class="dropdown-item" @click="ownerFeeExport(true)" href="javascript:">导出所有页</a>
                         </div>
                     </span>
@@ -24,29 +24,61 @@
                                 <h5 class="font-weight-bold">{{ $owner->name }}</h5>
                                 <p class="text-muted">货主</p>
                             </span>
+                <span v-if="(isArchived===1)" class="fa fa-check-circle  fa-4x offset-md-3" aria-hidden="true"
+                      style="color: #4c2584;opacity: 0.3"></span>
+                <span v-if="(isArchived===1)" class="ml-4 mt-2">
+                                <h5 class="font-weight-bold">已确认</h5>
+                            </span>
             </div>
             <table class="table table-striped table-sm text-nowrap table-hover table-bordered" id="table">
-                <tr v-for="(ownerFee,i) in ownerFees"
-                    @click="selectTr===i+1?selectTr=0:selectTr=i+1"
-                    :class="selectTr===i+1?'focusing' : ''">
-                    <td><input class="checkItem" type="checkbox" :value="ownerFee.id"></td>
-                    <td>@{{ i+1 }}</td>
-                    <td v-if="i==0 || ownerFee.logistic_name!== ownerFees[i-1].logistic_name"
-                        :rowspan="calRowspan(ownerFee.logistic_name)" class="text-center pt-4 bg-light">@{{
-                        ownerFee.logistic_name }}
+                <tr>
+                    <th>仓库类型</th>
+                    <th>使用区域</th>
+                    <th>数量</th>
+                    <th>合计面积</th>
+                    <th>单价</th>
+                    <th>金额</th>
+                </tr>
+                <tr v-for="(areaReport,i) in areaReports">
+                    <td rowspan="3" class="text-center pt-4 bg-light">@{{
+                        areaReport.owner_storage_price_model.using_type }}
+                    </td>
+                    <td>平面区</td>
+                    <td>@{{ areaReport.area_on_flat?areaReport.area_on_flat:0 }}</td>
+                    <td rowspan="3" class="text-center pt-4 bg-light">@{{ areaReport.accounting_area }}</td>
+                    <td :rowspan="areaReports.length*3" class="text-center pt-4 bg-light">@{{ price }}</td>
+                    <td :rowspan="areaReports.length*3" class="text-center pt-4 bg-light">@{{ billReport.storage_fee
+                        }}
                     </td>
-                    <td>@{{ ownerFee.province }}</td>
-                    <td>@{{ ownerFee.logistic_bill }}</td>
-                    <td>@{{ ownerFee.weight }}</td>
-                    <td>@{{ ownerFee.initial_weight_price }}</td>
-                    <td>@{{ ownerFee.additional_price }}</td>
-                    <td>@{{ ownerFee.logistic_fee }}</td>
+                </tr>
+                <tr v-for="(areaReport,i) in areaReports">
+                    <td>整托存储</td>
+                    <td>@{{ areaReport.area_on_tray?areaReport.area_on_tray:0 }}</td>
+                </tr>
+                <tr v-for="(areaReport,i) in areaReports">
+                    <td>半托存储</td>
+                    <td>@{{ areaReport.area_on_half_tray?areaReport.area_on_half_tray:0 }}</td>
                 </tr>
             </table>
-            <div class="text-info h5 btn btn">{{$ownerFees->count()}}/{{$ownerFees->total()}}</div>
-            {{$ownerFees->appends($paginateParams)->links()}}
         </div>
-        <textarea id="clipboardDiv" style="opacity:0"></textarea>
+        <div class="container" v-if="!(isArchived===1)">
+            <div class="row">
+                <div class="col-10"></div>
+                <div class="col-2">
+                    <form action="{{ 'areaFee/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 }}">
+                        <button type="submit" class="btn btn-outline-success btn-sm">
+                            <i class="far fa-trash-alt"></i> 确认金额
+                        </button>
+                    </form>
+                </div>
+            </div>
+        </div>
+        {{--        <textarea id="clipboardDiv" style="opacity:0"></textarea>--}}
     </div>
 @endsection
 @section('lastScript')
@@ -57,12 +89,12 @@
         let vue = new Vue({
             el: "#list",
             data: {
-                ownerFees: [
-                    @foreach($ownerFees as $ownerFee)
-                        {!! $ownerFee !!}
-                    @endforeach
-                ],
+                areaReports: {!! $areaReports !!},
+                billReport: {!! $billReport !!},
                 owners: [@foreach($owners as $owner){name: '{{ $owner->id }}', value: '{{ $owner->name}}'},@endforeach],
+                owner: {!! $owner !!},
+                price: {!! $price !!},
+                isArchived: {!! $isArchived !!},
                 selectTr: 0,
             },
             created() {
@@ -133,28 +165,8 @@
                     appendDom: "btn",
                 });
                 _this.form.init();
-                let column = [
-                    {name: 'index', value: '序号', neglect: true},
-                    {name: 'logistic_name', value: '仓库类型'},
-                    {name: 'province', value: '使用区域'},
-                    {name: 'logistic_bill', value: '数量'},
-                    {name: 'weight', value: '合计面积'},
-                    {name: 'initial_weight_price', value: '单价'},
-                    {name: 'additional_price', value: '金额'},
-                ];
-                new Header({
-                    el: "table",
-                    name: "ownerFee",
-                    column: column,
-                    data: this.ownerFees,
-                    restorationColumn: 'addtime',
-                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
-                }).init();
             },
             methods: {
-                calRowspan(logistic_name) {
-                    return this.ownerFees.filter(item => item.logistic_name === logistic_name).length;
-                },
                 ownerFeeExport(sign) {
                     let url = '{{url('finance/settlementBills/logisticFee/ownerFee/export')}}';
                     let token = '{{ csrf_token() }}';

+ 9 - 0
routes/web.php

@@ -787,12 +787,19 @@ Route::group(['prefix'=>'finance'],function(){
             Route::resource('detail', 'OwnerLogisticFeeDetailController', ['only' => ['index']]);
             Route::resource('report', 'OwnerLogisticFeeReportController', ['only' => ['index']]);
         });
+        Route::get('areaFee','SettlementBillOwnerAreaFeeController@index');
+        Route::post('areaFee/confirmBill','SettlementBillOwnerAreaFeeController@confirmBill');
     });
 });
 
 /** 客户 */
 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');
@@ -902,6 +909,8 @@ Route::group(['prefix'=>'procurement'],function () {
         Route::any('checkBillExport','ProcurementController@checkBillExport');
         Route::post('costPrice','ProcurementController@costPrice');
         Route::post('getCheckBillMonth','ProcurementController@getCheckBillMonth');
+
+
     });
     Route::get('relating',function (){return view('procurement.menuProcurement');});
 });

+ 1 - 1
tests/Services/LogisticYDService/LogisticYDSyncTest.php

@@ -36,7 +36,7 @@ class LogisticYDSyncTest extends TestCase
      */
     public function sync_test()
     {
-        LogisticYDSync::dispatch('4314960813161');
+        LogisticYDSync::dispatch('4280189118692');
         $this->assertTrue(OrderPackage::query()->where('logistic_number','4314543143889')->first()->transfer_status);
     }
 }