Commit 6f2e87071b2005f20bbbf9107248c548e807cf38
Merge branch 'ft_local_dev' into 'main'
feat:新增物模型表单数据收集 See merge request huang/yun-teng-iot-front!361
Showing
16 changed files
with
637 additions
and
134 deletions
| @@ -23,31 +23,31 @@ export const physicalColumn: BasicColumn[] = [ | @@ -23,31 +23,31 @@ export const physicalColumn: BasicColumn[] = [ | ||
| 23 | { | 23 | { |
| 24 | title: '功能名称', | 24 | title: '功能名称', |
| 25 | dataIndex: 'name', | 25 | dataIndex: 'name', |
| 26 | - width: 80, | 26 | + width: 90, |
| 27 | }, | 27 | }, |
| 28 | { | 28 | { |
| 29 | title: '标识符', | 29 | title: '标识符', |
| 30 | dataIndex: 'type', | 30 | dataIndex: 'type', |
| 31 | - width: 80, | 31 | + width: 90, |
| 32 | }, | 32 | }, |
| 33 | { | 33 | { |
| 34 | title: '数据类型', | 34 | title: '数据类型', |
| 35 | dataIndex: 'transportType', | 35 | dataIndex: 'transportType', |
| 36 | - width: 80, | 36 | + width: 100, |
| 37 | }, | 37 | }, |
| 38 | { | 38 | { |
| 39 | title: '单位', | 39 | title: '单位', |
| 40 | dataIndex: 'description1', | 40 | dataIndex: 'description1', |
| 41 | - width: 70, | 41 | + width: 90, |
| 42 | }, | 42 | }, |
| 43 | { | 43 | { |
| 44 | title: '读写类型', | 44 | title: '读写类型', |
| 45 | dataIndex: 'default', | 45 | dataIndex: 'default', |
| 46 | - width: 70, | 46 | + width: 60, |
| 47 | customRender: ({ record }) => { | 47 | customRender: ({ record }) => { |
| 48 | const status = record.actionStatus; | 48 | const status = record.actionStatus; |
| 49 | const enable = status === 'SUCCESS' ? '读写' : '只读'; | 49 | const enable = status === 'SUCCESS' ? '读写' : '只读'; |
| 50 | - const color = enable === '读写' ? 'blue' : 'blue'; | 50 | + const color = enable === '读写' ? 'blue' : 'green'; |
| 51 | const text = enable === '读写' ? '读写' : '只读'; | 51 | const text = enable === '读写' ? '读写' : '只读'; |
| 52 | return h(Tag, { color }, () => text); | 52 | return h(Tag, { color }, () => text); |
| 53 | }, | 53 | }, |
| @@ -55,12 +55,12 @@ export const physicalColumn: BasicColumn[] = [ | @@ -55,12 +55,12 @@ export const physicalColumn: BasicColumn[] = [ | ||
| 55 | { | 55 | { |
| 56 | title: '创建人', | 56 | title: '创建人', |
| 57 | dataIndex: 'description', | 57 | dataIndex: 'description', |
| 58 | - width: 90, | 58 | + width: 80, |
| 59 | }, | 59 | }, |
| 60 | { | 60 | { |
| 61 | title: '创建时间', | 61 | title: '创建时间', |
| 62 | dataIndex: 'createTime', | 62 | dataIndex: 'createTime', |
| 63 | - width: 140, | 63 | + width: 150, |
| 64 | }, | 64 | }, |
| 65 | ]; | 65 | ]; |
| 66 | 66 | ||
| @@ -406,3 +406,119 @@ export const formSchema: FormSchema[] = [ | @@ -406,3 +406,119 @@ export const formSchema: FormSchema[] = [ | ||
| 406 | }, | 406 | }, |
| 407 | }, | 407 | }, |
| 408 | ]; | 408 | ]; |
| 409 | + | ||
| 410 | +export const mockData: any = async () => { | ||
| 411 | + const res = await [ | ||
| 412 | + { | ||
| 413 | + name: '亮度百分比', | ||
| 414 | + type: 'Brightness', | ||
| 415 | + transportType: 'int32(整数型)', | ||
| 416 | + description1: '饱和度/aw', | ||
| 417 | + default: '1', | ||
| 418 | + actionStatus: 'SUCCESS', | ||
| 419 | + description: 'cheche', | ||
| 420 | + createTime: '2022-10-20 10:24:22', | ||
| 421 | + }, | ||
| 422 | + { | ||
| 423 | + name: '运行状态', | ||
| 424 | + type: 'RunningState', | ||
| 425 | + transportType: 'bool(布尔型)', | ||
| 426 | + description1: '', | ||
| 427 | + default: '1', | ||
| 428 | + actionStatus: 'FA', | ||
| 429 | + description: 'cheche', | ||
| 430 | + createTime: '2022-10-20 10:24:22', | ||
| 431 | + }, | ||
| 432 | + { | ||
| 433 | + name: '设备运行状态', | ||
| 434 | + type: 'E_Status_UP', | ||
| 435 | + transportType: 'text(字符串)', | ||
| 436 | + description1: '', | ||
| 437 | + default: '1', | ||
| 438 | + actionStatus: 'D', | ||
| 439 | + description: 'cheche', | ||
| 440 | + createTime: '2022-10-20 10:24:22', | ||
| 441 | + }, | ||
| 442 | + { | ||
| 443 | + name: '过流告警使能', | ||
| 444 | + type: 'OverCurrentEnable', | ||
| 445 | + transportType: 'struct(结构体)', | ||
| 446 | + description1: '', | ||
| 447 | + default: '1', | ||
| 448 | + actionStatus: 'SUCCESS', | ||
| 449 | + description: 'cheche', | ||
| 450 | + createTime: '2022-10-20 10:24:22', | ||
| 451 | + }, | ||
| 452 | + { | ||
| 453 | + name: '变频器运行状态1', | ||
| 454 | + type: 'Brightness', | ||
| 455 | + transportType: 'int32(整数型)', | ||
| 456 | + description1: '转每分钟/turn/m', | ||
| 457 | + default: '1', | ||
| 458 | + actionStatus: 'Fa', | ||
| 459 | + description: 'cheche', | ||
| 460 | + createTime: '2022-10-20 10:24:22', | ||
| 461 | + }, | ||
| 462 | + { | ||
| 463 | + name: '产品序列号', | ||
| 464 | + type: 'SerialNo', | ||
| 465 | + transportType: 'text(字符串)', | ||
| 466 | + description1: '', | ||
| 467 | + default: '1', | ||
| 468 | + actionStatus: 'FA', | ||
| 469 | + description: 'cheche', | ||
| 470 | + createTime: '2022-10-20 10:24:22', | ||
| 471 | + }, | ||
| 472 | + { | ||
| 473 | + name: '音量百分比', | ||
| 474 | + type: 'Volume', | ||
| 475 | + transportType: 'int32(整数型)', | ||
| 476 | + description1: '分贝/db', | ||
| 477 | + default: '1', | ||
| 478 | + actionStatus: 'SUCCESS', | ||
| 479 | + description: 'cheche', | ||
| 480 | + createTime: '2022-10-20 10:24:22', | ||
| 481 | + }, | ||
| 482 | + { | ||
| 483 | + name: '易释放氰化物', | ||
| 484 | + type: 'easy_release_cyanide', | ||
| 485 | + transportType: 'double(双精度浮点型)', | ||
| 486 | + description1: '毫克每升/mg/L', | ||
| 487 | + default: '1', | ||
| 488 | + actionStatus: 'SUCCESS', | ||
| 489 | + description: 'cheche', | ||
| 490 | + createTime: '2022-10-20 10:24:22', | ||
| 491 | + }, | ||
| 492 | + { | ||
| 493 | + name: '湿度', | ||
| 494 | + type: 'Humidity', | ||
| 495 | + transportType: 'float(单精度浮点型)', | ||
| 496 | + description1: '相对湿度/%RH', | ||
| 497 | + default: '1', | ||
| 498 | + actionStatus: 'SUCCESS', | ||
| 499 | + description: 'cheche', | ||
| 500 | + createTime: '2022-10-20 10:24:22', | ||
| 501 | + }, | ||
| 502 | + { | ||
| 503 | + name: '设备固件版本', | ||
| 504 | + type: 'FirmwareVersion', | ||
| 505 | + transportType: 'text(字符串)', | ||
| 506 | + description1: '', | ||
| 507 | + default: '1', | ||
| 508 | + actionStatus: 'SUCCESS', | ||
| 509 | + description: 'cheche', | ||
| 510 | + createTime: '2022-10-20 10:24:22', | ||
| 511 | + }, | ||
| 512 | + { | ||
| 513 | + name: '用电量', | ||
| 514 | + type: 'PowerConsumption', | ||
| 515 | + transportType: 'float(单精度浮点型)', | ||
| 516 | + description1: '千瓦时/kW.h', | ||
| 517 | + default: '1', | ||
| 518 | + actionStatus: 'F', | ||
| 519 | + description: 'cheche', | ||
| 520 | + createTime: '2022-10-20 10:24:22', | ||
| 521 | + }, | ||
| 522 | + ]; | ||
| 523 | + return res; | ||
| 524 | +}; |
| @@ -8,20 +8,20 @@ | @@ -8,20 +8,20 @@ | ||
| 8 | <template #toolbar> | 8 | <template #toolbar> |
| 9 | <div class="p-column"> | 9 | <div class="p-column"> |
| 10 | <div class="p-content"> | 10 | <div class="p-content"> |
| 11 | - <a-alert | ||
| 12 | - style="width: 420px" | ||
| 13 | - message="当前展示的是已发布到线上的功能定义,如需修改,请点击" | ||
| 14 | - type="info" | ||
| 15 | - show-icon | ||
| 16 | - /> | ||
| 17 | - <span | ||
| 18 | - @click="handleEditPhysicalModel" | ||
| 19 | - class="ml-2" | ||
| 20 | - style="color: #409eff; cursor: pointer" | ||
| 21 | - type="primary" | ||
| 22 | - size="small" | ||
| 23 | - >“编辑物模型”</span | ||
| 24 | - > | 11 | + <a-alert v-if="!isShowBtn" style="width: 511px" type="info" show-icon> |
| 12 | + <template #message> | ||
| 13 | + <span | ||
| 14 | + >当前展示的是已发布到线上的功能定义,如需修改,请点击 | ||
| 15 | + <span | ||
| 16 | + @click="handleEditPhysicalModel" | ||
| 17 | + class="ml-2" | ||
| 18 | + style="color: #409eff; cursor: pointer" | ||
| 19 | + size="small" | ||
| 20 | + >“编辑物模型”</span | ||
| 21 | + ></span | ||
| 22 | + > | ||
| 23 | + </template> | ||
| 24 | + </a-alert> | ||
| 25 | </div> | 25 | </div> |
| 26 | <div style="height: 20px"></div> | 26 | <div style="height: 20px"></div> |
| 27 | <div class="p-bottom"> | 27 | <div class="p-bottom"> |
| @@ -131,11 +131,12 @@ | @@ -131,11 +131,12 @@ | ||
| 131 | import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | 131 | import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; |
| 132 | import { deleteReportManage } from '/@/api/report/reportManager'; | 132 | import { deleteReportManage } from '/@/api/report/reportManager'; |
| 133 | import { Authority } from '/@/components/Authority'; | 133 | import { Authority } from '/@/components/Authority'; |
| 134 | - import { deviceConfigGetQuery } from '/@/api/device/deviceConfigApi'; | 134 | + // import { mockData } from '/@/api/device/deviceConfigApi'; |
| 135 | import PhysicalModelModal from './cpns/physical/PhysicalModelModal.vue'; | 135 | import PhysicalModelModal from './cpns/physical/PhysicalModelModal.vue'; |
| 136 | import PhysicalModelTsl from './cpns/physical/PhysicalModelTsl.vue'; | 136 | import PhysicalModelTsl from './cpns/physical/PhysicalModelTsl.vue'; |
| 137 | import { Popconfirm } from 'ant-design-vue'; | 137 | import { Popconfirm } from 'ant-design-vue'; |
| 138 | import { useMessage } from '/@/hooks/web/useMessage'; | 138 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 139 | + import { mockData } from '../device.profile.data'; | ||
| 139 | 140 | ||
| 140 | defineEmits(['register']); | 141 | defineEmits(['register']); |
| 141 | const { createMessage } = useMessage(); | 142 | const { createMessage } = useMessage(); |
| @@ -144,7 +145,8 @@ | @@ -144,7 +145,8 @@ | ||
| 144 | const [registerModalTsl, { openModal: openModalTsl }] = useModal(); | 145 | const [registerModalTsl, { openModal: openModalTsl }] = useModal(); |
| 145 | 146 | ||
| 146 | const [registerTable, { reload, setProps }] = useTable({ | 147 | const [registerTable, { reload, setProps }] = useTable({ |
| 147 | - api: deviceConfigGetQuery, | 148 | + // api: deviceConfigGetQuery, |
| 149 | + api: mockData, | ||
| 148 | columns: physicalColumn, | 150 | columns: physicalColumn, |
| 149 | showIndexColumn: false, | 151 | showIndexColumn: false, |
| 150 | clickToRowSelect: false, | 152 | clickToRowSelect: false, |
| @@ -184,6 +186,7 @@ | @@ -184,6 +186,7 @@ | ||
| 184 | isUpdate: true, | 186 | isUpdate: true, |
| 185 | record, | 187 | record, |
| 186 | isView: true, | 188 | isView: true, |
| 189 | + isText: 'view', | ||
| 187 | }); | 190 | }); |
| 188 | } | 191 | } |
| 189 | }; | 192 | }; |
| @@ -194,11 +197,13 @@ | @@ -194,11 +197,13 @@ | ||
| 194 | isUpdate: false, | 197 | isUpdate: false, |
| 195 | record, | 198 | record, |
| 196 | isView: false, | 199 | isView: false, |
| 200 | + isText: 'edit', | ||
| 197 | }); | 201 | }); |
| 198 | } else { | 202 | } else { |
| 199 | openModal(true, { | 203 | openModal(true, { |
| 200 | isUpdate: true, | 204 | isUpdate: true, |
| 201 | isView: false, | 205 | isView: false, |
| 206 | + isText: 'add', | ||
| 202 | }); | 207 | }); |
| 203 | } | 208 | } |
| 204 | }; | 209 | }; |
| @@ -35,12 +35,13 @@ | @@ -35,12 +35,13 @@ | ||
| 35 | </div> | 35 | </div> |
| 36 | </template> | 36 | </template> |
| 37 | <script lang="ts" setup> | 37 | <script lang="ts" setup> |
| 38 | - import { ref, unref } from 'vue'; | 38 | + import { ref, unref, reactive } from 'vue'; |
| 39 | import { BasicModal, useModalInner } from '/@/components/Modal'; | 39 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
| 40 | import { Tabs, TabPane, Typography, TypographyParagraph } from 'ant-design-vue'; | 40 | import { Tabs, TabPane, Typography, TypographyParagraph } from 'ant-design-vue'; |
| 41 | import Attribute from './cpns/Attribute.vue'; | 41 | import Attribute from './cpns/Attribute.vue'; |
| 42 | import Service from './cpns/Service.vue'; | 42 | import Service from './cpns/Service.vue'; |
| 43 | import Events from './cpns/Events.vue'; | 43 | import Events from './cpns/Events.vue'; |
| 44 | + import { mockData } from '../physical/cpns/components/mock'; | ||
| 44 | 45 | ||
| 45 | defineEmits(['register']); | 46 | defineEmits(['register']); |
| 46 | const blockContent = `属性一般是设备的运行状态,如当前温度等;服务是设备可被调用的方法,支持定义参数,如执行某项任务;事件则是设备上报的 | 47 | const blockContent = `属性一般是设备的运行状态,如当前温度等;服务是设备可被调用的方法,支持定义参数,如执行某项任务;事件则是设备上报的 |
| @@ -52,29 +53,50 @@ | @@ -52,29 +53,50 @@ | ||
| 52 | const EventsRef = ref<InstanceType<typeof Events>>(); | 53 | const EventsRef = ref<InstanceType<typeof Events>>(); |
| 53 | const isUpdate = ref(false); | 54 | const isUpdate = ref(false); |
| 54 | const isViewDetail = ref(''); | 55 | const isViewDetail = ref(''); |
| 56 | + const isText = ref(''); | ||
| 57 | + const allData: any = reactive({ | ||
| 58 | + properties: [], | ||
| 59 | + events: [], | ||
| 60 | + services: [], | ||
| 61 | + productKey: '', | ||
| 62 | + _ppk: {}, | ||
| 63 | + }); | ||
| 55 | const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { | 64 | const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { |
| 56 | setModalProps({ loading: true }); | 65 | setModalProps({ loading: true }); |
| 66 | + handleCancel(false); | ||
| 57 | isUpdate.value = data.isUpdate; | 67 | isUpdate.value = data.isUpdate; |
| 58 | isViewDetail.value = data.isView; | 68 | isViewDetail.value = data.isView; |
| 59 | - // AttrRef.value?.setFormData() | ||
| 60 | - setModalProps({ loading: false }); | 69 | + isText.value = data.isText; |
| 61 | if (!unref(isViewDetail)) { | 70 | if (!unref(isViewDetail)) { |
| 62 | const title = !unref(isUpdate) ? '编辑物模型' : '新增物模型'; | 71 | const title = !unref(isUpdate) ? '编辑物模型' : '新增物模型'; |
| 72 | + if (!unref(isUpdate)) { | ||
| 73 | + AttrRef.value?.setFormData(mockData.properties); | ||
| 74 | + } | ||
| 63 | setModalProps({ title, showOkBtn: true, showCancelBtn: true }); | 75 | setModalProps({ title, showOkBtn: true, showCancelBtn: true }); |
| 64 | if (!unref(isUpdate)) { | 76 | if (!unref(isUpdate)) { |
| 65 | } | 77 | } |
| 66 | } else { | 78 | } else { |
| 67 | setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看物模型' }); | 79 | setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看物模型' }); |
| 80 | + AttrRef.value?.setFormData(mockData.properties); | ||
| 68 | } | 81 | } |
| 82 | + setModalProps({ loading: false }); | ||
| 69 | }); | 83 | }); |
| 70 | - const handleCancel = () => { | 84 | + const handleCancel = (flag) => { |
| 71 | AttrRef.value?.resetFormData(); | 85 | AttrRef.value?.resetFormData(); |
| 72 | - closeModal(); | 86 | + activeKey.value = '1'; |
| 87 | + allData.properties = []; | ||
| 88 | + allData.events = []; | ||
| 89 | + allData.services = []; | ||
| 90 | + if (flag) { | ||
| 91 | + closeModal(); | ||
| 92 | + } | ||
| 73 | }; | 93 | }; |
| 74 | const handleSubmit = async () => { | 94 | const handleSubmit = async () => { |
| 75 | const value = await AttrRef.value?.getFormData(); | 95 | const value = await AttrRef.value?.getFormData(); |
| 76 | if (!value) return; | 96 | if (!value) return; |
| 77 | - console.log('搜集值', value); | 97 | + allData.properties.push(value); |
| 98 | + console.log('搜集值', allData); | ||
| 99 | + closeModal(); | ||
| 78 | }; | 100 | }; |
| 79 | </script> | 101 | </script> |
| 80 | 102 |
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <BasicForm @register="register" /> | 3 | + <BasicForm @register="register"> |
| 4 | + <template #valueRangeSlot> | ||
| 5 | + <div style="display: flex"> | ||
| 6 | + <Input | ||
| 7 | + type="number" | ||
| 8 | + v-model:vlaue="minMaxObj.min" | ||
| 9 | + placeholder="最小值" | ||
| 10 | + @blur="onInputBlurMin" | ||
| 11 | + /> | ||
| 12 | + <span>~</span> | ||
| 13 | + <Input | ||
| 14 | + type="number" | ||
| 15 | + v-model:vlaue="minMaxObj.max" | ||
| 16 | + placeholder="最大值" | ||
| 17 | + @blur="onInputBlurMax" | ||
| 18 | + /> | ||
| 19 | + </div> | ||
| 20 | + </template> | ||
| 21 | + <template #outputParamSlot> | ||
| 22 | + <div> | ||
| 23 | + <template v-for="(item, index) in outputParamData" :key="item"> | ||
| 24 | + <span style="display: none">{{ item }}</span> | ||
| 25 | + <InputParamItem | ||
| 26 | + :title="item.name" | ||
| 27 | + :item="item" | ||
| 28 | + class="mt-4" | ||
| 29 | + :index="index" | ||
| 30 | + :ref="dynamicBindRef.outputParamItemRef" | ||
| 31 | + @delete="deleteOutParItem" | ||
| 32 | + @edit="editOutParItem" | ||
| 33 | + /> | ||
| 34 | + </template> | ||
| 35 | + <div style="display: flex" class="mt-2"> | ||
| 36 | + <span style="color: #0170cc; cursor: pointer">+</span> | ||
| 37 | + <span style="color: #0170cc; cursor: pointer" @click="handleAddOutParam">增加参数</span> | ||
| 38 | + </div> | ||
| 39 | + </div> | ||
| 40 | + </template> | ||
| 41 | + </BasicForm> | ||
| 42 | + <AddParamsModal @register="registerModal" @data="getData" /> | ||
| 4 | </div> | 43 | </div> |
| 5 | </template> | 44 | </template> |
| 6 | <script lang="ts" setup> | 45 | <script lang="ts" setup> |
| 46 | + import { ref, unref, reactive } from 'vue'; | ||
| 7 | import { BasicForm, useForm } from '/@/components/Form'; | 47 | import { BasicForm, useForm } from '/@/components/Form'; |
| 8 | import { attrSchemas } from './config'; | 48 | import { attrSchemas } from './config'; |
| 49 | + import { useModal } from '/@/components/Modal'; | ||
| 50 | + import InputParamItem from './components/InputParamItem.vue'; | ||
| 51 | + import AddParamsModal from './components/AddParamsModal.vue'; | ||
| 52 | + import { Input } from 'ant-design-vue'; | ||
| 53 | + import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 54 | + | ||
| 55 | + const { createMessage } = useMessage(); | ||
| 56 | + const outputParamData: any = ref([]); | ||
| 57 | + const minMaxObj = reactive({ | ||
| 58 | + min: '', | ||
| 59 | + max: '', | ||
| 60 | + }); | ||
| 61 | + | ||
| 62 | + const dynamicBindRef = { | ||
| 63 | + outputParamItemRef: ref([]), | ||
| 64 | + }; | ||
| 65 | + const [registerModal, { openModal }] = useModal(); | ||
| 9 | 66 | ||
| 10 | const [register, { validate, setFieldsValue, resetFields }] = useForm({ | 67 | const [register, { validate, setFieldsValue, resetFields }] = useForm({ |
| 11 | labelWidth: 100, | 68 | labelWidth: 100, |
| @@ -17,20 +74,91 @@ | @@ -17,20 +74,91 @@ | ||
| 17 | submitOnReset: false, | 74 | submitOnReset: false, |
| 18 | showActionButtonGroup: false, | 75 | showActionButtonGroup: false, |
| 19 | }); | 76 | }); |
| 77 | + const onInputBlurMin = (e) => (minMaxObj.min = e.target.value); | ||
| 78 | + const onInputBlurMax = (e) => (minMaxObj.max = e.target.value); | ||
| 79 | + | ||
| 80 | + const getData = (d, f) => { | ||
| 81 | + if (f == 'output') { | ||
| 82 | + unref(outputParamData).push(d); | ||
| 83 | + if (d.id !== null) { | ||
| 84 | + const findIndex = unref(outputParamData).findIndex((f) => f.id !== d.id); | ||
| 85 | + if (findIndex !== -1) unref(outputParamData).splice(findIndex, 1); | ||
| 86 | + } | ||
| 87 | + } | ||
| 88 | + }; | ||
| 89 | + | ||
| 90 | + const handleAddOutParam = () => { | ||
| 91 | + openModal(true, { | ||
| 92 | + isUpdate: true, | ||
| 93 | + flag: 'output', | ||
| 94 | + excludeStruct: true, | ||
| 95 | + }); | ||
| 96 | + }; | ||
| 97 | + | ||
| 98 | + const deleteOutParItem = (index) => { | ||
| 99 | + unref(outputParamData).splice(index, 1); | ||
| 100 | + }; | ||
| 101 | + const editOutParItem = (item) => { | ||
| 102 | + openModal(true, { | ||
| 103 | + isUpdate: false, | ||
| 104 | + record: item, | ||
| 105 | + flag: 'output', | ||
| 106 | + excludeStruct: true, | ||
| 107 | + }); | ||
| 108 | + }; | ||
| 20 | 109 | ||
| 21 | //回显数据 | 110 | //回显数据 |
| 22 | const setFormData = (v) => { | 111 | const setFormData = (v) => { |
| 23 | - setFieldsValue(v); | 112 | + setFieldsValue(v[0]); |
| 113 | + const { dataSpecsList } = v[0]; | ||
| 114 | + outputParamData.value = [...new Array(dataSpecsList.length).keys()]; | ||
| 115 | + outputParamData.value = v[0].dataSpecsList; | ||
| 116 | + // dataSpecsList.forEach((item, index) => { | ||
| 117 | + // nextTick(() => { | ||
| 118 | + // unref(dynamicBindRef.outputParamItemRef)[index].setFormData(dataSpecsList) | ||
| 119 | + // }) | ||
| 120 | + // }); | ||
| 24 | }; | 121 | }; |
| 25 | //获取数据 | 122 | //获取数据 |
| 123 | + const getStructList = () => { | ||
| 124 | + const val = unref(dynamicBindRef.outputParamItemRef)?.map((item: any) => item.getFormData()); | ||
| 125 | + return val; | ||
| 126 | + }; | ||
| 127 | + | ||
| 26 | async function getFormData() { | 128 | async function getFormData() { |
| 27 | const values = await validate(); | 129 | const values = await validate(); |
| 28 | if (!values) return; | 130 | if (!values) return; |
| 29 | - return values; | 131 | + const dataSpecsList = getStructList(); |
| 132 | + if (Number(minMaxObj.min) > Number(minMaxObj.max)) { | ||
| 133 | + createMessage.error('最大值必须大于最小值,整数型不能有小数位,单精度有效位为7,双精度为16'); | ||
| 134 | + throw '最大值必须大于最小值,整数型不能有小数位,单精度有效位为7,双精度为16'; | ||
| 135 | + } | ||
| 136 | + if (Number(values.step) > Number(minMaxObj.max) - Number(minMaxObj.min)) { | ||
| 137 | + createMessage.error('步长不能大于取值范围的差值'); | ||
| 138 | + throw '步长不能大于取值范围的差值'; | ||
| 139 | + } | ||
| 140 | + const isStruct = values.dataType === 'STRUCT'; | ||
| 141 | + const dataSpecs = { | ||
| 142 | + ...minMaxObj, | ||
| 143 | + ...{ step: values.step }, | ||
| 144 | + ...{ unit: values.unit }, | ||
| 145 | + ...{ dataType: values.dataType }, | ||
| 146 | + }; | ||
| 147 | + Reflect.deleteProperty(values, 'valueRange'); | ||
| 148 | + Reflect.deleteProperty(values, 'step'); | ||
| 149 | + Reflect.deleteProperty(values, 'unit'); | ||
| 150 | + Reflect.deleteProperty(values, 'outputParam'); | ||
| 151 | + return { | ||
| 152 | + ...values, | ||
| 153 | + ...{ dataSpecs: isStruct ? null : dataSpecs }, | ||
| 154 | + ...{ dataSpecsList: isStruct ? dataSpecsList : null }, | ||
| 155 | + }; | ||
| 30 | } | 156 | } |
| 31 | //清空数据 | 157 | //清空数据 |
| 32 | const resetFormData = () => { | 158 | const resetFormData = () => { |
| 33 | resetFields(); | 159 | resetFields(); |
| 160 | + Reflect.set(minMaxObj, 'min', ''); | ||
| 161 | + Reflect.set(minMaxObj, 'max', ''); | ||
| 34 | }; | 162 | }; |
| 35 | 163 | ||
| 36 | defineExpose({ | 164 | defineExpose({ |
| @@ -92,12 +92,14 @@ | @@ -92,12 +92,14 @@ | ||
| 92 | openModal(true, { | 92 | openModal(true, { |
| 93 | isUpdate: true, | 93 | isUpdate: true, |
| 94 | flag: 'input', | 94 | flag: 'input', |
| 95 | + excludeStruct: false, | ||
| 95 | }); | 96 | }); |
| 96 | }; | 97 | }; |
| 97 | const handleAddOutParam = () => { | 98 | const handleAddOutParam = () => { |
| 98 | openModal(true, { | 99 | openModal(true, { |
| 99 | isUpdate: true, | 100 | isUpdate: true, |
| 100 | flag: 'output', | 101 | flag: 'output', |
| 102 | + excludeStruct: false, | ||
| 101 | }); | 103 | }); |
| 102 | }; | 104 | }; |
| 103 | 105 |
src/views/device/profiles/step/cpns/physical/cpns/components/1.json
deleted
100644 → 0
| 1 | -{ | ||
| 2 | - "_ppk": {}, | ||
| 3 | - "events": [], | ||
| 4 | - "productKey": "hsrnBYoBGFe", | ||
| 5 | - "properties": [], | ||
| 6 | - "services": [ | ||
| 7 | - { | ||
| 8 | - "callType": "ASYNC", | ||
| 9 | - "createTs": 1666172133097, | ||
| 10 | - "custom": true, | ||
| 11 | - "identifier": "1", | ||
| 12 | - "inputParams": [ | ||
| 13 | - { | ||
| 14 | - "custom": true, | ||
| 15 | - "dataSpecs": { | ||
| 16 | - "dataType": "INT", | ||
| 17 | - "max": "2", | ||
| 18 | - "min": "1", | ||
| 19 | - "step": "1", | ||
| 20 | - "unit": "W/㎡", | ||
| 21 | - "unitName": "太阳总辐射" | ||
| 22 | - }, | ||
| 23 | - "dataType": "INT", | ||
| 24 | - "direction": "PARAM_INPUT", | ||
| 25 | - "identifier": "1", | ||
| 26 | - "name": "1", | ||
| 27 | - "paraOrder": 0 | ||
| 28 | - } | ||
| 29 | - ], | ||
| 30 | - "outputParams": [], | ||
| 31 | - "productKey": "hsrnBYoBGFe", | ||
| 32 | - "required": false, | ||
| 33 | - "serviceName": "1" | ||
| 34 | - }, | ||
| 35 | - { | ||
| 36 | - "callType": "ASYNC", | ||
| 37 | - "createTs": 1666172369588, | ||
| 38 | - "custom": true, | ||
| 39 | - "identifier": "wufu1", | ||
| 40 | - "inputParams": [ | ||
| 41 | - { | ||
| 42 | - "custom": true, | ||
| 43 | - "dataSpecs": { | ||
| 44 | - "dataType": "INT", | ||
| 45 | - "max": "200", | ||
| 46 | - "min": "100", | ||
| 47 | - "step": "11", | ||
| 48 | - "unit": "dS/m", | ||
| 49 | - "unitName": "土壤EC值" | ||
| 50 | - }, | ||
| 51 | - "dataType": "INT", | ||
| 52 | - "direction": "PARAM_INPUT", | ||
| 53 | - "identifier": "ceshi", | ||
| 54 | - "name": "ceshi1", | ||
| 55 | - "paraOrder": 0 | ||
| 56 | - } | ||
| 57 | - ], | ||
| 58 | - "outputParams": [], | ||
| 59 | - "productKey": "hsrnBYoBGFe", | ||
| 60 | - "required": false, | ||
| 61 | - "serviceName": "服务1" | ||
| 62 | - } | ||
| 63 | - ] | ||
| 64 | -} |
| @@ -3,9 +3,9 @@ | @@ -3,9 +3,9 @@ | ||
| 3 | <BasicForm @register="registerForm"> | 3 | <BasicForm @register="registerForm"> |
| 4 | <template #valueRangeSlot> | 4 | <template #valueRangeSlot> |
| 5 | <div style="display: flex"> | 5 | <div style="display: flex"> |
| 6 | - <a-input v-model:vlaue="minMaxObj.min" placeholder="最小值" /> | 6 | + <a-input v-model:vlaue="minMaxObj.min" placeholder="最小值" @blur="onInputBlurMin" /> |
| 7 | <span>~</span> | 7 | <span>~</span> |
| 8 | - <a-input v-model:vlaue="minMaxObj.max" placeholder="最大值" /> | 8 | + <a-input v-model:vlaue="minMaxObj.max" placeholder="最大值" @blur="onInputBlurMax" /> |
| 9 | </div> | 9 | </div> |
| 10 | </template> | 10 | </template> |
| 11 | <template #structSlot> | 11 | <template #structSlot> |
| @@ -39,8 +39,11 @@ | @@ -39,8 +39,11 @@ | ||
| 39 | import { useModal } from '/@/components/Modal'; | 39 | import { useModal } from '/@/components/Modal'; |
| 40 | import InputParamItem from './InputParamItem.vue'; | 40 | import InputParamItem from './InputParamItem.vue'; |
| 41 | import AddParamsModal from './AddParamsModal.vue'; | 41 | import AddParamsModal from './AddParamsModal.vue'; |
| 42 | + import { findDictItemByCode } from '/@/api/system/dict'; | ||
| 43 | + import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 42 | 44 | ||
| 43 | defineEmits(['register']); | 45 | defineEmits(['register']); |
| 46 | + const { createMessage } = useMessage(); | ||
| 44 | const outputParamData: any = ref([]); | 47 | const outputParamData: any = ref([]); |
| 45 | const dynamicBindRef = { | 48 | const dynamicBindRef = { |
| 46 | outputParamItemRef: ref([]), | 49 | outputParamItemRef: ref([]), |
| @@ -51,7 +54,7 @@ | @@ -51,7 +54,7 @@ | ||
| 51 | }); | 54 | }); |
| 52 | const [registerModal, { openModal }] = useModal(); | 55 | const [registerModal, { openModal }] = useModal(); |
| 53 | 56 | ||
| 54 | - const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({ | 57 | + const [registerForm, { validate, setFieldsValue, resetFields, updateSchema }] = useForm({ |
| 55 | labelWidth: 100, | 58 | labelWidth: 100, |
| 56 | schemas: addParamsSchemas, | 59 | schemas: addParamsSchemas, |
| 57 | actionColOptions: { | 60 | actionColOptions: { |
| @@ -61,6 +64,8 @@ | @@ -61,6 +64,8 @@ | ||
| 61 | submitOnReset: false, | 64 | submitOnReset: false, |
| 62 | showActionButtonGroup: false, | 65 | showActionButtonGroup: false, |
| 63 | }); | 66 | }); |
| 67 | + const onInputBlurMin = (e) => (minMaxObj.min = e.target.value); | ||
| 68 | + const onInputBlurMax = (e) => (minMaxObj.max = e.target.value); | ||
| 64 | 69 | ||
| 65 | const getData = (d, f) => { | 70 | const getData = (d, f) => { |
| 66 | if (f == 'output') { | 71 | if (f == 'output') { |
| @@ -76,6 +81,7 @@ | @@ -76,6 +81,7 @@ | ||
| 76 | openModal(true, { | 81 | openModal(true, { |
| 77 | isUpdate: true, | 82 | isUpdate: true, |
| 78 | flag: 'output', | 83 | flag: 'output', |
| 84 | + excludeStruct: true, | ||
| 79 | }); | 85 | }); |
| 80 | }; | 86 | }; |
| 81 | 87 | ||
| @@ -90,10 +96,67 @@ | @@ -90,10 +96,67 @@ | ||
| 90 | }); | 96 | }); |
| 91 | }; | 97 | }; |
| 92 | 98 | ||
| 99 | + const updateFormExcludeStruct = async (flag) => { | ||
| 100 | + const res: any = await findDictItemByCode({ dictCode: 'data_type' }); | ||
| 101 | + const optionTrue = res | ||
| 102 | + .map((m) => { | ||
| 103 | + if (flag) { | ||
| 104 | + if (m.itemValue !== 'STRUCT') { | ||
| 105 | + return { | ||
| 106 | + value: m.itemValue, | ||
| 107 | + label: m.itemText, | ||
| 108 | + }; | ||
| 109 | + } | ||
| 110 | + } else { | ||
| 111 | + return { | ||
| 112 | + value: m.itemValue, | ||
| 113 | + label: m.itemText, | ||
| 114 | + }; | ||
| 115 | + } | ||
| 116 | + }) | ||
| 117 | + .filter(Boolean); | ||
| 118 | + updateSchema({ | ||
| 119 | + field: 'dataType', | ||
| 120 | + componentProps: { | ||
| 121 | + options: optionTrue, | ||
| 122 | + }, | ||
| 123 | + }); | ||
| 124 | + }; | ||
| 125 | + | ||
| 93 | const getFormData = async () => { | 126 | const getFormData = async () => { |
| 94 | - const value = await validate(); | ||
| 95 | - if (!value) return; | ||
| 96 | - return value; | 127 | + const values = await validate(); |
| 128 | + if (!values) return; | ||
| 129 | + if (Number(minMaxObj.min) > Number(minMaxObj.max)) { | ||
| 130 | + createMessage.error('最大值必须大于最小值,整数型不能有小数位,单精度有效位为7,双精度为16'); | ||
| 131 | + throw '最大值必须大于最小值,整数型不能有小数位,单精度有效位为7,双精度为16'; | ||
| 132 | + } | ||
| 133 | + if (Number(values.step) > Number(minMaxObj.max) - Number(minMaxObj.min)) { | ||
| 134 | + createMessage.error('步长不能大于取值范围的差值'); | ||
| 135 | + throw '步长不能大于取值范围的差值'; | ||
| 136 | + } | ||
| 137 | + const childSpecsDTO = { | ||
| 138 | + dataType: values.dataType, | ||
| 139 | + max: values.max, | ||
| 140 | + min: values.min, | ||
| 141 | + step: values.step, | ||
| 142 | + unit: values.unit, | ||
| 143 | + }; | ||
| 144 | + const dataSpecs = { | ||
| 145 | + dataType: values.dataType, | ||
| 146 | + max: values.max, | ||
| 147 | + min: values.min, | ||
| 148 | + step: values.step, | ||
| 149 | + unit: values.unit, | ||
| 150 | + }; | ||
| 151 | + return { | ||
| 152 | + ...values, | ||
| 153 | + ...{ dataSpecs }, | ||
| 154 | + ...{ childSpecsDTO }, | ||
| 155 | + ...{ | ||
| 156 | + childDataType: values.dataType, | ||
| 157 | + childName: values.name, | ||
| 158 | + }, | ||
| 159 | + }; | ||
| 97 | }; | 160 | }; |
| 98 | const setFormData = (v) => { | 161 | const setFormData = (v) => { |
| 99 | setFieldsValue(v); | 162 | setFieldsValue(v); |
| @@ -108,6 +171,7 @@ | @@ -108,6 +171,7 @@ | ||
| 108 | setFormData, | 171 | setFormData, |
| 109 | getFormData, | 172 | getFormData, |
| 110 | resetFormData, | 173 | resetFormData, |
| 174 | + updateFormExcludeStruct, | ||
| 111 | }); | 175 | }); |
| 112 | </script> | 176 | </script> |
| 113 | 177 |
| @@ -25,6 +25,7 @@ | @@ -25,6 +25,7 @@ | ||
| 25 | const AddParamFormRef = ref<InstanceType<typeof AddParamForm>>(); | 25 | const AddParamFormRef = ref<InstanceType<typeof AddParamForm>>(); |
| 26 | const isUpdate = ref(false); | 26 | const isUpdate = ref(false); |
| 27 | const isFlag = ref(''); | 27 | const isFlag = ref(''); |
| 28 | + const excludeStruct = ref(false); | ||
| 28 | const getTitle = computed(() => (!isUpdate.value ? '编辑参数' : '新增参数')); | 29 | const getTitle = computed(() => (!isUpdate.value ? '编辑参数' : '新增参数')); |
| 29 | 30 | ||
| 30 | const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { | 31 | const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { |
| @@ -32,9 +33,15 @@ | @@ -32,9 +33,15 @@ | ||
| 32 | handleCancel(false); | 33 | handleCancel(false); |
| 33 | isUpdate.value = data.isUpdate; | 34 | isUpdate.value = data.isUpdate; |
| 34 | isFlag.value = data.flag; | 35 | isFlag.value = data.flag; |
| 36 | + excludeStruct.value = data.excludeStruct; | ||
| 35 | AddParamFormRef.value?.setFormData(data.record); | 37 | AddParamFormRef.value?.setFormData(data.record); |
| 36 | setEditData.getEditData = data.record; | 38 | setEditData.getEditData = data.record; |
| 37 | setModalProps({ loading: false }); | 39 | setModalProps({ loading: false }); |
| 40 | + if (excludeStruct.value) { | ||
| 41 | + AddParamFormRef.value?.updateFormExcludeStruct(true); | ||
| 42 | + } else { | ||
| 43 | + AddParamFormRef.value?.updateFormExcludeStruct(false); | ||
| 44 | + } | ||
| 38 | }); | 45 | }); |
| 39 | 46 | ||
| 40 | const handleCancel = (flag) => { | 47 | const handleCancel = (flag) => { |
| @@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
| 17 | import { buildUUID } from '/@/utils/uuid'; | 17 | import { buildUUID } from '/@/utils/uuid'; |
| 18 | 18 | ||
| 19 | const emit = defineEmits(['delete', 'edit']); | 19 | const emit = defineEmits(['delete', 'edit']); |
| 20 | - defineProps({ | 20 | + const props = defineProps({ |
| 21 | index: { | 21 | index: { |
| 22 | type: Number, | 22 | type: Number, |
| 23 | required: true, | 23 | required: true, |
| @@ -43,6 +43,16 @@ | @@ -43,6 +43,16 @@ | ||
| 43 | }; | 43 | }; |
| 44 | emit('edit', value); | 44 | emit('edit', value); |
| 45 | }; | 45 | }; |
| 46 | + | ||
| 47 | + const getFormData = () => { | ||
| 48 | + return props.item; | ||
| 49 | + }; | ||
| 50 | + // const setFormData = (v) => { | ||
| 51 | + // console.log(v) | ||
| 52 | + // } | ||
| 53 | + defineExpose({ | ||
| 54 | + getFormData, | ||
| 55 | + }); | ||
| 46 | </script> | 56 | </script> |
| 47 | <style lang="less" scoped> | 57 | <style lang="less" scoped> |
| 48 | :deep(.ant-card-body) { | 58 | :deep(.ant-card-body) { |
| 1 | +export const mockData = { | ||
| 2 | + _ppk: {}, | ||
| 3 | + events: [], | ||
| 4 | + productKey: 'hsrnXEfGFDv', | ||
| 5 | + properties: [ | ||
| 6 | + { | ||
| 7 | + createTs: 1666259889029, | ||
| 8 | + custom: true, | ||
| 9 | + customFlag: true, | ||
| 10 | + dataSpecsList: [ | ||
| 11 | + { | ||
| 12 | + childDataType: 'INT', | ||
| 13 | + childName: '测试参数1', | ||
| 14 | + childSpecsDTO: { | ||
| 15 | + dataType: 'INT', | ||
| 16 | + max: '30', | ||
| 17 | + min: '20', | ||
| 18 | + step: '1', | ||
| 19 | + unit: 'mm/hour', | ||
| 20 | + unitName: '降雨量', | ||
| 21 | + }, | ||
| 22 | + custom: true, | ||
| 23 | + dataSpecs: { | ||
| 24 | + dataType: 'INT', | ||
| 25 | + max: '30', | ||
| 26 | + min: '20', | ||
| 27 | + step: '1', | ||
| 28 | + unit: 'mm/hour', | ||
| 29 | + unitName: '降雨量', | ||
| 30 | + }, | ||
| 31 | + dataType: 'STRUCT', | ||
| 32 | + identifier: 'iden2', | ||
| 33 | + isStd: 0, | ||
| 34 | + name: '测试参数1', | ||
| 35 | + }, | ||
| 36 | + { | ||
| 37 | + childDataType: 'INT', | ||
| 38 | + childName: '测试参数2', | ||
| 39 | + childSpecsDTO: { | ||
| 40 | + dataType: 'INT', | ||
| 41 | + max: '40', | ||
| 42 | + min: '30', | ||
| 43 | + step: '2', | ||
| 44 | + unit: 'pH', | ||
| 45 | + unitName: 'PH值', | ||
| 46 | + }, | ||
| 47 | + custom: true, | ||
| 48 | + dataSpecs: { | ||
| 49 | + dataType: 'INT', | ||
| 50 | + max: '40', | ||
| 51 | + min: '30', | ||
| 52 | + step: '2', | ||
| 53 | + unit: 'pH', | ||
| 54 | + unitName: 'PH值', | ||
| 55 | + }, | ||
| 56 | + dataType: 'STRUCT', | ||
| 57 | + identifier: 'idne2', | ||
| 58 | + isStd: 0, | ||
| 59 | + name: '测试参数2', | ||
| 60 | + }, | ||
| 61 | + ], | ||
| 62 | + dataType: 'STRUCT', | ||
| 63 | + description: '21212', | ||
| 64 | + identifier: 'iden1', | ||
| 65 | + name: '测试功能', | ||
| 66 | + productKey: 'hsrnXEfGFDv', | ||
| 67 | + required: false, | ||
| 68 | + rwFlag: 'READ_WRITE', | ||
| 69 | + std: false, | ||
| 70 | + }, | ||
| 71 | + ], | ||
| 72 | + services: [], | ||
| 73 | +}; |
| @@ -26,7 +26,7 @@ export const defaultTslContent = { | @@ -26,7 +26,7 @@ export const defaultTslContent = { | ||
| 26 | 26 | ||
| 27 | export const attrSchemas: FormSchema[] = [ | 27 | export const attrSchemas: FormSchema[] = [ |
| 28 | { | 28 | { |
| 29 | - field: 'configName', | 29 | + field: 'name', |
| 30 | label: '功能名称', | 30 | label: '功能名称', |
| 31 | required: true, | 31 | required: true, |
| 32 | component: 'Input', | 32 | component: 'Input', |
| @@ -39,7 +39,7 @@ export const attrSchemas: FormSchema[] = [ | @@ -39,7 +39,7 @@ export const attrSchemas: FormSchema[] = [ | ||
| 39 | }, | 39 | }, |
| 40 | }, | 40 | }, |
| 41 | { | 41 | { |
| 42 | - field: 'configName1', | 42 | + field: 'identifier', |
| 43 | label: '标识符', | 43 | label: '标识符', |
| 44 | required: true, | 44 | required: true, |
| 45 | component: 'Input', | 45 | component: 'Input', |
| @@ -59,7 +59,7 @@ export const attrSchemas: FormSchema[] = [ | @@ -59,7 +59,7 @@ export const attrSchemas: FormSchema[] = [ | ||
| 59 | colProps: { | 59 | colProps: { |
| 60 | span: 9, | 60 | span: 9, |
| 61 | }, | 61 | }, |
| 62 | - defaultValue: 'int32', | 62 | + defaultValue: 'INT', |
| 63 | componentProps: { | 63 | componentProps: { |
| 64 | placeholder: '请选择数据类型', | 64 | placeholder: '请选择数据类型', |
| 65 | api: findDictItemByCode, | 65 | api: findDictItemByCode, |
| @@ -71,7 +71,30 @@ export const attrSchemas: FormSchema[] = [ | @@ -71,7 +71,30 @@ export const attrSchemas: FormSchema[] = [ | ||
| 71 | }, | 71 | }, |
| 72 | }, | 72 | }, |
| 73 | { | 73 | { |
| 74 | - field: 'accessKeyId', | 74 | + field: 'valueRange', |
| 75 | + label: '取值范围', | ||
| 76 | + component: 'Input', | ||
| 77 | + slot: 'valueRangeSlot', | ||
| 78 | + colProps: { | ||
| 79 | + span: 18, | ||
| 80 | + }, | ||
| 81 | + ifShow: ({ values }) => isNumber(values.dataType), | ||
| 82 | + }, | ||
| 83 | + { | ||
| 84 | + field: 'step', | ||
| 85 | + label: '步长', | ||
| 86 | + component: 'Input', | ||
| 87 | + colProps: { | ||
| 88 | + span: 18, | ||
| 89 | + }, | ||
| 90 | + componentProps: { | ||
| 91 | + maxLength: 255, | ||
| 92 | + placeholder: '请输入步长', | ||
| 93 | + }, | ||
| 94 | + ifShow: ({ values }) => isNumber(values.dataType), | ||
| 95 | + }, | ||
| 96 | + { | ||
| 97 | + field: 'unit', | ||
| 75 | label: '单位', | 98 | label: '单位', |
| 76 | component: 'ApiSelect', | 99 | component: 'ApiSelect', |
| 77 | colProps: { | 100 | colProps: { |
| @@ -89,7 +112,7 @@ export const attrSchemas: FormSchema[] = [ | @@ -89,7 +112,7 @@ export const attrSchemas: FormSchema[] = [ | ||
| 89 | ifShow: ({ values }) => isNumber(values.dataType), | 112 | ifShow: ({ values }) => isNumber(values.dataType), |
| 90 | }, | 113 | }, |
| 91 | { | 114 | { |
| 92 | - field: 'field1', | 115 | + field: 'boolClose', |
| 93 | component: 'Input', | 116 | component: 'Input', |
| 94 | required: true, | 117 | required: true, |
| 95 | label: '0 -', | 118 | label: '0 -', |
| @@ -102,7 +125,7 @@ export const attrSchemas: FormSchema[] = [ | @@ -102,7 +125,7 @@ export const attrSchemas: FormSchema[] = [ | ||
| 102 | ifShow: ({ values }) => isBool(values.dataType), | 125 | ifShow: ({ values }) => isBool(values.dataType), |
| 103 | }, | 126 | }, |
| 104 | { | 127 | { |
| 105 | - field: 'field11', | 128 | + field: 'boolOpen', |
| 106 | component: 'Input', | 129 | component: 'Input', |
| 107 | required: true, | 130 | required: true, |
| 108 | label: '1 -', | 131 | label: '1 -', |
| @@ -115,7 +138,7 @@ export const attrSchemas: FormSchema[] = [ | @@ -115,7 +138,7 @@ export const attrSchemas: FormSchema[] = [ | ||
| 115 | ifShow: ({ values }) => isBool(values.dataType), | 138 | ifShow: ({ values }) => isBool(values.dataType), |
| 116 | }, | 139 | }, |
| 117 | { | 140 | { |
| 118 | - field: 'field2', | 141 | + field: 'length', |
| 119 | component: 'Input', | 142 | component: 'Input', |
| 120 | required: true, | 143 | required: true, |
| 121 | label: '数据长度', | 144 | label: '数据长度', |
| @@ -127,7 +150,7 @@ export const attrSchemas: FormSchema[] = [ | @@ -127,7 +150,7 @@ export const attrSchemas: FormSchema[] = [ | ||
| 127 | ifShow: ({ values }) => isString(values.dataType), | 150 | ifShow: ({ values }) => isString(values.dataType), |
| 128 | }, | 151 | }, |
| 129 | { | 152 | { |
| 130 | - field: 'brand', | 153 | + field: 'rwFlag', |
| 131 | component: 'ApiRadioGroup', | 154 | component: 'ApiRadioGroup', |
| 132 | label: '读写类型', | 155 | label: '读写类型', |
| 133 | required: true, | 156 | required: true, |
| @@ -146,12 +169,21 @@ export const attrSchemas: FormSchema[] = [ | @@ -146,12 +169,21 @@ export const attrSchemas: FormSchema[] = [ | ||
| 146 | }, | 169 | }, |
| 147 | }, | 170 | }, |
| 148 | { | 171 | { |
| 172 | + field: 'outputParam', | ||
| 173 | + label: 'JSON 对象', | ||
| 174 | + component: 'Input', | ||
| 175 | + // required: true, | ||
| 176 | + slot: 'outputParamSlot', | ||
| 177 | + colProps: { span: 24 }, | ||
| 178 | + ifShow: ({ values }) => isStruct(values.dataType), | ||
| 179 | + }, | ||
| 180 | + { | ||
| 149 | label: '描述', | 181 | label: '描述', |
| 150 | field: 'description', | 182 | field: 'description', |
| 151 | component: 'InputTextArea', | 183 | component: 'InputTextArea', |
| 152 | componentProps: { | 184 | componentProps: { |
| 153 | rows: 6, | 185 | rows: 6, |
| 154 | - maxLength: 255, | 186 | + maxLength: 100, |
| 155 | placeholder: '请输入描述', | 187 | placeholder: '请输入描述', |
| 156 | }, | 188 | }, |
| 157 | }, | 189 | }, |
| @@ -223,7 +255,7 @@ export const serviceSchemas: FormSchema[] = [ | @@ -223,7 +255,7 @@ export const serviceSchemas: FormSchema[] = [ | ||
| 223 | component: 'InputTextArea', | 255 | component: 'InputTextArea', |
| 224 | componentProps: { | 256 | componentProps: { |
| 225 | rows: 6, | 257 | rows: 6, |
| 226 | - maxLength: 255, | 258 | + maxLength: 100, |
| 227 | placeholder: '请输入描述', | 259 | placeholder: '请输入描述', |
| 228 | }, | 260 | }, |
| 229 | }, | 261 | }, |
| @@ -288,7 +320,7 @@ export const eventSchemas: FormSchema[] = [ | @@ -288,7 +320,7 @@ export const eventSchemas: FormSchema[] = [ | ||
| 288 | component: 'InputTextArea', | 320 | component: 'InputTextArea', |
| 289 | componentProps: { | 321 | componentProps: { |
| 290 | rows: 6, | 322 | rows: 6, |
| 291 | - maxLength: 255, | 323 | + maxLength: 100, |
| 292 | placeholder: '请输入描述', | 324 | placeholder: '请输入描述', |
| 293 | }, | 325 | }, |
| 294 | }, | 326 | }, |
| @@ -298,11 +330,11 @@ export const eventSchemas: FormSchema[] = [ | @@ -298,11 +330,11 @@ export const eventSchemas: FormSchema[] = [ | ||
| 298 | * 新增参数 动态显示表单 | 330 | * 新增参数 动态显示表单 |
| 299 | */ | 331 | */ |
| 300 | enum DateTypeEnum { | 332 | enum DateTypeEnum { |
| 301 | - IS_NUMBER_INT = 'int32', | ||
| 302 | - IS_NUMBER_DOUBLE = 'double', | ||
| 303 | - IS_STRING = 'text', | ||
| 304 | - IS_STRUCT = 'struct', | ||
| 305 | - IS_BOOL = 'bool', | 333 | + IS_NUMBER_INT = 'INT', |
| 334 | + IS_NUMBER_DOUBLE = 'DOUBLE', | ||
| 335 | + IS_STRING = 'TEXT', | ||
| 336 | + IS_STRUCT = 'STRUCT', | ||
| 337 | + IS_BOOL = 'BOOL', | ||
| 306 | } | 338 | } |
| 307 | const isNumber = (type: string) => { | 339 | const isNumber = (type: string) => { |
| 308 | return type === DateTypeEnum.IS_NUMBER_INT || type === DateTypeEnum.IS_NUMBER_DOUBLE; | 340 | return type === DateTypeEnum.IS_NUMBER_INT || type === DateTypeEnum.IS_NUMBER_DOUBLE; |
| @@ -354,7 +386,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -354,7 +386,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 354 | colProps: { | 386 | colProps: { |
| 355 | span: 23, | 387 | span: 23, |
| 356 | }, | 388 | }, |
| 357 | - defaultValue: 'int32', | 389 | + defaultValue: 'INT', |
| 358 | componentProps: { | 390 | componentProps: { |
| 359 | placeholder: '请选择数据类型', | 391 | placeholder: '请选择数据类型', |
| 360 | api: findDictItemByCode, | 392 | api: findDictItemByCode, |
| @@ -366,7 +398,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -366,7 +398,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 366 | }, | 398 | }, |
| 367 | }, | 399 | }, |
| 368 | { | 400 | { |
| 369 | - field: 'configNam2112111', | 401 | + field: 'structSlot', |
| 370 | label: 'JSON 对象', | 402 | label: 'JSON 对象', |
| 371 | required: true, | 403 | required: true, |
| 372 | component: 'Input', | 404 | component: 'Input', |
| @@ -377,7 +409,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -377,7 +409,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 377 | ifShow: ({ values }) => isStruct(values.dataType), | 409 | ifShow: ({ values }) => isStruct(values.dataType), |
| 378 | }, | 410 | }, |
| 379 | { | 411 | { |
| 380 | - field: 'field1', | 412 | + field: 'boolClose', |
| 381 | component: 'Input', | 413 | component: 'Input', |
| 382 | required: true, | 414 | required: true, |
| 383 | label: '0 -', | 415 | label: '0 -', |
| @@ -390,7 +422,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -390,7 +422,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 390 | ifShow: ({ values }) => isBool(values.dataType), | 422 | ifShow: ({ values }) => isBool(values.dataType), |
| 391 | }, | 423 | }, |
| 392 | { | 424 | { |
| 393 | - field: 'field11', | 425 | + field: 'boolOpen', |
| 394 | component: 'Input', | 426 | component: 'Input', |
| 395 | required: true, | 427 | required: true, |
| 396 | label: '1 -', | 428 | label: '1 -', |
| @@ -403,7 +435,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -403,7 +435,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 403 | ifShow: ({ values }) => isBool(values.dataType), | 435 | ifShow: ({ values }) => isBool(values.dataType), |
| 404 | }, | 436 | }, |
| 405 | { | 437 | { |
| 406 | - field: 'field2', | 438 | + field: 'length', |
| 407 | component: 'Input', | 439 | component: 'Input', |
| 408 | required: true, | 440 | required: true, |
| 409 | label: '数据长度', | 441 | label: '数据长度', |
| @@ -415,7 +447,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -415,7 +447,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 415 | ifShow: ({ values }) => isString(values.dataType), | 447 | ifShow: ({ values }) => isString(values.dataType), |
| 416 | }, | 448 | }, |
| 417 | { | 449 | { |
| 418 | - field: 'configNam2112', | 450 | + field: 'valueRange', |
| 419 | label: '取值范围', | 451 | label: '取值范围', |
| 420 | component: 'Input', | 452 | component: 'Input', |
| 421 | slot: 'valueRangeSlot', | 453 | slot: 'valueRangeSlot', |
| @@ -425,7 +457,7 @@ export const addParamsSchemas: FormSchema[] = [ | @@ -425,7 +457,7 @@ export const addParamsSchemas: FormSchema[] = [ | ||
| 425 | ifShow: ({ values }) => isNumber(values.dataType), | 457 | ifShow: ({ values }) => isNumber(values.dataType), |
| 426 | }, | 458 | }, |
| 427 | { | 459 | { |
| 428 | - field: 'configNam22', | 460 | + field: 'step', |
| 429 | label: '步长', | 461 | label: '步长', |
| 430 | component: 'Input', | 462 | component: 'Input', |
| 431 | colProps: { | 463 | colProps: { |
| @@ -103,7 +103,9 @@ | @@ -103,7 +103,9 @@ | ||
| 103 | var str = ""; | 103 | var str = ""; |
| 104 | for(var i = 6;i<20;i+=2){ | 104 | for(var i = 6;i<20;i+=2){ |
| 105 | str += String.fromCharCode(parseInt(trimSource[i]+trimSource[i+1],16)); | 105 | str += String.fromCharCode(parseInt(trimSource[i]+trimSource[i+1],16)); |
| 106 | - }` | 106 | + } |
| 107 | + } | ||
| 108 | + ` | ||
| 107 | ); | 109 | ); |
| 108 | beautify(aceEditor.value.session); | 110 | beautify(aceEditor.value.session); |
| 109 | scriptForm.scriptContent = aceEditor.value.getValue(); | 111 | scriptForm.scriptContent = aceEditor.value.getValue(); |
| @@ -10,7 +10,7 @@ | @@ -10,7 +10,7 @@ | ||
| 10 | @cancel="handleCancel" | 10 | @cancel="handleCancel" |
| 11 | @ok="handleSubmit" | 11 | @ok="handleSubmit" |
| 12 | > | 12 | > |
| 13 | - <ConverScript :ifAdd="true" ref="converScriptRef" /> | 13 | + <ConverScript :ifAdd="isTest ? false : true" ref="converScriptRef" /> |
| 14 | </BasicModal> | 14 | </BasicModal> |
| 15 | </div> | 15 | </div> |
| 16 | </template> | 16 | </template> |
| @@ -23,16 +23,28 @@ | @@ -23,16 +23,28 @@ | ||
| 23 | const getTitle = computed(() => (isUpdate.value ? '编辑转换脚本' : '新增转换脚本')); | 23 | const getTitle = computed(() => (isUpdate.value ? '编辑转换脚本' : '新增转换脚本')); |
| 24 | const isUpdate = ref(false); | 24 | const isUpdate = ref(false); |
| 25 | const isViewDetail = ref(''); | 25 | const isViewDetail = ref(''); |
| 26 | + const isTest = ref(false); | ||
| 27 | + const isText = ref(''); | ||
| 28 | + const isTitle = ref(''); | ||
| 26 | const [register, { setModalProps, closeModal }] = useModalInner(async (data) => { | 29 | const [register, { setModalProps, closeModal }] = useModalInner(async (data) => { |
| 27 | setModalProps({ loading: true }); | 30 | setModalProps({ loading: true }); |
| 28 | handleCancel(false); | 31 | handleCancel(false); |
| 29 | isUpdate.value = data.isUpdate; | 32 | isUpdate.value = data.isUpdate; |
| 30 | isViewDetail.value = data.isView; | 33 | isViewDetail.value = data.isView; |
| 34 | + isTest.value = data.isTest; | ||
| 35 | + isText.value = data.isText; | ||
| 36 | + isTitle.value = data.isTitle; | ||
| 31 | converScriptRef.value?.initEditor(data.record?.configuration?.jsScript); | 37 | converScriptRef.value?.initEditor(data.record?.configuration?.jsScript); |
| 32 | setModalProps({ loading: false }); | 38 | setModalProps({ loading: false }); |
| 33 | if (!unref(isViewDetail)) { | 39 | if (!unref(isViewDetail)) { |
| 34 | - const title = !unref(isUpdate) ? '编辑转换脚本' : '新增转换脚本'; | ||
| 35 | - setModalProps({ title, showOkBtn: true, showCancelBtn: true }); | 40 | + const title = |
| 41 | + unref(isTitle) == 'edit' | ||
| 42 | + ? '编辑转换脚本' | ||
| 43 | + : unref(isTitle) == 'add' | ||
| 44 | + ? '新增转换脚本' | ||
| 45 | + : '测试转换脚本'; | ||
| 46 | + const okText = isText.value == 'test' ? '测试' : '确定'; | ||
| 47 | + setModalProps({ title, showOkBtn: true, showCancelBtn: true, okText }); | ||
| 36 | if (!unref(isUpdate)) { | 48 | if (!unref(isUpdate)) { |
| 37 | } | 49 | } |
| 38 | } else { | 50 | } else { |
| @@ -91,3 +91,72 @@ export const formSchema: FormSchema[] = [ | @@ -91,3 +91,72 @@ export const formSchema: FormSchema[] = [ | ||
| 91 | colProps: { span: 24 }, | 91 | colProps: { span: 24 }, |
| 92 | }, | 92 | }, |
| 93 | ]; | 93 | ]; |
| 94 | + | ||
| 95 | +export const mockData: any = async () => { | ||
| 96 | + const res = await [ | ||
| 97 | + { | ||
| 98 | + reportConfigName: '风机转换', | ||
| 99 | + organizationName: 1, | ||
| 100 | + dataType: 'function', | ||
| 101 | + executeWay: '风机转换脚本使用js', | ||
| 102 | + executeTime: '2022-10-20 10:24:22', | ||
| 103 | + }, | ||
| 104 | + { | ||
| 105 | + reportConfigName: '水电转换', | ||
| 106 | + organizationName: 1, | ||
| 107 | + dataType: 'function', | ||
| 108 | + executeWay: '水电转换脚本使用js', | ||
| 109 | + executeTime: '2022-10-20 10:24:22', | ||
| 110 | + }, | ||
| 111 | + { | ||
| 112 | + reportConfigName: '摄像头转换', | ||
| 113 | + organizationName: 1, | ||
| 114 | + dataType: 'function', | ||
| 115 | + executeWay: '摄像头转换脚本使用js', | ||
| 116 | + executeTime: '2022-10-20 10:24:22', | ||
| 117 | + }, | ||
| 118 | + { | ||
| 119 | + reportConfigName: '变压器转换', | ||
| 120 | + organizationName: 1, | ||
| 121 | + dataType: 'function', | ||
| 122 | + executeWay: '变压器转换脚本使用js', | ||
| 123 | + executeTime: '2022-10-20 10:24:22', | ||
| 124 | + }, | ||
| 125 | + { | ||
| 126 | + reportConfigName: '设备状态转换', | ||
| 127 | + organizationName: 1, | ||
| 128 | + dataType: 'function', | ||
| 129 | + executeWay: '设备状态转换脚本使用js', | ||
| 130 | + executeTime: '2022-10-20 10:24:22', | ||
| 131 | + }, | ||
| 132 | + { | ||
| 133 | + reportConfigName: '电流转换', | ||
| 134 | + organizationName: 1, | ||
| 135 | + dataType: 'function', | ||
| 136 | + executeWay: '电流转换脚本使用js', | ||
| 137 | + executeTime: '2022-10-20 10:24:22', | ||
| 138 | + }, | ||
| 139 | + { | ||
| 140 | + reportConfigName: '电压转换', | ||
| 141 | + organizationName: 1, | ||
| 142 | + dataType: 'function', | ||
| 143 | + executeWay: '电压转换脚本使用js', | ||
| 144 | + executeTime: '2022-10-20 10:24:22', | ||
| 145 | + }, | ||
| 146 | + { | ||
| 147 | + reportConfigName: '传感器转换', | ||
| 148 | + organizationName: 1, | ||
| 149 | + dataType: 'function', | ||
| 150 | + executeWay: '传感器转换脚本使用js', | ||
| 151 | + executeTime: '2022-10-20 10:24:22', | ||
| 152 | + }, | ||
| 153 | + { | ||
| 154 | + reportConfigName: '物模型转换', | ||
| 155 | + organizationName: 1, | ||
| 156 | + dataType: 'function', | ||
| 157 | + executeWay: '物模型转换脚本使用js', | ||
| 158 | + executeTime: '2022-10-20 10:24:22', | ||
| 159 | + }, | ||
| 160 | + ]; | ||
| 161 | + return res; | ||
| 162 | +}; |
| @@ -25,6 +25,12 @@ | @@ -25,6 +25,12 @@ | ||
| 25 | <TableAction | 25 | <TableAction |
| 26 | :actions="[ | 26 | :actions="[ |
| 27 | { | 27 | { |
| 28 | + label: '测试', | ||
| 29 | + icon: 'clarity:note-edit-line', | ||
| 30 | + auth: '', | ||
| 31 | + onClick: handleBindTest.bind(null, record), | ||
| 32 | + }, | ||
| 33 | + { | ||
| 28 | label: '编辑', | 34 | label: '编辑', |
| 29 | icon: 'clarity:note-edit-line', | 35 | icon: 'clarity:note-edit-line', |
| 30 | auth: '', | 36 | auth: '', |
| @@ -51,18 +57,19 @@ | @@ -51,18 +57,19 @@ | ||
| 51 | <script lang="ts" setup> | 57 | <script lang="ts" setup> |
| 52 | import { reactive, nextTick } from 'vue'; | 58 | import { reactive, nextTick } from 'vue'; |
| 53 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 59 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
| 54 | - import { searchFormSchema, columns } from './config.data'; | 60 | + import { searchFormSchema, columns, mockData } from './config.data'; |
| 55 | import { Authority } from '/@/components/Authority'; | 61 | import { Authority } from '/@/components/Authority'; |
| 56 | import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | 62 | import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; |
| 57 | import { Popconfirm } from 'ant-design-vue'; | 63 | import { Popconfirm } from 'ant-design-vue'; |
| 58 | import { useModal } from '/@/components/Modal'; | 64 | import { useModal } from '/@/components/Modal'; |
| 59 | import ConverScriptModal from './ConverScriptModal.vue'; | 65 | import ConverScriptModal from './ConverScriptModal.vue'; |
| 60 | - import { exportPage, deleteExportManage } from '/@/api/export/exportManager'; | 66 | + import { deleteExportManage } from '/@/api/export/exportManager'; |
| 61 | 67 | ||
| 62 | const searchInfo = reactive<Recordable>({}); | 68 | const searchInfo = reactive<Recordable>({}); |
| 63 | const [registerTable, { reload, setProps }] = useTable({ | 69 | const [registerTable, { reload, setProps }] = useTable({ |
| 64 | title: '转换脚本列表', | 70 | title: '转换脚本列表', |
| 65 | - api: exportPage, | 71 | + // api: exportPage, |
| 72 | + api: mockData, | ||
| 66 | columns, | 73 | columns, |
| 67 | showIndexColumn: false, | 74 | showIndexColumn: false, |
| 68 | clickToRowSelect: false, | 75 | clickToRowSelect: false, |
| @@ -107,11 +114,28 @@ | @@ -107,11 +114,28 @@ | ||
| 107 | isUpdate: false, | 114 | isUpdate: false, |
| 108 | record, | 115 | record, |
| 109 | isView: false, | 116 | isView: false, |
| 117 | + isTest: false, | ||
| 118 | + isText: 'confirm', | ||
| 119 | + isTitle: 'edit', | ||
| 110 | }); | 120 | }); |
| 111 | } else { | 121 | } else { |
| 112 | openModal(true, { | 122 | openModal(true, { |
| 113 | isUpdate: true, | 123 | isUpdate: true, |
| 114 | isView: false, | 124 | isView: false, |
| 125 | + isTest: false, | ||
| 126 | + isText: 'confirm', | ||
| 127 | + isTitle: 'add', | ||
| 128 | + }); | ||
| 129 | + } | ||
| 130 | + }; | ||
| 131 | + const handleBindTest = (record: Recordable | null) => { | ||
| 132 | + if (record) { | ||
| 133 | + openModal(true, { | ||
| 134 | + isUpdate: false, | ||
| 135 | + record, | ||
| 136 | + isTest: true, | ||
| 137 | + isText: 'test', | ||
| 138 | + isTitle: 'test', | ||
| 115 | }); | 139 | }); |
| 116 | } | 140 | } |
| 117 | }; | 141 | }; |