feat(ops): partner proxy order list and HQ order delete
CI / verify (pull_request) Has been cancelled

Add partner-facing proxy order list/detail; unlock SUPER_ADMIN order delete with cascade cleanup and type filter.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-31 10:10:39 +08:00
parent 51f2b5fbfa
commit 8d6c0f9ac0
16 changed files with 523 additions and 8 deletions
@@ -0,0 +1,117 @@
import { useEffect, useState } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import PageHeader from '@dukang/shared-ui/PageHeader';
import type { PartnerProxyOrderListItem } from '@dukang/shared-types';
import { request } from '../lib/api';
function fmtMoney(n: number) {
return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
function fmtTime(value: string | undefined) {
if (!value) return '—';
const d = new Date(value);
if (Number.isNaN(d.getTime())) return value;
const pad = (n: number) => String(n).padStart(2, '0');
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
}
function deliveryLabel(order: PartnerProxyOrderListItem) {
const t = String(order.deliveryType || '').toUpperCase();
if (t === 'ON_SITE_PICKUP') return '现场提货';
if (t === 'CROSS_CITY') return '跨城配送';
if (t === 'LOCAL') return '同城配送';
return '线下代下单';
}
export default function ProxyOrderDetailPage() {
const { id } = useParams();
const navigate = useNavigate();
const [order, setOrder] = useState<PartnerProxyOrderListItem | null>(null);
const [error, setError] = useState('');
useEffect(() => {
document.title = '代下单详情';
}, []);
useEffect(() => {
if (!id) return;
void request<PartnerProxyOrderListItem>('PARTNER_H5', `/partner/proxy-orders/${id}`)
.then(setOrder)
.catch((e) => setError(e instanceof Error ? e.message : '加载失败'));
}, [id]);
const img = order?.imageResource?.url || '';
return (
<div className="page-no-tab partner-orders-page">
<PageHeader title="代下单详情" onBack={() => navigate('/center/proxy-orders')} />
{error && (
<p className="partner-form-error" role="alert" style={{ margin: '16px 20px' }}>
{error}
</p>
)}
{!order && !error && <p className="label-md text-muted" style={{ margin: 20 }}></p>}
{order && (
<div style={{ padding: '0 16px 32px' }}>
<div className="partner-order-card" style={{ pointerEvents: 'none' }}>
<div className="partner-order-card-top">
<span className="label-md text-muted">NO. {order.orderNo}</span>
<span className="label-md" style={{ color: 'var(--color-success-green)', fontWeight: 600 }}>
</span>
</div>
<div className="partner-order-product">
<div
className="partner-order-product-img"
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
overflow: 'hidden',
background: img ? `center/cover no-repeat url(${img})` : undefined,
}}
>
{!img && <span className="material-symbols-outlined text-muted">liquor</span>}
</div>
<div style={{ flex: 1, minWidth: 0 }}>
<h3 className="headline-md">{order.productName || '杜康好酒'}</h3>
{order.productSpec && (
<p className="label-md text-muted" style={{ marginTop: 4 }}>
{order.productSpec}
</p>
)}
<p className="body-md" style={{ marginTop: 8 }}>
×{order.quantity} · ¥{fmtMoney(Number(order.payAmount || 0))}
</p>
<p className="label-md text-muted" style={{ marginTop: 4 }}>
¥{fmtMoney(Number(order.benefitAmount || 0))}
</p>
</div>
</div>
</div>
<section className="partner-form-card" style={{ marginTop: 12 }}>
<h3 className="headline-md" style={{ marginBottom: 12 }}></h3>
<p className="body-md">{order.receiverName || '—'}</p>
<p className="body-md" style={{ marginTop: 8 }}>{order.receiverPhone || '—'}</p>
<p className="body-md" style={{ marginTop: 8 }}>
{order.receiverAddress || (String(order.deliveryType).toUpperCase() === 'ON_SITE_PICKUP' ? '现场提货' : '—')}
</p>
</section>
<section className="partner-form-card" style={{ marginTop: 12 }}>
<h3 className="headline-md" style={{ marginBottom: 12 }}></h3>
<p className="body-md">{deliveryLabel(order)}</p>
<p className="body-md" style={{ marginTop: 8 }}>{fmtTime(order.createdAt)}</p>
<p className="body-md" style={{ marginTop: 8 }}>线</p>
<p className="body-md" style={{ marginTop: 8 }}></p>
</section>
</div>
)}
</div>
);
}