diff --git a/app/Classes/Modules/Orders/ControllersLogic/ListOrderTrackingLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ListOrderTrackingLogic.php index f78a7560..d7bbb63a 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/ListOrderTrackingLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/ListOrderTrackingLogic.php @@ -5,13 +5,15 @@ namespace App\Classes\Modules\Orders\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Orders\Services\ListsOrderTracking; +use App\Classes\ValueObjects\Constants\RoleTypes; use App\Http\Resources\OrderTrackingResource; use App\Models\Order; -use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Log; +use Illuminate\Contracts\Encryption\DecryptException; class ListOrderTrackingLogic extends AbstractControllerLogic { @@ -42,6 +44,17 @@ class ListOrderTrackingLogic extends AbstractControllerLogic $query = null; $filters = json_decode($request->input('filters'), true); $trackingNo = $filters['tracking_no']; + + try { + $trackingNo = Crypt::decryptString($trackingNo); + $trackingNo = str_replace('_01', '', $trackingNo); + } catch (DecryptException $e) { + Log::info('Decryption failed, string might already be decrypted or invalid.'); + if(!in_array(Auth()->user()->type, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN])){ + abort(404); + } + } + if (preg_match('/^\d{9}$/', $trackingNo)) { $order = Order::where('reference', $trackingNo)->first(); if($order){ @@ -54,7 +67,10 @@ class ListOrderTrackingLogic extends AbstractControllerLogic } } else{ - $query = $this->listsOrderTracking->execute($this->listsOrderTracking->deserializeFilters($request->input('filters'))); + Artisan::call('process-yd-by-traking-no-data-command', [ + 'trackingNo' => $trackingNo + ]); + $query = $this->listsOrderTracking->execute(array_merge($this->listsOrderTracking->deserializeFilters($request->input('filters')), ['tracking_no' => $trackingNo])); } return $this->collectionResponse(OrderTrackingResource::collection($query)); diff --git a/app/Http/Resources/OrderPackagesReceivedResource.php b/app/Http/Resources/OrderPackagesReceivedResource.php index a5667c9d..c68d803b 100644 --- a/app/Http/Resources/OrderPackagesReceivedResource.php +++ b/app/Http/Resources/OrderPackagesReceivedResource.php @@ -20,7 +20,7 @@ class OrderPackagesReceivedResource extends JsonResource return [ 'id' => $this->id, - 'reference' => $this->reference, + // 'reference' => $this->reference, 'reference_contract' => (int) $this->type, 'type' => (int) $this->type, 'status' => (int) $this->status, diff --git a/app/Http/Resources/OrderTrackingResource.php b/app/Http/Resources/OrderTrackingResource.php index af6db571..1bcc32f5 100644 --- a/app/Http/Resources/OrderTrackingResource.php +++ b/app/Http/Resources/OrderTrackingResource.php @@ -2,7 +2,11 @@ namespace App\Http\Resources; +use App\Classes\ValueObjects\Constants\PackingListType; +use App\Classes\ValueObjects\Constants\RoleTypes; +use App\Models\PackingList; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Facades\Log; class OrderTrackingResource extends JsonResource { @@ -15,11 +19,26 @@ class OrderTrackingResource extends JsonResource */ public function toArray($request) { + $exceptionUsers = in_array(Auth()->user()->type, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]); + $packingList = PackingList::where('reference', $this->tracking_no)->where('type', PackingListType::SHIPPING_PACKING_LIST)->first(); + + $tracking = $this->tracking; + $remark = $this->remark; + $tracking_english = $this->tracking_english; + $remark_english = $this->remark_english; + if($tracking === '第三方提货') { + $tracking = '安排派送中'; + $tracking_english = 'Arranging Delivery'; + $remark = ''; + $remark_english = ''; + } + return [ 'id' => $this->id, - // 'tracking_no' => $this->tracking_no, - 'tracking' => $this->tracking . ($this->remark ? " (" . $this->remark . ")" : ''), - 'tracking_english' => $this->tracking_english . ($this->remark_english ? " (" . $this->remark_english . ")" : ''), + 'tracking_no' => $exceptionUsers ? $this->tracking_no : '', + 'order_id' => $packingList->owner->reference, + 'tracking' => $tracking . ($remark ? " (" . $remark . ")" : ''), + 'tracking_english' => $tracking_english . ($remark_english ? " (" . $remark_english . ")" : ''), 'tracking_time' => $this->tracking_time, ]; } diff --git a/app/Http/Resources/PackageBaseResource.php b/app/Http/Resources/PackageBaseResource.php index 935fbb07..b15e3f7d 100644 --- a/app/Http/Resources/PackageBaseResource.php +++ b/app/Http/Resources/PackageBaseResource.php @@ -2,9 +2,11 @@ namespace App\Http\Resources; +use App\Classes\ValueObjects\Constants\RoleTypes; use App\Models\Order; use App\Models\PackingList; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Facades\Crypt; class PackageBaseResource extends JsonResource { @@ -16,6 +18,8 @@ class PackageBaseResource extends JsonResource */ public function toArray($request) { + $exceptionUsers = in_array(Auth()->user()->type, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]); + $data = [ 'id' => $this->id, 'type' => $this->type, @@ -45,7 +49,9 @@ class PackageBaseResource extends JsonResource } if($this->include_packing_list_reference){ - $data['reference'] = $this->packingList->reference; + $data['reference'] = $exceptionUsers ? $this->packingList->reference : ''; + $data['reference_hash'] = hash('sha256', $this->packingList->reference); + $data['reference_encrypted'] = Crypt::encryptString($this->packingList->reference); } return $data; diff --git a/app/Http/Resources/PackingListForPackagesReceivedResource.php b/app/Http/Resources/PackingListForPackagesReceivedResource.php index f54a3766..6fab0a0d 100644 --- a/app/Http/Resources/PackingListForPackagesReceivedResource.php +++ b/app/Http/Resources/PackingListForPackagesReceivedResource.php @@ -9,6 +9,8 @@ use App\Classes\ValueObjects\Constants\RoleTypes; use App\Models\Order; use App\Models\PackingList; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Facades\Log; class PackingListForPackagesReceivedResource extends JsonResource { @@ -25,7 +27,8 @@ class PackingListForPackagesReceivedResource extends JsonResource $data = [ 'id' => $this->id, 'claimant_id' => $this->claimant_id, - 'reference' => $this->reference, + // 'reference' => $this->reference, + // 'reference_encrypted' => Crypt::encryptString($this->reference), 'status' => $this->status, 'transport' => new TransportResource($this->transports()->first()), 'type' => $this->type, diff --git a/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue b/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue index ce49fbac..46e695e7 100644 --- a/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue +++ b/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue @@ -24,20 +24,32 @@ -
-
- -
-
-
-
-

- - Tracking Details - -

+
+
+ + + +
+
@@ -83,6 +95,28 @@ required: true, } }, + computed: { + groupedParcelsByReference() { + const groups = {}; + + if (!this.order?.received_packages) return groups; + + const parcels = this.order.received_packages.flatMap(p => p.packages); + + for (const parcel of parcels) { + const ref = parcel.reference_hash; + if (!groups[ref]) { + groups[ref] = []; + } + groups[ref].push(parcel); + } + + return groups; + } + }, + mounted() { + this.fetch(); + }, data(){ return { section: 'orderPackageV4Section', @@ -92,9 +126,6 @@ filters: {}, } }, - mounted() { - this.fetch(); - }, methods: { fetch(){ this.isLoading = true; diff --git a/resources/assets/vue/components/orders/elements/PackageComponent.vue b/resources/assets/vue/components/orders/elements/PackageComponent.vue index 3cc62ff4..d68e439d 100644 --- a/resources/assets/vue/components/orders/elements/PackageComponent.vue +++ b/resources/assets/vue/components/orders/elements/PackageComponent.vue @@ -193,16 +193,6 @@ - -
-
-

- - Tracking Details - -

-
-
diff --git a/resources/assets/vue/components/tracking/elements/OrderTrackingComponent.vue b/resources/assets/vue/components/tracking/elements/OrderTrackingComponent.vue index 398c94e7..735c6458 100644 --- a/resources/assets/vue/components/tracking/elements/OrderTrackingComponent.vue +++ b/resources/assets/vue/components/tracking/elements/OrderTrackingComponent.vue @@ -14,6 +14,12 @@ + + diff --git a/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue b/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue index f7c6f355..6866aa47 100644 --- a/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue +++ b/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue @@ -6,7 +6,7 @@

Track your parcel

-
+
@@ -50,7 +50,7 @@ type: String, required: true }, - tracking_no: { + trackingNo: { type: String, } }, @@ -58,10 +58,10 @@ return { showList: false, currentKey: 1, - searchString: this.tracking_no, - trackingNo: this.tracking_no, + searchString: '', options: { 'order_by': {column: 'order_tracking_id', DESC: false}, + 'per_page': 20 } } }, @@ -72,11 +72,19 @@ }, methods: { search() { - if(this.searchString){ + if(this.searchString && this.searchString.length < 20){ this.trackingNo = this.searchString; } - const sanitizedtrackingNo = encodeURIComponent(this.trackingNo); - this.options['tracking_no'] = sanitizedtrackingNo; + if (this.searchString){ + const sanitizedtrackingNo = encodeURIComponent(this.searchString); + this.options['tracking_no'] = sanitizedtrackingNo; + } + else if (this.trackingNo){ + const sanitizedtrackingNo = encodeURIComponent(this.trackingNo); + this.options['tracking_no'] = sanitizedtrackingNo; + window.history.replaceState({}, '', '/order/tracking'); + } + this.currentKey+=1; this.showList = true; }, diff --git a/resources/views/pages/tracking/search.blade.php b/resources/views/pages/tracking/search.blade.php index eaa00f13..e872c405 100644 --- a/resources/views/pages/tracking/search.blade.php +++ b/resources/views/pages/tracking/search.blade.php @@ -2,7 +2,7 @@ @section('inner_content')
- +
@endsection diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index e50a6d15..1e502ae6 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -125,7 +125,7 @@
Payments & Billing
-
+