FPSMS-frontend
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

115 行
3.7 KiB

  1. "use client";
  2. import React, { useState, useEffect, useCallback } from "react";
  3. import { useSession } from "next-auth/react";
  4. import { SessionWithTokens } from "@/config/authConfig";
  5. import ProductionProcessList from "@/components/ProductionProcess/ProductionProcessList";
  6. import ProductionProcessDetail from "@/components/ProductionProcess/ProductionProcessDetail";
  7. import ProductionProcessJobOrderDetail from "@/components/ProductionProcess/ProductionProcessJobOrderDetail";
  8. import JobPickExecutionsecondscan from "@/components/Jodetail/JobPickExecutionsecondscan";
  9. import {
  10. fetchProductProcesses,
  11. fetchProductProcessesByJobOrderId,
  12. ProductProcessLineResponse
  13. } from "@/app/api/jo/actions";
  14. type PrinterCombo = {
  15. id: number;
  16. value: number;
  17. label?: string;
  18. code?: string;
  19. name?: string;
  20. description?: string;
  21. ip?: string;
  22. port?: number;
  23. };
  24. interface ProductionProcessPageProps {
  25. printerCombo: PrinterCombo[];
  26. }
  27. const STORAGE_KEY = 'productionProcess_selectedMatchingStock';
  28. const ProductionProcessPage: React.FC<ProductionProcessPageProps> = ({ printerCombo }) => {
  29. const [selectedProcessId, setSelectedProcessId] = useState<number | null>(null);
  30. const [selectedMatchingStock, setSelectedMatchingStock] = useState<{
  31. jobOrderId: number;
  32. productProcessId: number;
  33. } | null>(null);
  34. const { data: session } = useSession() as { data: SessionWithTokens | null };
  35. const currentUserId = session?.id ? parseInt(session.id) : undefined;
  36. // 从 sessionStorage 恢复状态(仅在客户端)
  37. useEffect(() => {
  38. if (typeof window !== 'undefined') {
  39. try {
  40. const saved = sessionStorage.getItem(STORAGE_KEY);
  41. if (saved) {
  42. const parsed = JSON.parse(saved);
  43. // 验证数据有效性
  44. if (parsed && typeof parsed.jobOrderId === 'number' && typeof parsed.productProcessId === 'number') {
  45. setSelectedMatchingStock(parsed);
  46. console.log(" Restored selectedMatchingStock from sessionStorage:", parsed);
  47. }
  48. }
  49. } catch (error) {
  50. console.error("Error restoring selectedMatchingStock:", error);
  51. sessionStorage.removeItem(STORAGE_KEY);
  52. }
  53. }
  54. }, []);
  55. // 保存状态到 sessionStorage
  56. useEffect(() => {
  57. if (typeof window !== 'undefined') {
  58. if (selectedMatchingStock) {
  59. sessionStorage.setItem(STORAGE_KEY, JSON.stringify(selectedMatchingStock));
  60. console.log(" Saved selectedMatchingStock to sessionStorage:", selectedMatchingStock);
  61. } else {
  62. sessionStorage.removeItem(STORAGE_KEY);
  63. }
  64. }
  65. }, [selectedMatchingStock]);
  66. // 处理返回列表时清除存储
  67. const handleBackFromSecondScan = useCallback(() => {
  68. setSelectedMatchingStock(null);
  69. if (typeof window !== 'undefined') {
  70. sessionStorage.removeItem(STORAGE_KEY);
  71. }
  72. }, []);
  73. if (selectedMatchingStock) {
  74. return (
  75. <JobPickExecutionsecondscan
  76. filterArgs={{ jobOrderId: selectedMatchingStock.jobOrderId }}
  77. onBack={handleBackFromSecondScan}
  78. />
  79. );
  80. }
  81. if (selectedProcessId !== null) {
  82. return (
  83. <ProductionProcessJobOrderDetail
  84. jobOrderId={selectedProcessId}
  85. onBack={() => setSelectedProcessId(null)}
  86. />
  87. );
  88. }
  89. return (
  90. <ProductionProcessList
  91. printerCombo={printerCombo}
  92. onSelectProcess={(jobOrderId) => {
  93. const id = jobOrderId ?? null;
  94. if (id !== null) {
  95. setSelectedProcessId(id);
  96. }
  97. }}
  98. onSelectMatchingStock={(jobOrderId, productProcessId) => {
  99. setSelectedMatchingStock({
  100. jobOrderId: jobOrderId || 0,
  101. productProcessId: productProcessId || 0
  102. });
  103. }}
  104. />
  105. );
  106. };
  107. export default ProductionProcessPage;