diff --git a/app/Admin/Services/OrderPackageService.php b/app/Admin/Services/OrderPackageService.php index 2bec965b..b5187b72 100644 --- a/app/Admin/Services/OrderPackageService.php +++ b/app/Admin/Services/OrderPackageService.php @@ -54,6 +54,7 @@ class OrderPackageService //创建发货单数据 $package = new OrderPackage(); $package->order_id = $order->id; + $package->user_id = $order->user_id; $package->consignee_name = $order->consignee_name; $package->consignee_telephone = $order->consignee_telephone; $package->consignee_zone = $order->consignee_zone; diff --git a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php index c2eb3787..79db4366 100644 --- a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php +++ b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php @@ -3,11 +3,13 @@ namespace App\Endpoint\Api\Http\Controllers\Order; use App\Endpoint\Api\Http\Controllers\Controller; +use App\Endpoint\Api\Http\Resources\OrderPackageResource; use App\Endpoint\Api\Http\Resources\OrderResource; use App\Endpoint\Api\Http\Resources\OrderResourceCollection; use App\Exceptions\BizException; use App\Helpers\Order as OrderHelper; use App\Helpers\Paginator as PaginatorHelper; +use App\Models\KuaidiLog; use App\Models\Order; use App\Services\OrderService; use Illuminate\Database\Eloquent\ModelNotFoundException; @@ -117,6 +119,7 @@ class OrderController extends Controller { $order = $request->user()->orders()->findOrFail($id); $order->load('products'); + $order->load('packages'); return OrderResource::make($order); } @@ -206,4 +209,26 @@ class OrderController extends Controller throw new BizException('订单支付失败,请重试'); } } + + /** + * 订单包裹列表 + */ + public function orderPackages($id, Request $request) + { + $order = $request->user()->orders()->findOrFail($id); + return OrderPackageResource::collection($order->packages()->where('is_failed', false)->orderBy('updated_at', 'desc')->get()); + } + + /** + * 物流包裹的明细 + * + * @return void + */ + public function shippingInfo($id, Request $request) + { + $package = $request->user()->orderPackages()->where('is_failed', false)->findOrFail($id); + return response()->json(array_merge(OrderPackageResource::make($package)->resolve(), [ + 'shipping_info'=> KuaidiLog::where(['number'=>$package->shipping_number, 'code'=>$package->shipping_code])->first()?->info, + ])); + } } diff --git a/app/Endpoint/Api/Http/Resources/OrderPackageResource.php b/app/Endpoint/Api/Http/Resources/OrderPackageResource.php new file mode 100644 index 00000000..f78e8c00 --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/OrderPackageResource.php @@ -0,0 +1,25 @@ + $this->id, + 'state' => $this->status, + 'shipping_company' => $this->shipping_company, + 'shipping_number' => $this->shipping_number, + 'last_news' => $this->last_news, + ]; + } +} diff --git a/app/Endpoint/Api/Http/Resources/OrderResource.php b/app/Endpoint/Api/Http/Resources/OrderResource.php index 73aca93d..534ff223 100644 --- a/app/Endpoint/Api/Http/Resources/OrderResource.php +++ b/app/Endpoint/Api/Http/Resources/OrderResource.php @@ -35,6 +35,8 @@ class OrderResource extends JsonResource 'completed_at' => (string) $this->completed_at?->toDateTimeString(), 'created_at' => $this->created_at->toDateTimeString(), 'expires_at' => $this->expires_at, + + 'packages' => OrderPackageResource::make($this->whenloaded('packages')->where('is_failed', false)->sortBy('created_at')->first()), ]; } } diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index d46b5167..384c9608 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -127,5 +127,7 @@ Route::group([ Route::post('order/orders/{order}/pay', [OrderController::class, 'pay']); Route::post('order/orders/{order}/confirm', [OrderController::class, 'confirm']); Route::post('order/orders/{order}/cancel', [OrderController::class, 'cancel']); + Route::get('order/orders/{order}/packages', [OrderController::class, 'orderPackages']); + Route::get('order/orders/{package}/shipping-info', [OrderController::class, 'shippingInfo']); }); }); diff --git a/app/Endpoint/Callback/Http/Controllers/Kuaidi100Controller.php b/app/Endpoint/Callback/Http/Controllers/Kuaidi100Controller.php index 97bf44af..e9d694d5 100644 --- a/app/Endpoint/Callback/Http/Controllers/Kuaidi100Controller.php +++ b/app/Endpoint/Callback/Http/Controllers/Kuaidi100Controller.php @@ -4,7 +4,6 @@ namespace App\Endpoint\Callback\Http\Controllers; use App\Services\Kuaidi100Service; use Illuminate\Http\Request; -use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Throwable; @@ -17,13 +16,16 @@ class Kuaidi100Controller extends Controller */ public function notify(Request $request, Kuaidi100Service $kuaidi100Service) { - $data = $request->all(); + $sign = $request->input('sign', ''); + $params = $request->input('param', '{}'); + // $params = '{"message":"变化","comOld":"","status":"polling","lastResult":{"nu":"9885738505649","message":"ok","ischeck":"0","com":"ems","condition":"00","status":"200","state":"0","data":[{"time":"2021-12-20 11:53:36","areaName":"湖北,孝感市,云梦县","status":"在途","areaCode":"CN420923000000","context":"到达【湖北省云梦县寄递事业部楚王城寄递营业部】","ftime":"2021-12-20 11:53:36"},{"time":"2021-12-20 11:50:57","areaName":"湖北,孝感市,云梦县","status":"在途","areaCode":"CN420923000000","context":"离开【湖北省云梦县寄递事业部中心营业部】,下一站【湖北省云梦县寄递事业部楚王城寄递营业部】","ftime":"2021-12-20 11:50:57"},{"time":"2021-12-20 11:39:47","areaName":"湖北,孝感市,云梦县","status":"揽收","areaCode":"CN420923000000","context":"【湖北省云梦县寄递事业部中心营业部】已收寄,揽投员:褚四明,电话:15872394578","ftime":"2021-12-20 11:39:47"}]},"comNew":"","billstatus":"change","autoCheck":"0"}'; + $params = json_decode($params, true); //校验回调签名 - if ($kuaidi100Service->unPollSign(Arr::get($data, 'sign', ''), Arr::get($data, 'param', []))) { + if ($kuaidi100Service->unPollSign($sign, $params)) { try { DB::beginTransaction(); - $kuaidi100Service->callback($request->input('param', [])); + $kuaidi100Service->callback($params); DB::commit(); } catch (Throwable $th) { DB::rollBack(); diff --git a/app/Models/OrderPackage.php b/app/Models/OrderPackage.php index e0adb450..1fb92773 100644 --- a/app/Models/OrderPackage.php +++ b/app/Models/OrderPackage.php @@ -42,7 +42,7 @@ class OrderPackage extends Model ]; protected $fillable = [ - 'remarks', 'status', 'is_failed', 'checked_at', + 'remarks', 'status', 'is_failed', 'checked_at', 'last_news', ]; /** diff --git a/app/Models/User.php b/app/Models/User.php index 47548898..8ba6bd4d 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -102,6 +102,14 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac return $this->hasMany(Order::class); } + /** + * 属于此用户的订单包裹 + */ + public function orderPackages() + { + return $this->hasMany(OrderPackage::class); + } + /** * 属于此用户的商品收藏记录 */ diff --git a/app/Services/AfterSaleService.php b/app/Services/AfterSaleService.php index 08b19920..0358098c 100644 --- a/app/Services/AfterSaleService.php +++ b/app/Services/AfterSaleService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Exceptions\BizException; +use App\Helpers\Order as OrderHelper; use App\Models\AfterSale; use App\Models\AfterSaleLog; use App\Models\OrderProduct; @@ -326,6 +327,12 @@ class AfterSaleService if ($this->isWaitFinance($afterSale)) { if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_REFUND])) { //todo-执行实际退款操作; + $order = $afterSale->order; + $order->refundTasks()->create([ + 'sn' => OrderHelper::serialNumber(), + 'amount' => $order->total_amount, + 'reason' => '取消订单', + ]); } elseif (in_array($afterSale->type, [AfterSale::TYPE_CHANGE])) {//换货流程 //todo-执行生成新的订单,发货单操作; } diff --git a/app/Services/Kuaidi100Service.php b/app/Services/Kuaidi100Service.php index 0f26c833..11cd3553 100644 --- a/app/Services/Kuaidi100Service.php +++ b/app/Services/Kuaidi100Service.php @@ -1398,6 +1398,11 @@ class Kuaidi100Service $status = OrderPackage::STATUS_OTHER; } + //记录最新的物流情况 + $lastNews = isset($lastRsult['data'][0]) ? $lastRsult['data'][0] : []; + $package->update([ + 'last_news'=> empty($lastNews) ? '' : $lastNews['context'], + ]); try { //更新包裹状态 (new OrderPackageService())->updatePackageStatus($package, $status); @@ -1483,7 +1488,7 @@ class Kuaidi100Service */ public function unPollSign(string $sign, array $params) { - return $sign === md5(json_encode($params).config('settings.kuaidi100_secret')); + return $sign === strtoupper(md5(json_encode($params, JSON_UNESCAPED_UNICODE).config('settings.kuaidi100_secret'))); } public function getStatusName($state = 0) diff --git a/app/Services/OrderPackageService.php b/app/Services/OrderPackageService.php index d2991e64..22e8c051 100644 --- a/app/Services/OrderPackageService.php +++ b/app/Services/OrderPackageService.php @@ -35,7 +35,7 @@ class OrderPackageService return; } - // 如果订单有未签收的未作废的包裹 + // 如果订单有未作废且未签收的包裹 if (! $package->order->where('is_failed', false)->unchecked()->exists()) { return; } diff --git a/config/settings.php b/config/settings.php index e8d36bd0..4f71d104 100644 --- a/config/settings.php +++ b/config/settings.php @@ -21,8 +21,8 @@ return [ 'article_health'=>3, // 指定内容链接:关于我们,服务协议,隐私协议 'article_about_us'=>env('APP_URL', '').'/h5/articles/1', - 'article_user_promotion_agreement'=>env('APP_URL', '').'h5/articles/2', - 'article_user_hide_agreement'=>env('APP_URL', '').'h5/articles/3', + 'article_user_promotion_agreement'=>env('APP_URL', '').'/h5/articles/2', + 'article_user_hide_agreement'=>env('APP_URL', '').'/h5/articles/3', // 快递100是否开启 'kuaidi100_is_use' => true, diff --git a/database/migrations/2021_12_20_134256_add_user_id_to_order_packages_table.php b/database/migrations/2021_12_20_134256_add_user_id_to_order_packages_table.php new file mode 100644 index 00000000..a61acf69 --- /dev/null +++ b/database/migrations/2021_12_20_134256_add_user_id_to_order_packages_table.php @@ -0,0 +1,35 @@ +unsignedBigInteger('user_id')->comment('用户ID'); + $table->string('last_news')->nullable()->comment('物流最新消息'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('order_packages', function (Blueprint $table) { + // + $table->dropColumn(['user_id', 'last_news']); + }); + } +} diff --git a/resources/views/endpoint/article/agreement.blade.php b/resources/views/endpoint/article/agreement.blade.php index 655a243a..0c3ce787 100644 --- a/resources/views/endpoint/article/agreement.blade.php +++ b/resources/views/endpoint/article/agreement.blade.php @@ -11,6 +11,10 @@ margin: 0 auto; text-align: center; } */ + img { + max-width: 100%; + max-height: 100%; + }