From 06a9757c727c6bc15595d5f56a0e309077025741 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期三, 17 四月 2024 09:22:14 +0800
Subject: [PATCH] Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasLift.java                         |  250 +++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java           |    5 
 zy-asrs-flow/src/pages/core/shuttleStandby/components/edit.jsx                             |  178 +++
 zy-asrs-wcs/src/main/java/basLift.sql                                                      |    9 
 zy-asrs-flow/src/pages/core/basLift/index.jsx                                              |  468 +++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/BasLiftService.java                 |    8 
 zy-asrs-wcs/src/main/resources/mapper/core/ShuttleStandbyMapper.xml                        |    5 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/asrs/controller/FlowController.java              |    9 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java                      |    2 
 zy-asrs-flow/src/components/Flow/GraphTools.jsx                                            |   34 
 zy-asrs-flow/src/pages/core/shuttleStandby/index.jsx                                       |  493 ++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/BasLiftMapper.java                   |   12 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/ShuttleStandbyServiceImpl.java |   12 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java                      |  140 +-
 zy-asrs-wcs/src/main/resources/mapper/core/BasLiftMapper.xml                               |    5 
 zy-asrs-flow/src/pages/core/basLift/components/edit.jsx                                    |  176 +++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java                  |  444 +++++----
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java                    |    2 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java           |    5 
 zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml                                  |    9 
 zy-asrs-wcs/src/main/java/shuttleStandby.sql                                               |    9 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/ShuttleStandbyService.java          |    8 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/ShuttleStandby.java                  |  246 +++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasLiftController.java           |  101 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/BasLiftServiceImpl.java        |   12 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java                            |  122 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/ShuttleStandbyMapper.java            |   12 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/ShuttleStandbyController.java    |  101 ++
 28 files changed, 2,594 insertions(+), 283 deletions(-)

diff --git a/zy-asrs-flow/src/components/Flow/GraphTools.jsx b/zy-asrs-flow/src/components/Flow/GraphTools.jsx
index 701fdec..dddb705 100644
--- a/zy-asrs-flow/src/components/Flow/GraphTools.jsx
+++ b/zy-asrs-flow/src/components/Flow/GraphTools.jsx
@@ -6,6 +6,7 @@
 import { exportDataToServer, getFlowList, deleteFlowById, updateFlowStatus, mockRun } from "../../services/flow/api";
 import './css/GraphTools.less'
 import { flow, remove } from "lodash";
+import { find } from "lodash";
 
 export const GraphTools = ({ graphRef, isReady }) => {
 
@@ -109,6 +110,8 @@
             }
 
             let result = sortNodes(rootNode, nodes, graph);
