223 lines
7.9 KiB
PHP
223 lines
7.9 KiB
PHP
<?php
|
|
|
|
namespace app\controller\open;
|
|
|
|
use app\support\AppraisalServicePricePackageService;
|
|
use app\support\EnterpriseOpenApiAuthService;
|
|
use app\support\EnterpriseOrderService;
|
|
use support\Request;
|
|
|
|
class OrdersController
|
|
{
|
|
public function create(Request $request)
|
|
{
|
|
try {
|
|
$auth = (new EnterpriseOpenApiAuthService())->authenticate($request);
|
|
} catch (\Throwable $e) {
|
|
return api_error($e->getMessage(), 401);
|
|
}
|
|
|
|
$payload = json_decode($request->rawBody(), true);
|
|
if (!is_array($payload)) {
|
|
return api_error('请求体必须是合法 JSON 对象', 422);
|
|
}
|
|
|
|
try {
|
|
$result = (new EnterpriseOrderService())->createOrder($auth['customer'], $payload, $request);
|
|
} catch (\InvalidArgumentException $e) {
|
|
return api_error($e->getMessage(), 422);
|
|
} catch (\RuntimeException $e) {
|
|
return api_error($e->getMessage(), 409);
|
|
} catch (\Throwable $e) {
|
|
return api_error('订单创建失败', 500, [
|
|
'detail' => $e->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return api_success($result, !empty($result['idempotent']) ? '订单已存在' : '订单已创建');
|
|
}
|
|
|
|
public function shipping(Request $request)
|
|
{
|
|
try {
|
|
$auth = (new EnterpriseOpenApiAuthService())->authenticate($request);
|
|
} catch (\Throwable $e) {
|
|
return api_error($e->getMessage(), 401);
|
|
}
|
|
|
|
$payload = json_decode($request->rawBody(), true);
|
|
if (!is_array($payload)) {
|
|
return api_error('请求体必须是合法 JSON 对象', 422);
|
|
}
|
|
|
|
try {
|
|
$result = (new EnterpriseOrderService())->submitShipping($auth['customer'], $payload);
|
|
} catch (\InvalidArgumentException $e) {
|
|
return api_error($e->getMessage(), 422);
|
|
} catch (\RuntimeException $e) {
|
|
return api_error($e->getMessage(), 404);
|
|
} catch (\Throwable $e) {
|
|
return api_error('运单提交失败', 500, [
|
|
'detail' => $e->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return api_success($result, '运单已提交');
|
|
}
|
|
|
|
public function cancel(Request $request)
|
|
{
|
|
try {
|
|
$auth = (new EnterpriseOpenApiAuthService())->authenticate($request);
|
|
} catch (\Throwable $e) {
|
|
return api_error($e->getMessage(), 401);
|
|
}
|
|
|
|
$payload = json_decode($request->rawBody(), true);
|
|
if (!is_array($payload)) {
|
|
return api_error('请求体必须是合法 JSON 对象', 422);
|
|
}
|
|
|
|
try {
|
|
$result = (new EnterpriseOrderService())->cancelOrder($auth['customer'], $payload);
|
|
} catch (\InvalidArgumentException $e) {
|
|
return api_error($e->getMessage(), 422);
|
|
} catch (\RuntimeException $e) {
|
|
return api_error($e->getMessage(), 404);
|
|
} catch (\Throwable $e) {
|
|
return api_error('订单取消失败', 500, [
|
|
'detail' => $e->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return api_success($result, '订单已取消');
|
|
}
|
|
|
|
public function saveReturnAddress(Request $request)
|
|
{
|
|
try {
|
|
$auth = (new EnterpriseOpenApiAuthService())->authenticate($request);
|
|
} catch (\Throwable $e) {
|
|
return api_error($e->getMessage(), 401);
|
|
}
|
|
|
|
$payload = json_decode($request->rawBody(), true);
|
|
if (!is_array($payload)) {
|
|
return api_error('请求体必须是合法 JSON 对象', 422);
|
|
}
|
|
|
|
try {
|
|
$result = (new EnterpriseOrderService())->saveReturnAddress($auth['customer'], $payload);
|
|
} catch (\InvalidArgumentException $e) {
|
|
return api_error($e->getMessage(), 422);
|
|
} catch (\RuntimeException $e) {
|
|
return api_error($e->getMessage(), 404);
|
|
} catch (\Throwable $e) {
|
|
return api_error('寄回地址保存失败', 500, [
|
|
'detail' => $e->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return api_success($result, '寄回地址已保存');
|
|
}
|
|
|
|
public function servicePricePackages(Request $request)
|
|
{
|
|
try {
|
|
(new EnterpriseOpenApiAuthService())->authenticate($request);
|
|
} catch (\Throwable $e) {
|
|
return api_error($e->getMessage(), 401);
|
|
}
|
|
|
|
try {
|
|
$service = new AppraisalServicePricePackageService();
|
|
$serviceProvider = trim((string)$request->input('service_provider', ''));
|
|
$allowedProviders = array_column($service->providerOptions(), 'service_provider');
|
|
if ($serviceProvider !== '' && !in_array($serviceProvider, $allowedProviders, true)) {
|
|
return api_error('service_provider 无效', 422);
|
|
}
|
|
|
|
$providers = array_values(array_filter(
|
|
$service->serviceOptions(),
|
|
fn (array $item) => $serviceProvider === '' || (string)$item['service_provider'] === $serviceProvider
|
|
));
|
|
|
|
return api_success([
|
|
'service_providers' => array_map(fn (array $item) => $this->formatOpenServiceProvider($item), $providers),
|
|
]);
|
|
} catch (\Throwable $e) {
|
|
return api_error('套餐获取失败', 500, [
|
|
'detail' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function detail(Request $request)
|
|
{
|
|
try {
|
|
$auth = (new EnterpriseOpenApiAuthService())->authenticate($request);
|
|
} catch (\Throwable $e) {
|
|
return api_error($e->getMessage(), 401);
|
|
}
|
|
|
|
$externalOrderNo = trim((string)($request->route?->param('external_order_no', '') ?? ''));
|
|
if ($externalOrderNo === '') {
|
|
$externalOrderNo = trim((string)$request->input('external_order_no', ''));
|
|
}
|
|
$orderNo = trim((string)$request->input('order_no', ''));
|
|
|
|
try {
|
|
$order = (new EnterpriseOrderService())->findOrder($auth['customer'], $externalOrderNo, $orderNo);
|
|
} catch (\InvalidArgumentException $e) {
|
|
return api_error($e->getMessage(), 422);
|
|
} catch (\RuntimeException $e) {
|
|
return api_error($e->getMessage(), 404);
|
|
} catch (\Throwable $e) {
|
|
return api_error('订单查询失败', 500, [
|
|
'detail' => $e->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return api_success([
|
|
'order' => $order,
|
|
]);
|
|
}
|
|
|
|
private function formatOpenServiceProvider(array $item): array
|
|
{
|
|
$packages = array_map(fn (array $package) => $this->formatOpenPricePackage($package), (array)($item['packages'] ?? []));
|
|
$defaultPackageCode = '';
|
|
foreach ($packages as $package) {
|
|
if (!empty($package['is_default'])) {
|
|
$defaultPackageCode = (string)$package['price_package_code'];
|
|
break;
|
|
}
|
|
}
|
|
if ($defaultPackageCode === '' && isset($packages[0])) {
|
|
$defaultPackageCode = (string)$packages[0]['price_package_code'];
|
|
}
|
|
|
|
return [
|
|
'service_provider' => (string)$item['service_provider'],
|
|
'service_provider_text' => (string)$item['service_provider_text'],
|
|
'sla_hours' => (int)$item['sla_hours'],
|
|
'default_price_package_code' => $defaultPackageCode,
|
|
'packages' => $packages,
|
|
];
|
|
}
|
|
|
|
private function formatOpenPricePackage(array $package): array
|
|
{
|
|
return [
|
|
'service_provider' => (string)$package['service_provider'],
|
|
'service_provider_text' => (string)$package['service_provider_text'],
|
|
'price_package_name' => (string)$package['package_name'],
|
|
'price_package_code' => (string)$package['package_code'],
|
|
'price_package_price' => (float)$package['price'],
|
|
'description' => (string)$package['description'],
|
|
'is_default' => (bool)$package['is_default'],
|
|
'sla_hours' => (int)$package['sla_hours'],
|
|
];
|
|
}
|
|
}
|