feat: add open warehouse list api
This commit is contained in:
31
server-api/app/controller/open/WarehousesController.php
Normal file
31
server-api/app/controller/open/WarehousesController.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller\open;
|
||||
|
||||
use app\support\EnterpriseOpenApiAuthService;
|
||||
use app\support\EnterpriseWarehouseService;
|
||||
use support\Request;
|
||||
|
||||
class WarehousesController
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
try {
|
||||
(new EnterpriseOpenApiAuthService())->authenticate($request);
|
||||
} catch (\Throwable $e) {
|
||||
return api_error($e->getMessage(), 401);
|
||||
}
|
||||
|
||||
try {
|
||||
$serviceProvider = trim((string)$request->input('service_provider', ''));
|
||||
|
||||
return api_success([
|
||||
'warehouses' => (new EnterpriseWarehouseService())->list($serviceProvider),
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
return api_error('仓库地址获取失败', 500, [
|
||||
'detail' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
48
server-api/app/support/EnterpriseWarehouseService.php
Normal file
48
server-api/app/support/EnterpriseWarehouseService.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace app\support;
|
||||
|
||||
class EnterpriseWarehouseService
|
||||
{
|
||||
public function list(string $serviceProvider = ''): array
|
||||
{
|
||||
$serviceProvider = trim($serviceProvider);
|
||||
$warehouses = (new WarehouseService())->list();
|
||||
|
||||
$warehouses = array_values(array_filter($warehouses, static function (array $item) use ($serviceProvider) {
|
||||
if ((string)($item['status'] ?? '') !== 'enabled') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $serviceProvider === '' || (string)($item['service_provider'] ?? '') === $serviceProvider;
|
||||
}));
|
||||
|
||||
return array_map(fn(array $item) => $this->formatOpenWarehouse($item), $warehouses);
|
||||
}
|
||||
|
||||
private function formatOpenWarehouse(array $item): array
|
||||
{
|
||||
return [
|
||||
'id' => (int)$item['id'],
|
||||
'warehouse_name' => (string)$item['warehouse_name'],
|
||||
'warehouse_code' => (string)$item['warehouse_code'],
|
||||
'service_provider' => (string)$item['service_provider'],
|
||||
'service_provider_text' => (string)$item['service_provider_text'],
|
||||
'receiver_name' => (string)$item['receiver_name'],
|
||||
'receiver_mobile' => (string)$item['receiver_mobile'],
|
||||
'province' => (string)$item['province'],
|
||||
'city' => (string)$item['city'],
|
||||
'district' => (string)$item['district'],
|
||||
'detail_address' => (string)$item['detail_address'],
|
||||
'full_address' => (string)$item['full_address'],
|
||||
'service_time' => (string)$item['service_time'],
|
||||
'notice' => (string)$item['notice'],
|
||||
'supported_category_ids' => array_values((array)($item['supported_category_ids'] ?? [])),
|
||||
'supported_category_names' => array_values((array)($item['supported_category_names'] ?? [])),
|
||||
'service_area_provinces' => array_values((array)($item['service_area_provinces'] ?? [])),
|
||||
'service_area_cities' => array_values((array)($item['service_area_cities'] ?? [])),
|
||||
'is_default' => (bool)$item['is_default'],
|
||||
'sort_order' => (int)$item['sort_order'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -50,6 +50,7 @@ use app\controller\admin\WarehouseWorkbenchController as AdminWarehouseWorkbench
|
||||
use app\controller\admin\ExpressCompaniesController as AdminExpressCompaniesController;
|
||||
use app\controller\admin\FileUploadController as AdminFileUploadController;
|
||||
use app\controller\open\OrdersController as OpenOrdersController;
|
||||
use app\controller\open\WarehousesController as OpenWarehousesController;
|
||||
use app\controller\open\Kuaidi100Controller as OpenKuaidi100Controller;
|
||||
use app\controller\open\ShouqianbaPaymentController as OpenShouqianbaPaymentController;
|
||||
|
||||
@@ -218,6 +219,7 @@ Route::post('/api/open/v1/orders/shipping', [OpenOrdersController::class, 'shipp
|
||||
Route::get('/api/open/v1/orders', [OpenOrdersController::class, 'detail']);
|
||||
Route::get('/api/open/v1/orders/{external_order_no}', [OpenOrdersController::class, 'detail']);
|
||||
Route::get('/api/open/v1/service-price-packages', [OpenOrdersController::class, 'servicePricePackages']);
|
||||
Route::get('/api/open/v1/warehouses', [OpenWarehousesController::class, 'index']);
|
||||
Route::post('/api/open/kuaidi100/callback', [OpenKuaidi100Controller::class, 'callback']);
|
||||
Route::post('/api/open/shouqianba/payment/notify', [OpenShouqianbaPaymentController::class, 'notify']);
|
||||
|
||||
|
||||
123
server-api/tools/enterprise_warehouse_list_mock_test.php
Normal file
123
server-api/tools/enterprise_warehouse_list_mock_test.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||
|
||||
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
|
||||
$dotenv->safeLoad();
|
||||
|
||||
use app\support\EnterpriseWarehouseService;
|
||||
use app\support\WarehouseService;
|
||||
use support\think\Db;
|
||||
|
||||
Db::setConfig(require dirname(__DIR__) . '/config/think-orm.php');
|
||||
|
||||
function assertTrue(bool $condition, string $message): void
|
||||
{
|
||||
if (!$condition) {
|
||||
throw new RuntimeException($message);
|
||||
}
|
||||
}
|
||||
|
||||
function cleanupWarehouseMockData(): void
|
||||
{
|
||||
Db::name('shipping_warehouses')->whereLike('warehouse_code', 'OPENWHMOCK%')->delete();
|
||||
}
|
||||
|
||||
function createMockWarehouse(string $code, string $serviceProvider, string $status, int $sortOrder): void
|
||||
{
|
||||
$now = date('Y-m-d H:i:s');
|
||||
Db::name('shipping_warehouses')->insert([
|
||||
'warehouse_name' => '开放接口测试仓库 ' . $code,
|
||||
'warehouse_code' => $code,
|
||||
'warehouse_type' => 'detection_center',
|
||||
'service_provider' => $serviceProvider,
|
||||
'receiver_name' => '开放接口收件人',
|
||||
'receiver_mobile' => '13900001111',
|
||||
'province' => '广东省',
|
||||
'city' => '深圳市',
|
||||
'district' => '南山区',
|
||||
'detail_address' => '开放接口测试地址 ' . $code,
|
||||
'service_time' => '周一至周五 09:00-18:00',
|
||||
'notice' => '开放接口 mock 测试仓库',
|
||||
'supported_category_ids_json' => json_encode([101, 102], JSON_UNESCAPED_UNICODE),
|
||||
'service_area_provinces_json' => json_encode(['广东省'], JSON_UNESCAPED_UNICODE),
|
||||
'service_area_cities_json' => json_encode(['深圳市'], JSON_UNESCAPED_UNICODE),
|
||||
'status' => $status,
|
||||
'is_default' => $sortOrder === 1 ? 1 : 0,
|
||||
'sort_order' => $sortOrder,
|
||||
'remark' => '不应暴露到第三方开放接口',
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
}
|
||||
|
||||
function findWarehouse(array $warehouses, string $code): ?array
|
||||
{
|
||||
foreach ($warehouses as $warehouse) {
|
||||
if (($warehouse['warehouse_code'] ?? '') === $code) {
|
||||
return $warehouse;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
new WarehouseService();
|
||||
cleanupWarehouseMockData();
|
||||
|
||||
createMockWarehouse('OPENWHMOCK-A', 'open_mock_a', 'enabled', 1);
|
||||
createMockWarehouse('OPENWHMOCK-B', 'open_mock_b', 'enabled', 2);
|
||||
createMockWarehouse('OPENWHMOCK-DISABLED', 'open_mock_a', 'disabled', 3);
|
||||
|
||||
$service = new EnterpriseWarehouseService();
|
||||
|
||||
$all = $service->list();
|
||||
assertTrue(findWarehouse($all, 'OPENWHMOCK-A') !== null, '启用仓库 A 应出现在全量列表中');
|
||||
assertTrue(findWarehouse($all, 'OPENWHMOCK-B') !== null, '启用仓库 B 应出现在全量列表中');
|
||||
assertTrue(findWarehouse($all, 'OPENWHMOCK-DISABLED') === null, '停用仓库不应出现在全量列表中');
|
||||
|
||||
$filtered = $service->list('open_mock_a');
|
||||
assertTrue(count($filtered) === 1, '按 service_provider 过滤后应只返回一个启用仓库');
|
||||
assertTrue(($filtered[0]['warehouse_code'] ?? '') === 'OPENWHMOCK-A', '过滤结果应为 OPENWHMOCK-A');
|
||||
|
||||
foreach (['remark', 'status', 'created_at', 'updated_at'] as $privateField) {
|
||||
assertTrue(!array_key_exists($privateField, $filtered[0]), $privateField . ' 不应暴露到开放接口');
|
||||
}
|
||||
|
||||
foreach ([
|
||||
'id',
|
||||
'warehouse_name',
|
||||
'warehouse_code',
|
||||
'service_provider',
|
||||
'service_provider_text',
|
||||
'receiver_name',
|
||||
'receiver_mobile',
|
||||
'province',
|
||||
'city',
|
||||
'district',
|
||||
'detail_address',
|
||||
'full_address',
|
||||
'service_time',
|
||||
'notice',
|
||||
'supported_category_ids',
|
||||
'supported_category_names',
|
||||
'service_area_provinces',
|
||||
'service_area_cities',
|
||||
'is_default',
|
||||
'sort_order',
|
||||
] as $publicField) {
|
||||
assertTrue(array_key_exists($publicField, $filtered[0]), $publicField . ' 应出现在开放接口响应中');
|
||||
}
|
||||
|
||||
assertTrue($service->list('missing_provider') === [], '不存在的 service_provider 应返回空列表');
|
||||
|
||||
cleanupWarehouseMockData();
|
||||
echo "ENTERPRISE_WAREHOUSE_LIST_MOCK_TEST_OK\n";
|
||||
} catch (Throwable $e) {
|
||||
cleanupWarehouseMockData();
|
||||
fwrite(STDERR, "ENTERPRISE_WAREHOUSE_LIST_MOCK_TEST_FAILED: {$e->getMessage()}\n");
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user