|  |  | 
 |  |  | import { useState, useEffect, useRef, useMemo } from 'react'; | 
 |  |  | import { useFrame } from '@react-three/fiber'; | 
 |  |  | import * as THREE from 'three'; | 
 |  |  | import WebSocketClient from './websocket' | 
 |  |  | import Tunnel from '../components/tunnel'; | 
 |  |  | import Area from '../components/area'; | 
 |  |  | import Shelf from '../components/shelf'; | 
 |  |  | import Box from '../components/box'; | 
 |  |  | import Agv from '../components/agv'; | 
 |  |  |  | 
 |  |  | import tunnelData from '@/assets/data/tunnel'; | 
 |  |  | import areaData from '@/assets/data/area'; | 
 |  |  | import shelfData from '@/assets/data/shelf'; | 
 |  |  | import agvRealDataList from '@/assets/data/agv'; | 
 |  |  | import { getBoxData } from '../api/box'; | 
 |  |  | import { getAgvData } from '../api/agv'; | 
 |  |  | import { INTERVAL_TIME } from '@/config/setting' | 
 |  |  |  | 
 |  |  | let index = 0; | 
 |  |  |  | 
 |  |  | const Warehouse = (props) => { | 
 |  |  |  | 
 |  |  |     const [agvData, setAgvData] = useState([ | 
 |  |  |         {} | 
 |  |  |         , | 
 |  |  |         {} | 
 |  |  |     ]); | 
 |  |  |     const [boxData, setBoxData] = useState([ | 
 |  |  |         {} | 
 |  |  |     ]) | 
 |  |  |     const [agv1Data, setAgv1Data] = useState({}); | 
 |  |  |     const [agv2Data, setAgv2Data] = useState({}); | 
 |  |  |     const [boxData, setBoxData] = useState([]); | 
 |  |  |  | 
 |  |  |     useEffect(() => { | 
 |  |  |         const timer = setInterval(() => { | 
 |  |  |             const agvRealData = agvRealDataList[index]; | 
 |  |  |             if (agvRealData) { | 
 |  |  |                 setAgvData(agvRealData); | 
 |  |  |         const websocket = new WebSocketClient('/ws/digitalTwin/websocket'); | 
 |  |  |         websocket.connect(); | 
 |  |  |         websocket.onMessage = (jsonStr) => { | 
 |  |  |             const data = JSON.parse(jsonStr); | 
 |  |  |             if (data.type === 'agv') { | 
 |  |  |                 switch (data.no) { | 
 |  |  |                     case "1": | 
 |  |  |                         setAgv1Data(data.obj); | 
 |  |  |                         break; | 
 |  |  |                     case "2": | 
 |  |  |                         setAgv2Data(data.obj); | 
 |  |  |                         break; | 
 |  |  |                     default: | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             index++; | 
 |  |  |         }, INTERVAL_TIME * 1.1); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         const timer = setInterval(() => { | 
 |  |  |             getBoxData().then(res => { | 
 |  |  |                 // res.push({ | 
 |  |  |                 //     locNo: "A100301001", | 
 |  |  |                 //     row: 3, | 
 |  |  |                 //     bay: 1, | 
 |  |  |                 //     lev: 1, | 
 |  |  |                 //     locSts: "STOCK", | 
 |  |  |                 // }) | 
 |  |  |                 // console.log(res); | 
 |  |  |                 setBoxData(res); | 
 |  |  |             }) | 
 |  |  |         }, INTERVAL_TIME); | 
 |  |  |  | 
 |  |  |         return () => { | 
 |  |  |             clearInterval(timer); | 
 |  |  |             if (timer) { | 
 |  |  |                 clearInterval(timer); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (websocket) { | 
 |  |  |                 websocket.onMessage = (data) => { } | 
 |  |  |                 websocket.close(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     }, []) | 
 |  |  |  | 
 |  |  | 
 |  |  |         return tunnelData.map((data, index) => <Tunnel key={index} {...data} />) | 
 |  |  |     }, []); | 
 |  |  |  | 
 |  |  |     const areaEl = useMemo(() => { | 
 |  |  |         return areaData.map((area, index) => <Area key={index} {...area} />) | 
 |  |  |     }, []); | 
 |  |  |  | 
 |  |  |     const shelfEl = useMemo(() => { | 
 |  |  |         return shelfData.map((data, index) => <Shelf key={index} {...data} />) | 
 |  |  |     }, []); | 
 |  |  |  | 
 |  |  |     const agvEl = useMemo(() => { | 
 |  |  |         return agvData.map((data, idx) => <Agv key={idx} {...data} />) | 
 |  |  |     }, [agvData]); | 
 |  |  |  | 
 |  |  |     const boxEl = useMemo(() => { | 
 |  |  |         return boxData.map((data, idx) => <Box key={idx} {...data} />) | 
 |  |  |     }, [boxData]); | 
 |  |  |  | 
 |  |  |     const agv1El = useMemo(() => { | 
 |  |  |         return <Agv key={1} {...agv1Data} /> | 
 |  |  |     }, [agv1Data]); | 
 |  |  |  | 
 |  |  |     const agv2El = useMemo(() => { | 
 |  |  |         return <Agv key={2} {...agv2Data} /> | 
 |  |  |     }, [agv2Data]); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     useFrame((state, delta) => { | 
 |  |  |  | 
 |  |  | 
 |  |  |         <> | 
 |  |  |             <group> | 
 |  |  |                 {tunnelEl} | 
 |  |  |                 {areaEl} | 
 |  |  |                 {shelfEl} | 
 |  |  |                 {agvEl} | 
 |  |  |                 {agv1El} | 
 |  |  |                 {agv2El} | 
 |  |  |                 {boxEl} | 
 |  |  |             </group> | 
 |  |  |         </> |