fix: 位置回溯父任务优先 + Tab筛选改为本地calcProductStatus过滤
This commit is contained in:
@ -55,14 +55,13 @@ export default function AdminTasksPage() {
|
||||
const [modalTarget, setModalTarget] = useState<ModalTarget | null>(null);
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
|
||||
// ---- 加载产品列表 ----
|
||||
async function loadProducts(kw: string, st: string) {
|
||||
// ---- 加载产品列表(始终拉全量,不做服务端状态过滤) ----
|
||||
async function loadProducts(kw: string) {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
try {
|
||||
const params: Record<string, string | number> = { limit: 1000 };
|
||||
if (kw.trim()) params.keyword = kw.trim();
|
||||
if (st) params.status = st;
|
||||
const { data } = await api.get<ProductResponse[]>("/products/", { params });
|
||||
setProducts(data);
|
||||
} catch {
|
||||
@ -72,28 +71,36 @@ export default function AdminTasksPage() {
|
||||
}
|
||||
}
|
||||
|
||||
// 首次加载
|
||||
useEffect(() => {
|
||||
loadProducts(keyword, statusFilter);
|
||||
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
|
||||
// 🚀 状态筛选 Tab 变化时自动重新查询
|
||||
useEffect(() => {
|
||||
loadProducts(keyword, statusFilter);
|
||||
}, [statusFilter]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
useEffect(() => { loadProducts(keyword); }, []); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
|
||||
function handleSearch(e?: React.FormEvent) {
|
||||
e?.preventDefault();
|
||||
setExpandedOrders(new Set());
|
||||
setExpandedProducts(new Set());
|
||||
setTaskTrees({});
|
||||
loadProducts(keyword, statusFilter);
|
||||
loadProducts(keyword);
|
||||
}
|
||||
|
||||
// ---- 按订单分组 ----
|
||||
/** 🔧 本地计算产品综合状态(与表格列渲染逻辑100%统一) */
|
||||
function calcProductStatus(p: ProductResponse): string {
|
||||
const tree = taskTrees[p.serial_number];
|
||||
if (tree?.task_tree?.length) {
|
||||
if (tree.task_tree.some(t => t.status === "WIP")) return "WIP";
|
||||
if (tree.task_tree.every(t => t.status === "COMPLETED" || t.status === "ARCHIVED")) return "COMPLETED";
|
||||
return tree.task_tree[0].status;
|
||||
}
|
||||
return p.status; // 未展开流转树时兜底产品状态
|
||||
}
|
||||
|
||||
// ---- 按订单分组 + 本地状态过滤 ----
|
||||
const orderGroups = useMemo<OrderGroup[]>(() => {
|
||||
const map = new Map<string, ProductResponse[]>();
|
||||
for (const p of products) {
|
||||
// 🔧 本地过滤:Tab切换时不再请求后端
|
||||
if (statusFilter) {
|
||||
const s = calcProductStatus(p).toUpperCase();
|
||||
if (s !== statusFilter) continue;
|
||||
}
|
||||
const key = p.order_no || "未绑定订单";
|
||||
if (!map.has(key)) map.set(key, []);
|
||||
map.get(key)!.push(p);
|
||||
@ -107,6 +114,7 @@ export default function AdminTasksPage() {
|
||||
(p) => p.current_location_id === "virtual_warehouse"
|
||||
),
|
||||
}));
|
||||
}, [products, statusFilter, taskTrees]);
|
||||
}, [products]);
|
||||
|
||||
// ---- 手风琴切换 ----
|
||||
@ -170,7 +178,7 @@ export default function AdminTasksPage() {
|
||||
const sn = modalTarget.task.product_sn || "";
|
||||
setModalTarget(null);
|
||||
if (sn) await refreshProductTree(sn);
|
||||
await loadProducts(keyword, statusFilter);
|
||||
await loadProducts(keyword);
|
||||
} catch (err: any) {
|
||||
toast(err?.response?.data?.detail ?? err?.message ?? "接收失败", "error");
|
||||
} finally {
|
||||
@ -187,7 +195,7 @@ export default function AdminTasksPage() {
|
||||
const sn = modalTarget.task.product_sn || "";
|
||||
setModalTarget(null);
|
||||
if (sn) await refreshProductTree(sn);
|
||||
await loadProducts(keyword, statusFilter);
|
||||
await loadProducts(keyword);
|
||||
} catch (err: any) {
|
||||
toast(err?.response?.data?.detail ?? err?.message ?? "驳回失败", "error");
|
||||
} finally {
|
||||
@ -210,7 +218,7 @@ export default function AdminTasksPage() {
|
||||
const sn = modalTarget.task.product_sn || "";
|
||||
setModalTarget(null);
|
||||
if (sn) await refreshProductTree(sn);
|
||||
await loadProducts(keyword, statusFilter);
|
||||
await loadProducts(keyword);
|
||||
} catch (err: any) {
|
||||
toast(err?.response?.data?.detail ?? err?.message ?? "转交失败", "error");
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user