#
Junjie
2024-06-13 ad67399e14815baa028564c0edce3fec3c414914
#
12个文件已修改
1040 ■■■■■ 已修改文件
zy-asrs-flow/src/pages/task/task/index.jsx 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-flow/src/pages/task/taskLog/components/edit.jsx 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-flow/src/pages/task/taskLog/index.jsx 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorStaController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasLedController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/LocController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/MotionLogController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskLogController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/TaskLog.java 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-flow/src/pages/task/task/index.jsx
@@ -75,6 +75,46 @@
    }
};
const handleComplete = async (rows, intl) => {
    if (!rows) return true;
    const hide = message.loading(intl.formatMessage({ id: 'page.completeing', defaultMessage: '正在完成' }));
    try {
        const resp = await Http.doPost('api/task/complete/' + rows.map((row) => row.id).join(','));
        if (resp.code === 200) {
            message.success(intl.formatMessage({ id: 'page.complete.success', defaultMessage: '完成成功' }));
            return true;
        } else {
            message.error(resp.msg);
            return false;
        }
    } catch (error) {
        message.error(intl.formatMessage({ id: 'page.complete.fail', defaultMessage: '完成失败,请重试!' }));
        return false;
    } finally {
        hide();
    }
};
const handleCancel = async (rows, intl) => {
    if (!rows) return true;
    const hide = message.loading(intl.formatMessage({ id: 'page.canceling', defaultMessage: '正在取消' }));
    try {
        const resp = await Http.doPost('api/task/cancel/' + rows.map((row) => row.id).join(','));
        if (resp.code === 200) {
            message.success(intl.formatMessage({ id: 'page.cancel.success', defaultMessage: '取消成功' }));
            return true;
        } else {
            message.error(resp.msg);
            return false;
        }
    } catch (error) {
        message.error(intl.formatMessage({ id: 'page.cancel.fail', defaultMessage: '取消失败,请重试!' }));
        return false;
    } finally {
        hide();
    }
};
const handleExport = async (intl) => {
    const hide = message.loading(intl.formatMessage({ id: 'page.exporting', defaultMessage: '正在导出' }));
    try {
@@ -471,7 +511,7 @@
        {
            title: '操作',
            dataIndex: 'option',
            width: 140,
            width: 240,
            valueType: 'option',
            render: (_, record) => [
                <Button
@@ -484,16 +524,36 @@
                >
                    <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>,
                <Button
                    type="link"
                    danger
                    key="batchRemove"
                    key="complete"
                    onClick={async () => {
                        Modal.confirm({
                            title: intl.formatMessage({ id: 'page.delete', defaultMessage: '删除' }),
                            content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '确定删除该项吗?' }),
                            title: intl.formatMessage({ id: 'page.complete', defaultMessage: '完成' }),
                            content: intl.formatMessage({ id: 'page.complete.confirm', defaultMessage: '确定完成该项吗?' }),
                            onOk: async () => {
                                const success = await handleRemove([record], intl);
                                const success = await handleComplete([record], intl);
                                if (success) {
                                    if (actionRef.current) {
                                        actionRef.current.reload();
@@ -503,8 +563,28 @@
                        });
                    }}
                >
                    <FormattedMessage id='page.delete' defaultMessage='删除' />
                    <FormattedMessage id='page.complete' defaultMessage='完成' />
                </Button>,
                <Button
                type="link"
                key="cancel"
                onClick={async () => {
                    Modal.confirm({
                        title: intl.formatMessage({ id: 'page.cancel', defaultMessage: '取消' }),
                        content: intl.formatMessage({ id: 'page.cancel.confirm', defaultMessage: '确定取消该项吗?' }),
                        onOk: async () => {
                            const success = await handleCancel([record], intl);
                            if (success) {
                                if (actionRef.current) {
                                    actionRef.current.reload();
                                }
                            }
                        },
                    });
                }}
            >
                <FormattedMessage id='page.cancel' defaultMessage='取消' />
            </Button>,
            ],
        },
    ];
zy-asrs-flow/src/pages/task/taskLog/components/edit.jsx
@@ -68,30 +68,151 @@
                            label="编号"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormText
                            name="name"
                            label="名称"
                        <ProFormSelect
                            name="busId"
                            label="总线"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                            showSearch
                            debounceTime={300}
                            request={async ({ keyWords }) => {
                                const resp = await Http.doPostForm('api/bus/query', { condition: keyWords });
                                return resp.data;
                            }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormText
                            name="flag"
                            label="标识"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormText
                            name="taskNo"
                            label="任务号"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormText
                            name="serialNum"
                            label="序列号"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormText
                            name="taskData"
                            label="任务数据"
                            name="title"
                            label="标题"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormSelect
                            name="taskSts"
                            label="任务状态"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                            showSearch
                            debounceTime={300}
                            request={async ({ keyWords }) => {
                                const resp = await Http.doPostForm('api/taskSts/query', { condition: keyWords });
                                return resp.data;
                            }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormSelect
                            name="taskCtg"
                            label="任务类型"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                            showSearch
                            debounceTime={300}
                            request={async ({ keyWords }) => {
                                const resp = await Http.doPostForm('api/taskCtg/query', { condition: keyWords });
                                return resp.data;
                            }}
                        />
                        <ProFormDigit
                            name="priority"
                            label="优先级"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormText
                            name="originSite"
                            label="起始站"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormText
                            name="originLoc"
                            label="起始库位"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormText
                            name="destSite"
                            label="目标站"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormText
                            name="destLoc"
                            label="目标库位"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormSelect
                            name="emptyMk"
                            label="空托"
                            colProps={{ md: 12, xl: 12 }}
                            options={[
                                { label: '是', value: 1 },
                                { label: '否', value: 0 },
                            ]}
                        />
                        <ProFormText
                            name="zpallet"
                            label="托盘码"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormText
                            name="phase"
                            label="环节"
                            colProps={{ md: 12, xl: 12 }}
                        />
                        <ProFormDateTimePicker
                            name="ioTime"
                            label="任务时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => moment(value).toISOString()}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDateTimePicker
                            name="startTime"
                            label="开始时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => moment(value).toISOString()}
                        />
                        <ProFormDateTimePicker
                            name="endTime"
                            label="结束时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => moment(value).toISOString()}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDateTimePicker
                            name="exceptionTime"
                            label="异常时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => moment(value).toISOString()}
                        />
                        <ProFormText
                            name="exceptionDesc"
                            label="异常描述"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormSelect
                            name="status"
                            label="状态"
@@ -101,14 +222,14 @@
                                { label: '禁用', value: 0 },
                            ]}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDateTimePicker
                            name="createTime"
                            label="添加时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => moment(value).toISOString()}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormSelect
                            name="createBy"
                            label="添加人员"
@@ -121,14 +242,14 @@
                                return resp.data;
                            }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDateTimePicker
                            name="updateTime"
                            label="修改时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => moment(value).toISOString()}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormSelect
                            name="updateBy"
                            label="修改人员"
@@ -141,14 +262,53 @@
                                return resp.data;
                            }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormText
                            name="memo"
                            label="备注"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDigit
                            name="shuttleNo"
                            label="四向穿梭车号"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                        />
                        <ProFormDigit
                            name="liftNo"
                            label="提升机号"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDigit
                            name="crnNo"
                            label="堆垛机号"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                        />
                        <ProFormDigit
                            name="rgvNo"
                            label="RGV号"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormDigit
                            name="agvNo"
                            label="AGV号"
                            colProps={{ md: 12, xl: 12 }}
                            fieldProps={{ precision: 0 }}
                        />
                        <ProFormText
                            name="recordLoc"
                            label="是否记录库位信息"
                            colProps={{ md: 12, xl: 12 }}
                        />
                    </ProForm.Group>
                </ProForm>
            </Modal>
