Commit 7830ece308bbd546ec5924fdca1a7a98e3f13556
Merge branch 'feat-model-of-matter-send-comomand' into 'main_dev'
perf: 迁移脚本管理/转换函数至规则引擎页面 See merge request yunteng/thingskit-front!606
Showing
11 changed files
with
484 additions
and
373 deletions
| 1 | +export { default as RuleChainConversionScript } from './index.vue'; |
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <BasicTable @register="registerTable" v-show="isStatus === 0"> | ||
| 4 | + <template #toolbar> | ||
| 5 | + <Authority value="api:yt:convert:js:post"> | ||
| 6 | + <a-button type="primary" @click="handleCreate"> 新增转换脚本 </a-button> | ||
| 7 | + </Authority> | ||
| 8 | + <Authority value="api:yt:convert:js:delete"> | ||
| 9 | + <Popconfirm | ||
| 10 | + title="您确定要批量删除数据" | ||
| 11 | + ok-text="确定" | ||
| 12 | + cancel-text="取消" | ||
| 13 | + @confirm="handleDeleteOrBatchDelete(null)" | ||
| 14 | + > | ||
| 15 | + <a-button color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> | ||
| 16 | + </Popconfirm> | ||
| 17 | + </Authority> | ||
| 18 | + </template> | ||
| 19 | + <template #status="{ record }"> | ||
| 20 | + <Switch | ||
| 21 | + :checked="record.status === 1" | ||
| 22 | + :loading="record.pendingStatus" | ||
| 23 | + checkedChildren="启用" | ||
| 24 | + unCheckedChildren="禁用" | ||
| 25 | + @change="(checked:boolean)=>statusChange(checked,record)" | ||
| 26 | + /> | ||
| 27 | + </template> | ||
| 28 | + <template #action="{ record }"> | ||
| 29 | + <TableAction | ||
| 30 | + :actions="[ | ||
| 31 | + { | ||
| 32 | + label: '查看', | ||
| 33 | + auth: 'api:yt:convert:js:get', | ||
| 34 | + icon: 'ant-design:eye-outlined', | ||
| 35 | + onClick: handleView.bind(null, record), | ||
| 36 | + ifShow: record.status == 1, | ||
| 37 | + }, | ||
| 38 | + { | ||
| 39 | + label: '编辑', | ||
| 40 | + auth: 'api:yt:convert:js:update', | ||
| 41 | + icon: 'clarity:note-edit-line', | ||
| 42 | + onClick: handleEdit.bind(null, record), | ||
| 43 | + ifShow: record.status == 0, | ||
| 44 | + }, | ||
| 45 | + { | ||
| 46 | + label: '删除', | ||
| 47 | + auth: 'api:yt:convert:js:delete', | ||
| 48 | + icon: 'ant-design:delete-outlined', | ||
| 49 | + ifShow: record.status == 0, | ||
| 50 | + color: 'error', | ||
| 51 | + popConfirm: { | ||
| 52 | + title: '是否确认删除', | ||
| 53 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 54 | + }, | ||
| 55 | + }, | ||
| 56 | + ]" | ||
| 57 | + /> | ||
| 58 | + </template> | ||
| 59 | + </BasicTable> | ||
| 60 | + <ScriptDrawer | ||
| 61 | + @register="registerDrawer" | ||
| 62 | + @isStatus="handleIsStatus" | ||
| 63 | + ref="scriptDrawerRef" | ||
| 64 | + @success="handleSuccess" | ||
| 65 | + /> | ||
| 66 | + <TestScript v-show="isStatus === 1" @isStatus="handleCancelStatus" ref="testScriptRef" /> | ||
| 67 | + </div> | ||
| 68 | +</template> | ||
| 69 | + | ||
| 70 | +<script lang="ts" setup> | ||
| 71 | + import { ref, nextTick } from 'vue'; | ||
| 72 | + import { Switch, Popconfirm } from 'ant-design-vue'; | ||
| 73 | + import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 74 | + import { columns } from '../config/config.data'; | ||
| 75 | + import { getConvertApi, deleteTransformApi } from '/@/api/device/TransformScriptApi'; | ||
| 76 | + import { useDrawer } from '/@/components/Drawer/index'; | ||
| 77 | + import ScriptDrawer from '../cpns/ScriptDrawer.vue'; | ||
| 78 | + import TestScript from '../cpns/TestScript.vue'; | ||
| 79 | + import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 80 | + import { updateTransformScriptStatusApi } from '/@/api/device/TransformScriptApi'; | ||
| 81 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 82 | + import { Authority } from '/@/components/Authority'; | ||
| 83 | + import { computed, unref } from 'vue'; | ||
| 84 | + | ||
| 85 | + const props = defineProps<{ searchInfo: Recordable }>(); | ||
| 86 | + | ||
| 87 | + const getSearchInfo = computed(() => props.searchInfo); | ||
| 88 | + | ||
| 89 | + const handleSuccess = () => { | ||
| 90 | + reload(); | ||
| 91 | + }; | ||
| 92 | + | ||
| 93 | + const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({ | ||
| 94 | + api: getConvertApi, | ||
| 95 | + title: '转换脚本列表', | ||
| 96 | + columns, | ||
| 97 | + useSearchForm: false, | ||
| 98 | + showTableSetting: true, | ||
| 99 | + bordered: true, | ||
| 100 | + showIndexColumn: false, | ||
| 101 | + clickToRowSelect: false, | ||
| 102 | + rowKey: 'id', | ||
| 103 | + beforeFetch: (params: Recordable) => { | ||
| 104 | + return { ...unref(getSearchInfo), ...params }; | ||
| 105 | + }, | ||
| 106 | + actionColumn: { | ||
| 107 | + width: 180, | ||
| 108 | + title: '操作', | ||
| 109 | + dataIndex: 'action', | ||
| 110 | + slots: { customRender: 'action' }, | ||
| 111 | + fixed: 'right', | ||
| 112 | + }, | ||
| 113 | + }); | ||
| 114 | + | ||
| 115 | + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } = | ||
| 116 | + useBatchDelete(deleteTransformApi, handleSuccess, setProps); | ||
| 117 | + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { | ||
| 118 | + // Demo:status为1的选择框禁用 | ||
| 119 | + if (record.status === 1) { | ||
| 120 | + return { disabled: true }; | ||
| 121 | + } else { | ||
| 122 | + return { disabled: false }; | ||
| 123 | + } | ||
| 124 | + }; | ||
| 125 | + nextTick(() => { | ||
| 126 | + setProps(selectionOptions); | ||
| 127 | + }); | ||
| 128 | + const [registerDrawer, { openDrawer }] = useDrawer(); | ||
| 129 | + | ||
| 130 | + const isStatus = ref(0); | ||
| 131 | + const testScriptRef = ref(); | ||
| 132 | + const scriptDrawerRef = ref(); | ||
| 133 | + const handleIsStatus = ({ status, jsCode }) => { | ||
| 134 | + isStatus.value = status; | ||
| 135 | + testScriptRef.value.aceEditor.setValue(jsCode); | ||
| 136 | + }; | ||
| 137 | + const handleCancelStatus = ({ status, emitType }) => { | ||
| 138 | + openDrawer(true); | ||
| 139 | + isStatus.value = status; | ||
| 140 | + if (emitType === 'ok') { | ||
| 141 | + const jsCode = testScriptRef.value.aceEditor.getValue(); | ||
| 142 | + scriptDrawerRef.value.aceEditor.setValue(jsCode); | ||
| 143 | + } | ||
| 144 | + }; | ||
| 145 | + const handleCreate = () => { | ||
| 146 | + nextTick(() => { | ||
| 147 | + openDrawer(true, { | ||
| 148 | + isUpdate: false, | ||
| 149 | + }); | ||
| 150 | + }); | ||
| 151 | + }; | ||
| 152 | + const handleEdit = (record: Recordable) => { | ||
| 153 | + nextTick(() => { | ||
| 154 | + openDrawer(true, { isUpdate: true, record }); | ||
| 155 | + }); | ||
| 156 | + }; | ||
| 157 | + const statusChange = async (checked, record) => { | ||
| 158 | + setProps({ | ||
| 159 | + loading: true, | ||
| 160 | + }); | ||
| 161 | + setSelectedRowKeys([]); | ||
| 162 | + resetSelectedRowKeys(); | ||
| 163 | + const newStatus = checked ? 1 : 0; | ||
| 164 | + const { createMessage } = useMessage(); | ||
| 165 | + try { | ||
| 166 | + await updateTransformScriptStatusApi(newStatus, record.id); | ||
| 167 | + if (newStatus) { | ||
| 168 | + createMessage.success(`启用成功`); | ||
| 169 | + } else { | ||
| 170 | + createMessage.success('禁用成功'); | ||
| 171 | + } | ||
| 172 | + } finally { | ||
| 173 | + setProps({ | ||
| 174 | + loading: false, | ||
| 175 | + }); | ||
| 176 | + reload(); | ||
| 177 | + } | ||
| 178 | + }; | ||
| 179 | + function handleView(record: Recordable) { | ||
| 180 | + nextTick(() => { | ||
| 181 | + openDrawer(true, { | ||
| 182 | + record, | ||
| 183 | + isUpdate: 'view', | ||
| 184 | + }); | ||
| 185 | + }); | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + defineExpose({ | ||
| 189 | + reload: () => reload(), | ||
| 190 | + }); | ||
| 191 | +</script> |
src/views/rule/script/TcpConversionScript/ConverScript.vue
renamed from
src/views/scriptmanage/converscript/ConverScript.vue
src/views/rule/script/TcpConversionScript/ConverScriptModal.less
renamed from
src/views/scriptmanage/converscript/ConverScriptModal.less
src/views/rule/script/TcpConversionScript/ConverScriptModal.vue
renamed from
src/views/scriptmanage/converscript/ConverScriptModal.vue
src/views/rule/script/TcpConversionScript/TestScriptModal.vue
renamed from
src/views/scriptmanage/converscript/TestScriptModal.vue
src/views/rule/script/TcpConversionScript/config.data.ts
renamed from
src/views/scriptmanage/converscript/config.data.ts
| 1 | +export { default as TcpConversionScript } from './index.vue'; |
src/views/rule/script/TcpConversionScript/index.vue
renamed from
src/views/scriptmanage/converscript/index.vue
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <BasicTable :clickToRowSelect="false" @register="registerTable" :searchInfo="searchInfo"> | ||
| 4 | - <template #toolbar> | ||
| 5 | - <Authority value="api:yt:js:post"> | ||
| 6 | - <a-button type="primary" @click="handleCreateOrEdit(null)"> 新增转换脚本 </a-button> | ||
| 7 | - </Authority> | ||
| 8 | - <Authority value="api:yt:js:delete"> | ||
| 9 | - <Popconfirm | ||
| 10 | - title="您确定要批量删除数据" | ||
| 11 | - ok-text="确定" | ||
| 12 | - cancel-text="取消" | ||
| 13 | - @confirm="handleDeleteOrBatchDelete(null)" | ||
| 14 | - > | ||
| 15 | - <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> | ||
| 16 | - </Popconfirm> | ||
| 17 | - </Authority> | ||
| 18 | - </template> | ||
| 19 | - <template #convertJs="{ record }"> | ||
| 20 | - <a-button type="text" @click="handleScriptView(record)"> | ||
| 21 | - <span style="color: #377dff">查看脚本</span> | ||
| 22 | - </a-button> | ||
| 23 | - </template> | ||
| 24 | - <template #action="{ record }"> | ||
| 25 | - <TableAction | ||
| 26 | - :actions="[ | ||
| 27 | - { | ||
| 28 | - label: '测试', | ||
| 29 | - icon: 'ant-design:font-size-outlined', | ||
| 30 | - auth: 'api:yt:js:test', | ||
| 31 | - onClick: handleBindTest.bind(null, record), | ||
| 32 | - }, | ||
| 33 | - { | ||
| 34 | - label: '编辑', | ||
| 35 | - icon: 'clarity:note-edit-line', | ||
| 36 | - auth: 'api:yt:js:update', | ||
| 37 | - onClick: handleCreateOrEdit.bind(null, record), | ||
| 38 | - ifShow: record.status == 0, | ||
| 39 | - }, | ||
| 40 | - { | ||
| 41 | - label: '删除', | ||
| 42 | - icon: 'ant-design:delete-outlined', | ||
| 43 | - auth: 'api:yt:js:delete', | ||
| 44 | - color: 'error', | ||
| 45 | - ifShow: record.status == 0, | ||
| 46 | - popConfirm: { | ||
| 47 | - title: '是否确认删除', | ||
| 48 | - confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 49 | - }, | ||
| 50 | - }, | ||
| 51 | - ]" | ||
| 52 | - /> | ||
| 53 | - </template> | ||
| 54 | - <template #status="{ record }"> | ||
| 55 | - <Authority value="api:yt:js:update:status"> | ||
| 56 | - <Switch | ||
| 57 | - :checked="record.status === 1" | ||
| 58 | - :loading="record.pendingStatus" | ||
| 59 | - checkedChildren="启用" | ||
| 60 | - unCheckedChildren="禁用" | ||
| 61 | - @change="(checked:boolean)=>statusChange(checked,record)" | ||
| 62 | - /> | ||
| 63 | - </Authority> | ||
| 64 | - </template> | ||
| 65 | - </BasicTable> | ||
| 66 | - <ConverScriptModal @register="registerModal" @success="handleSuccess" /> | ||
| 67 | - </div> | ||
| 68 | -</template> | ||
| 69 | - | ||
| 70 | -<script lang="ts" setup> | ||
| 71 | - import { reactive, nextTick } from 'vue'; | ||
| 72 | - import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 73 | - import { searchFormSchema, columns } from './config.data'; | ||
| 74 | - import { Authority } from '/@/components/Authority'; | ||
| 75 | - import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 76 | - import { Switch, Popconfirm } from 'ant-design-vue'; | ||
| 77 | - import { useModal } from '/@/components/Modal'; | ||
| 78 | - import ConverScriptModal from './ConverScriptModal.vue'; | ||
| 79 | - import { | ||
| 80 | - ScriptPage, | ||
| 81 | - deleteScriptManage, | ||
| 82 | - scriptPagePutApi, | ||
| 83 | - } from '/@/api/scriptmanage/scriptManager'; | ||
| 84 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 85 | - | ||
| 86 | - const searchInfo = reactive<Recordable>({}); | ||
| 87 | - const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({ | ||
| 88 | - title: '转换脚本列表', | ||
| 89 | - api: ScriptPage, | ||
| 90 | - columns, | ||
| 91 | - showIndexColumn: false, | ||
| 92 | - clickToRowSelect: false, | ||
| 93 | - formConfig: { | ||
| 94 | - labelWidth: 120, | ||
| 95 | - schemas: searchFormSchema, | ||
| 96 | - fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'x']], | ||
| 97 | - }, | ||
| 98 | - useSearchForm: true, | ||
| 99 | - showTableSetting: true, | ||
| 100 | - bordered: true, | ||
| 101 | - rowKey: 'id', | ||
| 102 | - actionColumn: { | ||
| 103 | - width: 200, | ||
| 104 | - title: '操作', | ||
| 105 | - dataIndex: 'action', | ||
| 106 | - slots: { customRender: 'action' }, | ||
| 107 | - fixed: 'right', | ||
| 108 | - }, | ||
| 109 | - }); | ||
| 110 | - | ||
| 111 | - const handleSuccess = () => { | ||
| 112 | - reload(); | ||
| 113 | - }; | ||
| 114 | - | ||
| 115 | - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } = | ||
| 116 | - useBatchDelete(deleteScriptManage, handleSuccess, setProps); | ||
| 117 | - selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { | ||
| 118 | - // Demo:status为1的选择框禁用 | ||
| 119 | - if (record.status === 1) { | ||
| 120 | - return { disabled: true }; | ||
| 121 | - } else { | ||
| 122 | - return { disabled: false }; | ||
| 123 | - } | ||
| 124 | - }; | ||
| 125 | - | ||
| 126 | - nextTick(() => { | ||
| 127 | - setProps(selectionOptions); | ||
| 128 | - }); | ||
| 129 | - | ||
| 130 | - const [registerModal, { openModal }] = useModal(); | ||
| 131 | - | ||
| 132 | - // 新增或编辑 | ||
| 133 | - const handleCreateOrEdit = (record: Recordable | null) => { | ||
| 134 | - if (record) { | ||
| 135 | - openModal(true, { | ||
| 136 | - isUpdate: false, | ||
| 137 | - record, | ||
| 138 | - isAuth: '', | ||
| 139 | - isView: false, | ||
| 140 | - isTest: false, | ||
| 141 | - isText: 'confirm', | ||
| 142 | - isTitle: 'edit', | ||
| 143 | - }); | ||
| 144 | - } else { | ||
| 145 | - openModal(true, { | ||
| 146 | - isAuth: '', | ||
| 147 | - isUpdate: true, | ||
| 148 | - isView: false, | ||
| 149 | - isTest: false, | ||
| 150 | - isText: 'confirm', | ||
| 151 | - isTitle: 'add', | ||
| 152 | - }); | ||
| 153 | - } | ||
| 154 | - }; | ||
| 155 | - const handleBindTest = (record: Recordable | null) => { | ||
| 156 | - if (record) { | ||
| 157 | - openModal(true, { | ||
| 158 | - isAuth: '', | ||
| 159 | - isUpdate: false, | ||
| 160 | - record: record.id, | ||
| 161 | - isTest: true, | ||
| 162 | - isText: 'test', | ||
| 163 | - isTitle: 'test', | ||
| 164 | - }); | ||
| 165 | - } | ||
| 166 | - }; | ||
| 167 | - const handleScriptView = (record: Recordable | null) => { | ||
| 168 | - if (record) { | ||
| 169 | - openModal(true, { | ||
| 170 | - isUpdate: true, | ||
| 171 | - record, | ||
| 172 | - isView: true, | ||
| 173 | - }); | ||
| 174 | - } | ||
| 175 | - }; | ||
| 176 | - const statusChange = async (checked, record) => { | ||
| 177 | - setProps({ | ||
| 178 | - loading: true, | ||
| 179 | - }); | ||
| 180 | - setSelectedRowKeys([]); | ||
| 181 | - resetSelectedRowKeys(); | ||
| 182 | - const newStatus = checked ? 1 : 0; | ||
| 183 | - const { createMessage } = useMessage(); | ||
| 184 | - try { | ||
| 185 | - await scriptPagePutApi(record.id, newStatus); | ||
| 186 | - if (newStatus) { | ||
| 187 | - createMessage.success(`启用成功`); | ||
| 188 | - } else { | ||
| 189 | - createMessage.success('禁用成功'); | ||
| 190 | - } | ||
| 191 | - } finally { | ||
| 192 | - setProps({ | ||
| 193 | - loading: false, | ||
| 194 | - }); | ||
| 195 | - reload(); | ||
| 196 | - } | ||
| 197 | - }; | ||
| 198 | -</script> | 1 | +<template> |
| 2 | + <div> | ||
| 3 | + <BasicTable :clickToRowSelect="false" @register="registerTable" :searchInfo="searchInfo"> | ||
| 4 | + <template #toolbar> | ||
| 5 | + <Authority value="api:yt:js:post"> | ||
| 6 | + <a-button type="primary" @click="handleCreateOrEdit(null)"> 新增转换脚本 </a-button> | ||
| 7 | + </Authority> | ||
| 8 | + <Authority value="api:yt:js:delete"> | ||
| 9 | + <Popconfirm | ||
| 10 | + title="您确定要批量删除数据" | ||
| 11 | + ok-text="确定" | ||
| 12 | + cancel-text="取消" | ||
| 13 | + @confirm="handleDeleteOrBatchDelete(null)" | ||
| 14 | + > | ||
| 15 | + <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> | ||
| 16 | + </Popconfirm> | ||
| 17 | + </Authority> | ||
| 18 | + </template> | ||
| 19 | + <template #convertJs="{ record }"> | ||
| 20 | + <a-button type="text" @click="handleScriptView(record)"> | ||
| 21 | + <span style="color: #377dff">查看脚本</span> | ||
| 22 | + </a-button> | ||
| 23 | + </template> | ||
| 24 | + <template #action="{ record }"> | ||
| 25 | + <TableAction | ||
| 26 | + :actions="[ | ||
| 27 | + { | ||
| 28 | + label: '测试', | ||
| 29 | + icon: 'ant-design:font-size-outlined', | ||
| 30 | + auth: 'api:yt:js:test', | ||
| 31 | + onClick: handleBindTest.bind(null, record), | ||
| 32 | + }, | ||
| 33 | + { | ||
| 34 | + label: '编辑', | ||
| 35 | + icon: 'clarity:note-edit-line', | ||
| 36 | + auth: 'api:yt:js:update', | ||
| 37 | + onClick: handleCreateOrEdit.bind(null, record), | ||
| 38 | + ifShow: record.status == 0, | ||
| 39 | + }, | ||
| 40 | + { | ||
| 41 | + label: '删除', | ||
| 42 | + icon: 'ant-design:delete-outlined', | ||
| 43 | + auth: 'api:yt:js:delete', | ||
| 44 | + color: 'error', | ||
| 45 | + ifShow: record.status == 0, | ||
| 46 | + popConfirm: { | ||
| 47 | + title: '是否确认删除', | ||
| 48 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 49 | + }, | ||
| 50 | + }, | ||
| 51 | + ]" | ||
| 52 | + /> | ||
| 53 | + </template> | ||
| 54 | + <template #status="{ record }"> | ||
| 55 | + <Authority value="api:yt:js:update:status"> | ||
| 56 | + <Switch | ||
| 57 | + :checked="record.status === 1" | ||
| 58 | + :loading="record.pendingStatus" | ||
| 59 | + checkedChildren="启用" | ||
| 60 | + unCheckedChildren="禁用" | ||
| 61 | + @change="(checked:boolean)=>statusChange(checked,record)" | ||
| 62 | + /> | ||
| 63 | + </Authority> | ||
| 64 | + </template> | ||
| 65 | + </BasicTable> | ||
| 66 | + <ConverScriptModal @register="registerModal" @success="handleSuccess" /> | ||
| 67 | + </div> | ||
| 68 | +</template> | ||
| 69 | + | ||
| 70 | +<script lang="ts" setup> | ||
| 71 | + import { reactive, nextTick, unref } from 'vue'; | ||
| 72 | + import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 73 | + import { columns } from './config.data'; | ||
| 74 | + import { Authority } from '/@/components/Authority'; | ||
| 75 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 76 | + import { Switch, Popconfirm } from 'ant-design-vue'; | ||
| 77 | + import { useModal } from '/@/components/Modal'; | ||
| 78 | + import ConverScriptModal from './ConverScriptModal.vue'; | ||
| 79 | + import { | ||
| 80 | + ScriptPage, | ||
| 81 | + deleteScriptManage, | ||
| 82 | + scriptPagePutApi, | ||
| 83 | + } from '/@/api/scriptmanage/scriptManager'; | ||
| 84 | + import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 85 | + | ||
| 86 | + const props = defineProps<{ searchInfo: Recordable }>(); | ||
| 87 | + const searchInfo = reactive<Recordable>({}); | ||
| 88 | + const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({ | ||
| 89 | + title: '转换脚本列表', | ||
| 90 | + api: ScriptPage, | ||
| 91 | + columns, | ||
| 92 | + showIndexColumn: false, | ||
| 93 | + clickToRowSelect: false, | ||
| 94 | + showTableSetting: true, | ||
| 95 | + bordered: true, | ||
| 96 | + rowKey: 'id', | ||
| 97 | + beforeFetch: (params: Recordable) => { | ||
| 98 | + return { ...unref(props.searchInfo), ...params }; | ||
| 99 | + }, | ||
| 100 | + actionColumn: { | ||
| 101 | + width: 200, | ||
| 102 | + title: '操作', | ||
| 103 | + dataIndex: 'action', | ||
| 104 | + slots: { customRender: 'action' }, | ||
| 105 | + fixed: 'right', | ||
| 106 | + }, | ||
| 107 | + }); | ||
| 108 | + | ||
| 109 | + const handleSuccess = () => { | ||
| 110 | + reload(); | ||
| 111 | + }; | ||
| 112 | + | ||
| 113 | + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } = | ||
| 114 | + useBatchDelete(deleteScriptManage, handleSuccess, setProps); | ||
| 115 | + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { | ||
| 116 | + // Demo:status为1的选择框禁用 | ||
| 117 | + if (record.status === 1) { | ||
| 118 | + return { disabled: true }; | ||
| 119 | + } else { | ||
| 120 | + return { disabled: false }; | ||
| 121 | + } | ||
| 122 | + }; | ||
| 123 | + | ||
| 124 | + nextTick(() => { | ||
| 125 | + setProps(selectionOptions); | ||
| 126 | + }); | ||
| 127 | + | ||
| 128 | + const [registerModal, { openModal }] = useModal(); | ||
| 129 | + | ||
| 130 | + // 新增或编辑 | ||
| 131 | + const handleCreateOrEdit = (record: Recordable | null) => { | ||
| 132 | + if (record) { | ||
| 133 | + openModal(true, { | ||
| 134 | + isUpdate: false, | ||
| 135 | + record, | ||
| 136 | + isAuth: '', | ||
| 137 | + isView: false, | ||
| 138 | + isTest: false, | ||
| 139 | + isText: 'confirm', | ||
| 140 | + isTitle: 'edit', | ||
| 141 | + }); | ||
| 142 | + } else { | ||
| 143 | + openModal(true, { | ||
| 144 | + isAuth: '', | ||
| 145 | + isUpdate: true, | ||
| 146 | + isView: false, | ||
| 147 | + isTest: false, | ||
| 148 | + isText: 'confirm', | ||
| 149 | + isTitle: 'add', | ||
| 150 | + }); | ||
| 151 | + } | ||
| 152 | + }; | ||
| 153 | + const handleBindTest = (record: Recordable | null) => { | ||
| 154 | + if (record) { | ||
| 155 | + openModal(true, { | ||
| 156 | + isAuth: '', | ||
| 157 | + isUpdate: false, | ||
| 158 | + record: record.id, | ||
| 159 | + isTest: true, | ||
| 160 | + isText: 'test', | ||
| 161 | + isTitle: 'test', | ||
| 162 | + }); | ||
| 163 | + } | ||
| 164 | + }; | ||
| 165 | + const handleScriptView = (record: Recordable | null) => { | ||
| 166 | + if (record) { | ||
| 167 | + openModal(true, { | ||
| 168 | + isUpdate: true, | ||
| 169 | + record, | ||
| 170 | + isView: true, | ||
| 171 | + }); | ||
| 172 | + } | ||
| 173 | + }; | ||
| 174 | + const statusChange = async (checked, record) => { | ||
| 175 | + setProps({ | ||
| 176 | + loading: true, | ||
| 177 | + }); | ||
| 178 | + setSelectedRowKeys([]); | ||
| 179 | + resetSelectedRowKeys(); | ||
| 180 | + const newStatus = checked ? 1 : 0; | ||
| 181 | + const { createMessage } = useMessage(); | ||
| 182 | + try { | ||
| 183 | + await scriptPagePutApi(record.id, newStatus); | ||
| 184 | + if (newStatus) { | ||
| 185 | + createMessage.success(`启用成功`); | ||
| 186 | + } else { | ||
| 187 | + createMessage.success('禁用成功'); | ||
| 188 | + } | ||
| 189 | + } finally { | ||
| 190 | + setProps({ | ||
| 191 | + loading: false, | ||
| 192 | + }); | ||
| 193 | + reload(); | ||
| 194 | + } | ||
| 195 | + }; | ||
| 196 | + | ||
| 197 | + defineExpose({ | ||
| 198 | + reload: () => { | ||
| 199 | + reload(); | ||
| 200 | + }, | ||
| 201 | + }); | ||
| 202 | +</script> |
| 1 | import { BasicColumn, FormSchema } from '/@/components/Table'; | 1 | import { BasicColumn, FormSchema } from '/@/components/Table'; |
| 2 | import { h } from 'vue'; | 2 | import { h } from 'vue'; |
| 3 | import { Tag } from 'ant-design-vue'; | 3 | import { Tag } from 'ant-design-vue'; |
| 4 | +import moment from 'moment'; | ||
| 5 | + | ||
| 6 | +export enum StatusEnum { | ||
| 7 | + ENABLE = 1, | ||
| 8 | + DISABLE = 0, | ||
| 9 | +} | ||
| 10 | + | ||
| 4 | export const columns: BasicColumn[] = [ | 11 | export const columns: BasicColumn[] = [ |
| 5 | { | 12 | { |
| 6 | title: '名称', | 13 | title: '名称', |
| @@ -44,12 +51,23 @@ export const searchFormSchema: FormSchema[] = [ | @@ -44,12 +51,23 @@ export const searchFormSchema: FormSchema[] = [ | ||
| 44 | componentProps: { | 51 | componentProps: { |
| 45 | placeholder: '请选择状态', | 52 | placeholder: '请选择状态', |
| 46 | options: [ | 53 | options: [ |
| 47 | - { label: '已启用', value: '1' }, | ||
| 48 | - { label: '未启用', value: '0' }, | 54 | + { label: '已启用', value: StatusEnum.ENABLE }, |
| 55 | + { label: '未启用', value: StatusEnum.DISABLE }, | ||
| 49 | ], | 56 | ], |
| 50 | }, | 57 | }, |
| 51 | colProps: { span: 6 }, | 58 | colProps: { span: 6 }, |
| 52 | }, | 59 | }, |
| 60 | + { | ||
| 61 | + field: 'createTime', | ||
| 62 | + label: '创建时间', | ||
| 63 | + component: 'RangePicker', | ||
| 64 | + colProps: { span: 10 }, | ||
| 65 | + componentProps: { | ||
| 66 | + showTime: { | ||
| 67 | + defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')], | ||
| 68 | + }, | ||
| 69 | + }, | ||
| 70 | + }, | ||
| 53 | ]; | 71 | ]; |
| 54 | 72 | ||
| 55 | export const formSchema: FormSchema[] = [ | 73 | export const formSchema: FormSchema[] = [ |
| 1 | -<template> | ||
| 2 | - <div> | ||
| 3 | - <BasicTable @register="registerTable" v-show="isStatus === 0"> | ||
| 4 | - <template #toolbar> | ||
| 5 | - <Authority value="api:yt:convert:js:post"> | ||
| 6 | - <a-button type="primary" @click="handleCreate"> 新增转换脚本 </a-button> | ||
| 7 | - </Authority> | ||
| 8 | - <Authority value="api:yt:convert:js:delete"> | ||
| 9 | - <Popconfirm | ||
| 10 | - title="您确定要批量删除数据" | ||
| 11 | - ok-text="确定" | ||
| 12 | - cancel-text="取消" | ||
| 13 | - @confirm="handleDeleteOrBatchDelete(null)" | ||
| 14 | - > | ||
| 15 | - <a-button color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> | ||
| 16 | - </Popconfirm> | ||
| 17 | - </Authority> | ||
| 18 | - </template> | ||
| 19 | - <template #status="{ record }"> | ||
| 20 | - <Switch | ||
| 21 | - :checked="record.status === 1" | ||
| 22 | - :loading="record.pendingStatus" | ||
| 23 | - checkedChildren="启用" | ||
| 24 | - unCheckedChildren="禁用" | ||
| 25 | - @change="(checked:boolean)=>statusChange(checked,record)" | ||
| 26 | - /> | ||
| 27 | - </template> | ||
| 28 | - <template #action="{ record }"> | ||
| 29 | - <TableAction | ||
| 30 | - :actions="[ | ||
| 31 | - { | ||
| 32 | - label: '查看', | ||
| 33 | - auth: 'api:yt:convert:js:get', | ||
| 34 | - icon: 'ant-design:eye-outlined', | ||
| 35 | - onClick: handleView.bind(null, record), | ||
| 36 | - ifShow: record.status == 1, | ||
| 37 | - }, | ||
| 38 | - { | ||
| 39 | - label: '编辑', | ||
| 40 | - auth: 'api:yt:convert:js:update', | ||
| 41 | - icon: 'clarity:note-edit-line', | ||
| 42 | - onClick: handleEdit.bind(null, record), | ||
| 43 | - ifShow: record.status == 0, | ||
| 44 | - }, | ||
| 45 | - { | ||
| 46 | - label: '删除', | ||
| 47 | - auth: 'api:yt:convert:js:delete', | ||
| 48 | - icon: 'ant-design:delete-outlined', | ||
| 49 | - ifShow: record.status == 0, | ||
| 50 | - color: 'error', | ||
| 51 | - popConfirm: { | ||
| 52 | - title: '是否确认删除', | ||
| 53 | - confirm: handleDeleteOrBatchDelete.bind(null, record), | ||
| 54 | - }, | ||
| 55 | - }, | ||
| 56 | - ]" | ||
| 57 | - /> | ||
| 58 | - </template> | ||
| 59 | - </BasicTable> | ||
| 60 | - <ScriptDrawer | ||
| 61 | - @register="registerDrawer" | ||
| 62 | - @isStatus="handleIsStatus" | ||
| 63 | - ref="scriptDrawerRef" | ||
| 64 | - @success="handleSuccess" | ||
| 65 | - /> | ||
| 66 | - <TestScript v-show="isStatus === 1" @isStatus="handleCancelStatus" ref="testScriptRef" /> | ||
| 67 | - </div> | ||
| 68 | -</template> | ||
| 69 | - | ||
| 70 | <script lang="ts" setup> | 1 | <script lang="ts" setup> |
| 71 | - import { ref, nextTick } from 'vue'; | ||
| 72 | - import { Switch, Popconfirm } from 'ant-design-vue'; | ||
| 73 | - import { BasicTable, useTable, TableAction } from '/@/components/Table'; | ||
| 74 | - import { columns, searchFormSchema } from './config/config.data'; | ||
| 75 | - import { getConvertApi, deleteTransformApi } from '/@/api/device/TransformScriptApi'; | ||
| 76 | - import { useDrawer } from '/@/components/Drawer/index'; | ||
| 77 | - import ScriptDrawer from './cpns/ScriptDrawer.vue'; | ||
| 78 | - import TestScript from './cpns/TestScript.vue'; | ||
| 79 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 80 | - import { updateTransformScriptStatusApi } from '/@/api/device/TransformScriptApi'; | ||
| 81 | - import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 82 | - import { Authority } from '/@/components/Authority'; | 2 | + import { Tabs } from 'ant-design-vue'; |
| 3 | + import { RuleChainConversionScript } from './RuleChainConversionScript'; | ||
| 4 | + import { TcpConversionScript } from './TcpConversionScript'; | ||
| 5 | + import { BasicForm, useForm } from '/@/components/Form'; | ||
| 6 | + import { searchFormSchema } from './config/config.data'; | ||
| 7 | + import { nextTick, ref, unref } from 'vue'; | ||
| 8 | + | ||
| 9 | + enum ActiveKey { | ||
| 10 | + RULE = 'rule', | ||
| 11 | + TCP = 'tco', | ||
| 12 | + } | ||
| 13 | + const ruleChainTableRefEl = ref<Nullable<InstanceType<typeof RuleChainConversionScript>>>(null); | ||
| 14 | + const tcpTableRefEl = ref<Nullable<InstanceType<typeof TcpConversionScript>>>(null); | ||
| 83 | 15 | ||
| 84 | - const handleSuccess = () => { | ||
| 85 | - reload(); | ||
| 86 | - }; | 16 | + const searchInfo = ref<Recordable>({}); |
| 87 | 17 | ||
| 88 | - const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({ | ||
| 89 | - api: getConvertApi, | ||
| 90 | - title: '转换脚本列表', | ||
| 91 | - columns, | ||
| 92 | - useSearchForm: true, | ||
| 93 | - showTableSetting: true, | ||
| 94 | - bordered: true, | ||
| 95 | - showIndexColumn: false, | ||
| 96 | - formConfig: { | ||
| 97 | - labelWidth: 100, | ||
| 98 | - schemas: searchFormSchema, | 18 | + const activeKey = ref(ActiveKey.RULE); |
| 19 | + | ||
| 20 | + const [register, { getFieldsValue }] = useForm({ | ||
| 21 | + schemas: searchFormSchema, | ||
| 22 | + labelWidth: 120, | ||
| 23 | + showAdvancedButton: true, | ||
| 24 | + compact: true, | ||
| 25 | + fieldMapToTime: [['createTime', ['startTime', 'endTime'], 'x']], | ||
| 26 | + submitFunc: async () => { | ||
| 27 | + const value = getFieldsValue(); | ||
| 28 | + searchInfo.value = value; | ||
| 29 | + console.log(searchInfo); | ||
| 30 | + await nextTick(); | ||
| 31 | + if (unref(activeKey) === ActiveKey.RULE) { | ||
| 32 | + unref(ruleChainTableRefEl)?.reload(); | ||
| 33 | + } else { | ||
| 34 | + unref(tcpTableRefEl)?.reload(); | ||
| 35 | + } | ||
| 99 | }, | 36 | }, |
| 100 | - clickToRowSelect: 'false', | ||
| 101 | - rowKey: 'id', | ||
| 102 | - actionColumn: { | ||
| 103 | - width: 180, | ||
| 104 | - title: '操作', | ||
| 105 | - dataIndex: 'action', | ||
| 106 | - slots: { customRender: 'action' }, | ||
| 107 | - fixed: 'right', | 37 | + resetFunc: async () => { |
| 38 | + searchInfo.value = {}; | ||
| 39 | + await nextTick(); | ||
| 40 | + if (unref(activeKey) === ActiveKey.RULE) { | ||
| 41 | + unref(ruleChainTableRefEl)?.reload(); | ||
| 42 | + } else { | ||
| 43 | + unref(tcpTableRefEl)?.reload(); | ||
| 44 | + } | ||
| 108 | }, | 45 | }, |
| 109 | }); | 46 | }); |
| 47 | +</script> | ||
| 110 | 48 | ||
| 111 | - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } = | ||
| 112 | - useBatchDelete(deleteTransformApi, handleSuccess, setProps); | ||
| 113 | - selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { | ||
| 114 | - // Demo:status为1的选择框禁用 | ||
| 115 | - if (record.status === 1) { | ||
| 116 | - return { disabled: true }; | ||
| 117 | - } else { | ||
| 118 | - return { disabled: false }; | ||
| 119 | - } | ||
| 120 | - }; | ||
| 121 | - nextTick(() => { | ||
| 122 | - setProps(selectionOptions); | ||
| 123 | - }); | ||
| 124 | - const [registerDrawer, { openDrawer }] = useDrawer(); | 49 | +<template> |
| 50 | + <section class="w-full h-full p-4"> | ||
| 51 | + <BasicForm @register="register" class="rule-script-manage-form w-full bg-light-50 !pt-4" /> | ||
| 52 | + <main class="mt-4"> | ||
| 53 | + <Tabs v-model:activeKey="activeKey" type="card" class="w-full h-full bg-light-50 !p-4"> | ||
| 54 | + <Tabs.TabPane tab="规则链转换脚本" :key="ActiveKey.RULE"> | ||
| 55 | + <RuleChainConversionScript | ||
| 56 | + ref="ruleChainTableRefEl" | ||
| 57 | + :search-info="searchInfo" | ||
| 58 | + class="p-4 bg-neutral-100" | ||
| 59 | + /> | ||
| 60 | + </Tabs.TabPane> | ||
| 61 | + <Tabs.TabPane tab="TCP转换脚本" :key="ActiveKey.TCP"> | ||
| 62 | + <TcpConversionScript | ||
| 63 | + ref="tcpTableRefEl" | ||
| 64 | + :search-info="searchInfo" | ||
| 65 | + class="p-4 bg-neutral-100" | ||
| 66 | + /> | ||
| 67 | + </Tabs.TabPane> | ||
| 68 | + </Tabs> | ||
| 69 | + </main> | ||
| 70 | + </section> | ||
| 71 | +</template> | ||
| 125 | 72 | ||
| 126 | - const isStatus = ref(0); | ||
| 127 | - const testScriptRef = ref(); | ||
| 128 | - const scriptDrawerRef = ref(); | ||
| 129 | - const handleIsStatus = ({ status, jsCode }) => { | ||
| 130 | - isStatus.value = status; | ||
| 131 | - testScriptRef.value.aceEditor.setValue(jsCode); | ||
| 132 | - }; | ||
| 133 | - const handleCancelStatus = ({ status, emitType }) => { | ||
| 134 | - openDrawer(true); | ||
| 135 | - isStatus.value = status; | ||
| 136 | - if (emitType === 'ok') { | ||
| 137 | - const jsCode = testScriptRef.value.aceEditor.getValue(); | ||
| 138 | - scriptDrawerRef.value.aceEditor.setValue(jsCode); | 73 | +<style lang="less" scoped> |
| 74 | + .rule-script-manage-form { | ||
| 75 | + :deep(.ant-row) { | ||
| 76 | + @apply w-full; | ||
| 139 | } | 77 | } |
| 140 | - }; | ||
| 141 | - const handleCreate = () => { | ||
| 142 | - nextTick(() => { | ||
| 143 | - openDrawer(true, { | ||
| 144 | - isUpdate: false, | ||
| 145 | - }); | ||
| 146 | - }); | ||
| 147 | - }; | ||
| 148 | - const handleEdit = (record: Recordable) => { | ||
| 149 | - nextTick(() => { | ||
| 150 | - openDrawer(true, { isUpdate: true, record }); | ||
| 151 | - }); | ||
| 152 | - }; | ||
| 153 | - const statusChange = async (checked, record) => { | ||
| 154 | - setProps({ | ||
| 155 | - loading: true, | ||
| 156 | - }); | ||
| 157 | - setSelectedRowKeys([]); | ||
| 158 | - resetSelectedRowKeys(); | ||
| 159 | - const newStatus = checked ? 1 : 0; | ||
| 160 | - const { createMessage } = useMessage(); | ||
| 161 | - try { | ||
| 162 | - await updateTransformScriptStatusApi(newStatus, record.id); | ||
| 163 | - if (newStatus) { | ||
| 164 | - createMessage.success(`启用成功`); | ||
| 165 | - } else { | ||
| 166 | - createMessage.success('禁用成功'); | ||
| 167 | - } | ||
| 168 | - } finally { | ||
| 169 | - setProps({ | ||
| 170 | - loading: false, | ||
| 171 | - }); | ||
| 172 | - reload(); | ||
| 173 | - } | ||
| 174 | - }; | ||
| 175 | - function handleView(record: Recordable) { | ||
| 176 | - nextTick(() => { | ||
| 177 | - openDrawer(true, { | ||
| 178 | - record, | ||
| 179 | - isUpdate: 'view', | ||
| 180 | - }); | ||
| 181 | - }); | ||
| 182 | } | 78 | } |
| 183 | -</script> | 79 | +</style> |