+            let targetResult = setResult(edges, result)
+            console.log(targetResult);
             exportDataToServer({
                 originData: JSON.stringify(data),
                 data: result,
@@ -176,6 +179,37 @@
         return cpValues;
     }
 
+    const setResult = (edges, result) => {
+        console.log(edges, result);
+        result.forEach((item) => {
+            let find = findEdge(edges, item.id)
+
+            item.nextTrue = "";
+            item.nextFalse = "";
+
+            find.forEach((edge) => {
+                if (edge.data.logicBool == true) {
+                    item.nextTrue = edge.target.cell;
+                } else {
+                    item.nextFalse = edge.target.cell;
+                }
+            })
+        })
+
+        return result;
+    }
+
+    const findEdge = (edges, parentId) => {
+        let list = [];
+        edges.forEach((edge) => {
+            if (edge.source.cell == parentId) {
+                list.push(edge);
+            }
+        })
+
+        return list;
+    }
+
     const transCode = (rootNode, nodes, graph) => {
         let codeContent = "";
 
diff --git a/zy-asrs-flow/src/pages/core/basLift/components/edit.jsx b/zy-asrs-flow/src/pages/core/basLift/components/edit.jsx
new file mode 100644
index 0000000..efabcc4
--- /dev/null
+++ b/zy-asrs-flow/src/pages/core/basLift/components/edit.jsx
@@ -0,0 +1,176 @@
+import React, { useState, useRef, useEffect } from 'react';
+import {
+    ProForm,
+    ProFormDigit,
+    ProFormText,
+    ProFormSelect,
+    ProFormDateTimePicker
+} from '@ant-design/pro-components';
+import { Form, Modal } from 'antd';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import moment from 'moment';
+import Http from '@/utils/http';
+
+const Edit = (props) => {
+    const intl = useIntl();
+    const [form] = Form.useForm();
+    const { } = props;
+
+    useEffect(() => {
+        form.resetFields();
+        form.setFieldsValue({
+            ...props.values
+        })
+    }, [form, props])
+
+    const handleCancel = () => {
+        props.onCancel();
+    };
+
+    const handleOk = () => {
+        form.submit();
+    }
+
+    const handleFinish = async (values) => {
+        props.onSubmit({ ...values });
+    }
+
+    return (
+        <>
+            <Modal
+                title={
+                    Object.keys(props.values).length > 0
+                        ? intl.formatMessage({ id: 'page.edit', defaultMessage: '缂栬緫' })
+                        : intl.formatMessage({ id: 'page.add', defaultMessage: '娣诲姞' })
+                }
+                width={640}
+                forceRender
+                destroyOnClose
+                open={props.open}
+                onCancel={handleCancel}
+                onOk={handleOk}
+            >
+                <ProForm
+                    form={form}
+                    submitter={false}
+                    onFinish={handleFinish}
+                    layout="horizontal"
+                    grid={true}
+                >
+                    <ProFormDigit
+                        name="id"
+                        disabled
+                        hidden={true}
+                    />
+                    <ProForm.Group>
+                        <ProFormSelect
+                            name="deviceId"
+                            label="璁惧id"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                            showSearch
+                            debounceTime={300}
+                            request={async ({ keyWords }) => {
+                                const resp = await Http.doPostForm('api/device/query', { condition: keyWords });
+                                return resp.data;
+                            }}
+                        />
+                        <ProFormDigit
+                            name="liftNo"
+                            label="鎻愬崌鏈哄彿"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                            rules={[{ required: true }]}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormDigit
+                            name="status"
+                            label="褰撳墠浠诲姟鐘舵��"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                        />
+                        <ProFormDigit
+                            name="taskNo"
+                            label="浠诲姟鍙�"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormSelect
+                            name="updateBy"
+                            label="淇敼浜哄憳"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                            showSearch
+                            debounceTime={300}
+                            request={async ({ keyWords }) => {
+                                const resp = await Http.doPostForm('api/user/query', { condition: keyWords });
+                                return resp.data;
+                            }}
+                        />
+                        <ProFormSelect
+                            name="createBy"
+                            label="鍒涘缓浜哄憳"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                            showSearch
+                            debounceTime={300}
+                            request={async ({ keyWords }) => {
+                                const resp = await Http.doPostForm('api/user/query', { condition: keyWords });
+                                return resp.data;
+                            }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormDateTimePicker
+                            name="createTime"
+                            label="鍒涘缓鏃堕棿"
+                            colProps={{ md: 12, xl: 12 }}
+                            transform={(value) => moment(value).toISOString()}
+                        />
+                        <ProFormDateTimePicker
+                            name="updateTime"
+                            label="淇敼鏃堕棿"
+                            colProps={{ md: 12, xl: 12 }}
+                            transform={(value) => moment(value).toISOString()}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormText
+                            name="memo"
+                            label="澶囨敞"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                        <ProFormDigit
+                            name="pakMk"
+                            label="浣滀笟鏍囪"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormText
+                            name="protocol"
+                            label="璁惧鐘舵��"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                        <ProFormSelect
+                            name="transfer"
+                            label="灏忚溅鏄惁鍙崲灞�"
+                            colProps={{ md: 12, xl: 12 }}
+                            options={[
+                                { label: '鍚�', value: 0 },
+                                { label: '鏄�', value: 1 },
+                            ]}
+                        />
+                    </ProForm.Group>
+
+                </ProForm>
+            </Modal>
+        </>
+    )
+}
+
+export default Edit;
diff --git a/zy-asrs-flow/src/pages/core/basLift/index.jsx b/zy-asrs-flow/src/pages/core/basLift/index.jsx
new file mode 100644
index 0000000..e382d1c
--- /dev/null
+++ b/zy-asrs-flow/src/pages/core/basLift/index.jsx
@@ -0,0 +1,468 @@
+
+import React, { useState, useRef, useEffect } from 'react';
+import { Button, message, Modal, Tag  } from 'antd';
+import {
+    FooterToolbar,
+    PageContainer,
+    ProTable,
+    LightFilter,
+} from '@ant-design/pro-components';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import { PlusOutlined, ExportOutlined } from '@ant-design/icons';
+import Http from '@/utils/http';
+import Edit from './components/edit'
+import { TextFilter, SelectFilter, DatetimeRangeFilter, LinkFilter } from '@/components/TableSearch'
+import { statusMap } from '@/utils/enum-util'
+import { repairBug } from '@/utils/common-util';
+
+const TABLE_KEY = 'pro-table-basLift';
+
+const handleSave = async (val, intl) => {
+    const hide = message.loading(intl.formatMessage({ id: 'page.adding', defaultMessage: '姝e湪娣诲姞' }));
+    try {
+        const resp = await Http.doPost('api/basLift/save', val);
+        if (resp.code === 200) {
+            message.success(intl.formatMessage({ id: 'page.add.success', defaultMessage: '娣诲姞鎴愬姛' }));
+            return true;
+        } else {
+            message.error(resp.msg);
+            return false;
+        }
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.add.fail', defaultMessage: '娣诲姞澶辫触璇烽噸璇曪紒' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+const handleUpdate = async (val, intl) => {
+    const hide = message.loading(intl.formatMessage({ id: 'page.updating', defaultMessage: '姝e湪鏇存柊' }));
+    try {
+        const resp = await Http.doPost('api/basLift/update', val);
+        if (resp.code === 200) {
+            message.success(intl.formatMessage({ id: 'page.update.success', defaultMessage: '鏇存柊鎴愬姛' }));
+            return true;
+        } else {
+            message.error(resp.msg);
+            return false;
+        }
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.update.fail', defaultMessage: '鏇存柊澶辫触璇烽噸璇曪紒' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+const handleRemove = async (rows, intl) => {
+    if (!rows) return true;
+    const hide = message.loading(intl.formatMessage({ id: 'page.deleting', defaultMessage: '姝e湪鍒犻櫎' }));
+    try {
+        const resp = await Http.doPost('api/basLift/remove/' + rows.map((row) => row.id).join(','));
+        if (resp.code === 200) {
+            message.success(intl.formatMessage({ id: 'page.delete.success', defaultMessage: '鍒犻櫎鎴愬姛' }));
+            return true;
+        } else {
+            message.error(resp.msg);
+            return false;
+        }
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.delete.fail', defaultMessage: '鍒犻櫎澶辫触锛岃閲嶈瘯锛�' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+const handleExport = async (intl) => {
+    const hide = message.loading(intl.formatMessage({ id: 'page.exporting', defaultMessage: '姝e湪瀵煎嚭' }));
+    try {
+        const resp = await Http.doPostBlob('api/basLift/export');
+        const blob = new Blob([resp], { type: 'application/vnd.ms-excel' });
+        window.location.href = window.URL.createObjectURL(blob);
+        message.success(intl.formatMessage({ id: 'page.export.success', defaultMessage: '瀵煎嚭鎴愬姛' }));
+        return true;
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.export.fail', defaultMessage: '瀵煎嚭澶辫触锛岃閲嶈瘯' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+
+const Main = () => {
+    const intl = useIntl();
+    const formTableRef = useRef();
+    const actionRef = useRef();
+    const [selectedRows, setSelectedRows] = useState([]);
+    const [modalVisible, setModalVisible] = useState(false);
+    const [currentRow, setCurrentRow] = useState();
+    const [searchParam, setSearchParam] = useState({});
+
+    useEffect(() => {
+
+    }, []);
+
+    const columns = [
+        {
+            title: intl.formatMessage({
+                id: 'page.table.no',
+                defaultMessage: 'No'
+            }),
+            dataIndex: 'index',
+            valueType: 'indexBorder',
+            width: 48,
+        },
+        {
+            title: '璁惧id',
+            dataIndex: 'deviceId$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <LinkFilter
+                name='deviceId'
+                major='device'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '鎻愬崌鏈哄彿',
+            dataIndex: 'liftNo',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            copyable: true,
+            filterDropdown: (props) => <TextFilter
+                name='liftNo'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '褰撳墠浠诲姟鐘舵��',
+            dataIndex: 'status',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='status'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '浠诲姟鍙�',
+            dataIndex: 'taskNo',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='taskNo'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '淇敼浜哄憳',
+            dataIndex: 'updateBy$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <LinkFilter
+                name='updateBy'
+                major='user'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '鍒涘缓浜哄憳',
+            dataIndex: 'createBy$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <LinkFilter
+                name='createBy'
+                major='user'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '鍒涘缓鏃堕棿',
+            dataIndex: 'createTime$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <DatetimeRangeFilter
+                name='createTime'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '淇敼鏃堕棿',
+            dataIndex: 'updateTime$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <DatetimeRangeFilter
+                name='updateTime'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '澶囨敞',
+            dataIndex: 'memo',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='memo'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '浣滀笟鏍囪',
+            dataIndex: 'pakMk',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='pakMk'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '璁惧鐘舵��',
+            dataIndex: 'protocol',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='protocol'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '灏忚溅鏄惁鍙崲灞�',
+            dataIndex: 'transfer$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <SelectFilter
+                name='transfer'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+                data={[
+                    { label: '鍚�', value: 0 },
+                    { label: '鏄�', value: 1 },
+                ]}
+            />,
+        },
+
+        {
+            title: '鎿嶄綔',
+            dataIndex: 'option',
+            width: 140,
+            valueType: 'option',
+            render: (_, record) => [
+                <Button
+                    type="link"
+                    key="edit"
+                    onClick={() => {
+                        setModalVisible(true);
+                        setCurrentRow(record);
+                    }}
+                >
+                    <FormattedMessage id='page.edit' defaultMessage='缂栬緫' />
+                </Button>,
+                <Button
+                    type="link"
+                    danger
+                    key="batchRemove"
+                    onClick={async () => {
+                        Modal.confirm({
+                            title: intl.formatMessage({ id: 'page.delete', defaultMessage: '鍒犻櫎' }),
+                            content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '纭畾鍒犻櫎璇ラ」鍚楋紵' }),
+                            onOk: async () => {
+                                const success = await handleRemove([record], intl);
+                                if (success) {
+                                    if (actionRef.current) {
+                                        actionRef.current.reload();
+                                    }
+                                }
+                            },
+                        });
+                    }}
+                >
+                    <FormattedMessage id='page.delete' defaultMessage='鍒犻櫎' />
+                </Button>,
+            ],
+        },
+    ];
+
+    return (
+        <PageContainer
+            header={{
+                breadcrumb: {},
+            }}
+        >
+            <div style={{ width: '100%', float: 'right' }}>
+                <ProTable
+                    key="basLift"
+                    rowKey="id"
+                    actionRef={actionRef}
+                    formRef={formTableRef}
+                    columns={columns}
+                    cardBordered
+                    scroll={{ x: 1300 }}
+                    dateFormatter="string"
+                    pagination={{ pageSize: 16 }}
+                    search={false}
+                    toolbar={{
+                        search: {
+                            onSearch: (value) => {
+                                setSearchParam(prevState => ({
+                                    ...prevState,
+                                    condition: value
+                                }));
+                                actionRef.current?.reload();
+                            },
+                        },
+                        filter: (
+                            <LightFilter
+                                onValuesChange={(val) => {
+                                }}
+                            >
+                            </LightFilter>
+                        ),
+                        actions: [
+                            <Button
+                                type="primary"
+                                key="save"
+                                onClick={async () => {
+                                    setModalVisible(true)
+                                }}
+                            >
+                                <PlusOutlined />
+                                <FormattedMessage id='page.add' defaultMessage='娣诲姞' />
+                            </Button>,
+                            <Button
+                                key="export"
+                                onClick={async () => {
+                                    handleExport(intl);
+                                }}
+                            >
+                                <ExportOutlined />
+                                <FormattedMessage id='page.export' defaultMessage='瀵煎嚭' />
+                            </Button>,
+                        ],
+                    }}
+                    request={(params, sorter, filter) =>
+                        Http.doPostPromise('/api/basLift/page', { ...params, ...searchParam }, (res) => {
+                            return {
+                                data: res.data.records,
+                                total: res.data.total,
+                                success: true,
+                            }
+                        })
+                    }
+                    rowSelection={{
+                        onChange: (ids, rows) => {
+                            setSelectedRows(rows);
+                        }
+                    }}
+                    columnsState={{
+                        persistenceKey: TABLE_KEY,
+                        persistenceType: 'localStorage',
+                        defaultValue: {
+                            // memo: { show: repairBug(TABLE_KEY, 'memo', false) },
+                            option: { fixed: 'right', disable: true },
+                        },
+                        onChange(value) {
+                        },
+                    }}
+                />
+            </div>
+
+            {selectedRows?.length > 0 && (
+                <FooterToolbar
+                    extra={
+                        <div>
+                            <a style={{ fontWeight: 600 }}>{selectedRows.length}</a>
+                            <FormattedMessage id='page.selected' defaultMessage=' 椤瑰凡閫夋嫨' />
+                        </div>
+                    }
+                >
+                    <Button
+                        key="remove"
+                        danger
+                        onClick={async () => {
+                            Modal.confirm({
+                                title: intl.formatMessage({ id: 'page.delete', defaultMessage: '鍒犻櫎' }),
+                                content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '纭畾鍒犻櫎璇ラ」鍚楋紵' }),
+                                onOk: async () => {
+                                    const success = await handleRemove(selectedRows, intl);
+                                    if (success) {
+                                        setSelectedRows([]);
+                                        actionRef.current?.reloadAndRest?.();
+                                    }
+                                },
+                            });
+                        }}
+                    >
+                        <FormattedMessage id='page.delete.batch' defaultMessage='鎵归噺鍒犻櫎' />
+                    </Button>
+                </FooterToolbar>
+            )}
+
+            <Edit
+                open={modalVisible}
+                values={currentRow || {}}
+                onCancel={
+                    () => {
+                        setModalVisible(false);
+                        setCurrentRow(undefined);
+                    }
+                }
+                onSubmit={async (values) => {
+                    let ok = false;
+                    if (values.id) {
+                        ok = await handleUpdate({ ...values }, intl)
+                    } else {
+                        ok = await handleSave({ ...values }, intl)
+                    }
+                    if (ok) {
+                        setModalVisible(false);
+                        setCurrentRow(undefined);
+                        if (actionRef.current) {
+                            actionRef.current.reload();
+                        }
+                    }
+                }}
+            />
+        </PageContainer>
+    );
+};
+
+export default Main;
diff --git a/zy-asrs-flow/src/pages/core/shuttleStandby/components/edit.jsx b/zy-asrs-flow/src/pages/core/shuttleStandby/components/edit.jsx
new file mode 100644
index 0000000..acc8c14
--- /dev/null
+++ b/zy-asrs-flow/src/pages/core/shuttleStandby/components/edit.jsx
@@ -0,0 +1,178 @@
+import React, { useState, useRef, useEffect } from 'react';
+import {
+    ProForm,
+    ProFormDigit,
+    ProFormText,
+    ProFormSelect,
+    ProFormDateTimePicker
+} from '@ant-design/pro-components';
+import { Form, Modal } from 'antd';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import moment from 'moment';
+import Http from '@/utils/http';
+
+const Edit = (props) => {
+    const intl = useIntl();
+    const [form] = Form.useForm();
+    const { } = props;
+
+    useEffect(() => {
+        form.resetFields();
+        form.setFieldsValue({
+            ...props.values
+        })
+    }, [form, props])
+
+    const handleCancel = () => {
+        props.onCancel();
+    };
+
+    const handleOk = () => {
+        form.submit();
+    }
+
+    const handleFinish = async (values) => {
+        props.onSubmit({ ...values });
+    }
+
+    return (
+        <>
+            <Modal
+                title={
+                    Object.keys(props.values).length > 0
+                        ? intl.formatMessage({ id: 'page.edit', defaultMessage: '缂栬緫' })
+                        : intl.formatMessage({ id: 'page.add', defaultMessage: '娣诲姞' })
+                }
+                width={640}
+                forceRender
+                destroyOnClose
+                open={props.open}
+                onCancel={handleCancel}
+                onOk={handleOk}
+            >
+                <ProForm
+                    form={form}
+                    submitter={false}
+                    onFinish={handleFinish}
+                    layout="horizontal"
+                    grid={true}
+                >
+                    <ProFormDigit
+                        name="id"
+                        disabled
+                        hidden={true}
+                    />
+                    <ProForm.Group>
+                        <ProFormText
+                            name="uuid"
+                            label="缂栧彿"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                        <ProFormText
+                            name="name"
+                            label="鍚嶇О"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormText
+                            name="flag"
+                            label="鏍囪瘑"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                        <ProFormSelect
+                            name="status"
+                            label="鐘舵��"
+                            colProps={{ md: 12, xl: 12 }}
+                            options={[
+                                { label: '姝e父', value: 1 },
+                                { label: '绂佺敤', value: 0 },
+                            ]}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormDateTimePicker
+                            name="createTime"
+                            label="娣诲姞鏃堕棿"
+                            colProps={{ md: 12, xl: 12 }}
+                            transform={(value) => moment(value).toISOString()}
+                        />
+                        <ProFormSelect
+                            name="createBy"
+                            label="娣诲姞浜哄憳"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                            showSearch
+                            debounceTime={300}
+                            request={async ({ keyWords }) => {
+                                const resp = await Http.doPostForm('api/user/query', { condition: keyWords });
+                                return resp.data;
+                            }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormDateTimePicker
+                            name="updateTime"
+                            label="淇敼鏃堕棿"
+                            colProps={{ md: 12, xl: 12 }}
+                            transform={(value) => moment(value).toISOString()}
+                        />
+                        <ProFormSelect
+                            name="updateBy"
+                            label="淇敼浜哄憳"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                            showSearch
+                            debounceTime={300}
+                            request={async ({ keyWords }) => {
+                                const resp = await Http.doPostForm('api/user/query', { condition: keyWords });
+                                return resp.data;
+                            }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormText
+                            name="memo"
+                            label="澶囨敞"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                        <ProFormDigit
+                            name="deviceId"
+                            label="璁惧鍙�"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormDigit
+                            name="deviceLev"
+                            label="璁惧妤煎眰妤煎眰"
+                            colProps={{ md: 12, xl: 12 }}
+                            fieldProps={{ precision: 0 }}
+                        />
+                        <ProFormText
+                            name="deviceLoc"
+                            label="璁惧搴撲綅鍙�"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                    </ProForm.Group>
+                    <ProForm.Group>
+                        <ProFormText
+                            name="deviceStandbyLoc"
+                            label="璁惧寰呮満浣嶅簱浣嶅彿"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                        <ProFormText
+                            name="standbyLoc"
+                            label="寰呮満浣嶅簱浣嶅彿"
+                            colProps={{ md: 12, xl: 12 }}
+                        />
+                    </ProForm.Group>
+
+                </ProForm>
+            </Modal>
+        </>
+    )
+}
+
+export default Edit;
diff --git a/zy-asrs-flow/src/pages/core/shuttleStandby/index.jsx b/zy-asrs-flow/src/pages/core/shuttleStandby/index.jsx
new file mode 100644
index 0000000..501e154
--- /dev/null
+++ b/zy-asrs-flow/src/pages/core/shuttleStandby/index.jsx
@@ -0,0 +1,493 @@
+
+import React, { useState, useRef, useEffect } from 'react';
+import { Button, message, Modal, Tag  } from 'antd';
+import {
+    FooterToolbar,
+    PageContainer,
+    ProTable,
+    LightFilter,
+} from '@ant-design/pro-components';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import { PlusOutlined, ExportOutlined } from '@ant-design/icons';
+import Http from '@/utils/http';
+import Edit from './components/edit'
+import { TextFilter, SelectFilter, DatetimeRangeFilter, LinkFilter } from '@/components/TableSearch'
+import { statusMap } from '@/utils/enum-util'
+import { repairBug } from '@/utils/common-util';
+
+const TABLE_KEY = 'pro-table-shuttleStandby';
+
+const handleSave = async (val, intl) => {
+    const hide = message.loading(intl.formatMessage({ id: 'page.adding', defaultMessage: '姝e湪娣诲姞' }));
+    try {
+        const resp = await Http.doPost('api/shuttleStandby/save', val);
+        if (resp.code === 200) {
+            message.success(intl.formatMessage({ id: 'page.add.success', defaultMessage: '娣诲姞鎴愬姛' }));
+            return true;
+        } else {
+            message.error(resp.msg);
+            return false;
+        }
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.add.fail', defaultMessage: '娣诲姞澶辫触璇烽噸璇曪紒' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+const handleUpdate = async (val, intl) => {
+    const hide = message.loading(intl.formatMessage({ id: 'page.updating', defaultMessage: '姝e湪鏇存柊' }));
+    try {
+        const resp = await Http.doPost('api/shuttleStandby/update', val);
+        if (resp.code === 200) {
+            message.success(intl.formatMessage({ id: 'page.update.success', defaultMessage: '鏇存柊鎴愬姛' }));
+            return true;
+        } else {
+            message.error(resp.msg);
+            return false;
+        }
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.update.fail', defaultMessage: '鏇存柊澶辫触璇烽噸璇曪紒' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+const handleRemove = async (rows, intl) => {
+    if (!rows) return true;
+    const hide = message.loading(intl.formatMessage({ id: 'page.deleting', defaultMessage: '姝e湪鍒犻櫎' }));
+    try {
+        const resp = await Http.doPost('api/shuttleStandby/remove/' + rows.map((row) => row.id).join(','));
+        if (resp.code === 200) {
+            message.success(intl.formatMessage({ id: 'page.delete.success', defaultMessage: '鍒犻櫎鎴愬姛' }));
+            return true;
+        } else {
+            message.error(resp.msg);
+            return false;
+        }
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.delete.fail', defaultMessage: '鍒犻櫎澶辫触锛岃閲嶈瘯锛�' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+const handleExport = async (intl) => {
+    const hide = message.loading(intl.formatMessage({ id: 'page.exporting', defaultMessage: '姝e湪瀵煎嚭' }));
+    try {
+        const resp = await Http.doPostBlob('api/shuttleStandby/export');
+        const blob = new Blob([resp], { type: 'application/vnd.ms-excel' });
+        window.location.href = window.URL.createObjectURL(blob);
+        message.success(intl.formatMessage({ id: 'page.export.success', defaultMessage: '瀵煎嚭鎴愬姛' }));
+        return true;
+    } catch (error) {
+        message.error(intl.formatMessage({ id: 'page.export.fail', defaultMessage: '瀵煎嚭澶辫触锛岃閲嶈瘯' }));
+        return false;
+    } finally {
+        hide();
+    }
+};
+
+
+const Main = () => {
+    const intl = useIntl();
+    const formTableRef = useRef();
+    const actionRef = useRef();
+    const [selectedRows, setSelectedRows] = useState([]);
+    const [modalVisible, setModalVisible] = useState(false);
+    const [currentRow, setCurrentRow] = useState();
+    const [searchParam, setSearchParam] = useState({});
+
+    useEffect(() => {
+
+    }, []);
+
+    const columns = [
+        {
+            title: intl.formatMessage({
+                id: 'page.table.no',
+                defaultMessage: 'No'
+            }),
+            dataIndex: 'index',
+            valueType: 'indexBorder',
+            width: 48,
+        },
+        {
+            title: '缂栧彿',
+            dataIndex: 'uuid',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='uuid'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '鍚嶇О',
+            dataIndex: 'name',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            copyable: true,
+            filterDropdown: (props) => <TextFilter
+                name='name'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '鏍囪瘑',
+            dataIndex: 'flag',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='flag'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '鐘舵��',
+            dataIndex: 'status$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <SelectFilter
+                name='status'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+                data={[
+                    { label: '姝e父', value: 1 },
+                    { label: '绂佺敤', value: 0 },
+                ]}
+            />,
+        },
+        {
+            title: '娣诲姞鏃堕棿',
+            dataIndex: 'createTime$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <DatetimeRangeFilter
+                name='createTime'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '娣诲姞浜哄憳',
+            dataIndex: 'createBy$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <LinkFilter
+                name='createBy'
+                major='user'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '淇敼鏃堕棿',
+            dataIndex: 'updateTime$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <DatetimeRangeFilter
+                name='updateTime'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '淇敼浜哄憳',
+            dataIndex: 'updateBy$',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <LinkFilter
+                name='updateBy'
+                major='user'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '澶囨敞',
+            dataIndex: 'memo',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='memo'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '璁惧鍙�',
+            dataIndex: 'deviceId',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='deviceId'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '璁惧妤煎眰妤煎眰',
+            dataIndex: 'deviceLev',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='deviceLev'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '璁惧搴撲綅鍙�',
+            dataIndex: 'deviceLoc',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='deviceLoc'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '璁惧寰呮満浣嶅簱浣嶅彿',
+            dataIndex: 'deviceStandbyLoc',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='deviceStandbyLoc'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+        {
+            title: '寰呮満浣嶅簱浣嶅彿',
+            dataIndex: 'standbyLoc',
+            valueType: 'text',
+            hidden: false,
+            width: 140,
+            filterDropdown: (props) => <TextFilter
+                name='standbyLoc'
+                {...props}
+                actionRef={actionRef}
+                setSearchParam={setSearchParam}
+            />,
+        },
+
+        {
+            title: '鎿嶄綔',
+            dataIndex: 'option',
+            width: 140,
+            valueType: 'option',
+            render: (_, record) => [
+                <Button
+                    type="link"
+                    key="edit"
+                    onClick={() => {
+                        setModalVisible(true);
+                        setCurrentRow(record);
+                    }}
+                >
+                    <FormattedMessage id='page.edit' defaultMessage='缂栬緫' />
+                </Button>,
+                <Button
+                    type="link"
+                    danger
+                    key="batchRemove"
+                    onClick={async () => {
+                        Modal.confirm({
+                            title: intl.formatMessage({ id: 'page.delete', defaultMessage: '鍒犻櫎' }),
+                            content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '纭畾鍒犻櫎璇ラ」鍚楋紵' }),
+                            onOk: async () => {
+                                const success = await handleRemove([record], intl);
+                                if (success) {
+                                    if (actionRef.current) {
+                                        actionRef.current.reload();
+                                    }
+                                }
+                            },
+                        });
+                    }}
+                >
+                    <FormattedMessage id='page.delete' defaultMessage='鍒犻櫎' />
+                </Button>,
+            ],
+        },
+    ];
+
+    return (
+        <PageContainer
+            header={{
+                breadcrumb: {},
+            }}
+        >
+            <div style={{ width: '100%', float: 'right' }}>
+                <ProTable
+                    key="shuttleStandby"
+                    rowKey="id"
+                    actionRef={actionRef}
+                    formRef={formTableRef}
+                    columns={columns}
+                    cardBordered
+                    scroll={{ x: 1300 }}
+                    dateFormatter="string"
+                    pagination={{ pageSize: 16 }}
+                    search={false}
+                    toolbar={{
+                        search: {
+                            onSearch: (value) => {
+                                setSearchParam(prevState => ({
+                                    ...prevState,
+                                    condition: value
+                                }));
+                                actionRef.current?.reload();
+                            },
+                        },
+                        filter: (
+                            <LightFilter
+                                onValuesChange={(val) => {
+                                }}
+                            >
+                            </LightFilter>
+                        ),
+                        actions: [
+                            <Button
+                                type="primary"
+                                key="save"
+                                onClick={async () => {
+                                    setModalVisible(true)
+                                }}
+                            >
+                                <PlusOutlined />
+                                <FormattedMessage id='page.add' defaultMessage='娣诲姞' />
+                            </Button>,
+                            <Button
+                                key="export"
+                                onClick={async () => {
+                                    handleExport(intl);
+                                }}
+                            >
+                                <ExportOutlined />
+                                <FormattedMessage id='page.export' defaultMessage='瀵煎嚭' />
+                            </Button>,
+                        ],
+                    }}
+                    request={(params, sorter, filter) =>
+                        Http.doPostPromise('/api/shuttleStandby/page', { ...params, ...searchParam }, (res) => {
+                            return {
+                                data: res.data.records,
+                                total: res.data.total,
+                                success: true,
+                            }
+                        })
+                    }
+                    rowSelection={{
+                        onChange: (ids, rows) => {
+                            setSelectedRows(rows);
+                        }
+                    }}
+                    columnsState={{
+                        persistenceKey: TABLE_KEY,
+                        persistenceType: 'localStorage',
+                        defaultValue: {
+                            // memo: { show: repairBug(TABLE_KEY, 'memo', false) },
+                            option: { fixed: 'right', disable: true },
+                        },
+                        onChange(value) {
+                        },
+                    }}
+                />
+            </div>
+
+            {selectedRows?.length > 0 && (
+                <FooterToolbar
+                    extra={
+                        <div>
+                            <a style={{ fontWeight: 600 }}>{selectedRows.length}</a>
+                            <FormattedMessage id='page.selected' defaultMessage=' 椤瑰凡閫夋嫨' />
+                        </div>
+                    }
+                >
+                    <Button
+                        key="remove"
+                        danger
+                        onClick={async () => {
+                            Modal.confirm({
+                                title: intl.formatMessage({ id: 'page.delete', defaultMessage: '鍒犻櫎' }),
+                                content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '纭畾鍒犻櫎璇ラ」鍚楋紵' }),
+                                onOk: async () => {
+                                    const success = await handleRemove(selectedRows, intl);
+                                    if (success) {
+                                        setSelectedRows([]);
+                                        actionRef.current?.reloadAndRest?.();
+                                    }
+                                },
+                            });
+                        }}
+                    >
+                        <FormattedMessage id='page.delete.batch' defaultMessage='鎵归噺鍒犻櫎' />
+                    </Button>
+                </FooterToolbar>
+            )}
+
+            <Edit
+                open={modalVisible}
+                values={currentRow || {}}
+                onCancel={
+                    () => {
+                        setModalVisible(false);
+                        setCurrentRow(undefined);
+                    }
+                }
+                onSubmit={async (values) => {
+                    let ok = false;
+                    if (values.id) {
+                        ok = await handleUpdate({ ...values }, intl)
+                    } else {
+                        ok = await handleSave({ ...values }, intl)
+                    }
+                    if (ok) {
+                        setModalVisible(false);
+                        setCurrentRow(undefined);
+                        if (actionRef.current) {
+                            actionRef.current.reload();
+                        }
+                    }
+                }}
+            />
+        </PageContainer>
+    );
+};
+
+export default Main;
diff --git a/zy-asrs-wcs/src/main/java/basLift.sql b/zy-asrs-wcs/src/main/java/basLift.sql
new file mode 100644
index 0000000..884b978
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/basLift.sql
@@ -0,0 +1,9 @@
+-- save basLift record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '鎻愬崌鏈哄垪琛ㄧ鐞�', '0', '/core/basLift', '/core/basLift', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ鎻愬崌鏈哄垪琛�', '', '1', 'core:basLift:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞鎻愬崌鏈哄垪琛�', '', '1', 'core:basLift:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼鎻愬崌鏈哄垪琛�', '', '1', 'core:basLift:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎鎻愬崌鏈哄垪琛�', '', '1', 'core:basLift:remove', '3', '1', '1');
+
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/asrs/controller/FlowController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/asrs/controller/FlowController.java
index e8a5ed6..417c3d1 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/asrs/controller/FlowController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/asrs/controller/FlowController.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.wcs.asrs.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wcs.asrs.entity.FlowGraph;
 import com.zy.asrs.wcs.asrs.entity.param.FlowLogicCodeParam;
@@ -72,11 +73,10 @@
             flowGraph.setStatus(0);
         }
         flowGraph.setName(param.get("name").toString());
-        flowGraph.setMemo(param.get("memo").toString());
+        flowGraph.setMemo(param.get("memo") == null ? "" : param.get("memo").toString());
         flowGraph.setOriginData(param.get("originData").toString());
-        flowGraph.setProcessData(JSON.toJSONString(list));
+        flowGraph.setProcessData(JSON.toJSONString(param.get("data")));
         flowGraph.setUpdateTime(new Date());
-        flowGraph.setHostId(getHostId());
         flowGraphService.saveOrUpdate(flowGraph);
 
         return R.ok();
@@ -91,7 +91,8 @@
 
         //寮�濮嬫ā鎷熸墽琛�
         String processData = flowGraph.getProcessData();
-        List<FlowLogicCodeParam> list = JSON.parseArray(processData, FlowLogicCodeParam.class);
+//        List<FlowLogicCodeParam> list = JSON.parseArray(processData, FlowLogicCodeParam.class);
+        List<JSONObject> list = JSON.parseArray(processData, JSONObject.class);
         boolean execute = flowExecute.execute(list);
         return R.ok().add(execute);
     }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasLiftController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasLiftController.java
new file mode 100644
index 0000000..64a5424
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasLiftController.java
@@ -0,0 +1,101 @@
+package com.zy.asrs.wcs.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wcs.common.annotation.OperationLog;
+import com.zy.asrs.wcs.common.domain.BaseParam;
+import com.zy.asrs.wcs.common.domain.KeyValVo;
+import com.zy.asrs.wcs.common.domain.PageParam;
+import com.zy.asrs.wcs.core.entity.BasLift;
+import com.zy.asrs.wcs.core.service.BasLiftService;
+import com.zy.asrs.wcs.utils.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class BasLiftController extends BaseController {
+
+    @Autowired
+    private BasLiftService basLiftService;
+
+    @PreAuthorize("hasAuthority('core:basLift:list')")
+    @PostMapping("/basLift/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<BasLift, BaseParam> pageParam = new PageParam<>(baseParam, BasLift.class);
+        return R.ok().add(basLiftService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:list')")
+    @PostMapping("/basLift/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(basLiftService.list());
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:list')")
+    @GetMapping("/basLift/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(basLiftService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:save')")
+    @OperationLog("娣诲姞鎻愬崌鏈哄垪琛�")
+    @PostMapping("/basLift/save")
+    public R save(@RequestBody BasLift basLift) {
+        if (!basLiftService.save(basLift)) {
+            return R.error("娣诲姞澶辫触");
+        }
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:update')")
+    @OperationLog("淇敼鎻愬崌鏈哄垪琛�")
+    @PostMapping("/basLift/update")
+    public R update(@RequestBody BasLift basLift) {
+        if (!basLiftService.updateById(basLift)) {
+            return R.error("淇敼澶辫触");
+        }
+        return R.ok("淇敼鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:remove')")
+    @OperationLog("鍒犻櫎鎻愬崌鏈哄垪琛�")
+    @PostMapping("/basLift/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!basLiftService.removeByIds(Arrays.asList(ids))) {
+            return R.error("鍒犻櫎澶辫触");
+        }
+        return R.ok("鍒犻櫎鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:list')")
+    @PostMapping("/basLift/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<BasLift> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(BasLift::getLiftNo, condition);
+        }
+        basLiftService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getLiftNo()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('core:basLift:list')")
+    @PostMapping("/basLift/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(basLiftService.list(), BasLift.class), response);
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/ShuttleStandbyController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/ShuttleStandbyController.java
new file mode 100644
index 0000000..bb7e8da
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/ShuttleStandbyController.java
@@ -0,0 +1,101 @@
+package com.zy.asrs.wcs.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wcs.common.annotation.OperationLog;
+import com.zy.asrs.wcs.common.domain.BaseParam;
+import com.zy.asrs.wcs.common.domain.KeyValVo;
+import com.zy.asrs.wcs.common.domain.PageParam;
+import com.zy.asrs.wcs.core.entity.ShuttleStandby;
+import com.zy.asrs.wcs.core.service.ShuttleStandbyService;
+import com.zy.asrs.wcs.utils.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class ShuttleStandbyController extends BaseController {
+
+    @Autowired
+    private ShuttleStandbyService shuttleStandbyService;
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:list')")
+    @PostMapping("/shuttleStandby/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<ShuttleStandby, BaseParam> pageParam = new PageParam<>(baseParam, ShuttleStandby.class);
+        return R.ok().add(shuttleStandbyService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:list')")
+    @PostMapping("/shuttleStandby/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(shuttleStandbyService.list());
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:list')")
+    @GetMapping("/shuttleStandby/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(shuttleStandbyService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:save')")
+    @OperationLog("娣诲姞绌挎杞﹀緟鏈轰綅")
+    @PostMapping("/shuttleStandby/save")
+    public R save(@RequestBody ShuttleStandby shuttleStandby) {
+        if (!shuttleStandbyService.save(shuttleStandby)) {
+            return R.error("娣诲姞澶辫触");
+        }
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:update')")
+    @OperationLog("淇敼绌挎杞﹀緟鏈轰綅")
+    @PostMapping("/shuttleStandby/update")
+    public R update(@RequestBody ShuttleStandby shuttleStandby) {
+        if (!shuttleStandbyService.updateById(shuttleStandby)) {
+            return R.error("淇敼澶辫触");
+        }
+        return R.ok("淇敼鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:remove')")
+    @OperationLog("鍒犻櫎绌挎杞﹀緟鏈轰綅")
+    @PostMapping("/shuttleStandby/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!shuttleStandbyService.removeByIds(Arrays.asList(ids))) {
+            return R.error("鍒犻櫎澶辫触");
+        }
+        return R.ok("鍒犻櫎鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:list')")
+    @PostMapping("/shuttleStandby/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<ShuttleStandby> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(ShuttleStandby::getName, condition);
+        }
+        shuttleStandbyService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getName()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('core:shuttleStandby:list')")
+    @PostMapping("/shuttleStandby/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(shuttleStandbyService.list(), ShuttleStandby.class), response);
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasLift.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasLift.java
new file mode 100644
index 0000000..5c1166d
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/BasLift.java
@@ -0,0 +1,250 @@
+package com.zy.asrs.wcs.core.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.rcs.service.DeviceService;
+import com.zy.asrs.wcs.system.entity.Host;
+import com.zy.asrs.wcs.system.entity.User;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.system.service.UserService;
+import com.zy.asrs.wcs.system.service.HostService;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("wcs_bas_lift")
+public class BasLift implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 璁惧id
+     */
+    @ApiModelProperty(value= "璁惧id")
+    private Long deviceId;
+
+    /**
+     * 鎻愬崌鏈哄彿
+     */
+    @ApiModelProperty(value= "鎻愬崌鏈哄彿")
+    private Integer liftNo;
+
+    /**
+     * 褰撳墠浠诲姟鐘舵��
+     */
+    @ApiModelProperty(value= "褰撳墠浠诲姟鐘舵��")
+    private Integer status;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    private Integer taskNo;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 鍒涘缓浜哄憳
+     */
+    @ApiModelProperty(value= "鍒涘缓浜哄憳")
+    private Long createBy;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    /**
+     * 浣滀笟鏍囪
+     */
+    @ApiModelProperty(value= "浣滀笟鏍囪")
+    private Integer pakMk;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 鎵�灞炴満鏋�
+     */
+    @ApiModelProperty(value= "鎵�灞炴満鏋�")
+    private Long hostId;
+
+    /**
+     * 璁惧鐘舵��
+     */
+    @ApiModelProperty(value= "璁惧鐘舵��")
+    private String protocol;
+
+    /**
+     * 灏忚溅鏄惁鍙崲灞� 0: 鍚�  1: 鏄�  
+     */
+    @ApiModelProperty(value= "灏忚溅鏄惁鍙崲灞� 0: 鍚�  1: 鏄�  ")
+    private Integer transfer;
+
+    /**
+     * 鎺�
+     */
+    @ApiModelProperty(value= "鎺�")
+    private Integer row;
+
+    /**
+     * 鍒�
+     */
+    @ApiModelProperty(value= "鍒�")
+    private Integer bay;
+
+    public BasLift() {}
+
+    public BasLift(Long deviceId,Integer liftNo,Integer status,Integer taskNo,Long updateBy,Long createBy,Date createTime,Date updateTime,String memo,Integer pakMk,Integer deleted,Long hostId,String protocol,Integer transfer) {
+        this.deviceId = deviceId;
+        this.liftNo = liftNo;
+        this.status = status;
+        this.taskNo = taskNo;
+        this.updateBy = updateBy;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+        this.memo = memo;
+        this.pakMk = pakMk;
+        this.deleted = deleted;
+        this.hostId = hostId;
+        this.protocol = protocol;
+        this.transfer = transfer;
+    }
+
+//    BasLift basLift = new BasLift(
+//            null,    // 璁惧id
+//            null,    // 鎻愬崌鏈哄彿[闈炵┖]
+//            null,    // 褰撳墠浠诲姟鐘舵��
+//            null,    // 浠诲姟鍙�
+//            null,    // 淇敼浜哄憳
+//            null,    // 鍒涘缓浜哄憳
+//            null,    // 鍒涘缓鏃堕棿
+//            null,    // 淇敼鏃堕棿
+//            null,    // 澶囨敞
+//            null,    // 浣滀笟鏍囪
+//            null,    // 鏄惁鍒犻櫎
+//            null,    // 鎵�灞炴満鏋�
+//            null,    // 璁惧鐘舵��
+//            null    // 灏忚溅鏄惁鍙崲灞�
+//    );
+
+    public String getDeviceId$(){
+        DeviceService service = SpringUtils.getBean(DeviceService.class);
+        Device device = service.getById(this.deviceId);
+        if (!Cools.isEmpty(device)){
+            return String.valueOf(device.getDeviceNo());
+        }
+        return null;
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getDeleted$(){
+        if (null == this.deleted){ return null; }
+        switch (this.deleted){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.deleted);
+        }
+    }
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.getById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public String getTransfer$(){
+        if (null == this.transfer){ return null; }
+        switch (this.transfer){
+            case 0:
+                return "鍚�";
+            case 1:
+                return "鏄�";
+            default:
+                return String.valueOf(this.transfer);
+        }
+    }
+
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/ShuttleStandby.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/ShuttleStandby.java
new file mode 100644
index 0000000..1c71373
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/ShuttleStandby.java
@@ -0,0 +1,246 @@
+package com.zy.asrs.wcs.core.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.zy.asrs.wcs.system.entity.Host;
+import com.zy.asrs.wcs.system.entity.User;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.system.service.UserService;
+import com.zy.asrs.wcs.system.service.HostService;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("wcs_shuttle_standby")
+public class ShuttleStandby implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鏍囪瘑
+     */
+    @ApiModelProperty(value= "鏍囪瘑")
+    private String flag;
+
+    /**
+     * 鎵�灞炴満鏋�
+     */
+    @ApiModelProperty(value= "鎵�灞炴満鏋�")
+    private Long hostId;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    /**
+     * 璁惧鍙�
+     */
+    @ApiModelProperty(value= "璁惧鍙�")
+    private Long deviceId;
+
+    /**
+     * 璁惧妤煎眰妤煎眰
+     */
+    @ApiModelProperty(value= "璁惧妤煎眰妤煎眰")
+    private Integer deviceLev;
+
+    /**
+     * 璁惧搴撲綅鍙�
+     */
+    @ApiModelProperty(value= "璁惧搴撲綅鍙�")
+    private String deviceLoc;
+
+    /**
+     * 璁惧寰呮満浣嶅簱浣嶅彿
+     */
+    @ApiModelProperty(value= "璁惧寰呮満浣嶅簱浣嶅彿")
+    private String deviceStandbyLoc;
+
+    /**
+     * 寰呮満浣嶅簱浣嶅彿
+     */
+    @ApiModelProperty(value= "寰呮満浣嶅簱浣嶅彿")
+    private String standbyLoc;
+
+    public ShuttleStandby() {}
+
+    public ShuttleStandby(String uuid,String name,String flag,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo,Long deviceId,Integer deviceLev,String deviceLoc,String deviceStandbyLoc,String standbyLoc) {
+        this.uuid = uuid;
+        this.name = name;
+        this.flag = flag;
+        this.hostId = hostId;
+        this.status = status;
+        this.deleted = deleted;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+        this.deviceId = deviceId;
+        this.deviceLev = deviceLev;
+        this.deviceLoc = deviceLoc;
+        this.deviceStandbyLoc = deviceStandbyLoc;
+        this.standbyLoc = standbyLoc;
+    }
+
+//    ShuttleStandby shuttleStandby = new ShuttleStandby(
+//            null,    // 缂栧彿
+//            null,    // 鍚嶇О
+//            null,    // 鏍囪瘑
+//            null,    // 鎵�灞炴満鏋�
+//            null,    // 鐘舵��
+//            null,    // 鏄惁鍒犻櫎
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 澶囨敞
+//            null,    // 璁惧鍙�
+//            null,    // 璁惧妤煎眰妤煎眰
+//            null,    // 璁惧搴撲綅鍙�
+//            null,    // 璁惧寰呮満浣嶅簱浣嶅彿
+//            null    // 寰呮満浣嶅簱浣嶅彿
+//    );
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.getById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getDeleted$(){
+        if (null == this.deleted){ return null; }
+        switch (this.deleted){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.deleted);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
index 2702cdc..c596e27 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -3,12 +3,15 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.wcs.core.domain.dto.MotionDto;
+import com.zy.asrs.wcs.core.entity.ShuttleStandby;
 import com.zy.asrs.wcs.core.entity.Task;
 import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
 import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
 import com.zy.asrs.wcs.core.model.enums.TaskStsType;
 import com.zy.asrs.wcs.core.model.enums.WorkZoneType;
+import com.zy.asrs.wcs.core.service.ShuttleStandbyService;
 import com.zy.asrs.wcs.core.service.TaskService;
+import com.zy.asrs.wcs.core.utils.ConveyorDispatcher;
 import com.zy.asrs.wcs.core.utils.LiftDispatcher;
 import com.zy.asrs.wcs.core.utils.ShuttleDispatcher;
 import com.zy.asrs.wcs.core.utils.Utils;
@@ -16,9 +19,11 @@
 import com.zy.asrs.wcs.core.entity.Motion;
 import com.zy.asrs.wcs.rcs.entity.Device;
 import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
+import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol;
 import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
 import com.zy.asrs.wcs.core.service.MotionService;
 import com.zy.asrs.wcs.rcs.service.DeviceService;
+import com.zy.asrs.wcs.rcs.thread.LiftThread;
 import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -44,19 +49,22 @@
     private ShuttleDispatcher shuttleDispatcher;
     @Autowired
     private LiftDispatcher liftDispatcher;
-//    @Autowired
-//    private ConveyorDispatcher conveyorDispatcher;
+    @Autowired
+    private ConveyorDispatcher conveyorDispatcher;
     @Autowired
     private DeviceService deviceService;
+    @Autowired
+    private ShuttleStandbyService shuttleStandbyService;
 
     public List<Motion> generateMotion(Task task) {
         List<Motion> motionList = new ArrayList<>();
-        switch (Objects.requireNonNull(WorkZoneType.query(task.getTaskSts() == TaskStsType.NEW_INBOUND.sts ? task.getOriginSite() : task.getDestSite()))) {
-            case FIRST_ZONE:
-                motionList = this.generateFirstZoneMotion(task);
-                break;
-            default:
-        }
+//        switch (Objects.requireNonNull(WorkZoneType.query(task.getTaskSts() == TaskStsType.NEW_INBOUND.sts ? task.getOriginSite() : task.getDestSite()))) {
+//            case FIRST_ZONE:
+//                motionList = this.generateFirstZoneMotion(task);
+//                break;
+//            default:
+//        }
+        motionList = this.generateFirstZoneMotion(task);
         return motionList;
     }
 
@@ -714,164 +722,189 @@
      */
     public List<Motion> generateChargeMotion(Task task) {
         List<Motion> motionList = new ArrayList<>();
-//        if (wrkCharge.getWrkSts() != WrkMastStsType.NEW_CHARGE.sts || wrkCharge.getIoType() != WrkIoTypeType.CHARGE.sts) {
-//            return motionList;
-//        }
-//
-//        // locNo
-//        String chargeLocNo = wrkCharge.getLocNo();
-//
-//        // lift
-//        Integer transferLiftNo = 2;
-//        SiemensLiftThread liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, transferLiftNo);
-//        LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-//        if (liftProtocol == null || liftProtocol.getLiftNo() == null) {
-//            return motionList;
-//        }
-//
-//        // shuttle
-//        Integer shuttleNo = wrkCharge.getShuttleNo();
-//        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-//        ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-//        if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
-//            return motionList;
-//        }
-//        if (!shuttleProtocol.isIdle()) {
-//            return motionList;
-//        }
-//
-//        //妫�娴嬬┛姊溅鏄惁鏈変换鍔$粦瀹�
-//        boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleProtocol.getShuttleNo().intValue());
-//        if (shuttleResult) {
-//            //瀛樺湪浠诲姟锛岀姝㈣В鏋�
-//            return motionList;
-//        }
-//
-//        //妫�娴嬫彁鍗囨満鏄惁鏈変换鍔$粦瀹�
-//        boolean liftResult = Utils.checkLiftHasBinding(transferLiftNo);
-//        if (liftResult) {
-//            //瀛樺湪浠诲姟锛岀姝㈣В鏋�
-//            return motionList;
-//        }
-//
-//        String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
-//
-//        //绌挎杞﹀埌鎻愬崌鏈哄簱浣嶅彿
-//        String liftLocNoTo = LiftCodeType.getLocNo(transferLiftNo, Utils.getLev(shuttleLocNo));
-//
-//        //绌挎杞﹀嚭鎻愬崌鏈哄簱浣嶅彿
-//        String liftLocNoFrom = LiftCodeType.getLocNo(transferLiftNo, Utils.getLev(wrkCharge.getLocNo()));
-//
-//        //绌挎杞﹀埌鎻愬崌鏈哄緟鏈轰綅搴撲綅鍙�
-//        String standbyLocNoTo = LiftCodeType.getStandbyLocNo(transferLiftNo, Utils.getLev(shuttleLocNo));
-//
-//        //绌挎杞﹀嚭鎻愬崌鏈哄緟鏈轰綅搴撲綅鍙�
-//        String standbyLocNoFrom = LiftCodeType.getStandbyLocNo(transferLiftNo, Utils.getLev(wrkCharge.getLocNo()));
-//
-//        // 鍒ゆ柇绌挎杞︽槸鍚﹀湪鍏呯數灞�
-//        if (Utils.getLev(shuttleLocNo) == Utils.getLev(chargeLocNo)) {
-//
-//            // 绌挎杞﹁蛋琛岃嚦鍏呯數妗╁簱浣�
-//            motionList.addAll(kernelService.shuttleMove(
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(shuttleLocNo);
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(chargeLocNo);
-//                    })),
-//                    MotionCtgType.SHUTTLE_MOVE
-//            ));
-//
-//        } else {
-//
-//            // 绌挎杞﹁蛋琛岃嚦鎻愬崌鏈哄緟鏈轰綅
-//            motionList.addAll(kernelService.shuttleMove(
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(shuttleLocNo);
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(standbyLocNoTo);
-//                    })),
-//                    MotionCtgType.SHUTTLE_MOVE
-//            ));
-//
-//            // 鎻愬崌鏈虹┖杞界Щ鍔ㄥ埌绌挎杞﹀眰
-//            motionList.addAll(kernelService.liftMove(
-//                    null
-//                    , MotionDto.build((dto -> {
-//                        dto.setLiftNo(transferLiftNo);
-//                        dto.setLev(Utils.getLev(shuttleLocNo));
-//                    }))
-//            ));
-//
-//            // 绌挎杞︽彁鍗囨満寰呮満浣嶈嚦鎻愬崌鏈哄簱浣�
-//            motionList.addAll(kernelService.shuttleMove(
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(standbyLocNoTo);
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLiftNo(transferLiftNo);
-//                        dto.setLocNo(liftLocNoTo);
-//                    })),
-//                    MotionCtgType.SHUTTLE_MOVE_TO_LIFT
-//            ));
-//
-//            // 鎻愬崌鏈烘惉杞� 鑷� 杈撻�佺嚎灞�
-//            motionList.addAll(kernelService.liftMoveShuttle(
-//                    MotionDto.build((dto -> {
-//                        dto.setLiftNo(transferLiftNo);
-//                        dto.setLev(Utils.getLev(shuttleLocNo));
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setLiftNo(transferLiftNo);
-//                        dto.setLev(Utils.getLev(chargeLocNo));
-//                    }))
-//            ));
-//
-//            // 绌挎杞︽彁鍗囨満鑷虫彁鍗囨満寰呮満浣�
-//            motionList.addAll(kernelService.shuttleMove(
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLiftNo(transferLiftNo);
-//                        dto.setLocNo(liftLocNoFrom);
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(standbyLocNoFrom);
-//                    })),
-//                    MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
-//            ));
-//
-//            // 绌挎杞︽彁鍗囨満寰呮満浣嶈嚦鍏呯數浣�
-//            motionList.addAll(kernelService.shuttleMove(
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(standbyLocNoFrom);
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(chargeLocNo);
-//                    })),
-//                    MotionCtgType.SHUTTLE_MOVE
-//            ));
-//
-//            wrkCharge.setLiftNo(transferLiftNo);
-//            wrkChargeMapper.updateById(wrkCharge);
-//        }
-//
-//        // 绌挎杞﹀紑濮嬪厖鐢�
-//        motionList.addAll(kernelService.shuttleCharge(
-//                null,
-//                MotionDto.build((dto -> {
-//                    dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                }))
-//        ));
+        if (task.getTaskSts() != TaskStsType.NEW_CHARGE.sts) {
+            return motionList;
+        }
+
+        // locNo
+        String chargeLocNo = task.getDestLoc();
+
+        // shuttle
+        Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>()
+                .eq(Device::getDeviceNo, task.getShuttleNo())
+                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
+                .eq(Device::getHostId, task.getHostId())
+                .eq(Device::getStatus, 1));
+        if (shuttleDevice == null) {
+            return motionList;
+        }
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue());
+        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+        if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
+            return motionList;
+        }
+        if (!shuttleThread.isIdle()) {
+            return motionList;
+        }
+
+        String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
+
+        // lift
+        Device transferLiftDevice = Utils.getRecentTransferLift(shuttleLocNo, shuttleProtocol.getShuttleNo());
+        if (transferLiftDevice == null) {
+            return motionList;
+        }
+        LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, transferLiftDevice.getId().intValue());
+        LiftProtocol liftProtocol = liftThread.getStatus();
+        if (liftProtocol == null || liftProtocol.getLiftNo() == null) {
+            return motionList;
+        }
+
+        //妫�娴嬬┛姊溅鏄惁鏈変换鍔$粦瀹�
+        boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice);
+        if (shuttleResult) {
+            //瀛樺湪浠诲姟锛岀姝㈣В鏋�
+            return motionList;
+        }
+
+        //妫�娴嬫彁鍗囨満鏄惁鏈変换鍔$粦瀹�
+        boolean liftResult = Utils.checkLiftHasBinding(Integer.parseInt(transferLiftDevice.getDeviceNo()));
+        if (liftResult) {
+            //瀛樺湪浠诲姟锛岀姝㈣В鏋�
+            return motionList;
+        }
+
+        //鑾峰彇灏忚溅寰呮満搴撲綅 ==> 杩涙彁鍗囨満
+        ShuttleStandby shuttleStandbyTo = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
+                .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
+                .eq(ShuttleStandby::getDeviceLev, Utils.getLev(shuttleLocNo))
+                .eq(ShuttleStandby::getStatus, 1));
+
+        //鑾峰彇灏忚溅寰呮満搴撲綅 ==> 鍑烘彁鍗囨満
+        ShuttleStandby shuttleStandbyFrom = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
+                .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
+                .eq(ShuttleStandby::getDeviceLev, Utils.getLev(chargeLocNo))
+                .eq(ShuttleStandby::getStatus, 1));
+        if (shuttleStandbyTo == null || shuttleStandbyFrom == null) {
+            return motionList;
+        }
+
+        //绌挎杞﹁繘鎻愬崌鏈哄簱浣嶅彿
+        String liftLocNoTo = shuttleStandbyTo.getDeviceLoc();
+
+        //绌挎杞﹀嚭鎻愬崌鏈哄簱浣嶅彿
+        String liftLocNoFrom = shuttleStandbyFrom.getDeviceLoc();
+
+        //绌挎杞﹁繘鎻愬崌鏈哄緟鏈轰綅搴撲綅鍙�
+        String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc();
+
+        //绌挎杞﹀嚭鎻愬崌鏈哄緟鏈轰綅搴撲綅鍙�
+        String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc();
+
+        // 鍒ゆ柇绌挎杞︽槸鍚﹀湪鍏呯數灞�
+        if (Utils.getLev(shuttleLocNo) == Utils.getLev(chargeLocNo)) {
+
+            // 绌挎杞﹁蛋琛岃嚦鍏呯數妗╁簱浣�
+            motionList.addAll(kernelService.shuttleMove(
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(shuttleLocNo);
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(chargeLocNo);
+                    })),
+                    MotionCtgType.SHUTTLE_MOVE
+            ));
+
+        } else {
+
+            // 绌挎杞﹁蛋琛岃嚦鎻愬崌鏈哄緟鏈轰綅
+            motionList.addAll(kernelService.shuttleMove(
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(shuttleLocNo);
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(standbyLocNoTo);
+                    })),
+                    MotionCtgType.SHUTTLE_MOVE
+            ));
+
+            // 鎻愬崌鏈虹┖杞界Щ鍔ㄥ埌绌挎杞﹀眰
+            motionList.addAll(kernelService.liftMove(
+                    null
+                    , MotionDto.build((dto -> {
+                        dto.setLiftNo(transferLiftDevice.getId().intValue());
+                        dto.setLev(Utils.getLev(shuttleLocNo));
+                    }))
+            ));
+
+            // 绌挎杞︽彁鍗囨満寰呮満浣嶈嚦鎻愬崌鏈哄簱浣�
+            motionList.addAll(kernelService.shuttleMove(
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(standbyLocNoTo);
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLiftNo(transferLiftDevice.getId().intValue());
+                        dto.setLocNo(liftLocNoTo);
+                    })),
+                    MotionCtgType.SHUTTLE_MOVE_TO_LIFT
+            ));
+
+            // 鎻愬崌鏈烘惉杞� 鑷� 杈撻�佺嚎灞�
+            motionList.addAll(kernelService.liftMoveShuttle(
+                    MotionDto.build((dto -> {
+                        dto.setLiftNo(transferLiftDevice.getId().intValue());
+                        dto.setLev(Utils.getLev(shuttleLocNo));
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setLiftNo(transferLiftDevice.getId().intValue());
+                        dto.setLev(Utils.getLev(chargeLocNo));
+                    }))
+            ));
+
+            // 绌挎杞︽彁鍗囨満鑷虫彁鍗囨満寰呮満浣�
+            motionList.addAll(kernelService.shuttleMove(
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLiftNo(transferLiftDevice.getId().intValue());
+                        dto.setLocNo(liftLocNoFrom);
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(standbyLocNoFrom);
+                    })),
+                    MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
+            ));
+
+            // 绌挎杞︽彁鍗囨満寰呮満浣嶈嚦鍏呯數浣�
+            motionList.addAll(kernelService.shuttleMove(
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(standbyLocNoFrom);
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(chargeLocNo);
+                    })),
+                    MotionCtgType.SHUTTLE_MOVE
+            ));
+
+            task.setLiftNo(Integer.parseInt(transferLiftDevice.getDeviceNo()));
+            taskService.updateById(task);
+        }
+
+        // 绌挎杞﹀紑濮嬪厖鐢�
+        motionList.addAll(kernelService.shuttleCharge(
+                null,
+                MotionDto.build((dto -> {
+                    dto.setShuttleNo(shuttleDevice.getId().intValue());
+                }))
+        ));
 
         return motionList;
     }