zy-asrs-flow/src/pages/task/taskLog/index.jsx
@@ -129,27 +129,14 @@
            />,
        },
        {
            title: '名称',
            dataIndex: 'name',
            title: '总线',
            dataIndex: 'busId$',
            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'
            filterDropdown: (props) => <LinkFilter
                name='busId'
                major='bus'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
@@ -161,6 +148,7 @@
            valueType: 'text',
            hidden: false,
            width: 140,
            copyable: true,
            filterDropdown: (props) => <TextFilter
                name='taskNo'
                {...props}
@@ -169,13 +157,227 @@
            />,
        },
        {
            title: '任务数据',
            dataIndex: 'taskData',
            title: '序列号',
            dataIndex: 'serialNum',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='taskData'
                name='serialNum'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '标题',
            dataIndex: 'title',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='title'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '任务状态',
            dataIndex: 'taskSts$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <LinkFilter
                name='taskSts'
                major='taskSts'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '任务类型',
            dataIndex: 'taskCtg$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <LinkFilter
                name='taskCtg'
                major='taskCtg'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '优先级',
            dataIndex: 'priority',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='priority'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '起始站',
            dataIndex: 'originSite',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='originSite'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '起始库位',
            dataIndex: 'originLoc',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='originLoc'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '目标站',
            dataIndex: 'destSite',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='destSite'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '目标库位',
            dataIndex: 'destLoc',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='destLoc'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '空托',
            dataIndex: 'emptyMk$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <SelectFilter
                name='emptyMk'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
                data={[
                    { label: '是', value: 1 },
                    { label: '否', value: 0 },
                ]}
            />,
        },
        {
            title: '托盘码',
            dataIndex: 'zpallet',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='zpallet'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '环节',
            dataIndex: 'phase',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='phase'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '任务时间',
            dataIndex: 'ioTime$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <DatetimeRangeFilter
                name='ioTime'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '开始时间',
            dataIndex: 'startTime$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <DatetimeRangeFilter
                name='startTime'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '结束时间',
            dataIndex: 'endTime$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <DatetimeRangeFilter
                name='endTime'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '异常时间',
            dataIndex: 'exceptionTime$',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <DatetimeRangeFilter
                name='exceptionTime'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '异常描述',
            dataIndex: 'exceptionDesc',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='exceptionDesc'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
@@ -265,6 +467,84 @@
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '四向穿梭车号',
            dataIndex: 'shuttleNo',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='shuttleNo'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '提升机号',
            dataIndex: 'liftNo',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='liftNo'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '堆垛机号',
            dataIndex: 'crnNo',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='crnNo'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: 'RGV号',
            dataIndex: 'rgvNo',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='rgvNo'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: 'AGV号',
            dataIndex: 'agvNo',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='agvNo'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '是否记录库位信息',
            dataIndex: 'recordLoc',
            valueType: 'text',
            hidden: false,
            width: 140,
            filterDropdown: (props) => <TextFilter
                name='recordLoc'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '操作',
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorController.java
@@ -1,4 +1,4 @@
package com.zy.asrs.wcs.system.controller;
package com.zy.asrs.wcs.core.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +10,7 @@
import com.zy.asrs.wcs.common.domain.PageParam;
import com.zy.asrs.wcs.core.entity.BasConveyor;
import com.zy.asrs.wcs.core.service.BasConveyorService;
import com.zy.asrs.wcs.system.controller.BaseController;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasConveyorStaController.java
@@ -1,4 +1,4 @@
package com.zy.asrs.wcs.system.controller;
package com.zy.asrs.wcs.core.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +10,7 @@
import com.zy.asrs.wcs.common.domain.PageParam;
import com.zy.asrs.wcs.core.entity.BasConveyorSta;
import com.zy.asrs.wcs.core.service.BasConveyorStaService;
import com.zy.asrs.wcs.system.controller.BaseController;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasLedController.java
@@ -1,4 +1,4 @@
package com.zy.asrs.wcs.system.controller;
package com.zy.asrs.wcs.core.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +10,7 @@
import com.zy.asrs.wcs.common.domain.PageParam;
import com.zy.asrs.wcs.core.entity.BasLed;
import com.zy.asrs.wcs.core.service.BasLedService;
import com.zy.asrs.wcs.system.controller.BaseController;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/LocController.java
@@ -1,6 +1,7 @@
package com.zy.asrs.wcs.core.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.R;
@@ -34,7 +35,11 @@
    public R page(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<Loc, BaseParam> pageParam = new PageParam<>(baseParam, Loc.class);
        return R.ok().add(locService.page(pageParam, pageParam.buildWrapper(true)));
        QueryWrapper<Loc> wrapper = new QueryWrapper<>();
        if (!Cools.isEmpty(baseParam.getCondition())) {
            wrapper.like("loc_no", baseParam.getCondition());
        }
        return R.ok().add(locService.page(pageParam, wrapper));
    }
    @PreAuthorize("hasAuthority('core:loc:list')")
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/MotionLogController.java
@@ -1,4 +1,4 @@
package com.zy.asrs.wcs.system.controller;
package com.zy.asrs.wcs.core.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +10,7 @@
import com.zy.asrs.wcs.common.domain.PageParam;
import com.zy.asrs.wcs.core.entity.MotionLog;
import com.zy.asrs.wcs.core.service.MotionLogService;
import com.zy.asrs.wcs.system.controller.BaseController;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java
@@ -8,19 +8,24 @@
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.Motion;
import com.zy.asrs.wcs.core.entity.MotionLog;
import com.zy.asrs.wcs.core.entity.Task;
import com.zy.asrs.wcs.core.entity.TaskLog;
import com.zy.asrs.wcs.core.model.enums.TaskStsType;
import com.zy.asrs.wcs.core.service.MotionLogService;
import com.zy.asrs.wcs.core.service.MotionService;
import com.zy.asrs.wcs.core.service.TaskLogService;
import com.zy.asrs.wcs.core.service.TaskService;
import com.zy.asrs.wcs.system.controller.BaseController;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
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;
import java.util.*;
@RestController
@RequestMapping("/api")
@@ -28,6 +33,12 @@
    @Autowired
    private TaskService taskService;
    @Autowired
    private TaskLogService taskLogService;
    @Autowired
    private MotionService motionService;
    @Autowired
    private MotionLogService motionLogService;
    @PreAuthorize("hasAuthority('core:task:list')")
    @PostMapping("/task/page")
@@ -99,4 +110,84 @@
        ExcelUtil.build(ExcelUtil.create(taskService.list(), Task.class), response);
    }
    @PreAuthorize("hasAuthority('core:task:complete')")
    @OperationLog("手动完成任务")
    @PostMapping("/task/complete/{id}")
    @Transactional
    public synchronized R complete(@PathVariable Long id) {
        Task task = taskService.getById(id);
        if (task == null) {
            return R.error("任务不存在");
        }
        switch (TaskStsType.query(task.getTaskSts())) {
            case NEW_INBOUND:
            case ANALYZE_INBOUND:
            case EXECUTE_INBOUND:
                task.setTaskSts(TaskStsType.COMPLETE_INBOUND.sts);
                break;
            case NEW_OUTBOUND:
            case ANALYZE_OUTBOUND:
            case EXECUTE_OUTBOUND:
                task.setTaskSts(TaskStsType.COMPLETE_OUTBOUND.sts);
                break;
            case NEW_CHARGE:
            case ANALYZE_CHARGE:
            case EXECUTE_CHARGE:
                task.setTaskSts(TaskStsType.CHARGE_WORKING.sts);
                break;
            case NEW_MOVE:
            case ANALYZE_MOVE:
            case EXECUTE_MOVE:
                task.setTaskSts(TaskStsType.COMPLETE_MOVE.sts);
                break;
            case NEW_MANUAL:
            case ANALYZE_MANUAL:
            case EXECUTE_MANUAL:
                task.setTaskSts(TaskStsType.COMPLETE_MANUAL.sts);
                break;
            default:
                return R.error("当前状态不可被完成");
        }
        task.setUpdateTime(new Date());
        task.setUpdateBy(getLoginUserId());
        if (!taskService.updateById(task)) {
            return R.error("完成失败");
        }
        return R.ok("任务完成");
    }
    @PreAuthorize("hasAuthority('core:task:cancel')")
    @OperationLog("手动取消任务")
    @PostMapping("/task/cancel/{id}")
    @Transactional
    public synchronized R cancel(@PathVariable Long id) {
        Task task = taskService.getById(id);
        if (task == null) {
            return R.error("任务不存在");
        }
        //创建历史档
        TaskLog taskLog = new TaskLog();
        taskLog.sync(task);
        taskLog.setUpdateTime(new Date());
        taskLog.setUpdateBy(getLoginUserId());
        taskLog.setHostId(null);
        taskLogService.save(taskLog);
        List<Motion> motions = motionService.list(new LambdaQueryWrapper<Motion>().eq(Motion::getTaskNo, task.getTaskNo()).eq(Motion::getHostId, task.getHostId()));
        for (Motion motion : motions) {
            //创建动作历史档
            MotionLog motionLog = new MotionLog();
            motionLog.sync(motion);
            motionLog.setUpdateTime(new Date());
            motionLogService.save(motionLog);
        }
        //删除源任务
        taskService.removeById(task.getId());
        //删除动作
        motionService.remove(new LambdaQueryWrapper<Motion>().eq(Motion::getTaskNo, task.getTaskNo()).eq(Motion::getHostId, task.getHostId()));
        return R.ok("取消成功");
    }
}
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskLogController.java
@@ -1,4 +1,4 @@
package com.zy.asrs.wcs.system.controller;
package com.zy.asrs.wcs.core.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +10,7 @@
import com.zy.asrs.wcs.common.domain.PageParam;
import com.zy.asrs.wcs.core.entity.TaskLog;
import com.zy.asrs.wcs.core.service.TaskLogService;
import com.zy.asrs.wcs.system.controller.BaseController;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -84,10 +85,10 @@
        List<KeyValVo> vos = new ArrayList<>();
        LambdaQueryWrapper<TaskLog> wrapper = new LambdaQueryWrapper<>();
        if (!Cools.isEmpty(condition)) {
            wrapper.like(TaskLog::getName, condition);
            wrapper.like(TaskLog::getTaskNo, condition);
        }
        taskLogService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
                item -> vos.add(new KeyValVo(item.getId(), item.getName()))
                item -> vos.add(new KeyValVo(item.getId(), item.getTaskNo()))
        );
        return R.ok().add(vos);
    }
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/entity/TaskLog.java
@@ -1,29 +1,27 @@
package com.zy.asrs.wcs.core.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.common.utils.Synchro;
import com.zy.asrs.wcs.core.service.BusService;
import com.zy.asrs.wcs.core.service.TaskCtgService;
import com.zy.asrs.wcs.core.service.TaskStsService;
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_task_log")
@@ -35,7 +33,7 @@
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    @TableId(value = "id", type = IdType.INPUT)
    private Long id;
    /**
@@ -45,16 +43,10 @@
    private String uuid;
    /**
     * 名称
     * 总线
     */
    @ApiModelProperty(value= "名称")
    private String name;
    /**
     * 标识
     */
    @ApiModelProperty(value= "标识")
    private String flag;
    @ApiModelProperty(value= "总线")
    private Long busId;
    /**
     * 任务号
@@ -63,10 +55,110 @@
    private String taskNo;
    /**
     * 任务数据
     * 序列号
     */
    @ApiModelProperty(value= "任务数据")
    private String taskData;
    @ApiModelProperty(value= "序列号")
    private String serialNum;
    /**
     * 标题
     */
    @ApiModelProperty(value= "标题")
    private String title;
    /**
     * 任务状态
     */
    @ApiModelProperty(value= "任务状态")
    private Long taskSts;
    /**
     * 任务类型
     */
    @ApiModelProperty(value= "任务类型")
    private Long taskCtg;
    /**
     * 优先级
     */
    @ApiModelProperty(value= "优先级")
    private Integer priority;
    /**
     * 起始站
     */
    @ApiModelProperty(value= "起始站")
    private String originSite;
    /**
     * 起始库位
     */
    @ApiModelProperty(value= "起始库位")
    private String originLoc;
    /**
     * 目标站
     */
    @ApiModelProperty(value= "目标站")
    private String destSite;
    /**
     * 目标库位
     */
    @ApiModelProperty(value= "目标库位")
    private String destLoc;
    /**
     * 空托 1: 是  0: 否
     */
    @ApiModelProperty(value= "空托 1: 是  0: 否  ")
    private Integer emptyMk;
    /**
     * 托盘码
     */
    @ApiModelProperty(value= "托盘码")
    private String zpallet;
    /**
     * 环节
     */
    @ApiModelProperty(value= "环节")
    private String phase;
    /**
     * 任务时间
     */
    @ApiModelProperty(value= "任务时间")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date ioTime;
    /**
     * 开始时间
     */
    @ApiModelProperty(value= "开始时间")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    /**
     * 结束时间
     */
    @ApiModelProperty(value= "结束时间")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    /**
     * 异常时间
     */
    @ApiModelProperty(value= "异常时间")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date exceptionTime;
    /**
     * 异常描述
     */
    @ApiModelProperty(value= "异常描述")
    private String exceptionDesc;
    /**
     * 所属机构
@@ -119,14 +211,65 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 四向穿梭车号
     */
    @ApiModelProperty(value= "四向穿梭车号")
    private Integer shuttleNo;
    /**
     * 提升机号
     */
    @ApiModelProperty(value= "提升机号")
    private Integer liftNo;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    private Integer crnNo;
    /**
     * RGV号
     */
    @ApiModelProperty(value= "RGV号")
    private Integer rgvNo;
    /**
     * AGV号
     */
    @ApiModelProperty(value= "AGV号")
    private Integer agvNo;
    /**
     * 是否记录库位信息
     */
    @ApiModelProperty(value= "是否记录库位信息")
    private String recordLoc;
    public TaskLog() {}
    public TaskLog(String uuid,String name,String flag,String taskNo,String taskData,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
    public TaskLog(String uuid,Long busId,String taskNo,String serialNum,String title,Long taskSts,Long taskCtg,Integer priority,String originSite,String originLoc,String destSite,String destLoc,Integer emptyMk,String zpallet,String phase,Date ioTime,Date startTime,Date endTime,Date exceptionTime,String exceptionDesc,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo,Integer shuttleNo,Integer liftNo,Integer crnNo,Integer rgvNo,Integer agvNo,String recordLoc) {
        this.uuid = uuid;
        this.name = name;
        this.flag = flag;
        this.busId = busId;
        this.taskNo = taskNo;
        this.taskData = taskData;
        this.serialNum = serialNum;
        this.title = title;
        this.taskSts = taskSts;
        this.taskCtg = taskCtg;
        this.priority = priority;
        this.originSite = originSite;
        this.originLoc = originLoc;
        this.destSite = destSite;
        this.destLoc = destLoc;
        this.emptyMk = emptyMk;
        this.zpallet = zpallet;
        this.phase = phase;
        this.ioTime = ioTime;
        this.startTime = startTime;
        this.endTime = endTime;
        this.exceptionTime = exceptionTime;
        this.exceptionDesc = exceptionDesc;
        this.hostId = hostId;
        this.status = status;
        this.deleted = deleted;
@@ -135,14 +278,35 @@
        this.updateTime = updateTime;
        this.updateBy = updateBy;
        this.memo = memo;
        this.shuttleNo = shuttleNo;
        this.liftNo = liftNo;
        this.crnNo = crnNo;
        this.rgvNo = rgvNo;
        this.agvNo = agvNo;
        this.recordLoc = recordLoc;
    }
//    TaskLog taskLog = new TaskLog(
//            null,    // 编号
//            null,    // 名称
//            null,    // 标识
//            null,    // 总线
//            null,    // 任务号
//            null,    // 任务数据
//            null,    // 序列号
//            null,    // 标题
//            null,    // 任务状态
//            null,    // 任务类型
//            null,    // 优先级
//            null,    // 起始站
//            null,    // 起始库位
//            null,    // 目标站
//            null,    // 目标库位
//            null,    // 空托
//            null,    // 托盘码
//            null,    // 环节
//            null,    // 任务时间
//            null,    // 开始时间
//            null,    // 结束时间
//            null,    // 异常时间
//            null,    // 异常描述
//            null,    // 所属机构
//            null,    // 状态
//            null,    // 是否删除
@@ -150,8 +314,83 @@
//            null,    // 添加人员
//            null,    // 修改时间
//            null,    // 修改人员
//            null    // 备注
//            null,    // 备注
//            null,    // 四向穿梭车号
//            null,    // 提升机号
//            null,    // 堆垛机号
//            null,    // RGV号
//            null,    // AGV号
//            null    // 是否记录库位信息
//    );
    public String getBusId$(){
        BusService service = SpringUtils.getBean(BusService.class);
        Bus bus = service.getById(this.busId);
        if (!Cools.isEmpty(bus)){
            return String.valueOf(bus.getUuid());
        }
        return null;
    }
    public String getTaskSts$(){
        TaskStsService service = SpringUtils.getBean(TaskStsService.class);
        TaskSts taskSts = service.getOne(new LambdaQueryWrapper<TaskSts>()
                .eq(TaskSts::getUuid, String.valueOf(this.taskSts))
                .eq(TaskSts::getHostId, this.hostId));
        if (!Cools.isEmpty(taskSts)){
            return String.valueOf(taskSts.getName());
        }
        return null;
    }
    public String getTaskCtg$(){
        TaskCtgService service = SpringUtils.getBean(TaskCtgService.class);
        TaskCtg taskCtg = service.getById(this.taskCtg);
        if (!Cools.isEmpty(taskCtg)){
            return String.valueOf(taskCtg.getName());
        }
        return null;
    }
    public String getEmptyMk$(){
        if (null == this.emptyMk){ return null; }
        switch (this.emptyMk){
            case 1:
                return "是";
            case 0:
                return "否";
            default:
                return String.valueOf(this.emptyMk);
        }
    }
    public String getIoTime$(){
        if (Cools.isEmpty(this.ioTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime);
    }
    public String getStartTime$(){
        if (Cools.isEmpty(this.startTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
    }
    public String getEndTime$(){
        if (Cools.isEmpty(this.endTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
    }
    public String getExceptionTime$(){
        if (Cools.isEmpty(this.exceptionTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.exceptionTime);
    }
    public String getHostId$(){
        HostService service = SpringUtils.getBean(HostService.class);
@@ -218,5 +457,8 @@
        return null;
    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
}
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
@@ -87,12 +87,9 @@
    @Transactional
    public void saveTaskLog(Task task) {
        //创建历史档
        Date date = new Date();
        TaskLog taskLog = new TaskLog();
        taskLog.setTaskNo(task.getTaskNo());
        taskLog.setTaskData(JSON.toJSONString(task));
        taskLog.setCreateTime(date);
        taskLog.setUpdateTime(date);
        taskLog.sync(task);
        taskLog.setUpdateTime(new Date());
        taskLogService.save(taskLog);
        List<Motion> motions = motionService.list(new LambdaQueryWrapper<Motion>().eq(Motion::getTaskNo, task.getTaskNo()).eq(Motion::getHostId, task.getHostId()));