135 lines
4.4 KiB
PHP
135 lines
4.4 KiB
PHP
<?php
|
||
namespace app\api\controller;
|
||
|
||
use support\Request;
|
||
use app\common\service\OrderFlowService;
|
||
use app\common\service\PaymentService;
|
||
use app\common\model\Order;
|
||
|
||
class OrderController
|
||
{
|
||
public function create(Request $request)
|
||
{
|
||
$params = $request->post();
|
||
$userId = $request->user->id;
|
||
|
||
try {
|
||
$order = OrderFlowService::createOrder($params, $userId);
|
||
|
||
return jsonResponse([
|
||
'order_id' => $order->id,
|
||
'order_no' => $order->order_no,
|
||
'pay_amount' => $order->total_price
|
||
], '下单成功');
|
||
} catch (\Exception $e) {
|
||
return jsonResponse(null, '下单失败: ' . $e->getMessage(), 400);
|
||
}
|
||
}
|
||
|
||
public function list(Request $request)
|
||
{
|
||
$status = $request->get('status', 'all');
|
||
$userId = $request->user->id;
|
||
|
||
$query = Order::where('user_id', $userId);
|
||
if ($status !== 'all') {
|
||
$query->where('status', $status);
|
||
}
|
||
|
||
$orders = $query->orderBy('id', 'desc')->get();
|
||
|
||
return jsonResponse(['items' => $orders, 'total' => $orders->count()]);
|
||
}
|
||
|
||
public function detail(Request $request, $id)
|
||
{
|
||
$userId = $request->user->id;
|
||
$order = Order::with(['logs'])->where('id', $id)->where('user_id', $userId)->first();
|
||
|
||
if (!$order) {
|
||
return jsonResponse(null, '订单不存在', 404);
|
||
}
|
||
|
||
$timeline = [];
|
||
$isFirst = true;
|
||
foreach ($order->logs as $log) {
|
||
$timeline[] = [
|
||
'title' => $log->title,
|
||
'time' => $log->created_at->format('Y-m-d H:i:s'),
|
||
'desc' => $log->description,
|
||
'is_current' => $isFirst,
|
||
'is_done' => true
|
||
];
|
||
$isFirst = false;
|
||
}
|
||
|
||
return jsonResponse([
|
||
'id' => $order->id,
|
||
'order_no' => $order->order_no,
|
||
'category' => $order->category,
|
||
'service_type' => $order->service_type,
|
||
'status' => $order->status,
|
||
'is_fast' => (bool)$order->is_fast,
|
||
'express_company' => $order->express_company,
|
||
'express_no' => $order->express_no,
|
||
'express_modify_count' => (int)$order->express_modify_count,
|
||
'timeline' => $timeline
|
||
]);
|
||
}
|
||
|
||
public function pay(Request $request)
|
||
{
|
||
$orderId = (int)$request->post('order_id');
|
||
$userId = $request->user->id;
|
||
$payType = trim((string)$request->post('pay_type', 'jsapi'));
|
||
$appId = trim((string)$request->post('app_id', ''));
|
||
|
||
$order = Order::where('id', $orderId)->where('user_id', $userId)->first();
|
||
if (!$order) {
|
||
return jsonResponse(null, '订单不存在', 404);
|
||
}
|
||
|
||
try {
|
||
if ($payType === 'native') {
|
||
$pay = PaymentService::createWechatNativePay($order);
|
||
return jsonResponse($pay, '支付发起成功');
|
||
}
|
||
|
||
if ($appId === '') {
|
||
return jsonResponse(null, '缺少 app_id,无法发起 JSAPI 支付', 400);
|
||
}
|
||
|
||
$openid = trim((string)$request->post('openid', ''));
|
||
$pay = PaymentService::createWechatJsapiPay($order, $appId, $openid);
|
||
return jsonResponse($pay, '支付发起成功');
|
||
} catch (\Throwable $e) {
|
||
return jsonResponse(null, $e->getMessage(), 400);
|
||
}
|
||
}
|
||
|
||
public function ship(Request $request)
|
||
{
|
||
$orderId = (int)$request->post('order_id');
|
||
$expressCompany = trim($request->post('express_company', ''));
|
||
$expressNo = trim($request->post('express_no', ''));
|
||
|
||
if (!$expressCompany || !$expressNo) {
|
||
return jsonResponse(null, '物流信息不完整', 400);
|
||
}
|
||
|
||
$userId = $request->user->id;
|
||
$order = Order::where('id', $orderId)->where('user_id', $userId)->first();
|
||
if (!$order) {
|
||
return jsonResponse(null, '订单不存在', 404);
|
||
}
|
||
|
||
try {
|
||
$isModify = ($order->status === 'wait_receive');
|
||
OrderFlowService::userShip($order, $expressCompany, $expressNo);
|
||
return jsonResponse(null, $isModify ? '物流信息修改成功' : '发货信息已提交');
|
||
} catch (\Exception $e) {
|
||
return jsonResponse(null, $e->getMessage(), 400);
|
||
}
|
||
}
|
||
}
|