@@ -881,40 +914,47 @@
      */
     public List<Motion> generateShuttleChargeWrkComplete(Task task) {
         List<Motion> motionList = new ArrayList<>();
-//        if (wrkCharge.getWrkSts() != WrkMastStsType.NEW_MOVE.sts || wrkCharge.getIoType() != WrkIoTypeType.MOVE.sts) {
-//            return motionList;
-//        }
-//
-//        // locNo
-//        String locNo = wrkCharge.getLocNo();
-//
-//        // shuttle
-//        Integer shuttleNo = wrkCharge.getShuttleNo();
-//        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
-//        ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-//        if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
-//            return motionList;
-//        }
-//
-//        String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
-//
-//        // 鍒ゆ柇绌挎杞︽槸鍚﹀湪鐩爣灞�
-//        if (Utils.getLev(shuttleLocNo) == Utils.getLev(locNo)) {
-//
-//            // 绌挎杞﹁蛋琛岃嚦鐩爣搴撲綅
-//            motionList.addAll(kernelService.shuttleMove(
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(shuttleLocNo);
-//                    })),
-//                    MotionDto.build((dto -> {
-//                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
-//                        dto.setLocNo(locNo);
-//                    })),
-//                    MotionCtgType.SHUTTLE_MOVE
-//            ));
-//
-//        }
+        if (task.getTaskSts() != TaskStsType.NEW_MOVE.sts) {
+            return motionList;
+        }
+
+        // locNo
+        String locNo = task.getDestLoc();
+
+        // shuttle
+        Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>()
+                .eq(Device::getDeviceNo, task.getShuttleNo())
+                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
+                .eq(Device::getHostId, task.getHostId())
+                .eq(Device::getStatus, 1));
+        if (shuttleDevice == null) {
+            return motionList;
+        }
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue());
+        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+        if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
+            return motionList;
+        }
+
+        String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
+
+        // 鍒ゆ柇绌挎杞︽槸鍚﹀湪鐩爣灞�
+        if (Utils.getLev(shuttleLocNo) == Utils.getLev(locNo)) {
+
+            // 绌挎杞﹁蛋琛岃嚦鐩爣搴撲綅
+            motionList.addAll(kernelService.shuttleMove(
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(shuttleLocNo);
+                    })),
+                    MotionDto.build((dto -> {
+                        dto.setShuttleNo(shuttleDevice.getId().intValue());
+                        dto.setLocNo(locNo);
+                    })),
+                    MotionCtgType.SHUTTLE_MOVE
+            ));
+
+        }
         return motionList;
     }
 
