Commit 6f2e87071b2005f20bbbf9107248c548e807cf38

Authored by xp.Huang
2 parents 23345cac 607e8c72

Merge branch 'ft_local_dev' into 'main'

feat:新增物模型表单数据收集

See merge request huang/yun-teng-iot-front!361
@@ -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({
@@ -61,6 +61,7 @@ @@ -61,6 +61,7 @@
61 openModal(true, { 61 openModal(true, {
62 isUpdate: true, 62 isUpdate: true,
63 flag: 'output', 63 flag: 'output',
  64 + excludeStruct: false,
64 }); 65 });
65 }; 66 };
66 const deleteOutParItem = (index) => { 67 const deleteOutParItem = (index) => {
@@ -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
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 };