diff --git a/apps/admin-web/src/pages/OrdersPage.tsx b/apps/admin-web/src/pages/OrdersPage.tsx index 505c314..e4958e3 100644 --- a/apps/admin-web/src/pages/OrdersPage.tsx +++ b/apps/admin-web/src/pages/OrdersPage.tsx @@ -45,6 +45,8 @@ type CityOption = { id: string; name: string; code: string }; type WarehouseOption = { id: string; name: string; + cityId?: string; + cityName?: string; status?: string; contactName: string; contactPhone: string; @@ -192,16 +194,13 @@ export default function OrdersPage() { }); } - async function loadWarehousesForOrder(order: OrderDetail) { - const cityId = order.city?.id || order.cityId; - if (!cityId) { - setWarehouses([]); - return [] as WarehouseOption[]; - } - const rows = await request(`/admin/cities/${cityId}/warehouses`).catch(() => []); - const active = rows.filter((w) => !w.status || w.status === 'ACTIVE'); - setWarehouses(active); - return active; + async function loadWarehouses() { + const res = await request>( + `/admin/city-warehouses?pageSize=${ADMIN_OPTIONS_PAGE_SIZE}&status=ACTIVE`, + ).catch(() => null); + const rows = (res?.items ?? []).filter((w) => !w.status || w.status === 'ACTIVE'); + setWarehouses(rows); + return rows; } async function openDetail(id: string) { @@ -214,16 +213,25 @@ export default function OrdersPage() { const res = await request(`/admin/orders/${id}`); setShipTarget(res); setDetail(res); - logisticsForm.resetFields(); - const rows = await loadWarehousesForOrder(res); - const preferredWarehouseId = res.fulfillmentWarehouseId || res.fulfillmentWarehouse?.id || rows[0]?.id; - const preferred = rows.find((w) => w.id === preferredWarehouseId) || rows[0]; + logisticsForm.setFieldsValue({ + logisticsCompany: '', + trackingNo: '', + manualQueryUrl: '', + }); + const rows = await loadWarehouses(); + const preferredWarehouseId = res.fulfillmentWarehouseId || res.fulfillmentWarehouse?.id; + const preferred = + rows.find((w) => w.id === preferredWarehouseId) || + rows.find((w) => w.cityId === (res.city?.id || res.cityId)) || + rows[0]; const defaults = preferred ? warehouseToDefaults(preferred, shipDefaults) : (shipDefaults ?? await request('/admin/orders/ship-defaults').catch(() => null)); if (defaults) { setShipDefaults(defaults); applyShipDefaults(defaults, preferred?.id); + } else { + shipForm.setFieldsValue({ warehouseId: preferred?.id, provider: 'XFX' }); } setShipMode(preferred ? 'WAREHOUSE' : 'EXPRESS'); setShipModalOpen(true); @@ -242,9 +250,21 @@ export default function OrdersPage() { try { const res = await request(`/admin/orders/${shipTarget.id}/ship`, { method: 'POST', - body: JSON.stringify(values), + body: JSON.stringify({ + provider: values.provider || 'XFX', + warehouseId: values.warehouseId, + weight: values.weight, + payMode: values.payMode, + remark: values.remark, + fromName: values.fromName, + fromMobile: values.fromMobile, + fromAddress: values.fromAddress, + fromAddressDetail: values.fromAddressDetail, + fromLng: values.fromLng, + fromLat: values.fromLat, + }), }); - message.success('仓配发货成功'); + message.success('选仓发货成功'); setShipTarget(res); setDetail(res); setShipModalOpen(false); @@ -258,12 +278,22 @@ export default function OrdersPage() { async function submitLogisticsShip() { if (!shipTarget) return; - const values = await logisticsForm.validateFields(); + const values = await logisticsForm.validateFields(['logisticsCompany', 'trackingNo', 'manualQueryUrl']); + const logisticsCompany = String(values.logisticsCompany ?? '').trim(); + const trackingNo = String(values.trackingNo ?? '').trim(); + if (!logisticsCompany || !trackingNo) { + message.error('请填写快递公司与运单号'); + return; + } setLogisticsShipping(true); try { const res = await request(`/admin/orders/${shipTarget.id}/logistics-ship`, { method: 'POST', - body: JSON.stringify(values), + body: JSON.stringify({ + logisticsCompany, + trackingNo, + manualQueryUrl: String(values.manualQueryUrl ?? '').trim() || undefined, + }), }); message.success('快递单已录入'); setShipTarget(res); @@ -593,13 +623,14 @@ export default function OrdersPage() { open={shipModalOpen} onCancel={() => setShipModalOpen(false)} width={560} - destroyOnClose + destroyOnClose={false} + forceRender footer={ {shipMode === 'WAREHOUSE' ? ( ) : (