Showing
15 changed files
with
724 additions
and
926 deletions
| ... | ... | @@ -2,18 +2,17 @@ |
| 2 | 2 | import { Button, Tag } from 'ant-design-vue'; |
| 3 | 3 | import { h, onMounted, ref, unref, Ref } from 'vue'; |
| 4 | 4 | import { DeviceRecord } from '/@/api/device/model/deviceModel'; |
| 5 | - // import { ScriptRecord } from '/@/api/scriptmanage/model/scriptModel'; | |
| 6 | 5 | import { getScriptManageMeList } from '/@/api/scriptmanage/scriptManager'; |
| 7 | 6 | import { Description, useDescription } from '/@/components/Description'; |
| 8 | 7 | import { useModal } from '/@/components/Modal'; |
| 9 | - import CoverScriptModal from '/@/views/rule/script/TcpConversionScript/ConverScriptModal.vue'; | |
| 8 | + import { ConverScriptModal } from '/@/views/rule/script/TcpConversionScript/components'; | |
| 10 | 9 | import { SelectTypes } from 'ant-design-vue/es/select'; |
| 10 | + import { BusinessConvertScriptTextEnum } from '/@/views/rule/script/TcpConversionScript/config'; | |
| 11 | 11 | |
| 12 | 12 | const props = defineProps<{ |
| 13 | 13 | record: DeviceRecord['profileData']['transportConfiguration']; |
| 14 | 14 | }>(); |
| 15 | 15 | |
| 16 | - // const scriptInfo = ref<ScriptRecord>({} as unknown as ScriptRecord); | |
| 17 | 16 | const authScriptIdStr = ref(''); |
| 18 | 17 | |
| 19 | 18 | const upScriptIdStr = ref(''); |
| ... | ... | @@ -87,29 +86,25 @@ |
| 87 | 86 | const [registerModal, { openModal }] = useModal(); |
| 88 | 87 | |
| 89 | 88 | const handleTestAuthScript = () => { |
| 90 | - openModal(true, { | |
| 91 | - isUpdate: false, | |
| 92 | - isTest: true, | |
| 93 | - record: unref(authScriptIdStr), | |
| 94 | - isText: 'test', | |
| 95 | - isTitle: 'test', | |
| 96 | - }); | |
| 89 | + const modalParams = { | |
| 90 | + text: BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT, | |
| 91 | + record: { id: unref(authScriptIdStr) }, | |
| 92 | + }; | |
| 93 | + openModal(true, modalParams); | |
| 97 | 94 | }; |
| 98 | 95 | |
| 99 | 96 | const handleTestUpScript = () => { |
| 100 | - openModal(true, { | |
| 101 | - isUpdate: false, | |
| 102 | - isTest: true, | |
| 103 | - record: unref(upScriptIdStr), | |
| 104 | - isText: 'test', | |
| 105 | - isTitle: 'test', | |
| 106 | - }); | |
| 97 | + const modalParams = { | |
| 98 | + text: BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT, | |
| 99 | + record: { id: unref(upScriptIdStr) }, | |
| 100 | + }; | |
| 101 | + openModal(true, modalParams); | |
| 107 | 102 | }; |
| 108 | 103 | </script> |
| 109 | 104 | |
| 110 | 105 | <template> |
| 111 | 106 | <section> |
| 112 | 107 | <Description @register="register" /> |
| 113 | - <CoverScriptModal @register="registerModal" /> | |
| 108 | + <ConverScriptModal @register="registerModal" /> | |
| 114 | 109 | </section> |
| 115 | 110 | </template> | ... | ... |
| 1 | +<template> | |
| 2 | + <div class="flex"> | |
| 3 | + <div> | |
| 4 | + <Select | |
| 5 | + v-bind="$attrs" | |
| 6 | + placeholder="请选择脚本" | |
| 7 | + @change="handleChange" | |
| 8 | + v-model:value="scriptId" | |
| 9 | + style="width: 305px" | |
| 10 | + show-search | |
| 11 | + :options="selectOptions" | |
| 12 | + :filter-option="handleSearch" | |
| 13 | + allowClear | |
| 14 | + /> | |
| 15 | + </div> | |
| 16 | + <div> | |
| 17 | + <span | |
| 18 | + @click="handleBusinessModal(BusinessConvertScriptTextEnum.BUSINESS_ADD_TEXT)" | |
| 19 | + class="ml-2" | |
| 20 | + style="color: #409eff; cursor: pointer" | |
| 21 | + size="small" | |
| 22 | + >新建转换脚本</span | |
| 23 | + > | |
| 24 | + </div> | |
| 25 | + </div> | |
| 26 | + <a-button | |
| 27 | + @click="handleBusinessModal(BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT)" | |
| 28 | + class="mt-4" | |
| 29 | + type="primary" | |
| 30 | + >测试脚本</a-button | |
| 31 | + > | |
| 32 | + <ConverScriptModal @register="registerModal" @success="handleSuccess" /> | |
| 33 | +</template> | |
| 34 | +<script lang="ts" setup name="ScriptSelectItem"> | |
| 35 | + import { ref, Ref, onMounted } from 'vue'; | |
| 36 | + import { SelectTypes } from 'ant-design-vue/es/select'; | |
| 37 | + import { Select } from 'ant-design-vue'; | |
| 38 | + import { | |
| 39 | + BusinessConvertScriptTextEnum, | |
| 40 | + ScriptTypeEnum, | |
| 41 | + } from '/@/views/rule/script/TcpConversionScript/config'; | |
| 42 | + import { getScriptManageMeList } from '/@/api/scriptmanage/scriptManager'; | |
| 43 | + import { useModal } from '/@/components/Modal'; | |
| 44 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
| 45 | + import { ConverScriptModal } from '/@/views/rule/script/TcpConversionScript/components'; | |
| 46 | + | |
| 47 | + const props = defineProps({ | |
| 48 | + scriptType: { | |
| 49 | + type: String, | |
| 50 | + default: ScriptTypeEnum.TRANSPORT_TCP_AUTH, | |
| 51 | + }, | |
| 52 | + modelValue: { | |
| 53 | + type: String, | |
| 54 | + default: '', | |
| 55 | + }, | |
| 56 | + }); | |
| 57 | + | |
| 58 | + const emits = defineEmits(['update:modelValue', 'change']); | |
| 59 | + | |
| 60 | + const { createMessage } = useMessage(); | |
| 61 | + | |
| 62 | + const selectOptions: Ref<SelectTypes['options']> = ref([]); | |
| 63 | + | |
| 64 | + //如果是空字符串,placeholder没提示文字 | |
| 65 | + const scriptId = ref<any>(null); | |
| 66 | + | |
| 67 | + onMounted(() => { | |
| 68 | + getSelectOptions(); | |
| 69 | + }); | |
| 70 | + | |
| 71 | + const getSelectOptions = async () => { | |
| 72 | + selectOptions.value = await getAllScriptType(props.scriptType); | |
| 73 | + }; | |
| 74 | + | |
| 75 | + const getAllScriptType = async (type) => { | |
| 76 | + const rest = await getScriptManageMeList({ scriptType: type }); | |
| 77 | + return rest.map((m) => ({ label: m.name, value: m.id })); | |
| 78 | + }; | |
| 79 | + | |
| 80 | + const handleSearch = (inputValue: string, option: Record<'label' | 'value', string>) => { | |
| 81 | + return option.label.includes(inputValue); | |
| 82 | + }; | |
| 83 | + | |
| 84 | + const [registerModal, { openModal }] = useModal(); | |
| 85 | + | |
| 86 | + // 业务弹窗 | |
| 87 | + const handleBusinessModal = (text) => { | |
| 88 | + const modalParams = { | |
| 89 | + text, | |
| 90 | + record: | |
| 91 | + text !== BusinessConvertScriptTextEnum.BUSINESS_ADD_TEXT ? { id: scriptId.value } : null, | |
| 92 | + scriptType: props.scriptType, | |
| 93 | + }; | |
| 94 | + if (!scriptId.value) return createMessage.error('请先选择对应脚本'); | |
| 95 | + openModal(true, modalParams); | |
| 96 | + }; | |
| 97 | + | |
| 98 | + const handleSuccess = () => { | |
| 99 | + getSelectOptions(); | |
| 100 | + }; | |
| 101 | + | |
| 102 | + const handleChange = (value) => { | |
| 103 | + emits('update:modelValue', value); | |
| 104 | + emits('change', value); | |
| 105 | + }; | |
| 106 | + | |
| 107 | + const setValue = (value) => { | |
| 108 | + scriptId.value = value; | |
| 109 | + }; | |
| 110 | + defineExpose({ | |
| 111 | + setValue, | |
| 112 | + }); | |
| 113 | +</script> | ... | ... |
src/views/device/profiles/step/cpns/tcp/config.ts
deleted
100644 → 0
| 1 | -import { FormSchema } from '/@/components/Form'; | |
| 2 | - | |
| 3 | -export const tcpSchemas: FormSchema[] = [ | |
| 4 | - { | |
| 5 | - field: 'authScriptId', | |
| 6 | - label: '鉴权脚本', | |
| 7 | - component: 'Input', | |
| 8 | - slot: 'authScriptId', | |
| 9 | - colProps: { span: 24 }, | |
| 10 | - required: true, | |
| 11 | - }, | |
| 12 | - { | |
| 13 | - field: 'upScriptId', | |
| 14 | - label: '上行脚本', | |
| 15 | - component: 'Input', | |
| 16 | - slot: 'upScriptId', | |
| 17 | - colProps: { span: 24 }, | |
| 18 | - required: true, | |
| 19 | - }, | |
| 20 | -]; | |
| 21 | - | |
| 22 | -// 新增编辑配置 | |
| 23 | -export const formSchema: FormSchema[] = [ | |
| 24 | - { | |
| 25 | - field: 'name', | |
| 26 | - label: '输入参数', | |
| 27 | - colProps: { span: 24 }, | |
| 28 | - required: true, | |
| 29 | - component: 'Input', | |
| 30 | - componentProps: { | |
| 31 | - maxLength: 255, | |
| 32 | - placeholder: '请输入输入参数', | |
| 33 | - }, | |
| 34 | - }, | |
| 35 | - { | |
| 36 | - field: 'scriptContent', | |
| 37 | - label: '脚本内容', | |
| 38 | - required: true, | |
| 39 | - component: 'Input', | |
| 40 | - slot: 'scriptContent', | |
| 41 | - colProps: { span: 24 }, | |
| 42 | - }, | |
| 43 | - { | |
| 44 | - field: 'remark', | |
| 45 | - label: '输出参数', | |
| 46 | - colProps: { span: 24 }, | |
| 47 | - component: 'InputTextArea', | |
| 48 | - componentProps: { | |
| 49 | - rows: 6, | |
| 50 | - maxLength: 255, | |
| 51 | - placeholder: '请输入输出参数', | |
| 52 | - }, | |
| 53 | - }, | |
| 54 | -]; |
| 1 | -<template> | |
| 2 | - <div> | |
| 3 | - <a-form | |
| 4 | - ref="formRef" | |
| 5 | - :model="scriptForm" | |
| 6 | - name="basic" | |
| 7 | - :label-col="{ span: 4 }" | |
| 8 | - :wrapper-col="{ span: 16 }" | |
| 9 | - style="margin-left: 2.4rem" | |
| 10 | - autocomplete="off" | |
| 11 | - > | |
| 12 | - <a-form-item | |
| 13 | - v-if="deviceTypeStr !== 'SENSOR'" | |
| 14 | - label="鉴权脚本" | |
| 15 | - name="'params'" | |
| 16 | - :rules="[{ required: true, message: '请选择鉴权脚本' }]" | |
| 17 | - > | |
| 18 | - <div style="display: flex; align-items: center"> | |
| 19 | - <div> | |
| 20 | - <Select | |
| 21 | - @change="handleAuthChange" | |
| 22 | - placeholder="请选择" | |
| 23 | - v-model:value="scriptForm.authScriptId" | |
| 24 | - style="width: 305px" | |
| 25 | - show-search | |
| 26 | - :options="selectAuthOptions" | |
| 27 | - :filter-option="handleAuthSearch" | |
| 28 | - allowClear | |
| 29 | - /> | |
| 30 | - </div> | |
| 31 | - <div> | |
| 32 | - <span | |
| 33 | - @click="handleCreateOrEditAuth('add')" | |
| 34 | - class="ml-2" | |
| 35 | - style="color: #409eff; cursor: pointer" | |
| 36 | - size="small" | |
| 37 | - >新建转换脚本</span | |
| 38 | - > | |
| 39 | - </div> | |
| 40 | - </div> | |
| 41 | - <a-button @click="handleCreateOrEditAuth('test')" class="mt-4" type="primary" | |
| 42 | - >测试脚本</a-button | |
| 43 | - > | |
| 44 | - </a-form-item> | |
| 45 | - <a-form-item | |
| 46 | - label="上行脚本" | |
| 47 | - name="'params'" | |
| 48 | - :rules="[{ required: true, message: '请选择上行脚本' }]" | |
| 49 | - > | |
| 50 | - <div style="display: flex; align-items: center"> | |
| 51 | - <div> | |
| 52 | - <Select | |
| 53 | - @change="handleUpChange" | |
| 54 | - placeholder="请选择" | |
| 55 | - v-model:value="scriptForm.upScriptId" | |
| 56 | - style="width: 305px" | |
| 57 | - show-search | |
| 58 | - :options="selectUpOptions" | |
| 59 | - :filter-option="handleSearch" | |
| 60 | - allowClear | |
| 61 | - /> | |
| 62 | - </div> | |
| 63 | - <div> | |
| 64 | - <span | |
| 65 | - @click="handleCreateOrEdit('add')" | |
| 66 | - class="ml-2" | |
| 67 | - style="color: #409eff; cursor: pointer" | |
| 68 | - size="small" | |
| 69 | - >新建转换脚本</span | |
| 70 | - > | |
| 71 | - </div> | |
| 72 | - </div> | |
| 73 | - <a-button @click="handleCreateOrEdit('test')" class="mt-4" type="primary" | |
| 74 | - >测试脚本</a-button | |
| 75 | - > | |
| 76 | - </a-form-item> | |
| 77 | - </a-form> | |
| 78 | - <ConverScriptModal @register="registerModal" @success="handleSuccess" /> | |
| 79 | - <ConverScriptModal @register="registerAuthModal" @success="handleAuthSuccess" /> | |
| 80 | - </div> | |
| 81 | -</template> | |
| 82 | -<script lang="ts" setup name="index"> | |
| 83 | - import { ref, Ref, onMounted, reactive } from 'vue'; | |
| 84 | - import { SelectTypes } from 'ant-design-vue/es/select'; | |
| 85 | - import { Select } from 'ant-design-vue'; | |
| 86 | - import { useModal } from '/@/components/Modal'; | |
| 87 | - import { getScriptManageMeList } from '/@/api/scriptmanage/scriptManager'; | |
| 88 | - import ConverScriptModal from '/@/views/rule/script/TcpConversionScript/ConverScriptModal.vue'; | |
| 89 | - import { useMessage } from '/@/hooks/web/useMessage'; | |
| 90 | - | |
| 91 | - const props = defineProps({ | |
| 92 | - deviceTypeStr: { type: String, default: '' }, | |
| 93 | - }); | |
| 94 | - | |
| 95 | - const scriptForm = reactive({ | |
| 96 | - authScriptId: '', | |
| 97 | - upScriptId: '', | |
| 98 | - }); | |
| 99 | - const selectUpOptions: Ref<SelectTypes['options']> = ref([]); | |
| 100 | - | |
| 101 | - const selectAuthOptions: Ref<SelectTypes['options']> = ref([]); | |
| 102 | - | |
| 103 | - const { createMessage } = useMessage(); | |
| 104 | - | |
| 105 | - const upScriptIdStr = ref(''); | |
| 106 | - | |
| 107 | - const authScriptIdStr = ref(''); | |
| 108 | - | |
| 109 | - onMounted(async () => { | |
| 110 | - selectUpOptions.value = await getAllScriptType('TRANSPORT_TCP_UP'); | |
| 111 | - selectAuthOptions.value = await getAllScriptType('TRANSPORT_TCP_AUTH'); | |
| 112 | - }); | |
| 113 | - | |
| 114 | - const getAllScriptType = async (type) => { | |
| 115 | - const rest = await getScriptManageMeList({ scriptType: type }); | |
| 116 | - return rest.map((m) => ({ label: m.name, value: m.id })); | |
| 117 | - }; | |
| 118 | - | |
| 119 | - const handleSuccess = async ({ res, text }) => { | |
| 120 | - if (text !== 'test') { | |
| 121 | - const rest = await getAllScriptType('TRANSPORT_TCP_UP'); | |
| 122 | - selectUpOptions.value = rest; | |
| 123 | - scriptForm.upScriptId = res?.id; | |
| 124 | - upScriptIdStr.value = res?.id; | |
| 125 | - } | |
| 126 | - }; | |
| 127 | - | |
| 128 | - const handleAuthSuccess = async ({ res, text }) => { | |
| 129 | - if (text !== 'test') { | |
| 130 | - const rest = await getAllScriptType('TRANSPORT_TCP_AUTH'); | |
| 131 | - selectAuthOptions.value = rest; | |
| 132 | - scriptForm.authScriptId = res?.id; | |
| 133 | - authScriptIdStr.value = res?.id; | |
| 134 | - } | |
| 135 | - }; | |
| 136 | - | |
| 137 | - const handleUpChange = (v) => { | |
| 138 | - upScriptIdStr.value = v; | |
| 139 | - scriptForm.upScriptId = v; | |
| 140 | - }; | |
| 141 | - | |
| 142 | - const handleAuthChange = (v) => { | |
| 143 | - authScriptIdStr.value = v; | |
| 144 | - scriptForm.authScriptId = v; | |
| 145 | - }; | |
| 146 | - | |
| 147 | - const [registerModal, { openModal }] = useModal(); | |
| 148 | - | |
| 149 | - const [registerAuthModal, { openModal: openAuthModel }] = useModal(); | |
| 150 | - | |
| 151 | - //TODO: 待优化 | |
| 152 | - | |
| 153 | - const handleCreateOrEditAuth = (c) => { | |
| 154 | - if (c === 'add') { | |
| 155 | - openAuthModel(true, { | |
| 156 | - isUpdate: true, | |
| 157 | - isView: false, | |
| 158 | - isTest: false, | |
| 159 | - isText: 'confirm', | |
| 160 | - isTitle: 'add', | |
| 161 | - }); | |
| 162 | - } else { | |
| 163 | - if (!authScriptIdStr.value) return createMessage.error('请先选择对应脚本'); | |
| 164 | - openAuthModel(true, { | |
| 165 | - isUpdate: false, | |
| 166 | - isTest: true, | |
| 167 | - record: authScriptIdStr.value, | |
| 168 | - isText: 'test', | |
| 169 | - isTitle: 'test', | |
| 170 | - }); | |
| 171 | - } | |
| 172 | - }; | |
| 173 | - | |
| 174 | - const handleCreateOrEdit = (c) => { | |
| 175 | - if (c === 'add') { | |
| 176 | - openModal(true, { | |
| 177 | - isUpdate: true, | |
| 178 | - isView: false, | |
| 179 | - isTest: false, | |
| 180 | - isText: 'confirm', | |
| 181 | - isTitle: 'add', | |
| 182 | - }); | |
| 183 | - } else { | |
| 184 | - if (!upScriptIdStr.value) return createMessage.error('请先选择对应脚本'); | |
| 185 | - openModal(true, { | |
| 186 | - isUpdate: false, | |
| 187 | - isTest: true, | |
| 188 | - record: upScriptIdStr.value, | |
| 189 | - isText: 'test', | |
| 190 | - isTitle: 'test', | |
| 191 | - }); | |
| 192 | - } | |
| 193 | - }; | |
| 194 | - | |
| 195 | - const getFormData = async () => { | |
| 196 | - if (props.deviceTypeStr === 'SENSOR') { | |
| 197 | - if (!scriptForm.upScriptId) { | |
| 198 | - createMessage.error('请先选择对应脚本'); | |
| 199 | - throw new Error('请先选择对应脚本'); | |
| 200 | - } | |
| 201 | - } else { | |
| 202 | - if (!scriptForm.authScriptId) { | |
| 203 | - createMessage.error('请先选择对应脚本'); | |
| 204 | - throw new Error('请先选择对应脚本'); | |
| 205 | - } | |
| 206 | - if (!scriptForm.upScriptId) { | |
| 207 | - createMessage.error('请先选择对应脚本'); | |
| 208 | - throw new Error('请先选择对应脚本'); | |
| 209 | - } | |
| 210 | - } | |
| 211 | - return { | |
| 212 | - ...scriptForm, | |
| 213 | - type: 'TCP', | |
| 214 | - }; | |
| 215 | - }; | |
| 216 | - | |
| 217 | - const resetFormData = () => { | |
| 218 | - // resetFields(); | |
| 219 | - }; | |
| 220 | - | |
| 221 | - const setFormData = (v) => { | |
| 222 | - scriptForm.authScriptId = v?.authScriptId; | |
| 223 | - scriptForm.upScriptId = v?.upScriptId; | |
| 224 | - // setFieldsValue(v); | |
| 225 | - upScriptIdStr.value = v?.upScriptId; | |
| 226 | - authScriptIdStr.value = v?.authScriptId; | |
| 227 | - }; | |
| 228 | - | |
| 229 | - const handleSearch = (inputValue: string, option: Record<'label' | 'value', string>) => { | |
| 230 | - return option.label.includes(inputValue); | |
| 231 | - }; | |
| 232 | - | |
| 233 | - const handleAuthSearch = (inputValue: string, option: Record<'label' | 'value', string>) => { | |
| 234 | - return option.label.includes(inputValue); | |
| 235 | - }; | |
| 236 | - | |
| 237 | - defineExpose({ | |
| 238 | - getFormData, | |
| 239 | - resetFormData, | |
| 240 | - setFormData, | |
| 241 | - }); | |
| 242 | -</script> | |
| 243 | -<style lang="less" scoped></style> | |
| 1 | +<template> | |
| 2 | + <div> | |
| 3 | + <a-form | |
| 4 | + ref="formRef" | |
| 5 | + :model="scriptForm" | |
| 6 | + name="basic" | |
| 7 | + :label-col="{ span: 4 }" | |
| 8 | + :wrapper-col="{ span: 16 }" | |
| 9 | + autocomplete="off" | |
| 10 | + style="margin-left: 2.4rem" | |
| 11 | + > | |
| 12 | + <a-form-item | |
| 13 | + v-if="deviceTypeStr !== TypeEnum.SENSOR" | |
| 14 | + label="鉴权脚本" | |
| 15 | + name="authScriptId" | |
| 16 | + :rules="[{ required: true, message: '请选择鉴权脚本' }]" | |
| 17 | + > | |
| 18 | + <ScriptSelectItem | |
| 19 | + ref="scriptSelectItemAuthRef" | |
| 20 | + v-model:value="scriptForm.authScriptId" | |
| 21 | + :scriptType="ScriptTypeEnum.TRANSPORT_TCP_AUTH" | |
| 22 | + /> | |
| 23 | + </a-form-item> | |
| 24 | + <a-form-item | |
| 25 | + label="上行脚本" | |
| 26 | + name="upScriptId" | |
| 27 | + :rules="[{ required: true, message: '请选择上行脚本' }]" | |
| 28 | + > | |
| 29 | + <ScriptSelectItem | |
| 30 | + ref="scriptSelectItemUpRef" | |
| 31 | + v-model:value="scriptForm.upScriptId" | |
| 32 | + :scriptType="ScriptTypeEnum.TRANSPORT_TCP_UP" | |
| 33 | + /> | |
| 34 | + </a-form-item> | |
| 35 | + </a-form> | |
| 36 | + </div> | |
| 37 | +</template> | |
| 38 | +<script lang="ts" setup name="index"> | |
| 39 | + import { reactive, ref } from 'vue'; | |
| 40 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
| 41 | + import { ScriptSelectItem } from './components'; | |
| 42 | + import { ScriptTypeEnum } from '/@/views/rule/script/TcpConversionScript/config'; | |
| 43 | + import { TypeEnum } from '/@/views/device/list/config/data'; | |
| 44 | + | |
| 45 | + const props = defineProps({ | |
| 46 | + deviceTypeStr: { type: String, default: '' }, | |
| 47 | + }); | |
| 48 | + | |
| 49 | + const scriptForm = reactive({ | |
| 50 | + authScriptId: '', | |
| 51 | + upScriptId: '', | |
| 52 | + }); | |
| 53 | + | |
| 54 | + const { createMessage } = useMessage(); | |
| 55 | + | |
| 56 | + const scriptSelectItemAuthRef = ref<InstanceType<typeof ScriptSelectItem>>(); | |
| 57 | + | |
| 58 | + const scriptSelectItemUpRef = ref<InstanceType<typeof ScriptSelectItem>>(); | |
| 59 | + | |
| 60 | + const getFormData = async () => { | |
| 61 | + //业务 网关子设备没有鉴权脚本 | |
| 62 | + if (props.deviceTypeStr === TypeEnum.SENSOR) Reflect.deleteProperty(scriptForm, 'authScriptId'); | |
| 63 | + if (Object.values(scriptForm).some((item) => !item)) { | |
| 64 | + createMessage.error('请先选择对应脚本'); | |
| 65 | + throw new Error('请先选择对应脚本'); | |
| 66 | + } | |
| 67 | + return { | |
| 68 | + ...scriptForm, | |
| 69 | + type: 'TCP', | |
| 70 | + }; | |
| 71 | + }; | |
| 72 | + | |
| 73 | + const resetFormData = () => {}; | |
| 74 | + | |
| 75 | + const setFormData = (data) => { | |
| 76 | + scriptForm.authScriptId = data?.authScriptId; | |
| 77 | + scriptForm.upScriptId = data?.upScriptId; | |
| 78 | + scriptSelectItemAuthRef.value?.setValue(data?.authScriptId); | |
| 79 | + scriptSelectItemUpRef.value?.setValue(data?.upScriptId); | |
| 80 | + }; | |
| 81 | + defineExpose({ | |
| 82 | + getFormData, | |
| 83 | + resetFormData, | |
| 84 | + setFormData, | |
| 85 | + }); | |
| 86 | +</script> | |
| 87 | +<style lang="less" scoped></style> | ... | ... |
src/views/rule/script/TcpConversionScript/ConverScriptModal.less
deleted
100644 → 0
src/views/rule/script/TcpConversionScript/ConverScriptModal.vue
deleted
100644 → 0
| 1 | -<template> | |
| 2 | - <div> | |
| 3 | - <BasicModal | |
| 4 | - destroyOnClose | |
| 5 | - v-bind="$attrs" | |
| 6 | - width="60rem" | |
| 7 | - @register="register" | |
| 8 | - :title="getTitle" | |
| 9 | - :minHeight="500" | |
| 10 | - @cancel="handleCancel" | |
| 11 | - @ok="handleSubmit" | |
| 12 | - > | |
| 13 | - <ConverScript | |
| 14 | - :view="isViewDetail" | |
| 15 | - :text="isTitle" | |
| 16 | - :ifAdd="isTest ? false : true" | |
| 17 | - ref="converScriptRef" | |
| 18 | - /> | |
| 19 | - </BasicModal> | |
| 20 | - </div> | |
| 21 | -</template> | |
| 22 | -<script setup lang="ts"> | |
| 23 | - import { ref, computed, unref, reactive } from 'vue'; | |
| 24 | - import { BasicModal, useModalInner } from '/@/components/Modal'; | |
| 25 | - import ConverScript from './ConverScript.vue'; | |
| 26 | - import { | |
| 27 | - createOrEditScriptManage, | |
| 28 | - getScriptManageDetail, | |
| 29 | - testScriptManage, | |
| 30 | - } from '/@/api/scriptmanage/scriptManager'; | |
| 31 | - import { useMessage } from '/@/hooks/web/useMessage'; | |
| 32 | - | |
| 33 | - const emits = defineEmits(['success', 'register']); | |
| 34 | - const { createMessage } = useMessage(); | |
| 35 | - const converScriptRef = ref<InstanceType<typeof ConverScript>>(); | |
| 36 | - const getTitle = computed(() => (isUpdate.value ? '编辑转换脚本' : '新增转换脚本')); | |
| 37 | - const isUpdate = ref(false); | |
| 38 | - const isViewDetail = ref(''); | |
| 39 | - const isTest = ref(false); | |
| 40 | - const isText = ref(''); | |
| 41 | - const isTitle = ref(''); | |
| 42 | - const editData = reactive({ | |
| 43 | - data: {}, | |
| 44 | - }); | |
| 45 | - const [register, { setModalProps, closeModal }] = useModalInner(async (data) => { | |
| 46 | - setModalProps({ loading: true }); | |
| 47 | - handleCancel(false); | |
| 48 | - isUpdate.value = data.isUpdate; | |
| 49 | - isViewDetail.value = data.isView; | |
| 50 | - isTest.value = data.isTest; | |
| 51 | - isText.value = data.isText; | |
| 52 | - isTitle.value = data.isTitle; | |
| 53 | - editData.data = data.record; | |
| 54 | - setModalProps({ loading: false }); | |
| 55 | - converScriptRef.value?.initEditor(); | |
| 56 | - if (!unref(isViewDetail)) { | |
| 57 | - const title = | |
| 58 | - unref(isTitle) == 'edit' | |
| 59 | - ? '编辑转换脚本' | |
| 60 | - : unref(isTitle) == 'add' | |
| 61 | - ? '新增转换脚本' | |
| 62 | - : '测试转换脚本'; | |
| 63 | - const okText = isText.value == 'test' ? '测试' : '确定'; | |
| 64 | - if (unref(isTitle) == 'add') { | |
| 65 | - converScriptRef.value?.setDefaultRadio('TRANSPORT_TCP_UP'); | |
| 66 | - } | |
| 67 | - if (unref(isTitle) == 'edit') { | |
| 68 | - converScriptRef.value?.setFormData(data.record); | |
| 69 | - } | |
| 70 | - if (unref(isTitle) == 'test') { | |
| 71 | - if (data.record) { | |
| 72 | - const res = await getScriptManageDetail(data.record); | |
| 73 | - converScriptRef.value?.setFormData(res); | |
| 74 | - } else { | |
| 75 | - converScriptRef.value?.setDefaultRadio('TRANSPORT_TCP_UP'); | |
| 76 | - } | |
| 77 | - } | |
| 78 | - setModalProps({ title, showOkBtn: true, showCancelBtn: true, okText }); | |
| 79 | - if (!unref(isUpdate)) { | |
| 80 | - } | |
| 81 | - } else { | |
| 82 | - setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看转换脚本' }); | |
| 83 | - const res = await getScriptManageDetail(data.record.id); | |
| 84 | - converScriptRef.value?.setFormData(res || {}); | |
| 85 | - } | |
| 86 | - }); | |
| 87 | - | |
| 88 | - const handleSubmit = async () => { | |
| 89 | - setModalProps({ confirmLoading: true }); | |
| 90 | - try { | |
| 91 | - const val = await converScriptRef.value?.getFormData(); | |
| 92 | - const tempObj = { | |
| 93 | - ...editData.data, | |
| 94 | - ...val, | |
| 95 | - }; | |
| 96 | - const res: any = | |
| 97 | - isText.value == 'test' | |
| 98 | - ? await testScriptManage(val) | |
| 99 | - : await createOrEditScriptManage(tempObj); | |
| 100 | - createMessage.success( | |
| 101 | - unref(isTitle) == 'edit' | |
| 102 | - ? '编辑转换脚本成功' | |
| 103 | - : unref(isTitle) == 'add' | |
| 104 | - ? '新增转换脚本成功' | |
| 105 | - : '测试转换脚本成功' | |
| 106 | - ); | |
| 107 | - if (unref(isTitle) == 'add' || unref(isTitle) == 'edit') { | |
| 108 | - setTimeout(() => { | |
| 109 | - closeModal(); | |
| 110 | - }, 10); | |
| 111 | - emits('success', { | |
| 112 | - res, | |
| 113 | - text: isText.value, | |
| 114 | - }); | |
| 115 | - } else { | |
| 116 | - if (res) { | |
| 117 | - converScriptRef.value?.setScriptOutputData(res?.output || res?.error); | |
| 118 | - } | |
| 119 | - } | |
| 120 | - } finally { | |
| 121 | - setModalProps({ confirmLoading: false }); | |
| 122 | - } | |
| 123 | - }; | |
| 124 | - const handleCancel = (flag) => { | |
| 125 | - if (flag) { | |
| 126 | - closeModal(); | |
| 127 | - } | |
| 128 | - converScriptRef.value?.resetFormData(); | |
| 129 | - }; | |
| 130 | -</script> | |
| 131 | -<style lang="less" scoped> | |
| 132 | - @import url('./ConverScriptModal.less'); | |
| 133 | -</style> |
src/views/rule/script/TcpConversionScript/TestScriptModal.vue
deleted
100644 → 0
| 1 | -<template> | |
| 2 | - <div> | |
| 3 | - <BasicModal | |
| 4 | - destroyOnClose | |
| 5 | - v-bind="$attrs" | |
| 6 | - width="60rem" | |
| 7 | - @register="register" | |
| 8 | - :title="getTitle" | |
| 9 | - :minHeight="500" | |
| 10 | - @cancel="handleCancel" | |
| 11 | - @ok="handleSubmit" | |
| 12 | - > | |
| 13 | - <ConverScript | |
| 14 | - :view="isViewDetail" | |
| 15 | - :text="isTitle" | |
| 16 | - :ifAdd="isTest ? false : true" | |
| 17 | - ref="converScriptRef" | |
| 18 | - /> | |
| 19 | - </BasicModal> | |
| 20 | - </div> | |
| 21 | -</template> | |
| 22 | -<script setup lang="ts"> | |
| 23 | - import { ref, computed, unref, reactive } from 'vue'; | |
| 24 | - import { BasicModal, useModalInner } from '/@/components/Modal'; | |
| 25 | - import ConverScript from './ConverScript.vue'; | |
| 26 | - import { | |
| 27 | - createOrEditScriptManage, | |
| 28 | - getScriptManageDetail, | |
| 29 | - testScriptManage, | |
| 30 | - } from '/@/api/scriptmanage/scriptManager'; | |
| 31 | - import { useMessage } from '/@/hooks/web/useMessage'; | |
| 32 | - | |
| 33 | - const emits = defineEmits(['success', 'register']); | |
| 34 | - const { createMessage } = useMessage(); | |
| 35 | - const converScriptRef = ref<InstanceType<typeof ConverScript>>(); | |
| 36 | - const getTitle = computed(() => (isUpdate.value ? '编辑转换脚本' : '新增转换脚本')); | |
| 37 | - const isUpdate = ref(false); | |
| 38 | - const isViewDetail = ref(''); | |
| 39 | - const isTest = ref(false); | |
| 40 | - const isText = ref(''); | |
| 41 | - const isTitle = ref(''); | |
| 42 | - const editData = reactive({ | |
| 43 | - data: {}, | |
| 44 | - }); | |
| 45 | - const [register, { setModalProps, closeModal }] = useModalInner(async (data) => { | |
| 46 | - setModalProps({ loading: true }); | |
| 47 | - handleCancel(false); | |
| 48 | - isUpdate.value = data.isUpdate; | |
| 49 | - isViewDetail.value = data.isView; | |
| 50 | - isTest.value = data.isTest; | |
| 51 | - isText.value = data.isText; | |
| 52 | - isTitle.value = data.isTitle; | |
| 53 | - editData.data = data.record; | |
| 54 | - setModalProps({ loading: false }); | |
| 55 | - converScriptRef.value?.initEditor(); | |
| 56 | - if (!unref(isViewDetail)) { | |
| 57 | - const title = | |
| 58 | - unref(isTitle) == 'edit' | |
| 59 | - ? '编辑转换脚本' | |
| 60 | - : unref(isTitle) == 'add' | |
| 61 | - ? '新增转换脚本' | |
| 62 | - : '测试转换脚本'; | |
| 63 | - const okText = isText.value == 'test' ? '测试' : '确定'; | |
| 64 | - if (unref(isTitle) == 'add') { | |
| 65 | - converScriptRef.value?.setDefaultRadio('TRANSPORT_TCP_UP'); | |
| 66 | - } | |
| 67 | - if (unref(isTitle) == 'edit') { | |
| 68 | - converScriptRef.value?.setFormData(data.record); | |
| 69 | - } | |
| 70 | - if (unref(isTitle) == 'test') { | |
| 71 | - if (data.record) { | |
| 72 | - const res = await getScriptManageDetail(data.record); | |
| 73 | - converScriptRef.value?.setFormData({ ...res, convertJs: data?.testContent }); | |
| 74 | - } else { | |
| 75 | - converScriptRef.value?.setFormData({ convertJs: data?.testContent }); | |
| 76 | - converScriptRef.value?.setDefaultRadio('TRANSPORT_TCP_UP'); | |
| 77 | - } | |
| 78 | - } | |
| 79 | - setModalProps({ title, showOkBtn: true, showCancelBtn: true, okText }); | |
| 80 | - if (!unref(isUpdate)) { | |
| 81 | - } | |
| 82 | - } else { | |
| 83 | - setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看转换脚本' }); | |
| 84 | - const res = await getScriptManageDetail(data.record.id); | |
| 85 | - converScriptRef.value?.setFormData(res || {}); | |
| 86 | - } | |
| 87 | - }); | |
| 88 | - | |
| 89 | - const handleSubmit = async () => { | |
| 90 | - setModalProps({ confirmLoading: true }); | |
| 91 | - try { | |
| 92 | - const val = await converScriptRef.value?.getFormData(); | |
| 93 | - const tempObj = { | |
| 94 | - ...editData.data, | |
| 95 | - ...val, | |
| 96 | - }; | |
| 97 | - const res: any = | |
| 98 | - isText.value == 'test' | |
| 99 | - ? await testScriptManage(val) | |
| 100 | - : await createOrEditScriptManage(tempObj); | |
| 101 | - createMessage.success( | |
| 102 | - unref(isTitle) == 'edit' | |
| 103 | - ? '编辑转换脚本成功' | |
| 104 | - : unref(isTitle) == 'add' | |
| 105 | - ? '新增转换脚本成功' | |
| 106 | - : '测试转换脚本成功' | |
| 107 | - ); | |
| 108 | - if (unref(isTitle) == 'add' || unref(isTitle) == 'edit') { | |
| 109 | - setTimeout(() => { | |
| 110 | - closeModal(); | |
| 111 | - }, 10); | |
| 112 | - emits('success', { | |
| 113 | - res, | |
| 114 | - text: isText.value, | |
| 115 | - }); | |
| 116 | - } else { | |
| 117 | - if (res) { | |
| 118 | - converScriptRef.value?.setScriptOutputData(res?.output || res?.error); | |
| 119 | - } | |
| 120 | - } | |
| 121 | - } finally { | |
| 122 | - setModalProps({ confirmLoading: false }); | |
| 123 | - } | |
| 124 | - }; | |
| 125 | - const handleCancel = (flag) => { | |
| 126 | - if (flag) { | |
| 127 | - closeModal(); | |
| 128 | - } | |
| 129 | - converScriptRef.value?.resetFormData(); | |
| 130 | - }; | |
| 131 | -</script> | |
| 132 | -<style lang="less" scoped> | |
| 133 | - @import url('./ConverScriptModal.less'); | |
| 134 | -</style> |
src/views/rule/script/TcpConversionScript/components/ConverScriptForm.vue
renamed from
src/views/rule/script/TcpConversionScript/ConverScript.vue
| ... | ... | @@ -6,17 +6,16 @@ |
| 6 | 6 | name="basic" |
| 7 | 7 | :label-col="{ span: 4 }" |
| 8 | 8 | :wrapper-col="{ span: 16 }" |
| 9 | - autocomplete="off" | |
| 10 | 9 | > |
| 11 | 10 | <a-form-item |
| 12 | - :label="ifAdd ? '名称' : '输入参数(params)'" | |
| 13 | - :name="ifAdd ? 'name' : 'params'" | |
| 14 | - :rules="[{ required: true, message: ifAdd ? '请输入脚本名称' : '请输入参数' }]" | |
| 11 | + :label="isNotTest ? '名称' : '输入参数(params)'" | |
| 12 | + :name="isNotTest ? 'name' : 'params'" | |
| 13 | + :rules="[{ required: true, message: isNotTest ? '请输入脚本名称' : '请输入参数' }]" | |
| 15 | 14 | > |
| 16 | 15 | <a-input-group compact> |
| 17 | 16 | <a-input |
| 18 | 17 | style="width: calc(100% - 200px)" |
| 19 | - v-if="ifAdd" | |
| 18 | + v-if="isNotTest" | |
| 20 | 19 | :maxlength="36" |
| 21 | 20 | @change="handleInputChange" |
| 22 | 21 | v-model:value="scriptForm.name" |
| ... | ... | @@ -28,7 +27,13 @@ |
| 28 | 27 | v-model:value="scriptForm.params" |
| 29 | 28 | placeholder="请输入参数" |
| 30 | 29 | /> |
| 31 | - <a-button @click="onHandleClick(text)" v-show="ifAdd && !view" type="primary"> | |
| 30 | + <a-button | |
| 31 | + @click=" | |
| 32 | + handleInnerTestClick(BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT, 'innerTest') | |
| 33 | + " | |
| 34 | + v-show="isNotTest && !isView" | |
| 35 | + type="primary" | |
| 36 | + > | |
| 32 | 37 | 测试 |
| 33 | 38 | </a-button> |
| 34 | 39 | </a-input-group> |
| ... | ... | @@ -46,36 +51,35 @@ |
| 46 | 51 | /> |
| 47 | 52 | </a-space> |
| 48 | 53 | </a-form-item> |
| 49 | - <a-form-item label="脚本内容" :name="ifAdd ? 'convertJs' : 'script'"> | |
| 50 | - <Card title="脚本内容" :bodyStyle="{ padding: 0 }"> | |
| 54 | + <a-form-item label="脚本内容" :name="isNotTest ? 'convertJs' : 'script'"> | |
| 55 | + <Card title="编写脚本内容" :bodyStyle="{ padding: 0 }"> | |
| 51 | 56 | <template #extra> |
| 52 | 57 | <Button |
| 53 | - v-show="ifAdd && !view" | |
| 54 | - @click="onHandleTestExampleGateway(scriptForm.scriptType)" | |
| 55 | - style="position: relative; top: -4rem; right: -6.6rem" | |
| 58 | + v-show="isNotTest && !isView" | |
| 59 | + @click="onHandleTestExample(true, scriptForm.scriptType)" | |
| 60 | + class="button-text" | |
| 56 | 61 | type="primary" |
| 57 | 62 | > |
| 58 | 63 | 直连/子设备用例</Button |
| 59 | 64 | > |
| 60 | 65 | <Button |
| 61 | - class="ml-2" | |
| 62 | - v-show="ifAdd && !view" | |
| 63 | - @click="onHandleTestExample(scriptForm.scriptType)" | |
| 64 | - style="position: relative; top: -4rem; right: -6.6rem" | |
| 66 | + class="ml-2 button-text" | |
| 67 | + v-show="isNotTest && !isView" | |
| 68 | + @click="onHandleTestExample(false, scriptForm.scriptType)" | |
| 65 | 69 | type="primary" |
| 66 | 70 | > |
| 67 | 71 | 网关用例</Button |
| 68 | 72 | > |
| 69 | 73 | <a-button @click="handleFormat" size="small">格式化</a-button> |
| 70 | 74 | <Tooltip |
| 71 | - v-if="scriptForm.scriptType !== 'TRANSPORT_TCP_UP'" | |
| 75 | + v-if="scriptForm.scriptType !== ScriptTypeEnum.TRANSPORT_TCP_UP" | |
| 72 | 76 | :title="defaultAuthTitle" |
| 73 | 77 | class="ml-2" |
| 74 | 78 | > |
| 75 | - <QuestionCircleOutlined style="font-size: 1rem" /> | |
| 79 | + <QuestionCircleOutlined /> | |
| 76 | 80 | </Tooltip> |
| 77 | 81 | <Tooltip v-else :title="defaultUpTitle" class="ml-2"> |
| 78 | - <QuestionCircleOutlined style="font-size: 1rem" /> | |
| 82 | + <QuestionCircleOutlined /> | |
| 79 | 83 | </Tooltip> |
| 80 | 84 | </template> |
| 81 | 85 | <div ref="aceRef"></div> |
| ... | ... | @@ -88,12 +92,12 @@ |
| 88 | 92 | </Button> |
| 89 | 93 | </a-form-item> |
| 90 | 94 | <a-form-item |
| 91 | - :label="ifAdd ? '备注' : '输出参数(output)'" | |
| 92 | - :name="ifAdd ? 'description' : 'output'" | |
| 95 | + :label="isNotTest ? '备注' : '输出参数(output)'" | |
| 96 | + :name="isNotTest ? 'description' : 'output'" | |
| 93 | 97 | > |
| 94 | 98 | <a-textarea |
| 95 | 99 | :rows="3" |
| 96 | - v-if="ifAdd" | |
| 100 | + v-if="isNotTest" | |
| 97 | 101 | v-model:value="scriptForm.description" |
| 98 | 102 | placeholder="请输入备注" |
| 99 | 103 | :maxlength="255" |
| ... | ... | @@ -107,7 +111,7 @@ |
| 107 | 111 | /> |
| 108 | 112 | </a-form-item> |
| 109 | 113 | </a-form> |
| 110 | - <TestScriptModal @register="registerModal" /> | |
| 114 | + <ConverScriptModal @register="registerModal" /> | |
| 111 | 115 | </div> |
| 112 | 116 | </template> |
| 113 | 117 | <script setup lang="ts"> |
| ... | ... | @@ -130,18 +134,25 @@ |
| 130 | 134 | defaultTestUpExample, |
| 131 | 135 | defaultTestAuthExample, |
| 132 | 136 | defaultTestSubGatewayUpExample, |
| 133 | - } from './config.data'; | |
| 137 | + ScriptTypeEnum, | |
| 138 | + aceEditorAttribtes, | |
| 139 | + aceEditorOptions, | |
| 140 | + } from '../config'; | |
| 134 | 141 | import { useAppStore } from '/@/store/modules/app'; |
| 135 | - import TestScriptModal from './TestScriptModal.vue'; | |
| 142 | + import { ConverScriptModal } from './index'; | |
| 136 | 143 | import { useModal } from '/@/components/Modal'; |
| 144 | + import { useHooks } from '../hooks/index.hooks'; | |
| 145 | + import { BusinessConvertScriptTextEnum } from '../config'; | |
| 137 | 146 | |
| 138 | 147 | defineEmits(['register']); |
| 148 | + | |
| 139 | 149 | const props = defineProps({ |
| 140 | - ifAdd: { type: Boolean, default: true }, | |
| 141 | - text: { type: String, default: '' }, | |
| 142 | - view: { type: Boolean, default: false }, | |
| 150 | + isNotTest: { type: Boolean, default: true }, | |
| 151 | + isView: { type: Boolean, default: false }, | |
| 143 | 152 | }); |
| 144 | 153 | |
| 154 | + const { validateContentError, validateContentLengthError } = useHooks(); | |
| 155 | + | |
| 145 | 156 | const scriptForm = reactive({ |
| 146 | 157 | name: '', |
| 147 | 158 | description: '', |
| ... | ... | @@ -170,49 +181,42 @@ |
| 170 | 181 | |
| 171 | 182 | const getAceClass = computed((): string => userStore.getDarkMode); |
| 172 | 183 | |
| 173 | - const setDefaultRadio = (p3) => { | |
| 174 | - scriptForm.scriptType = p3; | |
| 184 | + const setDefaultRadio = (defaultRadio) => { | |
| 185 | + scriptForm.scriptType = defaultRadio; | |
| 175 | 186 | }; |
| 176 | 187 | |
| 177 | 188 | const getDictValue = async (dict_type) => { |
| 178 | 189 | const res = await findDictItemByCode({ |
| 179 | 190 | dictCode: dict_type, |
| 180 | 191 | }); |
| 181 | - return res.map((m) => { | |
| 182 | - return { label: m.itemText, value: m.itemValue }; | |
| 183 | - }); | |
| 192 | + return res.map((m) => ({ label: m.itemText, value: m.itemValue })); | |
| 193 | + }; | |
| 194 | + | |
| 195 | + const getScriptType = async () => { | |
| 196 | + reportTypeOptions.scriptTypeOptions = (await getDictValue('script_type')) as any; | |
| 184 | 197 | }; |
| 185 | 198 | |
| 186 | - onMounted(async () => { | |
| 187 | - reportTypeOptions.scriptTypeOptions = (await getDictValue('script_type')) as never as any; | |
| 199 | + onMounted(() => { | |
| 200 | + getScriptType(); | |
| 201 | + initEditor(); | |
| 188 | 202 | }); |
| 189 | 203 | |
| 190 | - // 初始化编辑器 | |
| 204 | + // 初始化Ace编辑器 | |
| 191 | 205 | const initEditor = () => { |
| 192 | - aceEditor.value = ace.edit(aceRef.value, { | |
| 193 | - maxLines: 16, // 最大行数,超过会自动出现滚动条 | |
| 194 | - minLines: 12, // 最小行数,还未到最大行数时,编辑器会自动伸缩大小 | |
| 195 | - fontSize: 14, // 编辑器内字体大小 | |
| 196 | - theme: 'ace/theme/chrome', // 默认设置的主题 | |
| 197 | - mode: 'ace/mode/javascript', // 默认设置的语言模式 | |
| 198 | - tabSize: 2, // 制表符设置为 4 个空格大小 | |
| 199 | - }); | |
| 200 | - | |
| 206 | + aceEditor.value = ace.edit(aceRef.value, aceEditorAttribtes); | |
| 201 | 207 | aceEditor.value.setOptions({ |
| 202 | - enableBasicAutocompletion: true, | |
| 203 | - enableLiveAutocompletion: true, | |
| 204 | - enableSnippets: true, | |
| 205 | - enableEmmet: true, | |
| 208 | + ...aceEditorOptions, | |
| 206 | 209 | theme: getAceClass.value === 'dark' ? 'ace/theme/terminal' : 'ace/theme/chrome', |
| 207 | 210 | }); |
| 208 | 211 | aceEditor.value.setValue(''); |
| 209 | 212 | beautify(aceEditor.value.session); |
| 210 | - switchScriptTypeGetContent('TRANSPORT_TCP_UP'); | |
| 213 | + switchScriptTypeGetContent(ScriptTypeEnum.TRANSPORT_TCP_UP); | |
| 211 | 214 | }; |
| 212 | 215 | |
| 213 | 216 | const handleScriptType = ({ target }) => { |
| 214 | 217 | const { value } = target; |
| 215 | 218 | scriptForm.scriptType = value; |
| 219 | + //业务 编辑不允许切换 | |
| 216 | 220 | if (convertJsContent.value) return; |
| 217 | 221 | switchScriptTypeGetContent(value); |
| 218 | 222 | }; |
| ... | ... | @@ -221,23 +225,17 @@ |
| 221 | 225 | aceEditor.value.setValue(defaultScriptTypeContent[type]); |
| 222 | 226 | }; |
| 223 | 227 | |
| 224 | - const onHandleTestExample = (example) => { | |
| 225 | - if (example === 'TRANSPORT_TCP_UP') { | |
| 226 | - aceEditor.value?.setValue(defaultTestUpExample); | |
| 227 | - } else { | |
| 228 | - aceEditor.value?.setValue(defaultTestAuthExample); | |
| 229 | - } | |
| 230 | - handleFormat(); | |
| 231 | - }; | |
| 232 | - | |
| 233 | - const onHandleTestExampleGateway = (example) => { | |
| 234 | - if (example === 'TRANSPORT_TCP_UP') { | |
| 228 | + const onHandleTestExample = (status, example) => { | |
| 229 | + if (status && example === ScriptTypeEnum.TRANSPORT_TCP_UP) { | |
| 235 | 230 | aceEditor.value?.setValue(defaultTestSubGatewayUpExample); |
| 236 | 231 | } else { |
| 237 | - aceEditor.value?.setValue(defaultTestAuthExample); | |
| 232 | + example === ScriptTypeEnum.TRANSPORT_TCP_UP | |
| 233 | + ? aceEditor.value?.setValue(defaultTestUpExample) | |
| 234 | + : aceEditor.value?.setValue(defaultTestAuthExample); | |
| 238 | 235 | } |
| 239 | 236 | handleFormat(); |
| 240 | 237 | }; |
| 238 | + | |
| 241 | 239 | const handleCopy = () => { |
| 242 | 240 | const valueRef = aceEditor.value.getValue(); |
| 243 | 241 | const value = unref(valueRef); |
| ... | ... | @@ -255,61 +253,41 @@ |
| 255 | 253 | |
| 256 | 254 | const getFormData = async () => { |
| 257 | 255 | const value = await formRef.value.validateFields(); |
| 258 | - if (props.ifAdd) { | |
| 256 | + if (props.isNotTest) { | |
| 259 | 257 | scriptForm.convertJs = aceEditor.value.getValue(); |
| 260 | - if (scriptForm.convertJs == '') { | |
| 261 | - createMessage.error('请编写脚本内容'); | |
| 262 | - throw '请编写脚本内容'; | |
| 263 | - } | |
| 258 | + if (scriptForm.convertJs == '') return validateContentError(); | |
| 264 | 259 | } else { |
| 265 | 260 | scriptForm.script = aceEditor.value.getValue(); |
| 266 | - if (scriptForm.script == '') { | |
| 267 | - createMessage.error('请编写脚本内容'); | |
| 268 | - throw '请编写脚本内容'; | |
| 269 | - } | |
| 261 | + if (scriptForm.script == '') return validateContentError(); | |
| 270 | 262 | } |
| 271 | 263 | if (!value) return; |
| 272 | - if (scriptForm.params) { | |
| 273 | - const trimParams = scriptForm.params.replace(/\s*/g, ''); | |
| 274 | - Reflect.set(value, 'params', trimParams); | |
| 275 | - } | |
| 276 | - if (scriptForm.convertJs.length > 1000) { | |
| 277 | - createMessage.error('脚本内容长度不能大于1000'); | |
| 278 | - throw '脚本内容长度不能大于1000'; | |
| 279 | - } | |
| 264 | + if (scriptForm.params) removeTrim(true, scriptForm.params); | |
| 265 | + if (scriptForm.convertJs.length > 1000) return validateContentLengthError(); | |
| 280 | 266 | return { |
| 281 | 267 | ...value, |
| 282 | - ...{ convertJs: props.ifAdd ? scriptForm.convertJs : null }, | |
| 283 | - ...{ script: !props.ifAdd ? scriptForm.script : null }, | |
| 268 | + ...{ convertJs: props.isNotTest ? scriptForm.convertJs : null }, | |
| 269 | + ...{ script: !props.isNotTest ? scriptForm.script : null }, | |
| 284 | 270 | }; |
| 285 | 271 | }; |
| 286 | 272 | |
| 287 | - const handleInputChange = (e) => { | |
| 288 | - const trimParams = e.target.value.replace(/\s*/g, ''); | |
| 273 | + const removeTrim = (status, e) => { | |
| 274 | + //去除空格 | |
| 275 | + const value = status ? e : e.target.value; | |
| 276 | + const trimParams = value.replace(/\s*/g, ''); | |
| 289 | 277 | Reflect.set(scriptForm, 'params', trimParams); |
| 290 | - if (scriptForm.scriptType === 'TRANSPORT_TCP_DOWN') { | |
| 291 | - aceEditor.value.setValue(`out.datas = "${scriptForm.params}";out.deviceName = "sensor";`); | |
| 292 | - } | |
| 293 | 278 | }; |
| 294 | 279 | |
| 295 | - const getRecordId = ref(''); | |
| 280 | + const handleInputChange = (e) => removeTrim(false, e); | |
| 296 | 281 | |
| 297 | 282 | const convertJsContent = ref(''); |
| 298 | 283 | |
| 299 | 284 | const setFormData = (v) => { |
| 300 | - if (v) { | |
| 301 | - getRecordId.value = v?.id; | |
| 302 | - for (let i in scriptForm) { | |
| 303 | - Reflect.set(scriptForm, i, v[i]); | |
| 304 | - } | |
| 305 | - aceEditor.value.setValue(v.convertJs); | |
| 306 | - convertJsContent.value = v.convertJs; | |
| 307 | - handleFormat(); | |
| 285 | + if (!v) return; | |
| 286 | + for (let i in scriptForm) { | |
| 287 | + Reflect.set(scriptForm, i, v[i]); | |
| 308 | 288 | } |
| 309 | - }; | |
| 310 | - | |
| 311 | - const setScriptContentData = (v) => { | |
| 312 | - aceEditor.value.setValue(v); | |
| 289 | + aceEditor.value.setValue(v.convertJs); | |
| 290 | + convertJsContent.value = v.convertJs; | |
| 313 | 291 | handleFormat(); |
| 314 | 292 | }; |
| 315 | 293 | |
| ... | ... | @@ -317,6 +295,7 @@ |
| 317 | 295 | for (let i in scriptForm) { |
| 318 | 296 | Reflect.set(scriptForm, i, ''); |
| 319 | 297 | } |
| 298 | + setDefaultRadio(ScriptTypeEnum.TRANSPORT_TCP_UP); | |
| 320 | 299 | }; |
| 321 | 300 | |
| 322 | 301 | const setScriptOutputData = (v) => { |
| ... | ... | @@ -332,29 +311,39 @@ |
| 332 | 311 | |
| 333 | 312 | const [registerModal, { openModal }] = useModal(); |
| 334 | 313 | |
| 335 | - const onHandleClick = (o) => { | |
| 314 | + const handleInnerTestClick = (text, innerTest) => { | |
| 336 | 315 | const getTestContent = aceEditor.value?.getValue(); |
| 337 | - openModal(true, { | |
| 338 | - isAuth: '', | |
| 339 | - isUpdate: o, | |
| 340 | - record: o === 'add' ? null : getRecordId.value, | |
| 341 | - testContent: getTestContent, | |
| 342 | - isTest: true, | |
| 343 | - isText: 'test', | |
| 344 | - isTitle: 'test', | |
| 316 | + const modalParams = { | |
| 317 | + innerTest, | |
| 318 | + text, | |
| 319 | + record: { | |
| 320 | + convertJs: getTestContent, | |
| 321 | + scriptType: scriptForm.scriptType, | |
| 322 | + }, | |
| 323 | + }; | |
| 324 | + openModal(true, modalParams); | |
| 325 | + }; | |
| 326 | + | |
| 327 | + const setDisableRadio = (value) => { | |
| 328 | + reportTypeOptions.scriptTypeOptions.forEach((item: any) => { | |
| 329 | + if (item.value === value) item.disabled = false; | |
| 330 | + else item.disabled = true; | |
| 345 | 331 | }); |
| 346 | 332 | }; |
| 347 | 333 | |
| 348 | 334 | defineExpose({ |
| 349 | - initEditor, | |
| 350 | 335 | getFormData, |
| 351 | 336 | resetFormData, |
| 352 | 337 | setFormData, |
| 353 | - setScriptContentData, | |
| 354 | 338 | setScriptOutputData, |
| 355 | 339 | setDefaultRadio, |
| 340 | + setDisableRadio, | |
| 356 | 341 | }); |
| 357 | 342 | </script> |
| 358 | 343 | <style lang="less" scoped> |
| 359 | - @import url('./ConverScriptModal.less'); | |
| 344 | + .button-text { | |
| 345 | + position: relative; | |
| 346 | + top: -4rem; | |
| 347 | + right: -6.6rem; | |
| 348 | + } | |
| 360 | 349 | </style> | ... | ... |
| 1 | +<template> | |
| 2 | + <div> | |
| 3 | + <BasicModal | |
| 4 | + destroyOnClose | |
| 5 | + v-bind="$attrs" | |
| 6 | + width="60rem" | |
| 7 | + @register="register" | |
| 8 | + :minHeight="500" | |
| 9 | + @cancel="handleCancel" | |
| 10 | + @ok="handleSubmit" | |
| 11 | + > | |
| 12 | + <ConverScriptForm | |
| 13 | + ref="converScriptFormRef" | |
| 14 | + :isNotTest="businessText !== BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT" | |
| 15 | + :isView="businessText === BusinessConvertScriptTextEnum.BUSINESS_VIEW_TEXT" | |
| 16 | + /> | |
| 17 | + </BasicModal> | |
| 18 | + </div> | |
| 19 | +</template> | |
| 20 | +<script setup lang="ts"> | |
| 21 | + import { ref, nextTick, reactive } from 'vue'; | |
| 22 | + import { BasicModal, useModalInner } from '/@/components/Modal'; | |
| 23 | + import { ConverScriptForm } from './index'; | |
| 24 | + import { | |
| 25 | + createOrEditScriptManage, | |
| 26 | + getScriptManageDetail, | |
| 27 | + testScriptManage, | |
| 28 | + } from '/@/api/scriptmanage/scriptManager'; | |
| 29 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
| 30 | + import { BusinessConvertScriptTextEnum } from '../config'; | |
| 31 | + import { useHooks } from '../hooks/index.hooks'; | |
| 32 | + import { useThrottleFn } from '@vueuse/shared'; | |
| 33 | + | |
| 34 | + const emits = defineEmits(['success', 'register']); | |
| 35 | + | |
| 36 | + const { createMessage } = useMessage(); | |
| 37 | + | |
| 38 | + const { setPropsForModal, businessTextIsTest } = useHooks(); | |
| 39 | + | |
| 40 | + const converScriptFormRef = ref<InstanceType<typeof ConverScriptForm>>(); | |
| 41 | + | |
| 42 | + const businessText = ref(''); | |
| 43 | + | |
| 44 | + const restData = reactive({ | |
| 45 | + data: {}, | |
| 46 | + }); | |
| 47 | + | |
| 48 | + const [register, { setModalProps, closeModal }] = useModalInner(async (data) => { | |
| 49 | + try { | |
| 50 | + await nextTick(); | |
| 51 | + businessText.value = data.text; | |
| 52 | + restData.data = data.record; | |
| 53 | + setModalProps(setPropsForModal(data.text)); | |
| 54 | + handleCancel(false); | |
| 55 | + if (!data.record) return; | |
| 56 | + if (!data.innerTest) { | |
| 57 | + const rest = await getScriptManageDetail(data.record?.id); | |
| 58 | + converScriptFormRef.value?.setFormData(rest); | |
| 59 | + } else converScriptFormRef.value?.setFormData(data.record); | |
| 60 | + if (data.scriptType) { | |
| 61 | + converScriptFormRef.value?.setDisableRadio(data.scriptType); | |
| 62 | + } | |
| 63 | + } finally { | |
| 64 | + setModalProps({ | |
| 65 | + loading: false, | |
| 66 | + }); | |
| 67 | + } | |
| 68 | + }); | |
| 69 | + | |
| 70 | + const handleSubmit = () => useThrottle(); | |
| 71 | + | |
| 72 | + const useThrottle = useThrottleFn(() => { | |
| 73 | + getValue(); | |
| 74 | + }, 2000); | |
| 75 | + | |
| 76 | + const getValue = async () => { | |
| 77 | + try { | |
| 78 | + setModalProps({ confirmLoading: true }); | |
| 79 | + const formData = await converScriptFormRef.value?.getFormData(); | |
| 80 | + const rest = businessTextIsTest(businessText.value) | |
| 81 | + ? ((await testScriptManage(formData)) as any) | |
| 82 | + : ((await createOrEditScriptManage({ ...restData.data, ...formData })) as any); | |
| 83 | + if (businessTextIsTest(businessText.value)) { | |
| 84 | + createMessage.success(`${businessText.value}成功`); | |
| 85 | + converScriptFormRef.value?.setScriptOutputData(rest?.output || rest?.error); | |
| 86 | + } else { | |
| 87 | + createMessage.success(`${businessText.value}成功`); | |
| 88 | + closeModal(); | |
| 89 | + emits('success', { | |
| 90 | + rest, | |
| 91 | + text: businessText.value, | |
| 92 | + }); | |
| 93 | + } | |
| 94 | + } finally { | |
| 95 | + setModalProps({ confirmLoading: false }); | |
| 96 | + } | |
| 97 | + }; | |
| 98 | + | |
| 99 | + const handleCancel = (flag) => { | |
| 100 | + if (flag) { | |
| 101 | + closeModal(); | |
| 102 | + } | |
| 103 | + converScriptFormRef.value?.resetFormData(); | |
| 104 | + }; | |
| 105 | +</script> | |
| 106 | +<style lang="less" scoped></style> | ... | ... |
src/views/rule/script/TcpConversionScript/config/index.ts
renamed from
src/views/rule/script/TcpConversionScript/config.data.ts
| 1 | -import { BasicColumn, FormSchema } from '/@/components/Table'; | |
| 1 | +import { BasicColumn, BasicTableProps, FormSchema } from '/@/components/Table'; | |
| 2 | 2 | import moment from 'moment'; |
| 3 | 3 | import { h } from 'vue'; |
| 4 | 4 | |
| 5 | +//业务权限配置 | |
| 6 | +export enum PermissionConvertScriptEnum { | |
| 7 | + PERMISSION_POST = 'api:yt:js:post', | |
| 8 | + PERMISSION_DELETE = 'api:yt:js:delete', | |
| 9 | + PERMISSION_TEST = 'api:yt:js:test', | |
| 10 | + PERMISSION_UPDATE = 'api:yt:js:update', | |
| 11 | + PERMISSION_UPDATE_STATUS = 'api:yt:js:update:status', | |
| 12 | +} | |
| 13 | + | |
| 14 | +//业务文字描述配置 | |
| 15 | +export enum BusinessConvertScriptTextEnum { | |
| 16 | + BUSINESS_ENABLE_SUCCESS = '启用成功', | |
| 17 | + BUSINESS_DISABLE_SUCCESS = '禁用成功', | |
| 18 | + BUSINESS_ADD_TEXT = '新增转换脚本', | |
| 19 | + BUSINESS_DELETE_TEXT = '批量删除', | |
| 20 | + BUSINESS_VIEW_TEXT = '查看转换脚本', | |
| 21 | + BUSINESS_TEST_TEXT = '测试转换脚本', | |
| 22 | + BUSINESS_EDIT_TEXT = '编辑转换脚本', | |
| 23 | + BUSINESS_SUBMIT_TEXT = '确定', | |
| 24 | +} | |
| 25 | + | |
| 26 | +//业务脚本类型枚举 | |
| 27 | +export enum ScriptTypeEnum { | |
| 28 | + //上行脚本 | |
| 29 | + TRANSPORT_TCP_UP = 'TRANSPORT_TCP_UP', | |
| 30 | + //设备鉴权 | |
| 31 | + TRANSPORT_TCP_AUTH = 'TRANSPORT_TCP_AUTH', | |
| 32 | +} | |
| 33 | + | |
| 34 | +//Ace编辑器通用配置 | |
| 35 | +export const aceEditorAttribtes = { | |
| 36 | + maxLines: 16, // 最大行数,超过会自动出现滚动条 | |
| 37 | + minLines: 12, // 最小行数,还未到最大行数时,编辑器会自动伸缩大小 | |
| 38 | + fontSize: 14, // 编辑器内字体大小 | |
| 39 | + theme: 'ace/theme/chrome', // 默认设置的主题 | |
| 40 | + mode: 'ace/mode/javascript', // 默认设置的语言模式 | |
| 41 | + tabSize: 2, // 制表符设置为 4 个空格大小 | |
| 42 | +}; | |
| 43 | + | |
| 44 | +export const aceEditorOptions = { | |
| 45 | + enableBasicAutocompletion: true, | |
| 46 | + enableLiveAutocompletion: true, | |
| 47 | + enableSnippets: true, | |
| 48 | + enableEmmet: true, | |
| 49 | +}; | |
| 50 | + | |
| 5 | 51 | // 表格配置 |
| 6 | 52 | export const columns: BasicColumn[] = [ |
| 7 | 53 | { |
| ... | ... | @@ -33,7 +79,26 @@ export const columns: BasicColumn[] = [ |
| 33 | 79 | }, |
| 34 | 80 | ]; |
| 35 | 81 | |
| 36 | -// 查询配置 | |
| 82 | +//表格通用属性配置 | |
| 83 | +export const defaultTableAttribtes: BasicTableProps = { | |
| 84 | + columns, | |
| 85 | + title: '转换脚本列表', | |
| 86 | + showIndexColumn: false, | |
| 87 | + clickToRowSelect: false, | |
| 88 | + useSearchForm: true, | |
| 89 | + showTableSetting: true, | |
| 90 | + bordered: true, | |
| 91 | + rowKey: 'id', | |
| 92 | + actionColumn: { | |
| 93 | + width: 200, | |
| 94 | + title: '操作', | |
| 95 | + dataIndex: 'action', | |
| 96 | + slots: { customRender: 'action' }, | |
| 97 | + fixed: 'right', | |
| 98 | + }, | |
| 99 | +}; | |
| 100 | + | |
| 101 | +// 表格查询配置 | |
| 37 | 102 | export const searchFormSchema: FormSchema[] = [ |
| 38 | 103 | { |
| 39 | 104 | field: 'name', |
| ... | ... | @@ -58,6 +123,7 @@ export const searchFormSchema: FormSchema[] = [ |
| 58 | 123 | }, |
| 59 | 124 | ]; |
| 60 | 125 | |
| 126 | +//示例配置 | |
| 61 | 127 | export const defaultAuthTitle = h('div', { style: 'background:#404040' }, [ |
| 62 | 128 | h('h3', { style: 'color:white' }, '设备鉴权示例'), |
| 63 | 129 | h('h3', { style: 'color:white' }, '输入参数:为16进制字符串'), |
| ... | ... | @@ -84,7 +150,7 @@ export const defaultUpTitle = h('div', { style: 'background:#404040' }, [ |
| 84 | 150 | ), |
| 85 | 151 | ]); |
| 86 | 152 | |
| 87 | -// TRANSPORT_TCP_DOWN: 'out.datas = "";out.deviceName = "sensor";', | |
| 153 | +//用例配置 | |
| 88 | 154 | export const defaultScriptTypeContent = { |
| 89 | 155 | TRANSPORT_TCP_UP: `/*网关上行脚本*/ |
| 90 | 156 | var teleData = {}; |
| ... | ... | @@ -104,21 +170,9 @@ out.success = params; |
| 104 | 170 | `, |
| 105 | 171 | }; |
| 106 | 172 | |
| 107 | -export const defaultTestUpExample = `/*网关上行脚本*/ | |
| 108 | -var teleData = {}; | |
| 109 | -/*物模型数据(可选):原始数据*/ | |
| 110 | -teleData.source= params; | |
| 111 | -/*网关设备:slaveDevice是网关子设备的“设备标识”*/ | |
| 112 | -slaveDevice = params.substr(0,2); | |
| 113 | -teleData[slaveDevice]= params; | |
| 114 | -out.datas = teleData; | |
| 115 | -out.telemetry = true;/*必填:true表示设备上报的遥测数据,false表示命令下发的响应数据*/`; | |
| 173 | +export const defaultTestUpExample = defaultScriptTypeContent['TRANSPORT_TCP_UP']; | |
| 116 | 174 | |
| 117 | -export const defaultTestAuthExample = `/*必填:设备的访问令牌*/ | |
| 118 | -out.password = params; | |
| 119 | -/*选填:设备鉴权成功后响应给设备的信息*/ | |
| 120 | -out.success = params; | |
| 121 | -`; | |
| 175 | +export const defaultTestAuthExample = defaultScriptTypeContent['TRANSPORT_TCP_AUTH']; | |
| 122 | 176 | |
| 123 | 177 | export const defaultTestSubGatewayUpExample = `/*params为TCP上报的标准ModBus数据,实际使用或测试时请删除*/ |
| 124 | 178 | var params = "010304026C00883BF0" | ... | ... |
| 1 | +import { BusinessConvertScriptTextEnum } from '../config'; | |
| 2 | +import { useMessage } from '/@/hooks/web/useMessage'; | |
| 3 | + | |
| 4 | +export const useHooks = () => { | |
| 5 | + const { createMessage } = useMessage(); | |
| 6 | + | |
| 7 | + //映射弹窗底部按钮文字 | |
| 8 | + const getModalButtonText = (text) => { | |
| 9 | + return text === BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT | |
| 10 | + ? BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT.slice(0, 2) | |
| 11 | + : BusinessConvertScriptTextEnum.BUSINESS_SUBMIT_TEXT; | |
| 12 | + }; | |
| 13 | + | |
| 14 | + //判断业务文字是否为测试 | |
| 15 | + const businessTextIsTest = (text) => text === BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT; | |
| 16 | + | |
| 17 | + //验证脚本内容 | |
| 18 | + const validateContentError = () => { | |
| 19 | + createMessage.error('请编写脚本内容'); | |
| 20 | + throw '请编写脚本内容'; | |
| 21 | + }; | |
| 22 | + | |
| 23 | + const validateContentLengthError = () => { | |
| 24 | + createMessage.error('请编写脚本内容'); | |
| 25 | + throw '请编写脚本内容'; | |
| 26 | + }; | |
| 27 | + | |
| 28 | + //Modal弹窗属性 | |
| 29 | + const setPropsForModal = (text) => { | |
| 30 | + return { | |
| 31 | + loading: true, | |
| 32 | + title: text, | |
| 33 | + okText: getModalButtonText(text), | |
| 34 | + showOkBtn: text !== BusinessConvertScriptTextEnum.BUSINESS_VIEW_TEXT, | |
| 35 | + showCancelBtn: text !== BusinessConvertScriptTextEnum.BUSINESS_VIEW_TEXT, | |
| 36 | + }; | |
| 37 | + }; | |
| 38 | + return { | |
| 39 | + getModalButtonText, | |
| 40 | + businessTextIsTest, | |
| 41 | + validateContentError, | |
| 42 | + validateContentLengthError, | |
| 43 | + setPropsForModal, | |
| 44 | + }; | |
| 45 | +}; | ... | ... |
| 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 | +<template> | |
| 2 | + <div> | |
| 3 | + <BasicTable :clickToRowSelect="false" @register="registerTable" :searchInfo="searchInfo"> | |
| 4 | + <template #toolbar> | |
| 5 | + <Authority :value="PermissionConvertScriptEnum.PERMISSION_POST"> | |
| 6 | + <a-button | |
| 7 | + type="primary" | |
| 8 | + @click="handleBusinessModal(BusinessConvertScriptTextEnum.BUSINESS_ADD_TEXT, null)" | |
| 9 | + > | |
| 10 | + {{ BusinessConvertScriptTextEnum.BUSINESS_ADD_TEXT }} | |
| 11 | + </a-button> | |
| 12 | + </Authority> | |
| 13 | + <Authority :value="PermissionConvertScriptEnum.PERMISSION_DELETE"> | |
| 14 | + <Popconfirm | |
| 15 | + title="您确定要批量删除数据" | |
| 16 | + ok-text="确定" | |
| 17 | + cancel-text="取消" | |
| 18 | + @confirm="handleDeleteOrBatchDelete(null)" | |
| 19 | + > | |
| 20 | + <a-button type="primary" color="error" :disabled="hasBatchDelete"> | |
| 21 | + {{ BusinessConvertScriptTextEnum.BUSINESS_DELETE_TEXT }} | |
| 22 | + </a-button> | |
| 23 | + </Popconfirm> | |
| 24 | + </Authority> | |
| 25 | + </template> | |
| 26 | + <template #convertJs="{ record }"> | |
| 27 | + <a-button | |
| 28 | + type="text" | |
| 29 | + @click="handleBusinessModal(BusinessConvertScriptTextEnum.BUSINESS_VIEW_TEXT, record)" | |
| 30 | + > | |
| 31 | + <span style="color: #377dff">{{ | |
| 32 | + BusinessConvertScriptTextEnum.BUSINESS_VIEW_TEXT.slice(0, 2) | |
| 33 | + }}</span> | |
| 34 | + </a-button> | |
| 35 | + </template> | |
| 36 | + <template #action="{ record }"> | |
| 37 | + <TableAction | |
| 38 | + :actions="[ | |
| 39 | + { | |
| 40 | + label: BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT.slice(0, 2), | |
| 41 | + icon: 'ant-design:font-size-outlined', | |
| 42 | + auth: PermissionConvertScriptEnum.PERMISSION_TEST, | |
| 43 | + onClick: handleBusinessModal.bind( | |
| 44 | + null, | |
| 45 | + BusinessConvertScriptTextEnum.BUSINESS_TEST_TEXT, | |
| 46 | + record | |
| 47 | + ), | |
| 48 | + }, | |
| 49 | + { | |
| 50 | + label: BusinessConvertScriptTextEnum.BUSINESS_EDIT_TEXT.slice(0, 2), | |
| 51 | + icon: 'clarity:note-edit-line', | |
| 52 | + auth: PermissionConvertScriptEnum.PERMISSION_UPDATE, | |
| 53 | + onClick: handleBusinessModal.bind( | |
| 54 | + null, | |
| 55 | + BusinessConvertScriptTextEnum.BUSINESS_EDIT_TEXT, | |
| 56 | + record | |
| 57 | + ), | |
| 58 | + ifShow: record.status == 0, | |
| 59 | + }, | |
| 60 | + { | |
| 61 | + label: BusinessConvertScriptTextEnum.BUSINESS_DELETE_TEXT.slice(-2), | |
| 62 | + icon: 'ant-design:delete-outlined', | |
| 63 | + auth: PermissionConvertScriptEnum.PERMISSION_DELETE, | |
| 64 | + color: 'error', | |
| 65 | + ifShow: record.status == 0, | |
| 66 | + popConfirm: { | |
| 67 | + title: '是否确认删除', | |
| 68 | + confirm: handleDeleteOrBatchDelete.bind(null, record), | |
| 69 | + }, | |
| 70 | + }, | |
| 71 | + ]" | |
| 72 | + /> | |
| 73 | + </template> | |
| 74 | + <template #status="{ record }"> | |
| 75 | + <Authority :value="PermissionConvertScriptEnum.PERMISSION_UPDATE_STATUS"> | |
| 76 | + <Switch | |
| 77 | + :checked="record.status === 1" | |
| 78 | + :loading="record.pendingStatus" | |
| 79 | + checkedChildren="启用" | |
| 80 | + unCheckedChildren="禁用" | |
| 81 | + @change="(checked:boolean)=>statusChange(checked,record)" | |
| 82 | + /> | |
| 83 | + </Authority> | |
| 84 | + </template> | |
| 85 | + </BasicTable> | |
| 86 | + <ConverScriptModal @register="registerModal" @success="handleSuccess" /> | |
| 87 | + </div> | |
| 88 | +</template> | |
| 89 | + | |
| 90 | +<script lang="ts" setup name="index"> | |
| 91 | + import { reactive, nextTick, unref } from 'vue'; | |
| 92 | + import { BasicTable, useTable, TableAction } from '/@/components/Table'; | |
| 93 | + import { Authority } from '/@/components/Authority'; | |
| 94 | + import { useModal } from '/@/components/Modal'; | |
| 95 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | |
| 96 | + import { Switch, Popconfirm } from 'ant-design-vue'; | |
| 97 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
| 98 | + import { | |
| 99 | + ScriptPage, | |
| 100 | + deleteScriptManage, | |
| 101 | + scriptPagePutApi, | |
| 102 | + } from '/@/api/scriptmanage/scriptManager'; | |
| 103 | + import { | |
| 104 | + PermissionConvertScriptEnum, | |
| 105 | + searchFormSchema, | |
| 106 | + defaultTableAttribtes, | |
| 107 | + BusinessConvertScriptTextEnum, | |
| 108 | + } from './config'; | |
| 109 | + import { ConverScriptModal } from './components'; | |
| 110 | + | |
| 111 | + const props = defineProps<{ searchInfo: Recordable }>(); | |
| 112 | + | |
| 113 | + const searchInfo = reactive<Recordable>({}); | |
| 114 | + | |
| 115 | + const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({ | |
| 116 | + api: ScriptPage, | |
| 117 | + ...defaultTableAttribtes, | |
| 118 | + beforeFetch: (params: Recordable) => { | |
| 119 | + return { ...unref(props.searchInfo), ...params }; | |
| 120 | + }, | |
| 121 | + formConfig: { | |
| 122 | + labelWidth: 120, | |
| 123 | + schemas: searchFormSchema, | |
| 124 | + fieldMapToTime: [['sendTime', ['startTime', 'endTime'], 'x']], | |
| 125 | + }, | |
| 126 | + }); | |
| 127 | + | |
| 128 | + const handleSuccess = () => { | |
| 129 | + reload(); | |
| 130 | + }; | |
| 131 | + | |
| 132 | + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } = | |
| 133 | + useBatchDelete(deleteScriptManage, handleSuccess, setProps) as any; | |
| 134 | + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { | |
| 135 | + if (record.status === 1) return { disabled: true }; | |
| 136 | + else return { disabled: false }; | |
| 137 | + }; | |
| 138 | + | |
| 139 | + nextTick(() => { | |
| 140 | + setProps(selectionOptions); | |
| 141 | + }); | |
| 142 | + | |
| 143 | + const [registerModal, { openModal }] = useModal(); | |
| 144 | + | |
| 145 | + // 业务弹窗 | |
| 146 | + const handleBusinessModal = (text, record: Recordable | null) => { | |
| 147 | + const modalParams = { | |
| 148 | + text, | |
| 149 | + record, | |
| 150 | + }; | |
| 151 | + openModal(true, modalParams); | |
| 152 | + }; | |
| 153 | + | |
| 154 | + const setPropsLoading = (loading) => { | |
| 155 | + setProps({ | |
| 156 | + loading, | |
| 157 | + }); | |
| 158 | + setSelectedRowKeys([]); | |
| 159 | + resetSelectedRowKeys(); | |
| 160 | + }; | |
| 161 | + | |
| 162 | + const statusChange = async (checked, record) => { | |
| 163 | + setPropsLoading(true); | |
| 164 | + const newStatus = checked ? 1 : 0; | |
| 165 | + const { createMessage } = useMessage(); | |
| 166 | + try { | |
| 167 | + await scriptPagePutApi(record.id, newStatus); | |
| 168 | + if (newStatus) | |
| 169 | + return createMessage.success(BusinessConvertScriptTextEnum.BUSINESS_ENABLE_SUCCESS); | |
| 170 | + else return createMessage.success(BusinessConvertScriptTextEnum.BUSINESS_DISABLE_SUCCESS); | |
| 171 | + } finally { | |
| 172 | + setPropsLoading(false); | |
| 173 | + reload(); | |
| 174 | + } | |
| 175 | + }; | |
| 176 | + | |
| 177 | + defineExpose({ | |
| 178 | + reload: () => { | |
| 179 | + reload(); | |
| 180 | + }, | |
| 181 | + }); | |
| 182 | +</script> | ... | ... |