@@ -957,11 +997,11 @@
             // 绌挎杞﹁蛋琛岃嚦鐩爣搴撲綅
             motionList.addAll(kernelService.shuttleMove(
                     MotionDto.build((dto -> {
-                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
+                        dto.setShuttleNo(device.getId().intValue());
                         dto.setLocNo(shuttleLocNo);
                     })),
                     MotionDto.build((dto -> {
-                        dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
+                        dto.setShuttleNo(device.getId().intValue());
                         dto.setLocNo(locNo);
                     })),
                     MotionCtgType.SHUTTLE_MOVE
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/BasLiftMapper.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/BasLiftMapper.java
new file mode 100644
index 0000000..ecee5b3
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/BasLiftMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wcs.core.mapper;
+
+import com.zy.asrs.wcs.core.entity.BasLift;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasLiftMapper extends BaseMapper<BasLift> {
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/ShuttleStandbyMapper.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/ShuttleStandbyMapper.java
new file mode 100644
index 0000000..7464706
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/ShuttleStandbyMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wcs.core.mapper;
+
+import com.zy.asrs.wcs.core.entity.ShuttleStandby;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ShuttleStandbyMapper extends BaseMapper<ShuttleStandby> {
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
index 05ce37a..ddcac62 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
@@ -36,6 +36,8 @@
 
     List<Task> selectWorkingByShuttle(Integer shuttleNo);
 
+    List<Task> selectWorkingByLift(Integer liftNo);
+
     Task selectChargeWorking(Integer shuttleNo);
 
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/BasLiftService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/BasLiftService.java
new file mode 100644
index 0000000..4789a24
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/BasLiftService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.wcs.core.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.wcs.core.entity.BasLift;
+
+public interface BasLiftService extends IService<BasLift> {
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/ShuttleStandbyService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/ShuttleStandbyService.java
new file mode 100644
index 0000000..85f5466
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/ShuttleStandbyService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.wcs.core.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.wcs.core.entity.ShuttleStandby;
+
+public interface ShuttleStandbyService extends IService<ShuttleStandby> {
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
index 47a8862..166eb58 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
@@ -34,6 +34,8 @@
 
     List<Task> selectWorkingByShuttle(Integer shuttleNo);
 
+    List<Task> selectWorkingByLift(Integer liftNo);
+
     Task selectChargeWorking(Integer shuttleNo);
 
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/BasLiftServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/BasLiftServiceImpl.java
new file mode 100644
index 0000000..b5b2fc3
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/BasLiftServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wcs.core.service.impl;
+
+import com.zy.asrs.wcs.core.mapper.BasLiftMapper;
+import com.zy.asrs.wcs.core.entity.BasLift;
+import com.zy.asrs.wcs.core.service.BasLiftService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("basLiftService")
+public class BasLiftServiceImpl extends ServiceImpl<BasLiftMapper, BasLift> implements BasLiftService {
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
index 54c4852..741bed4 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
@@ -442,6 +442,11 @@
                 continue;
             }
 
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
             if (!shuttleThread.isCharging()) {
                 continue;
             }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/ShuttleStandbyServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/ShuttleStandbyServiceImpl.java
new file mode 100644
index 0000000..d24b76d
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/ShuttleStandbyServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wcs.core.service.impl;
+
+import com.zy.asrs.wcs.core.mapper.ShuttleStandbyMapper;
+import com.zy.asrs.wcs.core.entity.ShuttleStandby;
+import com.zy.asrs.wcs.core.service.ShuttleStandbyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("shuttleStandbyService")
+public class ShuttleStandbyServiceImpl extends ServiceImpl<ShuttleStandbyMapper, ShuttleStandby> implements ShuttleStandbyService {
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
index 5d58baf..394edcf 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
@@ -112,6 +112,11 @@
     }
 
     @Override
+    public List<Task> selectWorkingByLift(Integer liftNo) {
+        return this.baseMapper.selectWorkingByLift(liftNo);
+    }
+
+    @Override
     public Task selectChargeWorking(Integer shuttleNo) {
         return this.baseMapper.selectChargeWorking(shuttleNo);
     }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java
index d308757..6c3b59b 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java
@@ -4,9 +4,13 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.SpringUtils;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.core.entity.BasLift;
 import com.zy.asrs.wcs.core.entity.Task;
 import com.zy.asrs.wcs.core.entity.TaskSerialNo;
+import com.zy.asrs.wcs.core.model.NavigateNode;
 import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
+import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
+import com.zy.asrs.wcs.core.service.BasLiftService;
 import com.zy.asrs.wcs.core.service.TaskSerialNoService;
 import com.zy.asrs.wcs.core.service.TaskService;
 import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
@@ -77,34 +81,38 @@
 
     //鑾峰彇闄ょ櫧鍚嶅崟澶栫殑鎸囧畾妤煎眰鍏ㄩ儴绌挎杞y鍧愭爣鐐�
     public static List<int[]> getShuttlePoints(Integer whiteShuttle, Integer lev) {
-//        SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
+        DeviceService deviceService = SpringUtils.getBean(DeviceService.class);
         ArrayList<int[]> list = new ArrayList<>();
-//        for (ShuttleSlave slave : slaveProperties.getShuttle()) {
-//            if (slave.getId().intValue() == whiteShuttle) {
-//                continue;//璺宠繃鐧藉悕鍗�
-//            }
-//
-//            //鑾峰彇绌挎杞︽墍鍦ㄨ妭鐐逛綅缃�
-//            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
-//            if (shuttleThread == null) {
-//                continue;
-//            }
-//            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-//            if (shuttleProtocol == null) {
-//                continue;
-//            }
-//
-//            if (shuttleProtocol.getCurrentLocNo() == null) {
-//                continue;
-//            }
-//
-//            if (lev != Utils.getLev(shuttleProtocol.getCurrentLocNo())) {
-//                continue;//妤煎眰涓嶅悓
-//            }
-//
-//            int[] xyPosition = NavigatePositionConvert.positionToXY(shuttleProtocol.getCurrentLocNo());//閫氳繃搴撲綅鍙疯幏鍙杧y鍧愭爣
-//            list.add(xyPosition);
-//        }
+
+        List<Device> devices = deviceService.list(new LambdaQueryWrapper<Device>()
+                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
+                .eq(Device::getStatus, 1));
+        for (Device device : devices) {
+            if (Integer.parseInt(device.getDeviceNo()) == whiteShuttle) {
+                continue;//璺宠繃鐧藉悕鍗�
+            }
+
+            //鑾峰彇绌挎杞︽墍鍦ㄨ妭鐐逛綅缃�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
+            if (shuttleThread == null) {
+                continue;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            if (shuttleProtocol.getCurrentLocNo() == null) {
+                continue;
+            }
+
+            if (lev != Utils.getLev(shuttleProtocol.getCurrentLocNo())) {
+                continue;//妤煎眰涓嶅悓
+            }
+
+            int[] xyPosition = NavigatePositionConvert.positionToXY(shuttleProtocol.getCurrentLocNo());//閫氳繃搴撲綅鍙疯幏鍙杧y鍧愭爣
+            list.add(xyPosition);
+        }
         return list;
     }
 
@@ -175,4 +183,64 @@
         throw new CoolException("宸ヤ綔鍙风敓鎴愬け璐�");
     }
 
+    /**
+     * 妫�娴嬬┛姊溅鏄惁鏈変换鍔$粦瀹�
+     */
+    public static boolean checkShuttleHasBinding(Device device) {
+        TaskService taskService = SpringUtils.getBean(TaskService.class);
+        List<Task> tasks = taskService.selectWorkingByShuttle(Integer.parseInt(device.getDeviceNo()));
+        if (tasks.isEmpty()) {
+            return false;//鏃犱换鍔$粦瀹�
+        }
+        return true;//鏈変换鍔$粦瀹�
+    }
+
+    /**
+     * 妫�娴嬫彁鍗囨満鏄惁鏈変换鍔$粦瀹�
+     */
+    public static boolean checkLiftHasBinding(Integer liftNo) {
+        TaskService taskService = SpringUtils.getBean(TaskService.class);
+        List<Task> tasks = taskService.selectWorkingByLift(liftNo);
+        if (tasks.isEmpty()) {
+            return false;//鏃犱换鍔$粦瀹�
+        }
+        return true;//鏈変换鍔$粦瀹�
+    }
+
+    /**
+     * 鑾峰彇璺濈鐩爣搴撲綅鏈�杩戠殑鎻愬崌鏈�
+     */
+    public static Device getRecentTransferLift(String locNo, Integer shuttleNo) {
+        BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
+        DeviceService deviceService = SpringUtils.getBean(DeviceService.class);
+        if (basLiftService == null) {
+            return null;
+        }
+
+        Integer distance = Integer.MAX_VALUE;
+        Long liftDeviceId = null;
+        for (BasLift basLift : basLiftService.list(new LambdaQueryWrapper<BasLift>()
+                .eq(BasLift::getStatus, 1)
+                .eq(BasLift::getTransfer, 1))) {
+            int lev = Utils.getLev(locNo);
+            String liftLocNo = Utils.getLocNo(basLift.getRow(), basLift.getBay(), lev);
+            List<NavigateNode> nodeList = NavigateUtils.calc(locNo, liftLocNo, NavigationMapType.NONE.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(locNo)));
+            Integer originPathAllDistance = NavigateUtils.getOriginPathAllDistance(nodeList);//鎬昏窛绂�
+            if (originPathAllDistance < distance) {
+                distance = originPathAllDistance;
+                liftDeviceId = basLift.getDeviceId();
+            }
+        }
+
+        if (liftDeviceId == null) {
+            return null;
+        }
+
+        Device device = deviceService.getById(liftDeviceId);
+        if (device == null) {
+            return null;
+        }
+        return device;
+    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java
index 2725023..f1158fe 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/FlowExecute.java
@@ -1,8 +1,12 @@
 package com.zy.asrs.wcs.rcs.thread;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.wcs.asrs.entity.param.FlowLogicCodeParam;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.codec.digest.Md5Crypt;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -12,61 +16,99 @@
 public class FlowExecute {
 
     //鎵ц娴佺▼鍥�
-    public boolean execute(List<FlowLogicCodeParam> list) {
-        for (FlowLogicCodeParam param : list) {
-            if (param.getId().equals("1")) {
-                return executeFlow(param.getLogicTrue());
+    public boolean execute(List<JSONObject> list) {
+        String currentId = list.get(0).getString("id");
+
+        String listId = DigestUtils.md5Hex(JSON.toJSONString(list));
+
+        while (currentId != null) {
+            //鑾峰彇娴佺▼鍥�
+            JSONObject flow = findFLow(list, currentId);
+            if (flow == null) {
+                break;
             }
-        }
-        System.out.println(list);
-        return false;
-    }
 
-    private boolean executeFlow(List<Map<String, Object>> list) {
-        for (Map<String, Object> map : list) {
-            JSONObject data = (JSONObject) map.get("data");
-            if (data.getString("type").equals("devp")) {
-                JSONObject devp = data.getJSONObject("devpType");
-                String devpNo = devp.getString("devpNo");//杈撻�佺嚎PLC
-                String staNo = devp.getString("staNo");//绔欏彿
-                Boolean enableStaStatus = devp.getBoolean("enableStaStatus");//鍒ゆ柇绔欑偣鐘舵��
-                JSONArray staStatus = devp.getJSONArray("staStatus");//绔欑偣鐘舵�佸垪琛�
-                String staJudgementFailExecute = devp.getString("staJudgementFailExecute");//鍒ゆ柇澶辫触鍚庢槸鍚︾户缁墽琛屾祦绋�
-                Boolean writeWorkNoStatus = devp.getBoolean("writeWorkNoStatus");//鏄惁鍐欏叆宸ヤ綔鍙�
-                Boolean writeStaNoStatus = devp.getBoolean("writeStaNoStatus");//鏄惁鍐欏叆鐩爣绔�
-                String writeWorkNo = devp.getString("writeWorkNo");//鍐欏叆宸ヤ綔鍙锋暟鎹�
-                String writeStaNo = devp.getString("writeStaNo");//鍐欏叆鐩爣绔欐暟鎹�
-                if (enableStaStatus) {
-                    //鍒ゆ柇绔欑偣鐘舵��
-                    boolean statusFlag = true;//榛樿鍒ゆ柇閫氳繃
-                    for (Object status : staStatus) {
-                        System.out.println(status);
-                    }
+            //鎵ц
+            boolean result = executeFlow(flow, listId);
 
-                    if (!statusFlag) {
-                        //鍒ゆ柇涓嶉�氳繃
-                        if (staJudgementFailExecute.equals("stop")) {
-                            //鍒ゆ柇澶辫触鍚庝笉缁х画鎵ц
-                            return false;
-                        }
-                    }
-
-                }
-
-                if (writeWorkNoStatus) {
-                    //鍐欏叆宸ヤ綔鍙�
-                }
-
-                if (writeStaNoStatus) {
-                    //鍐欏叆鐩爣绔�
-                }
-                System.out.println(devp);
+            //鎵ц鍚庣画娴佺▼
+            if (Cools.isEmpty(flow.get("nextTrue")) && Cools.isEmpty(flow.get("nextFalse"))) {
+                break;//鏃犲悗缁祦绋�
             }
-            System.out.println(data);
+
+            //鏇存柊id
+            currentId = result ? flow.getString("nextTrue") : flow.getString("nextFalse");
         }
 
-        System.out.println(list);
-        return false;
+        System.out.println("鎵ц瀹屾垚");
+        return true;
     }
 
+    private boolean executeFlow(JSONObject flow, String listId) {
+        System.out.println(flow.getString("id") + "琚墽琛�");
+        String type = flow.getString("type");
+        if (type.equals("devp")) {
+
+        } else if (type.equals("shuttle")) {
+
+        }
+        return true;
+    }
+
+    private JSONObject findFLow(List<JSONObject> list, String id) {
+        for (JSONObject flow : list) {
+            if (flow.getString("id").equals(id)) {
+                return flow;
+            }
+        }
+        return null;
+    }
+
+//    private boolean executeFlow(List<Map<String, Object>> list) {
+//        for (Map<String, Object> map : list) {
+//            JSONObject data = (JSONObject) map.get("data");
+//            if (data.getString("type").equals("devp")) {
+//                JSONObject devp = data.getJSONObject("devpType");
+//                String devpNo = devp.getString("devpNo");//杈撻�佺嚎PLC
+//                String staNo = devp.getString("staNo");//绔欏彿
+//                Boolean enableStaStatus = devp.getBoolean("enableStaStatus");//鍒ゆ柇绔欑偣鐘舵��
+//                JSONArray staStatus = devp.getJSONArray("staStatus");//绔欑偣鐘舵�佸垪琛�
+//                String staJudgementFailExecute = devp.getString("staJudgementFailExecute");//鍒ゆ柇澶辫触鍚庢槸鍚︾户缁墽琛屾祦绋�
+//                Boolean writeWorkNoStatus = devp.getBoolean("writeWorkNoStatus");//鏄惁鍐欏叆宸ヤ綔鍙�
+//                Boolean writeStaNoStatus = devp.getBoolean("writeStaNoStatus");//鏄惁鍐欏叆鐩爣绔�
+//                String writeWorkNo = devp.getString("writeWorkNo");//鍐欏叆宸ヤ綔鍙锋暟鎹�
+//                String writeStaNo = devp.getString("writeStaNo");//鍐欏叆鐩爣绔欐暟鎹�
+//                if (enableStaStatus) {
+//                    //鍒ゆ柇绔欑偣鐘舵��
+//                    boolean statusFlag = true;//榛樿鍒ゆ柇閫氳繃
+//                    for (Object status : staStatus) {
+//                        System.out.println(status);
+//                    }
+//
+//                    if (!statusFlag) {
+//                        //鍒ゆ柇涓嶉�氳繃
+//                        if (staJudgementFailExecute.equals("stop")) {
+//                            //鍒ゆ柇澶辫触鍚庝笉缁х画鎵ц
+//                            return false;
+//                        }
+//                    }
+//
+//                }
+//
+//                if (writeWorkNoStatus) {
+//                    //鍐欏叆宸ヤ綔鍙�
+//                }
+//
+//                if (writeStaNoStatus) {
+//                    //鍐欏叆鐩爣绔�
+//                }
+//                System.out.println(devp);
+//            }
+//            System.out.println(data);
+//        }
+//
+//        System.out.println(list);
+//        return false;
+//    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/shuttleStandby.sql b/zy-asrs-wcs/src/main/java/shuttleStandby.sql
new file mode 100644
index 0000000..ff02352
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/shuttleStandby.sql
@@ -0,0 +1,9 @@
+-- save shuttleStandby record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '绌挎杞﹀緟鏈轰綅绠$悊', '0', '/core/shuttleStandby', '/core/shuttleStandby', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ绌挎杞﹀緟鏈轰綅', '', '1', 'core:shuttleStandby:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞绌挎杞﹀緟鏈轰綅', '', '1', 'core:shuttleStandby:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼绌挎杞﹀緟鏈轰綅', '', '1', 'core:shuttleStandby:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎绌挎杞﹀緟鏈轰綅', '', '1', 'core:shuttleStandby:remove', '3', '1', '1');
+
diff --git a/zy-asrs-wcs/src/main/resources/mapper/core/BasLiftMapper.xml b/zy-asrs-wcs/src/main/resources/mapper/core/BasLiftMapper.xml
new file mode 100644
index 0000000..a5653dc
--- /dev/null
+++ b/zy-asrs-wcs/src/main/resources/mapper/core/BasLiftMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.wcs.core.mapper.BasLiftMapper">
+
+</mapper>
diff --git a/zy-asrs-wcs/src/main/resources/mapper/core/ShuttleStandbyMapper.xml b/zy-asrs-wcs/src/main/resources/mapper/core/ShuttleStandbyMapper.xml
new file mode 100644
index 0000000..761d485
--- /dev/null
+++ b/zy-asrs-wcs/src/main/resources/mapper/core/ShuttleStandbyMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.wcs.core.mapper.ShuttleStandbyMapper">
+
+</mapper>
diff --git a/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml b/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
index 93b2cc3..81aefdb 100644
--- a/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
+++ b/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
@@ -79,11 +79,18 @@
 
     <select id="selectWorkingByShuttle" resultType="com.zy.asrs.wcs.core.entity.Task">
         select * from wcs_task
-        where task_sts in (1,2,3,101,102,103,201,202,203,204,301,302,303,401,402,403)
+        where task_sts in (1,2,3,101,102,103,301,302,303,401,402,403)
           and shuttle_no = #{shuttleNo}
         order by priority desc,start_time,task_no asc
     </select>
 
+    <select id="selectWorkingByLift" resultType="com.zy.asrs.wcs.core.entity.Task">
+        select * from wcs_task
+        where task_sts in (1,2,3,101,102,103,301,302,303,401,402,403)
+          and lift_no = #{liftNo}
+        order by priority desc,start_time,task_no asc
+    </select>
+
     <select id="selectChargeWorking" resultType="com.zy.asrs.wcs.core.entity.Task">
         select * from wcs_task
         where task_sts in (201,202,203,204)

--
Gitblit v1.9.1