Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack
3个文件已修改
13个文件已添加
1 文件已重命名
New file |
| | |
| | | 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 }} |
| | | rules={[{ required: true }]} |
| | | /> |
| | | </ProForm.Group> |
| | | <ProForm.Group> |
| | | <ProFormText |
| | | name="flag" |
| | | label="标识" |
| | | colProps={{ md: 12, xl: 12 }} |
| | | /> |
| | | <ProFormSelect |
| | | name="status" |
| | | label="状态" |
| | | colProps={{ md: 12, xl: 12 }} |
| | | options={[ |
| | | { label: '正常', value: 1 }, |
| | | { label: '禁用', value: 0 }, |
| | | ]} |
| | | /> |
| | | </ProForm.Group> |
| | | <ProForm.Group> |
| | | <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; |
| | | }} |
| | | /> |
| | | <ProFormDateTimePicker |
| | | name="createTime" |
| | | label="添加时间" |
| | | colProps={{ md: 12, xl: 12 }} |
| | | transform={(value) => moment(value).toISOString()} |
| | | /> |
| | | </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; |
| | | }} |
| | | /> |
| | | <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 }} |
| | | /> |
| | | </ProForm.Group> |
| | | |
| | | </ProForm> |
| | | </Modal> |
| | | </> |
| | | ) |
| | | } |
| | | |
| | | export default Edit; |
New file |
| | |
| | | |
| | | 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-deviceCtg'; |
| | | |
| | | const handleSave = async (val, intl) => { |
| | | const hide = message.loading(intl.formatMessage({ id: 'page.adding', defaultMessage: '正在添加' })); |
| | | try { |
| | | const resp = await Http.doPost('api/deviceCtg/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: '正在更新' })); |
| | | try { |
| | | const resp = await Http.doPost('api/deviceCtg/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: '正在删除' })); |
| | | try { |
| | | const resp = await Http.doPost('api/deviceCtg/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: '正在导出' })); |
| | | try { |
| | | const resp = await Http.doPostBlob('api/deviceCtg/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: '正常', value: 1 }, |
| | | { label: '禁用', value: 0 }, |
| | | ]} |
| | | />, |
| | | }, |
| | | { |
| | | 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: 'updateBy$', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <LinkFilter |
| | | name='updateBy' |
| | | 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: 'memo', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <TextFilter |
| | | name='memo' |
| | | {...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="deviceCtg" |
| | | 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/deviceCtg/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; |
New file |
| | |
| | | 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.DeviceCtg; |
| | | import com.zy.asrs.wcs.core.service.DeviceCtgService; |
| | | 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 DeviceCtgController extends BaseController { |
| | | |
| | | @Autowired |
| | | private DeviceCtgService deviceCtgService; |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:list')") |
| | | @PostMapping("/deviceCtg/page") |
| | | public R page(@RequestBody Map<String, Object> map) { |
| | | BaseParam baseParam = buildParam(map, BaseParam.class); |
| | | PageParam<DeviceCtg, BaseParam> pageParam = new PageParam<>(baseParam, DeviceCtg.class); |
| | | return R.ok().add(deviceCtgService.page(pageParam, pageParam.buildWrapper(true))); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:list')") |
| | | @PostMapping("/deviceCtg/list") |
| | | public R list(@RequestBody Map<String, Object> map) { |
| | | return R.ok().add(deviceCtgService.list()); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:list')") |
| | | @GetMapping("/deviceCtg/{id}") |
| | | public R get(@PathVariable("id") Long id) { |
| | | return R.ok().add(deviceCtgService.getById(id)); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:save')") |
| | | @OperationLog("添加Motion设备类型") |
| | | @PostMapping("/deviceCtg/save") |
| | | public R save(@RequestBody DeviceCtg deviceCtg) { |
| | | if (!deviceCtgService.save(deviceCtg)) { |
| | | return R.error("添加失败"); |
| | | } |
| | | return R.ok("添加成功"); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:update')") |
| | | @OperationLog("修改Motion设备类型") |
| | | @PostMapping("/deviceCtg/update") |
| | | public R update(@RequestBody DeviceCtg deviceCtg) { |
| | | if (!deviceCtgService.updateById(deviceCtg)) { |
| | | return R.error("修改失败"); |
| | | } |
| | | return R.ok("修改成功"); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:remove')") |
| | | @OperationLog("删除Motion设备类型") |
| | | @PostMapping("/deviceCtg/remove/{ids}") |
| | | public R remove(@PathVariable Long[] ids) { |
| | | if (!deviceCtgService.removeByIds(Arrays.asList(ids))) { |
| | | return R.error("删除失败"); |
| | | } |
| | | return R.ok("删除成功"); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('core:deviceCtg:list')") |
| | | @PostMapping("/deviceCtg/query") |
| | | public R query(@RequestParam(required = false) String condition) { |
| | | List<KeyValVo> vos = new ArrayList<>(); |
| | | LambdaQueryWrapper<DeviceCtg> wrapper = new LambdaQueryWrapper<>(); |
| | | if (!Cools.isEmpty(condition)) { |
| | | wrapper.like(DeviceCtg::getName, condition); |
| | | } |
| | | deviceCtgService.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:deviceCtg:list')") |
| | | @PostMapping("/deviceCtg/export") |
| | | public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { |
| | | ExcelUtil.build(ExcelUtil.create(deviceCtgService.list(), DeviceCtg.class), response); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.entity; |
| | | |
| | | 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.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("rcs_device_ctg") |
| | | public class DeviceCtg 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; |
| | | |
| | | /** |
| | | * 状态 1: 正常 0: 禁用 |
| | | */ |
| | | @ApiModelProperty(value= "状态 1: 正常 0: 禁用 ") |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 添加人员 |
| | | */ |
| | | @ApiModelProperty(value= "添加人员") |
| | | private Long createBy; |
| | | |
| | | /** |
| | | * 添加时间 |
| | | */ |
| | | @ApiModelProperty(value= "添加时间") |
| | | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
| | | private Date createTime; |
| | | |
| | | /** |
| | | * 修改人员 |
| | | */ |
| | | @ApiModelProperty(value= "修改人员") |
| | | private Long updateBy; |
| | | |
| | | /** |
| | | * 修改时间 |
| | | */ |
| | | @ApiModelProperty(value= "修改时间") |
| | | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
| | | private Date updateTime; |
| | | |
| | | /** |
| | | * 备注 |
| | | */ |
| | | @ApiModelProperty(value= "备注") |
| | | private String memo; |
| | | |
| | | /** |
| | | * 是否删除 1: 是 0: 否 |
| | | */ |
| | | @ApiModelProperty(value= "是否删除 1: 是 0: 否 ") |
| | | @TableLogic |
| | | private Integer deleted; |
| | | |
| | | /** |
| | | * 所属机构 |
| | | */ |
| | | @ApiModelProperty(value= "所属机构") |
| | | private Long hostId; |
| | | |
| | | public DeviceCtg() {} |
| | | |
| | | public DeviceCtg(String uuid,String name,String flag,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer deleted,Long hostId) { |
| | | this.uuid = uuid; |
| | | this.name = name; |
| | | this.flag = flag; |
| | | this.status = status; |
| | | this.createBy = createBy; |
| | | this.createTime = createTime; |
| | | this.updateBy = updateBy; |
| | | this.updateTime = updateTime; |
| | | this.memo = memo; |
| | | this.deleted = deleted; |
| | | this.hostId = hostId; |
| | | } |
| | | |
| | | // DeviceCtg deviceCtg = new DeviceCtg( |
| | | // null, // 编号 |
| | | // null, // 名称[非空] |
| | | // null, // 标识 |
| | | // null, // 状态 |
| | | // null, // 添加人员 |
| | | // null, // 添加时间 |
| | | // null, // 修改人员 |
| | | // null, // 修改时间 |
| | | // null, // 备注 |
| | | // null, // 是否删除 |
| | | // null // 所属机构 |
| | | // ); |
| | | |
| | | public String getStatus$(){ |
| | | if (null == this.status){ return null; } |
| | | switch (this.status){ |
| | | case 1: |
| | | return "正常"; |
| | | case 0: |
| | | return "禁用"; |
| | | default: |
| | | return String.valueOf(this.status); |
| | | } |
| | | } |
| | | |
| | | 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 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 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; |
| | | } |
| | | |
| | | |
| | | } |
File was renamed from zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/kernel/command/ShuttleCommandService.java |
| | |
| | | //package com.zy.asrs.wcs.rcs.kernel.command; |
| | | //package com.zy.asrs.wcs.core.kernel.command; |
| | | // |
| | | //import com.zy.asrs.common.wms.mapper.WrkMastMapper; |
| | | //import com.zy.asrs.common.wms.service.LocMastService; |
| | | //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | //import com.zy.asrs.wcs.core.model.command.ShuttleAssignCommand; |
| | | //import com.zy.asrs.wcs.core.model.command.ShuttleCommand; |
| | | //import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; |
| | | //import com.zy.asrs.wcs.core.model.enums.MotionStsType; |
| | | //import com.zy.asrs.wcs.core.service.BasShuttleService; |
| | | //import com.zy.asrs.wcs.core.service.LocService; |
| | | //import com.zy.asrs.wcs.core.service.TaskService; |
| | | //import com.zy.asrs.wcs.core.utils.NavigateMapUtils; |
| | | //import com.zy.asrs.wcs.core.utils.RedisUtil; |
| | | //import com.zy.asrs.wcs.rcs.cache.SlaveConnection; |
| | | //import com.zy.asrs.wcs.rcs.entity.Motion; |
| | | //import com.zy.asrs.wcs.rcs.model.enums.SlaveType; |
| | | //import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; |
| | | //import com.zy.asrs.wcs.rcs.service.MotionService; |
| | | //import com.zy.asrs.wcs.rcs.thread.ShuttleThread; |
| | | //import lombok.extern.slf4j.Slf4j; |
| | | //import org.springframework.beans.factory.annotation.Autowired; |
| | | //import org.springframework.stereotype.Service; |
| | | // |
| | | //import java.util.ArrayList; |
| | | //import java.util.List; |
| | | //import java.util.Objects; |
| | | //import java.util.Optional; |
| | | // |
| | |
| | | // @Autowired |
| | | // private MotionService motionService; |
| | | // @Autowired |
| | | // private WrkMastMapper wrkMastMapper; |
| | | // private TaskService taskService; |
| | | // @Autowired |
| | | // private BasShuttleService basShuttleService; |
| | | // @Autowired |
| | | // private LocMastService locMastService; |
| | | // private LocService locService; |
| | | // @Autowired |
| | | // private NavigateMapUtils navigateMapUtils; |
| | | // |
| | |
| | | // public Boolean accept(Motion motion) { |
| | | // Integer deviceNo = Integer.parseInt(motion.getDevice()); |
| | | // ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo); |
| | | // ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | // ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | // if (null == shuttleProtocol) { |
| | | // return false; |
| | | // } |
| | | // if (shuttleProtocol.getBusyStatus().intValue() == ShuttleStatusType.BUSY.id |
| | | // || !shuttleProtocol.isIdle()) { |
| | | // if (!shuttleProtocol.getIdle()) {//设备不空闲 |
| | | // return false; |
| | | // } |
| | | // if (!shuttleProtocol.getPakMk()) { |
| | | // return false; |
| | | // } |
| | | // if (motionService.selectCount(new EntityWrapper<Motion>() |
| | | // .eq("device_ctg", DeviceCtgType.SHUTTLE.val()) |
| | | // .eq("device", motion.getDevice()) |
| | | // .eq("motion_sts", MotionStsType.EXECUTING.val())) > 0) { |
| | | // if (motionService.count(new LambdaQueryWrapper<Motion>() |
| | | // .eq(Motion::getDeviceCtg, DeviceCtgType.SHUTTLE.val()) |
| | | // .eq(Motion::getDevice, motion.getDevice()) |
| | | // .eq(Motion::getMotionSts, MotionStsType.EXECUTING.val())) > 0) { |
| | | // return false; |
| | | // } |
| | | // |
New file |
| | |
| | | package com.zy.asrs.wcs.core.mapper; |
| | | |
| | | import com.zy.asrs.wcs.core.entity.DeviceCtg; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | @Mapper |
| | | @Repository |
| | | public interface DeviceCtgMapper extends BaseMapper<DeviceCtg> { |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.model.command; |
| | | |
| | | import com.zy.asrs.wcs.core.model.NavigateNode; |
| | | import lombok.Data; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class ShuttleAssignCommand { |
| | | |
| | | /** |
| | | * 四向穿梭车号 |
| | | */ |
| | | private Short shuttleNo = 0; |
| | | |
| | | /** |
| | | * 任务号 |
| | | */ |
| | | private Short taskNo = 0; |
| | | |
| | | /** |
| | | * 作业类型 |
| | | * 1: 入库 |
| | | * 2: 出库 |
| | | * 3: 托盘顶升 |
| | | * 4: 托盘下降 |
| | | * 5: 左移 |
| | | * 6: 右移 |
| | | * 7: 前移 |
| | | * 8: 后移 |
| | | * 9: 充电 |
| | | */ |
| | | private Short taskMode = 0; |
| | | |
| | | /** |
| | | * 源库位 |
| | | */ |
| | | private String sourceLocNo; |
| | | |
| | | /** |
| | | * 目标库位 |
| | | */ |
| | | private String locNo; |
| | | |
| | | /** |
| | | * 命令list |
| | | */ |
| | | private List<ShuttleCommand> commands = new ArrayList<>(); |
| | | |
| | | /** |
| | | * 是否自动,true:自动模式,false:手动模式 |
| | | */ |
| | | private Boolean auto = true; |
| | | |
| | | |
| | | /** |
| | | * 是否为充电任务。true:是,false:否 |
| | | */ |
| | | private Boolean charge = false; |
| | | |
| | | /** |
| | | * 当前任务所占用的节点list |
| | | */ |
| | | private List<NavigateNode> nodes; |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.model.command; |
| | | |
| | | import com.zy.asrs.wcs.core.model.NavigateNode; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 四向穿梭车命令报文 |
| | | */ |
| | | @Data |
| | | public class ShuttleCommand { |
| | | |
| | | /** |
| | | * 四向穿梭车号 |
| | | */ |
| | | private Short shuttleNo = 0; |
| | | |
| | | /** |
| | | * 任务号 |
| | | */ |
| | | private Short taskNo = 0; |
| | | |
| | | /** |
| | | * 作业类型 |
| | | */ |
| | | private Short taskMode = 0; |
| | | |
| | | /** |
| | | * 功能说明 |
| | | * 0、空 |
| | | * 1、正常移动 |
| | | * 2、托盘顶升 |
| | | * 3、强制移动 |
| | | * 4、查找定位点 |
| | | * 5、充电开关 |
| | | * 6、系统复位 |
| | | * 7、紧急停止 |
| | | * 8、IO控制 |
| | | * 9、行走电机强制移动(输入为脉冲指令) |
| | | * 10、升降伺服强制移动(输入为脉冲指令) |
| | | * 控制指令字 |
| | | */ |
| | | private Short commandWord; |
| | | |
| | | /** |
| | | * 启始二维编号 |
| | | */ |
| | | private Short startCodeNum; |
| | | |
| | | /** |
| | | * 中间二维编号 |
| | | */ |
| | | private Short middleCodeNum; |
| | | |
| | | /** |
| | | * 目标二维编号 |
| | | */ |
| | | private Short distCodeNum; |
| | | |
| | | /** |
| | | * 起点到目标点的距离长度 |
| | | */ |
| | | private Integer startToDistDistance; |
| | | |
| | | /** |
| | | * 中间点到目标点的距离长度 |
| | | */ |
| | | private Integer middleToDistDistance; |
| | | |
| | | /** |
| | | * 小车运行方向 |
| | | */ |
| | | private Short runDirection; |
| | | |
| | | /** |
| | | * 托盘顶升 |
| | | */ |
| | | private Short palletLift; |
| | | |
| | | /** |
| | | * 小车强制移动距离 |
| | | */ |
| | | private Integer forceMoveDistance; |
| | | |
| | | /** |
| | | * 充电开关 |
| | | */ |
| | | private Short chargeSwitch; |
| | | |
| | | /** |
| | | * 小车IO控制 |
| | | */ |
| | | private Short IOControl; |
| | | |
| | | /** |
| | | * 小车运行速度 |
| | | */ |
| | | private Short runSpeed; |
| | | |
| | | /** |
| | | * 小车雷达备用 |
| | | */ |
| | | private Short radarTmp; |
| | | |
| | | /** |
| | | * 指令结束位 |
| | | */ |
| | | private Short commandEnd; |
| | | |
| | | /** |
| | | * 命令是否完成,默认false未完成 |
| | | */ |
| | | private Boolean complete = false; |
| | | |
| | | /** |
| | | * 行走命令所占用的节点list |
| | | */ |
| | | private List<NavigateNode> nodes; |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.model.enums; |
| | | |
| | | import com.zy.asrs.framework.common.SpringUtils; |
| | | import com.zy.asrs.framework.exception.CoolException; |
| | | import com.zy.asrs.wcs.core.entity.DeviceCtg; |
| | | import com.zy.asrs.wcs.core.service.DeviceCtgService; |
| | | |
| | | public enum DeviceCtgType { |
| | | |
| | | CONVEYOR, |
| | | CRANE, |
| | | LIFT, |
| | | SHUTTLE, |
| | | AGV, |
| | | ; |
| | | |
| | | DeviceCtgType() { |
| | | } |
| | | |
| | | public long val() { |
| | | DeviceCtgService service = SpringUtils.getBean(DeviceCtgService.class); |
| | | DeviceCtg entity = service.selectByFlag(this.toString()); |
| | | if (entity == null) { |
| | | throw new CoolException("DeviceCtgType Error!"); |
| | | } |
| | | return entity.getId(); |
| | | } |
| | | |
| | | |
| | | public static DeviceCtgType get(String el) { |
| | | for (DeviceCtgType value : DeviceCtgType.values()) { |
| | | if (el.equals(value.toString())) { |
| | | return value; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.model.enums; |
| | | |
| | | |
| | | import com.zy.asrs.framework.common.SpringUtils; |
| | | import com.zy.asrs.framework.exception.CoolException; |
| | | import com.zy.asrs.wcs.rcs.entity.MotionSts; |
| | | import com.zy.asrs.wcs.rcs.service.MotionStsService; |
| | | |
| | | public enum MotionStsType { |
| | | |
| | | INIT, |
| | | WAITING, |
| | | EXECUTING, |
| | | COMPLETE, |
| | | CANCEL, |
| | | ERROR, |
| | | ; |
| | | |
| | | MotionStsType() { |
| | | } |
| | | |
| | | public long val() { |
| | | MotionStsService service = SpringUtils.getBean(MotionStsService.class); |
| | | MotionSts entity = service.selectByFlag(this.toString()); |
| | | if (entity == null) { |
| | | throw new CoolException("DeviceCtgType Error!"); |
| | | } |
| | | return entity.getId(); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.zy.asrs.wcs.core.entity.DeviceCtg; |
| | | |
| | | public interface DeviceCtgService extends IService<DeviceCtg> { |
| | | |
| | | DeviceCtg selectByFlag(String flag); |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.asrs.wcs.core.mapper.DeviceCtgMapper; |
| | | import com.zy.asrs.wcs.core.entity.DeviceCtg; |
| | | import com.zy.asrs.wcs.core.service.DeviceCtgService; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | @Service("deviceCtgService") |
| | | public class DeviceCtgServiceImpl extends ServiceImpl<DeviceCtgMapper, DeviceCtg> implements DeviceCtgService { |
| | | |
| | | @Override |
| | | public DeviceCtg selectByFlag(String flag) { |
| | | return this.getOne(new LambdaQueryWrapper<DeviceCtg>().eq(DeviceCtg::getFlag, flag)); |
| | | } |
| | | |
| | | } |
| | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | |
| | | import com.zy.asrs.wcs.core.entity.DeviceCtg; |
| | | import com.zy.asrs.wcs.core.service.DeviceCtgService; |
| | | import com.zy.asrs.wcs.rcs.service.DeviceTypeService; |
| | | import com.zy.asrs.wcs.rcs.service.MotionCtgService; |
| | | import com.zy.asrs.wcs.rcs.service.MotionStsService; |
| | |
| | | * 设备类型 |
| | | */ |
| | | @ApiModelProperty(value= "设备类型") |
| | | private Long deviceType; |
| | | private Long deviceCtg; |
| | | |
| | | /** |
| | | * 设备 |
| | |
| | | |
| | | public Motion() {} |
| | | |
| | | public Motion(String uuid,Integer wrkNo,String serialNo,String title,Integer priority,Integer sync,Long motionCtg,Long motionSts,Long deviceType,String device,String origin,Integer oriDrt,String target,Integer tarDrt,String dockNo,Date ioTime,Date startTime,Date endTime,Date errTime,Long errCode,String errDesc,String temp,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer deleted,Long hostId) { |
| | | public Motion(String uuid,Integer wrkNo,String serialNo,String title,Integer priority,Integer sync,Long motionCtg,Long motionSts,Long deviceCtg,String device,String origin,Integer oriDrt,String target,Integer tarDrt,String dockNo,Date ioTime,Date startTime,Date endTime,Date errTime,Long errCode,String errDesc,String temp,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer deleted,Long hostId) { |
| | | this.uuid = uuid; |
| | | this.wrkNo = wrkNo; |
| | | this.serialNo = serialNo; |
| | |
| | | this.sync = sync; |
| | | this.motionCtg = motionCtg; |
| | | this.motionSts = motionSts; |
| | | this.deviceType = deviceType; |
| | | this.deviceCtg = deviceCtg; |
| | | this.device = device; |
| | | this.origin = origin; |
| | | this.oriDrt = oriDrt; |
| | |
| | | } |
| | | |
| | | public String getDeviceType$(){ |
| | | DeviceTypeService service = SpringUtils.getBean(DeviceTypeService.class); |
| | | DeviceType deviceType = service.getById(this.deviceType); |
| | | if (!Cools.isEmpty(deviceType)){ |
| | | return String.valueOf(deviceType.getName()); |
| | | DeviceCtgService service = SpringUtils.getBean(DeviceCtgService.class); |
| | | DeviceCtg deviceCtg = service.getById(this.deviceCtg); |
| | | if (!Cools.isEmpty(deviceCtg)){ |
| | | return String.valueOf(deviceCtg.getName()); |
| | | } |
| | | return null; |
| | | } |
| | |
| | | |
| | | public interface MotionStsService extends IService<MotionSts> { |
| | | |
| | | MotionSts selectByFlag(String flag); |
| | | |
| | | } |
| | |
| | | package com.zy.asrs.wcs.rcs.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.asrs.wcs.rcs.mapper.MotionStsMapper; |
| | | import com.zy.asrs.wcs.rcs.entity.MotionSts; |
| | | import com.zy.asrs.wcs.rcs.service.MotionStsService; |
| | |
| | | @Service("motionStsService") |
| | | public class MotionStsServiceImpl extends ServiceImpl<MotionStsMapper, MotionSts> implements MotionStsService { |
| | | |
| | | @Override |
| | | public MotionSts selectByFlag(String flag) { |
| | | return this.getOne(new LambdaQueryWrapper<MotionSts>().eq(MotionSts::getFlag, flag)); |
| | | } |
| | | } |
New file |
| | |
| | | -- save deviceCtg record |
| | | -- mysql |
| | | insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( 'Motion设备类型管理', '0', '/core/deviceCtg', '/core/deviceCtg', '0' , '0', '1' , '1'); |
| | | |
| | | insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '查询Motion设备类型', '', '1', 'core:deviceCtg:list', '0', '1', '1'); |
| | | insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '添加Motion设备类型', '', '1', 'core:deviceCtg:save', '1', '1', '1'); |
| | | insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '修改Motion设备类型', '', '1', 'core:deviceCtg:update', '2', '1', '1'); |
| | | insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '删除Motion设备类型', '', '1', 'core:deviceCtg:remove', '3', '1', '1'); |
| | | |
New file |
| | |
| | | <?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.DeviceCtgMapper"> |
| | | |
| | | </mapper> |