import React, { useState, useRef, useEffect } from 'react'; 
 | 
import * as THREE from 'three' 
 | 
import { Spin, Descriptions, Button } from 'antd'; 
 | 
import { FormattedMessage, useIntl, useModel } from '@umijs/max'; 
 | 
import { LoadingOutlined } from '@ant-design/icons'; 
 | 
import { createStyles } from 'antd-style'; 
 | 
import * as Utils from '../../utils' 
 | 
import Http from '@/utils/http'; 
 | 
import ShelfThree from './shelfThree' 
 | 
  
 | 
const useStyles = createStyles(({ token, css }) => { 
 | 
    return { 
 | 
        infoBox: { 
 | 
            height: '100%', 
 | 
            display: 'flex', 
 | 
            gap: '0px', 
 | 
        }, 
 | 
        threeInfo: { 
 | 
            height: '100%', 
 | 
            width: '60%', 
 | 
        }, 
 | 
        spinWrapper: { 
 | 
            height: '100%', 
 | 
        }, 
 | 
        threeContainer: { 
 | 
            zIndex: 99, 
 | 
            width: '100%', 
 | 
            height: '100%', 
 | 
        }, 
 | 
        tableInfo: { 
 | 
            height: '100%', 
 | 
            width: '40%', 
 | 
            padding: '0 10px 0 15px', 
 | 
            overflow: 'auto', 
 | 
        }, 
 | 
        tableButton: { 
 | 
            width: '100%', 
 | 
            marginBottom: '10px', 
 | 
            fontWeight: 'bold', 
 | 
            letterSpacing: '1px', 
 | 
        } 
 | 
    } 
 | 
}) 
 | 
  
 | 
let shelfThree; 
 | 
  
 | 
const startThree = (dom) => { 
 | 
    shelfThree = new ShelfThree(dom); 
 | 
    shelfThree.startup(); 
 | 
} 
 | 
  
 | 
const endThree = () => { 
 | 
    if (shelfThree) { 
 | 
        shelfThree.destroy(); 
 | 
        shelfThree = null; 
 | 
    } 
 | 
} 
 | 
  
 | 
const fetchShelfInfo = async (locNo) => { 
 | 
    const res = await Http.doGet('/api/map/shelf/info', { locNo: locNo }); 
 | 
    if (res?.data && shelfThree) { 
 | 
        shelfThree.generateMesh((addObject) => { 
 | 
            for (const item of res.data) { 
 | 
                const { row, bay, lev } = Utils.parseLocNo(item.locNo); 
 | 
                // shelf 
 | 
                const shelfMesh = new THREE.Mesh(new THREE.BoxGeometry(100, 40, 100), new THREE.MeshStandardMaterial({ 
 | 
                    color: '#006266', 
 | 
                })); 
 | 
                shelfMesh.name = item.locNo; 
 | 
                shelfMesh.position.set(0, 20 + 100 * (lev - 1), 0); 
 | 
                addObject(shelfMesh) 
 | 
  
 | 
                // pallet 
 | 
                const palletMesh = new THREE.Mesh(new THREE.BoxGeometry(100, 60, 100), new THREE.MeshStandardMaterial({ 
 | 
                    color: '#2c2c54', 
 | 
                })); 
 | 
                palletMesh.name = item.locNo; 
 | 
                palletMesh.position.set(0, 70 + 100 * (lev - 1), 0); 
 | 
                addObject(palletMesh) 
 | 
            } 
 | 
        }); 
 | 
        shelfThree.setNewSelectedMesh(locNo); 
 | 
    } 
 | 
} 
 | 
  
 | 
const ShelfView = (props) => { 
 | 
    const intl = useIntl(); 
 | 
    const { styles } = useStyles(); 
 | 
    const refContainer = useRef(); 
 | 
  
 | 
    const { data, curFloor, curLocNo, setCurLocNo } = props; 
 | 
    const [loading, setLoading] = React.useState(false); 
 | 
  
 | 
    useEffect(() => { 
 | 
        // init curLocNo 
 | 
        const originLocNo = data.no + '-' + curFloor; 
 | 
        setCurLocNo(originLocNo); 
 | 
  
 | 
        endThree(); 
 | 
        setLoading(true); 
 | 
  
 | 
        setTimeout(() => { 
 | 
            startThree(refContainer.current); 
 | 
            shelfThree.handleClick = (objName) => { 
 | 
                setCurLocNo(objName); 
 | 
            }; 
 | 
            fetchShelfInfo(originLocNo); 
 | 
            setLoading(false); 
 | 
        }, 300) 
 | 
  
 | 
        return endThree; 
 | 
    }, [data]); 
 | 
  
 | 
    return ( 
 | 
        <> 
 | 
            <div className={styles.infoBox}> 
 | 
                <div className={`${styles.threeInfo} three-spin`}> 
 | 
                    <Spin 
 | 
                        spinning={loading} 
 | 
                        indicator={<LoadingOutlined spin />} 
 | 
                        size={'large'} 
 | 
                        wrapperClassName={styles.spinWrapper} 
 | 
                    > 
 | 
                        <div ref={refContainer} className={styles.threeContainer}></div> 
 | 
                    </Spin> 
 | 
                </div> 
 | 
                <div className={styles.tableInfo}> 
 | 
                    <Descriptions 
 | 
                        bordered 
 | 
                        layout="vertical" 
 | 
                        column={1} 
 | 
                        items={ 
 | 
                            [ 
 | 
                                { 
 | 
                                    key: '1', 
 | 
                                    label: intl.formatMessage({ id: 'map.loc.no', defaultMessage: '库位号' }), 
 | 
                                    children: curLocNo, 
 | 
                                }, 
 | 
                                { 
 | 
                                    key: '2', 
 | 
                                    label: intl.formatMessage({ id: 'map.pallet.barcode', defaultMessage: '托盘条码' }), 
 | 
                                    children: '80000010', 
 | 
                                }, 
 | 
                                { 
 | 
                                    key: '3', 
 | 
                                    label: intl.formatMessage({ id: 'map.is.enable', defaultMessage: '是否启用' }), 
 | 
                                    children: 'Disabled', 
 | 
                                }, 
 | 
                                { 
 | 
                                    key: '4', 
 | 
                                    label: intl.formatMessage({ id: 'map.loc.operation', defaultMessage: '库位操作' }), 
 | 
                                    children: ( 
 | 
                                        <> 
 | 
                                            <Button className={styles.tableButton} size='large' type="primary" danger> 
 | 
                                                <FormattedMessage id='map.loc.lock' defaultMessage='锁定' /> 
 | 
                                            </Button> 
 | 
                                            <Button className={styles.tableButton} size='large' disabled> 
 | 
                                                <FormattedMessage id='map.loc.unlock' defaultMessage='解锁' /> 
 | 
                                            </Button> 
 | 
                                            <Button className={styles.tableButton} size='large'> 
 | 
                                                <FormattedMessage id='map.loc.reset' defaultMessage='清除库位' /> 
 | 
                                            </Button> 
 | 
                                        </> 
 | 
                                    ) 
 | 
                                }, 
 | 
                            ] 
 | 
                        } 
 | 
                    /> 
 | 
                </div> 
 | 
            </div> 
 | 
        </> 
 | 
    ) 
 | 
} 
 | 
  
 | 
export default ShelfView; 
 |