Commit e4fc9fcff4c4b078734e88700c738c937ea76146

Authored by xp.Huang
2 parents cb4c0ff3 f5cb7ffc

Merge branch 'ft_local_dev' into 'main'

feat:mock模拟阿里云后端数据,物模型新增编辑回显数据大致完成,待完善细节问题和联调服务端

See merge request huang/yun-teng-iot-front!366
@@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
33 33
34 import { useUserStore } from '/@/store/modules/user'; 34 import { useUserStore } from '/@/store/modules/user';
35 import { useLockStore } from '/@/store/modules/lock'; 35 import { useLockStore } from '/@/store/modules/lock';
36 - import headerImg from '/@/assets/images/header.jpg'; 36 + import headerImg from '/@/assets/images/logo.png';
37 export default defineComponent({ 37 export default defineComponent({
38 name: 'LockModal', 38 name: 'LockModal',
39 components: { BasicModal, BasicForm }, 39 components: { BasicModal, BasicForm },
@@ -106,6 +106,7 @@ @@ -106,6 +106,7 @@
106 left: calc(50% - 45px); 106 left: calc(50% - 45px);
107 width: auto; 107 width: auto;
108 text-align: center; 108 text-align: center;
  109 +
109 &-img { 110 &-img {
110 width: 70px; 111 width: 70px;
111 border-radius: 50%; 112 border-radius: 50%;
@@ -113,7 +114,7 @@ @@ -113,7 +114,7 @@
113 114
114 &-name { 115 &-name {
115 margin-top: 5px; 116 margin-top: 5px;
116 - display: flex; 117 + // display: flex;
117 width: 100%; 118 width: 100%;
118 // margin-left: -15px; 119 // margin-left: -15px;
119 } 120 }
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <BasicModal 3 <BasicModal
4 :maskClosable="false" 4 :maskClosable="false"
5 v-bind="$attrs" 5 v-bind="$attrs"
6 - width="60rem" 6 + :width="dynamicWidth"
7 @register="register" 7 @register="register"
8 @ok="handleSubmit" 8 @ok="handleSubmit"
9 @cancel="handleCancel" 9 @cancel="handleCancel"
@@ -86,6 +86,7 @@ @@ -86,6 +86,7 @@
86 profileData: {}, 86 profileData: {},
87 }); 87 });
88 const transportTypeStr = ref(''); 88 const transportTypeStr = ref('');
  89 + const dynamicWidth = ref('55rem');
89 const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { 90 const [register, { closeModal, setModalProps }] = useModalInner(async (data) => {
90 setModalProps({ confirmLoading: false }); 91 setModalProps({ confirmLoading: false });
91 current.value = 0; 92 current.value = 0;
@@ -95,6 +96,7 @@ @@ -95,6 +96,7 @@
95 isEditId.value = data.record !== undefined ? data.record.id : null; 96 isEditId.value = data.record !== undefined ? data.record.id : null;
96 isEditCreatTime.value = data.record !== undefined ? data.record.createTime : null; 97 isEditCreatTime.value = data.record !== undefined ? data.record.createTime : null;
97 if (!unref(isViewDetail)) { 98 if (!unref(isViewDetail)) {
  99 + dynamicWidth.value = 55 + 'rem';
98 const title = !unref(isUpdate) ? '编辑设备配置' : '新增设备配置'; 100 const title = !unref(isUpdate) ? '编辑设备配置' : '新增设备配置';
99 setModalProps({ title, showOkBtn: true, showCancelBtn: true }); 101 setModalProps({ title, showOkBtn: true, showCancelBtn: true });
100 if (!unref(isUpdate)) { 102 if (!unref(isUpdate)) {
@@ -103,6 +105,7 @@ @@ -103,6 +105,7 @@
103 handleStepNext(false, res); 105 handleStepNext(false, res);
104 } 106 }
105 } else { 107 } else {
  108 + dynamicWidth.value = 60 + 'rem';
106 setModalProps({ showOkBtn: false, showCancelBtn: false, title: '设备配置详情' }); 109 setModalProps({ showOkBtn: false, showCancelBtn: false, title: '设备配置详情' });
107 await setDeviceConfEditFormData(res); 110 await setDeviceConfEditFormData(res);
108 await setTransConfEditFormData(res); 111 await setTransConfEditFormData(res);
@@ -21,6 +21,11 @@ export const steps = [ @@ -21,6 +21,11 @@ export const steps = [
21 21
22 export const physicalColumn: BasicColumn[] = [ 22 export const physicalColumn: BasicColumn[] = [
23 { 23 {
  24 + title: '功能类型',
  25 + dataIndex: 'dType',
  26 + width: 90,
  27 + },
  28 + {
24 title: '功能名称', 29 title: '功能名称',
25 dataIndex: 'name', 30 dataIndex: 'name',
26 width: 90, 31 width: 90,
@@ -410,6 +415,7 @@ export const formSchema: FormSchema[] = [ @@ -410,6 +415,7 @@ export const formSchema: FormSchema[] = [
410 export const mockData: any = async () => { 415 export const mockData: any = async () => {
411 const res = await [ 416 const res = await [
412 { 417 {
  418 + dType: 'events',
413 name: '亮度百分比', 419 name: '亮度百分比',
414 type: 'Brightness', 420 type: 'Brightness',
415 transportType: 'int32(整数型)', 421 transportType: 'int32(整数型)',
@@ -420,6 +426,7 @@ export const mockData: any = async () => { @@ -420,6 +426,7 @@ export const mockData: any = async () => {
420 createTime: '2022-10-20 10:24:22', 426 createTime: '2022-10-20 10:24:22',
421 }, 427 },
422 { 428 {
  429 + dType: 'service',
423 name: '运行状态', 430 name: '运行状态',
424 type: 'RunningState', 431 type: 'RunningState',
425 transportType: 'bool(布尔型)', 432 transportType: 'bool(布尔型)',
@@ -430,6 +437,7 @@ export const mockData: any = async () => { @@ -430,6 +437,7 @@ export const mockData: any = async () => {
430 createTime: '2022-10-20 10:24:22', 437 createTime: '2022-10-20 10:24:22',
431 }, 438 },
432 { 439 {
  440 + dType: 'attr',
433 name: '设备运行状态', 441 name: '设备运行状态',
434 type: 'E_Status_UP', 442 type: 'E_Status_UP',
435 transportType: 'text(字符串)', 443 transportType: 'text(字符串)',
@@ -440,6 +448,7 @@ export const mockData: any = async () => { @@ -440,6 +448,7 @@ export const mockData: any = async () => {
440 createTime: '2022-10-20 10:24:22', 448 createTime: '2022-10-20 10:24:22',
441 }, 449 },
442 { 450 {
  451 + dType: 'attr',
443 name: '过流告警使能', 452 name: '过流告警使能',
444 type: 'OverCurrentEnable', 453 type: 'OverCurrentEnable',
445 transportType: 'struct(结构体)', 454 transportType: 'struct(结构体)',
@@ -450,6 +459,7 @@ export const mockData: any = async () => { @@ -450,6 +459,7 @@ export const mockData: any = async () => {
450 createTime: '2022-10-20 10:24:22', 459 createTime: '2022-10-20 10:24:22',
451 }, 460 },
452 { 461 {
  462 + dType: 'events',
453 name: '变频器运行状态1', 463 name: '变频器运行状态1',
454 type: 'Brightness', 464 type: 'Brightness',
455 transportType: 'int32(整数型)', 465 transportType: 'int32(整数型)',
@@ -460,6 +470,7 @@ export const mockData: any = async () => { @@ -460,6 +470,7 @@ export const mockData: any = async () => {
460 createTime: '2022-10-20 10:24:22', 470 createTime: '2022-10-20 10:24:22',
461 }, 471 },
462 { 472 {
  473 + dType: 'service',
463 name: '产品序列号', 474 name: '产品序列号',
464 type: 'SerialNo', 475 type: 'SerialNo',
465 transportType: 'text(字符串)', 476 transportType: 'text(字符串)',
@@ -470,6 +481,7 @@ export const mockData: any = async () => { @@ -470,6 +481,7 @@ export const mockData: any = async () => {
470 createTime: '2022-10-20 10:24:22', 481 createTime: '2022-10-20 10:24:22',
471 }, 482 },
472 { 483 {
  484 + dType: 'service',
473 name: '音量百分比', 485 name: '音量百分比',
474 type: 'Volume', 486 type: 'Volume',
475 transportType: 'int32(整数型)', 487 transportType: 'int32(整数型)',
@@ -480,6 +492,7 @@ export const mockData: any = async () => { @@ -480,6 +492,7 @@ export const mockData: any = async () => {
480 createTime: '2022-10-20 10:24:22', 492 createTime: '2022-10-20 10:24:22',
481 }, 493 },
482 { 494 {
  495 + dType: 'attr',
483 name: '易释放氰化物', 496 name: '易释放氰化物',
484 type: 'easy_release_cyanide', 497 type: 'easy_release_cyanide',
485 transportType: 'double(双精度浮点型)', 498 transportType: 'double(双精度浮点型)',
@@ -490,6 +503,7 @@ export const mockData: any = async () => { @@ -490,6 +503,7 @@ export const mockData: any = async () => {
490 createTime: '2022-10-20 10:24:22', 503 createTime: '2022-10-20 10:24:22',
491 }, 504 },
492 { 505 {
  506 + dType: 'attr',
493 name: '湿度', 507 name: '湿度',
494 type: 'Humidity', 508 type: 'Humidity',
495 transportType: 'float(单精度浮点型)', 509 transportType: 'float(单精度浮点型)',
@@ -500,6 +514,7 @@ export const mockData: any = async () => { @@ -500,6 +514,7 @@ export const mockData: any = async () => {
500 createTime: '2022-10-20 10:24:22', 514 createTime: '2022-10-20 10:24:22',
501 }, 515 },
502 { 516 {
  517 + dType: 'attr',
503 name: '设备固件版本', 518 name: '设备固件版本',
504 type: 'FirmwareVersion', 519 type: 'FirmwareVersion',
505 transportType: 'text(字符串)', 520 transportType: 'text(字符串)',
@@ -510,6 +525,7 @@ export const mockData: any = async () => { @@ -510,6 +525,7 @@ export const mockData: any = async () => {
510 createTime: '2022-10-20 10:24:22', 525 createTime: '2022-10-20 10:24:22',
511 }, 526 },
512 { 527 {
  528 + dType: 'events',
513 name: '用电量', 529 name: '用电量',
514 type: 'PowerConsumption', 530 type: 'PowerConsumption',
515 transportType: 'float(单精度浮点型)', 531 transportType: 'float(单精度浮点型)',
@@ -10,6 +10,8 @@ @@ -10,6 +10,8 @@
10 > 10 >
11 <div v-if="isViewDetail"> 11 <div v-if="isViewDetail">
12 <Attribute v-show="activeKey === '1'" ref="AttrRef" /> 12 <Attribute v-show="activeKey === '1'" ref="AttrRef" />
  13 + <Service v-show="activeKey === '2'" ref="ServiceRef" />
  14 + <Events v-show="activeKey === '3'" ref="EventsRef" />
13 </div> 15 </div>
14 <div v-if="!isViewDetail"> 16 <div v-if="!isViewDetail">
15 <div> 17 <div>
@@ -20,13 +22,19 @@ @@ -20,13 +22,19 @@
20 </Typography> 22 </Typography>
21 </div> 23 </div>
22 <Tabs type="card" v-model:activeKey="activeKey" :size="size"> 24 <Tabs type="card" v-model:activeKey="activeKey" :size="size">
23 - <TabPane key="1" tab="属性"> 25 + <TabPane :disabled="attrDisable" forceRender key="1" tab="属性">
24 <Attribute v-show="activeKey === '1'" ref="AttrRef" /> 26 <Attribute v-show="activeKey === '1'" ref="AttrRef" />
25 </TabPane> 27 </TabPane>
26 - <TabPane key="2" tab="服务"> 28 + <TabPane :disabled="serveiceDisable" forceRender key="2" tab="服务">
27 <Service v-show="activeKey === '2'" ref="ServiceRef" /> 29 <Service v-show="activeKey === '2'" ref="ServiceRef" />
28 </TabPane> 30 </TabPane>
29 - <TabPane key="3" v-show="activeKey === '3'" tab="事件"> 31 + <TabPane
  32 + :disabled="eventDisable"
  33 + forceRender
  34 + key="3"
  35 + v-show="activeKey === '3'"
  36 + tab="事件"
  37 + >
30 <Events v-show="activeKey === '3'" ref="EventsRef" /> 38 <Events v-show="activeKey === '3'" ref="EventsRef" />
31 </TabPane> 39 </TabPane>
32 </Tabs> 40 </Tabs>
@@ -44,6 +52,9 @@ @@ -44,6 +52,9 @@
44 import { mockData } from '../physical/cpns/components/mock'; 52 import { mockData } from '../physical/cpns/components/mock';
45 53
46 defineEmits(['register']); 54 defineEmits(['register']);
  55 + const attrDisable = ref(false);
  56 + const serveiceDisable = ref(false);
  57 + const eventDisable = ref(false);
47 const blockContent = `属性一般是设备的运行状态,如当前温度等;服务是设备可被调用的方法,支持定义参数,如执行某项任务;事件则是设备上报的 58 const blockContent = `属性一般是设备的运行状态,如当前温度等;服务是设备可被调用的方法,支持定义参数,如执行某项任务;事件则是设备上报的
48 通知,如告警,需要被及时处理。`; 59 通知,如告警,需要被及时处理。`;
49 const activeKey = ref('1'); 60 const activeKey = ref('1');
@@ -54,6 +65,7 @@ @@ -54,6 +65,7 @@
54 const isUpdate = ref(false); 65 const isUpdate = ref(false);
55 const isViewDetail = ref(''); 66 const isViewDetail = ref('');
56 const isText = ref(''); 67 const isText = ref('');
  68 + const dType = ref('');
57 const allData: any = reactive({ 69 const allData: any = reactive({
58 properties: [], 70 properties: [],
59 events: [], 71 events: [],
@@ -61,27 +73,64 @@ @@ -61,27 +73,64 @@
61 productKey: '', 73 productKey: '',
62 _ppk: {}, 74 _ppk: {},
63 }); 75 });
  76 +
  77 + const setAttrFormData = (data: {}) => AttrRef.value?.setFormData(data);
  78 + const setServiceFormData = (data: {}) => ServiceRef.value?.setFormData(data);
  79 + const setEventsFormData = (data: {}) => EventsRef.value?.setFormData(data);
  80 + const enums = {
  81 + attr: setAttrFormData,
  82 + service: setServiceFormData,
  83 + events: setEventsFormData,
  84 + };
  85 + function action(val, data) {
  86 + let F = enums[val];
  87 + F(data);
  88 + }
  89 + const dynamicData = (t, a, s, e) => {
  90 + switch (t) {
  91 + case 'attr':
  92 + activeKey.value = '1';
  93 + action(t, a);
  94 + attrDisable.value = false;
  95 + serveiceDisable.value = true;
  96 + eventDisable.value = true;
  97 + break;
  98 + case 'service':
  99 + activeKey.value = '2';
  100 + action(t, s);
  101 + attrDisable.value = true;
  102 + serveiceDisable.value = false;
  103 + eventDisable.value = true;
  104 + break;
  105 + case 'events':
  106 + activeKey.value = '3';
  107 + action(t, e);
  108 + attrDisable.value = true;
  109 + serveiceDisable.value = true;
  110 + eventDisable.value = false;
  111 + break;
  112 + }
  113 + };
64 const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { 114 const [register, { closeModal, setModalProps }] = useModalInner(async (data) => {
65 setModalProps({ loading: true }); 115 setModalProps({ loading: true });
66 handleCancel(false); 116 handleCancel(false);
67 isUpdate.value = data.isUpdate; 117 isUpdate.value = data.isUpdate;
68 isViewDetail.value = data.isView; 118 isViewDetail.value = data.isView;
69 isText.value = data.isText; 119 isText.value = data.isText;
  120 + dType.value = data.record?.dType;
70 if (!unref(isViewDetail)) { 121 if (!unref(isViewDetail)) {
71 const title = !unref(isUpdate) ? '编辑物模型' : '新增物模型'; 122 const title = !unref(isUpdate) ? '编辑物模型' : '新增物模型';
72 if (!unref(isUpdate)) { 123 if (!unref(isUpdate)) {
73 nextTick(() => { 124 nextTick(() => {
74 - AttrRef.value?.setFormData(mockData.properties);  
75 - ServiceRef.value?.setFormData(mockData.services);  
76 - EventsRef.value?.setFormData(mockData.events); 125 + dynamicData(dType.value, mockData.properties, mockData.services, mockData.events);
77 }); 126 });
78 } 127 }
79 setModalProps({ title, showOkBtn: true, showCancelBtn: true }); 128 setModalProps({ title, showOkBtn: true, showCancelBtn: true });
80 } else { 129 } else {
81 setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看物模型' }); 130 setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看物模型' });
82 - AttrRef.value?.setFormData(mockData.properties);  
83 - ServiceRef.value?.setFormData(mockData.services);  
84 - EventsRef.value?.setFormData(mockData.events); 131 + nextTick(() => {
  132 + dynamicData(dType.value, mockData.properties, mockData.services, mockData.events);
  133 + });
85 } 134 }
86 setModalProps({ loading: false }); 135 setModalProps({ loading: false });
87 }); 136 });
@@ -93,6 +142,9 @@ @@ -93,6 +142,9 @@
93 allData.properties = []; 142 allData.properties = [];
94 allData.events = []; 143 allData.events = [];
95 allData.services = []; 144 allData.services = [];
  145 + attrDisable.value = false;
  146 + serveiceDisable.value = false;
  147 + eventDisable.value = false;
96 if (flag) { 148 if (flag) {
97 closeModal(); 149 closeModal();
98 } 150 }
@@ -5,14 +5,14 @@ @@ -5,14 +5,14 @@
5 <div style="display: flex"> 5 <div style="display: flex">
6 <Input 6 <Input
7 type="number" 7 type="number"
8 - v-model:vlaue="minMaxObj.min" 8 + v-model:value="minMaxObj.min"
9 placeholder="最小值" 9 placeholder="最小值"
10 @blur="onInputBlurMin" 10 @blur="onInputBlurMin"
11 /> 11 />
12 <span>~</span> 12 <span>~</span>
13 <Input 13 <Input
14 type="number" 14 type="number"
15 - v-model:vlaue="minMaxObj.max" 15 + v-model:value="minMaxObj.max"
16 placeholder="最大值" 16 placeholder="最大值"
17 @blur="onInputBlurMax" 17 @blur="onInputBlurMax"
18 /> 18 />
@@ -50,11 +50,9 @@ @@ -50,11 +50,9 @@
50 import InputParamItem from './components/InputParamItem.vue'; 50 import InputParamItem from './components/InputParamItem.vue';
51 import AddParamsModal from './components/AddParamsModal.vue'; 51 import AddParamsModal from './components/AddParamsModal.vue';
52 import { Input } from 'ant-design-vue'; 52 import { Input } from 'ant-design-vue';
53 - // import { useMessage } from '/@/hooks/web/useMessage';  
54 - import { validateValueRangeAndStep } from '../hook/useValidateParital'; 53 + import { validateValueRangeAndStep, validateValueBool } from '../hook/useValidateParital';
55 import { buildUUID } from '/@/utils/uuid'; 54 import { buildUUID } from '/@/utils/uuid';
56 55
57 - // const { createMessage } = useMessage();  
58 const outputParamData: any = ref([]); 56 const outputParamData: any = ref([]);
59 const minMaxObj = reactive({ 57 const minMaxObj = reactive({
60 min: '', 58 min: '',
@@ -94,7 +92,7 @@ @@ -94,7 +92,7 @@
94 openModal(true, { 92 openModal(true, {
95 isUpdate: true, 93 isUpdate: true,
96 flag: 'output', 94 flag: 'output',
97 - excludeStruct: false, 95 + excludeStruct: true,
98 }); 96 });
99 }; 97 };
100 98
@@ -106,13 +104,24 @@ @@ -106,13 +104,24 @@
106 isUpdate: false, 104 isUpdate: false,
107 record: item, 105 record: item,
108 flag: 'output', 106 flag: 'output',
109 - excludeStruct: false, 107 + excludeStruct: true,
110 }); 108 });
111 }; 109 };
112 110
113 //回显数据 111 //回显数据
114 const setFormData = (v) => { 112 const setFormData = (v) => {
115 setFieldsValue(v[0]); 113 setFieldsValue(v[0]);
  114 + setFieldsValue({
  115 + ...v[0].dataSpecs,
  116 + boolClose:
  117 + v[0].dataSpecsList !== undefined || v[0].dataSpecsList !== null
  118 + ? v[0].dataSpecsList[0].name
  119 + : '',
  120 + boolOpen:
  121 + v[0].dataSpecsList !== undefined || v[0].dataSpecsList !== null
  122 + ? v[0].dataSpecsList[1].name
  123 + : '',
  124 + });
116 const { dataSpecsList } = v[0]; 125 const { dataSpecsList } = v[0];
117 if (dataSpecsList !== undefined) { 126 if (dataSpecsList !== undefined) {
118 outputParamData.value = [...new Array(dataSpecsList.length).keys()]; 127 outputParamData.value = [...new Array(dataSpecsList.length).keys()];
@@ -130,13 +139,26 @@ @@ -130,13 +139,26 @@
130 if (!values) return; 139 if (!values) return;
131 const dataSpecsList = getStructList(); 140 const dataSpecsList = getStructList();
132 validateValueRangeAndStep(Number(minMaxObj.min), Number(values.step), Number(minMaxObj.max)); 141 validateValueRangeAndStep(Number(minMaxObj.min), Number(values.step), Number(minMaxObj.max));
133 - const isStruct = values.dataType === 'STRUCT'; 142 + validateValueBool(Number(values.boolClose), Number(values.boolOpen));
134 const dataSpecs = { 143 const dataSpecs = {
135 ...minMaxObj, 144 ...minMaxObj,
136 ...{ step: values.step }, 145 ...{ step: values.step },
137 ...{ unit: values.unit }, 146 ...{ unit: values.unit },
138 ...{ dataType: values.dataType }, 147 ...{ dataType: values.dataType },
  148 + ...{ length: values.length },
139 }; 149 };
  150 + const dataSpecsListBool = [
  151 + {
  152 + dataType: values.dataType,
  153 + name: '0',
  154 + value: values.boolClose,
  155 + },
  156 + {
  157 + dataType: values.dataType,
  158 + name: '1',
  159 + value: values.boolOpen,
  160 + },
  161 + ];
140 const { valueRange, step, unit, outputParam, ...value } = values; 162 const { valueRange, step, unit, outputParam, ...value } = values;
141 console.log(valueRange); 163 console.log(valueRange);
142 console.log(step); 164 console.log(step);
@@ -144,13 +166,26 @@ @@ -144,13 +166,26 @@
144 console.log(outputParam); 166 console.log(outputParam);
145 return { 167 return {
146 ...value, 168 ...value,
147 - ...{ dataSpecs: isStruct ? null : dataSpecs },  
148 - ...{ dataSpecsList: isStruct ? dataSpecsList : null }, 169 + ...{
  170 + dataSpecs:
  171 + values.dataType === 'INT' || values.dataType === 'DOUBLE' || values.dataType === 'TEXT'
  172 + ? dataSpecs
  173 + : null,
  174 + },
  175 + ...{
  176 + dataSpecsList:
  177 + values.dataType === 'STRUCT'
  178 + ? dataSpecsList
  179 + : values.dataType === 'BOOL'
  180 + ? dataSpecsListBool
  181 + : null,
  182 + },
149 }; 183 };
150 } 184 }
151 //清空数据 185 //清空数据
152 const resetFormData = () => { 186 const resetFormData = () => {
153 resetFields(); 187 resetFields();
  188 + outputParamData.value = [];
154 Reflect.set(minMaxObj, 'min', ''); 189 Reflect.set(minMaxObj, 'min', '');
155 Reflect.set(minMaxObj, 'max', ''); 190 Reflect.set(minMaxObj, 'max', '');
156 }; 191 };
@@ -74,6 +74,7 @@ @@ -74,6 +74,7 @@
74 isUpdate: false, 74 isUpdate: false,
75 record: item, 75 record: item,
76 flag: 'output', 76 flag: 'output',
  77 + excludeStruct: false,
77 }); 78 });
78 }; 79 };
79 //回显数据 80 //回显数据
@@ -105,6 +106,7 @@ @@ -105,6 +106,7 @@
105 //清空数据 106 //清空数据
106 const resetFormData = () => { 107 const resetFormData = () => {
107 resetFields(); 108 resetFields();
  109 + outputParamData.value = [];
108 }; 110 };
109 111
110 defineExpose({ 112 defineExpose({
@@ -114,6 +114,7 @@ @@ -114,6 +114,7 @@
114 isUpdate: false, 114 isUpdate: false,
115 record: item, 115 record: item,
116 flag: 'input', 116 flag: 'input',
  117 + excludeStruct: false,
117 }); 118 });
118 }; 119 };
119 const deleteOutParItem = (index) => { 120 const deleteOutParItem = (index) => {
@@ -124,12 +125,12 @@ @@ -124,12 +125,12 @@
124 isUpdate: false, 125 isUpdate: false,
125 record: item, 126 record: item,
126 flag: 'output', 127 flag: 'output',
  128 + excludeStruct: false,
127 }); 129 });
128 }; 130 };
129 131
130 //回显数据 132 //回显数据
131 const setFormData = (v) => { 133 const setFormData = (v) => {
132 - console.log(v[0]);  
133 setFieldsValue(v[0]); 134 setFieldsValue(v[0]);
134 const { inputParams, outputParams } = v[0]; 135 const { inputParams, outputParams } = v[0];
135 if (outputParams !== undefined) { 136 if (outputParams !== undefined) {
@@ -168,6 +169,8 @@ @@ -168,6 +169,8 @@
168 //清空数据 169 //清空数据
169 const resetFormData = () => { 170 const resetFormData = () => {
170 resetFields(); 171 resetFields();
  172 + inputParamData.value = [];
  173 + outputParamData.value = [];
171 }; 174 };
172 175
173 defineExpose({ 176 defineExpose({
@@ -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="最小值" @blur="onInputBlurMin" /> 6 + <Input v-model:value="minMaxObj.min" placeholder="最小值" @blur="onInputBlurMin" />
7 <span>~</span> 7 <span>~</span>
8 - <a-input v-model:vlaue="minMaxObj.max" placeholder="最大值" @blur="onInputBlurMax" /> 8 + <Input v-model:value="minMaxObj.max" placeholder="最大值" @blur="onInputBlurMax" />
9 </div> 9 </div>
10 </template> 10 </template>
11 <template #structSlot> 11 <template #structSlot>
@@ -40,11 +40,11 @@ @@ -40,11 +40,11 @@
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'; 42 import { findDictItemByCode } from '/@/api/system/dict';
43 - // import { useMessage } from '/@/hooks/web/useMessage';  
44 - import { validateValueRangeAndStep } from '../../hook/useValidateParital'; 43 + import { validateValueRangeAndStep, validateValueBool } from '../../hook/useValidateParital';
  44 + import { buildUUID } from '/@/utils/uuid';
  45 + import { Input } from 'ant-design-vue';
45 46
46 defineEmits(['register']); 47 defineEmits(['register']);
47 - // const { createMessage } = useMessage();  
48 const outputParamData: any = ref([]); 48 const outputParamData: any = ref([]);
49 const dynamicBindRef = { 49 const dynamicBindRef = {
50 outputParamItemRef: ref([]), 50 outputParamItemRef: ref([]),
@@ -70,10 +70,11 @@ @@ -70,10 +70,11 @@
70 70
71 const getData = (d, f) => { 71 const getData = (d, f) => {
72 if (f == 'output') { 72 if (f == 'output') {
73 - unref(outputParamData).push(d);  
74 if (d.id !== null) { 73 if (d.id !== null) {
75 - const findIndex = unref(outputParamData).findIndex((f) => f.id !== d.id);  
76 - if (findIndex !== -1) unref(outputParamData).splice(findIndex, 1); 74 + const findIndex = unref(outputParamData).findIndex((f) => f.id == d.id);
  75 + if (findIndex !== -1) unref(outputParamData).splice(findIndex, 1, d);
  76 + } else {
  77 + unref(outputParamData).push({ ...d, id: buildUUID() });
77 } 78 }
78 } 79 }
79 }; 80 };
@@ -94,6 +95,7 @@ @@ -94,6 +95,7 @@
94 isUpdate: false, 95 isUpdate: false,
95 record: item, 96 record: item,
96 flag: 'output', 97 flag: 'output',
  98 + excludeStruct: true,
97 }); 99 });
98 }; 100 };
99 101
@@ -124,26 +126,74 @@ @@ -124,26 +126,74 @@
124 }); 126 });
125 }; 127 };
126 128
  129 + const getOutputStructList = () => {
  130 + const val = unref(dynamicBindRef.outputParamItemRef)?.map((item: any) => item.getFormData());
  131 + return val;
  132 + };
127 const getFormData = async () => { 133 const getFormData = async () => {
128 const values = await validate(); 134 const values = await validate();
129 if (!values) return; 135 if (!values) return;
130 validateValueRangeAndStep(Number(minMaxObj.min), Number(values.step), Number(minMaxObj.max)); 136 validateValueRangeAndStep(Number(minMaxObj.min), Number(values.step), Number(minMaxObj.max));
  137 + validateValueBool(Number(values.boolClose), Number(values.boolOpen));
  138 + const outputParams = getOutputStructList();
  139 + outputParams.forEach((f) => {
  140 + f.dataType = 'STRUCT';
  141 + });
  142 + //int double类型
131 const childSpecsDTO = { 143 const childSpecsDTO = {
132 dataType: values.dataType, 144 dataType: values.dataType,
133 max: minMaxObj.max, 145 max: minMaxObj.max,
134 min: minMaxObj.min, 146 min: minMaxObj.min,
135 step: values.step, 147 step: values.step,
136 unit: values.unit, 148 unit: values.unit,
  149 + length: values.length,
137 }; 150 };
138 const dataSpecs = childSpecsDTO; 151 const dataSpecs = childSpecsDTO;
139 - const { step, unit, valueRange, ...value } = values; 152 + //bool类型
  153 + const childEnumSpecsDTO = [
  154 + {
  155 + dataType: values.dataType,
  156 + name: values.boolClose,
  157 + value: 0,
  158 + },
  159 + {
  160 + dataType: values.dataType,
  161 + name: values.boolOpen,
  162 + value: 1,
  163 + },
  164 + ];
  165 + const dataSpecsList = childEnumSpecsDTO;
  166 + //text类型
  167 + //其他类型
  168 + const { boolClose, boolOpen, step, unit, valueRange, ...value } = values;
140 console.log(valueRange); 169 console.log(valueRange);
141 console.log(step); 170 console.log(step);
142 console.log(unit); 171 console.log(unit);
  172 + console.log(boolClose);
  173 + console.log(boolOpen);
143 return { 174 return {
144 ...value, 175 ...value,
145 - ...{ dataSpecs },  
146 - ...{ childSpecsDTO }, 176 + ...{
  177 + dataSpecs:
  178 + values.dataType === 'INT' || values.dataType === 'DOUBLE' || values.dataType === 'TEXT'
  179 + ? dataSpecs
  180 + : null,
  181 + },
  182 + ...{
  183 + childSpecsDTO:
  184 + values.dataType === 'INT' || values.dataType === 'DOUBLE' || values.dataType === 'TEXT'
  185 + ? childSpecsDTO
  186 + : null,
  187 + },
  188 + ...{
  189 + dataSpecsList:
  190 + values.dataType === 'BOOL'
  191 + ? dataSpecsList
  192 + : values.dataType === 'STRUCT'
  193 + ? outputParams
  194 + : null,
  195 + },
  196 + ...{ childEnumSpecsDTO: values.dataType === 'BOOL' ? childEnumSpecsDTO : null },
147 ...{ 197 ...{
148 childDataType: values.dataType, 198 childDataType: values.dataType,
149 childName: values.name, 199 childName: values.name,
@@ -151,10 +201,35 @@ @@ -151,10 +201,35 @@
151 }; 201 };
152 }; 202 };
153 const setFormData = (v) => { 203 const setFormData = (v) => {
  204 + console.log('回显', v);
154 setFieldsValue(v); 205 setFieldsValue(v);
155 setFieldsValue({ 206 setFieldsValue({
156 ...v.dataSpecs, 207 ...v.dataSpecs,
157 }); 208 });
  209 + try {
  210 + setFieldsValue({
  211 + boolClose: v.dataType == 'BOOL' ? v.dataSpecsList[0].name : '',
  212 + boolOpen: v.dataType == 'BOOL' ? v.dataSpecsList[1].name : '',
  213 + });
  214 + } catch (e) {
  215 + console.log(e);
  216 + }
  217 + const { dataSpecsList, dataType, childDataType } = v;
  218 + if (childDataType == 'BOOL') {
  219 + setFieldsValue({
  220 + dataType: childDataType,
  221 + boolClose: dataSpecsList[0].name,
  222 + boolOpen: dataSpecsList[1].name,
  223 + });
  224 + }
  225 + try {
  226 + if (dataType == 'BOOL' || dataType == 'STRUCT') {
  227 + outputParamData.value = [...new Array(dataSpecsList.length).keys()];
  228 + outputParamData.value = dataSpecsList;
  229 + }
  230 + } catch (e) {
  231 + console.log(e);
  232 + }
158 nextTick(() => { 233 nextTick(() => {
159 minMaxObj.min = v?.dataSpecs?.min; 234 minMaxObj.min = v?.dataSpecs?.min;
160 minMaxObj.max = v?.dataSpecs?.max; 235 minMaxObj.max = v?.dataSpecs?.max;
1 import { buildUUID } from '/@/utils/uuid'; 1 import { buildUUID } from '/@/utils/uuid';
2 2
  3 +//模拟阿里云属性服务事件服务端格式
3 export const mockData = { 4 export const mockData = {
4 _ppk: {}, 5 _ppk: {},
5 events: [ 6 events: [
6 { 7 {
7 - createTs: 1666344382193, 8 + createTs: 1666596472189,
8 custom: true, 9 custom: true,
9 - description: '33',  
10 - eventName: '事件1',  
11 - eventType: 'ALERT_EVENT_TYPE',  
12 - identifier: 'i1', 10 + description: '监播动作结果上报事件',
  11 + eventName: '监播动作结果上报事件',
  12 + eventType: 'INFO_EVENT_TYPE',
  13 + identifier: 'MonitorActionEvent',
13 outputData: [ 14 outputData: [
14 { 15 {
15 id: buildUUID(), 16 id: buildUUID(),
16 custom: true, 17 custom: true,
17 dataSpecs: { 18 dataSpecs: {
18 dataType: 'INT', 19 dataType: 'INT',
19 - max: '20',  
20 - min: '10',  
21 - step: '3',  
22 - unit: 'W/㎡',  
23 - unitName: '太阳总辐射', 20 + max: '1024',
  21 + min: '-1024',
  22 + precise: 0,
  23 + step: '1',
  24 + unit: '',
  25 + unitName: '无',
24 }, 26 },
25 dataType: 'INT', 27 dataType: 'INT',
26 direction: 'PARAM_OUTPUT', 28 direction: 'PARAM_OUTPUT',
27 - identifier: 'i1',  
28 - name: '参数1', 29 + identifier: 'ActionType',
  30 + name: '监播操作类型',
29 paraOrder: 0, 31 paraOrder: 0,
30 }, 32 },
  33 + {
  34 + id: buildUUID(),
  35 + custom: true,
  36 + dataSpecs: {
  37 + dataType: 'TEXT',
  38 + length: 1024,
  39 + },
  40 + dataType: 'TEXT',
  41 + direction: 'PARAM_OUTPUT',
  42 + identifier: 'FileKey',
  43 + name: '上传文件ossKey',
  44 + paraOrder: 1,
  45 + },
  46 + {
  47 + id: buildUUID(),
  48 + custom: true,
  49 + dataSpecsList: [
  50 + {
  51 + id: buildUUID(),
  52 + dataType: 'BOOL',
  53 + name: '1',
  54 + value: 0,
  55 + },
  56 + {
  57 + id: buildUUID(),
  58 + dataType: 'BOOL',
  59 + name: '0',
  60 + value: 1,
  61 + },
  62 + ],
  63 + dataType: 'BOOL',
  64 + direction: 'PARAM_OUTPUT',
  65 + identifier: 'Extension',
  66 + name: '扩展信息',
  67 + paraOrder: 2,
  68 + },
  69 + {
  70 + id: buildUUID(),
  71 + custom: true,
  72 + dataSpecsList: [
  73 + {
  74 + id: buildUUID(),
  75 + childDataType: 'DOUBLE',
  76 + childName: '峰值',
  77 + childSpecsDTO: {
  78 + dataType: 'DOUBLE',
  79 + max: '33',
  80 + min: '22',
  81 + step: '2',
  82 + unit: 'm³/s',
  83 + unitName: '立方米每秒',
  84 + },
  85 + custom: true,
  86 + dataSpecs: {
  87 + dataType: 'DOUBLE',
  88 + max: '33',
  89 + min: '22',
  90 + step: '2',
  91 + unit: 'm³/s',
  92 + unitName: '立方米每秒',
  93 + },
  94 + dataType: 'STRUCT',
  95 + identifier: 'bass',
  96 + isStd: 0,
  97 + name: '峰值',
  98 + },
  99 + {
  100 + id: buildUUID(),
  101 + childDataType: 'BOOL',
  102 + childEnumSpecsDTO: [
  103 + {
  104 + dataType: 'BOOL',
  105 + name: '1',
  106 + value: 0,
  107 + },
  108 + {
  109 + dataType: 'BOOL',
  110 + name: '0',
  111 + value: 1,
  112 + },
  113 + ],
  114 + childName: '平均速率',
  115 + custom: true,
  116 + dataSpecsList: [
  117 + {
  118 + id: buildUUID(),
  119 + dataType: 'BOOL',
  120 + name: '1',
  121 + value: 0,
  122 + },
  123 + {
  124 + id: buildUUID(),
  125 + dataType: 'BOOL',
  126 + name: '0',
  127 + value: 1,
  128 + },
  129 + ],
  130 + dataType: 'STRUCT',
  131 + identifier: 'average',
  132 + isStd: 0,
  133 + name: '平均速率',
  134 + },
  135 + ],
  136 + dataType: 'STRUCT',
  137 + direction: 'PARAM_OUTPUT',
  138 + identifier: 'ceshi',
  139 + name: '网速',
  140 + paraOrder: 3,
  141 + },
31 ], 142 ],
32 productKey: 'hsrnXEfGFDv', 143 productKey: 'hsrnXEfGFDv',
33 required: false, 144 required: false,
@@ -36,67 +147,123 @@ export const mockData = { @@ -36,67 +147,123 @@ export const mockData = {
36 productKey: 'hsrnXEfGFDv', 147 productKey: 'hsrnXEfGFDv',
37 properties: [ 148 properties: [
38 { 149 {
39 - createTs: 1666259889029, 150 + createTs: 1666604372638,
40 custom: true, 151 custom: true,
41 customFlag: true, 152 customFlag: true,
42 dataSpecsList: [ 153 dataSpecsList: [
43 { 154 {
44 - id: buildUUID(), 155 + childDataType: 'BOOL',
  156 + childEnumSpecsDTO: [
  157 + {
  158 + dataType: 'BOOL',
  159 + name: '左眼',
  160 + value: 0,
  161 + },
  162 + {
  163 + dataType: 'BOOL',
  164 + name: '右眼',
  165 + value: 1,
  166 + },
  167 + ],
  168 + childName: '眼睛',
  169 + custom: true,
  170 + dataSpecsList: [
  171 + {
  172 + dataType: 'BOOL',
  173 + name: '左眼',
  174 + value: 0,
  175 + },
  176 + {
  177 + dataType: 'BOOL',
  178 + name: '右眼',
  179 + value: 1,
  180 + },
  181 + ],
  182 + dataType: 'STRUCT',
  183 + identifier: 'Eye',
  184 + isStd: 0,
  185 + name: '眼睛',
  186 + },
  187 + {
45 childDataType: 'INT', 188 childDataType: 'INT',
46 - childName: '测试参数1', 189 + childName: '鼻子',
47 childSpecsDTO: { 190 childSpecsDTO: {
48 dataType: 'INT', 191 dataType: 'INT',
49 - max: '30',  
50 - min: '20',  
51 - step: '1',  
52 - unit: 'mm/hour',  
53 - unitName: '降雨量', 192 + max: '22',
  193 + min: '12',
  194 + step: '5',
  195 + unit: '只',
  196 + unitName: '只',
54 }, 197 },
55 custom: true, 198 custom: true,
56 dataSpecs: { 199 dataSpecs: {
57 dataType: 'INT', 200 dataType: 'INT',
58 - max: '30',  
59 - min: '20',  
60 - step: '1',  
61 - unit: 'mm/hour',  
62 - unitName: '降雨量', 201 + max: '22',
  202 + min: '12',
  203 + step: '5',
  204 + unit: '只',
  205 + unitName: '只',
63 }, 206 },
64 dataType: 'STRUCT', 207 dataType: 'STRUCT',
65 - identifier: 'iden2', 208 + identifier: 'Boless',
66 isStd: 0, 209 isStd: 0,
67 - name: '测试参数1', 210 + name: '鼻子',
68 }, 211 },
69 { 212 {
70 - id: buildUUID(),  
71 - childDataType: 'INT',  
72 - childName: '测试参数2', 213 + childDataType: 'TEXT',
  214 + childName: '脸颊',
73 childSpecsDTO: { 215 childSpecsDTO: {
74 - dataType: 'INT',  
75 - max: '40',  
76 - min: '30',  
77 - step: '2',  
78 - unit: 'pH',  
79 - unitName: 'PH值', 216 + dataType: 'TEXT',
  217 + length: 10240,
80 }, 218 },
81 custom: true, 219 custom: true,
82 dataSpecs: { 220 dataSpecs: {
83 - dataType: 'INT',  
84 - max: '40',  
85 - min: '30',  
86 - step: '2',  
87 - unit: 'pH',  
88 - unitName: 'PH值', 221 + dataType: 'TEXT',
  222 + length: 10240,
89 }, 223 },
90 dataType: 'STRUCT', 224 dataType: 'STRUCT',
91 - identifier: 'idne2', 225 + identifier: 'Facebook',
92 isStd: 0, 226 isStd: 0,
93 - name: '测试参数2', 227 + name: '脸颊',
  228 + },
  229 + {
  230 + childDataType: 'BOOL',
  231 + childEnumSpecsDTO: [
  232 + {
  233 + dataType: 'BOOL',
  234 + name: '左耳',
  235 + value: 0,
  236 + },
  237 + {
  238 + dataType: 'BOOL',
  239 + name: '右耳',
  240 + value: 1,
  241 + },
  242 + ],
  243 + childName: '耳朵',
  244 + custom: true,
  245 + dataSpecsList: [
  246 + {
  247 + dataType: 'BOOL',
  248 + name: '左耳',
  249 + value: 0,
  250 + },
  251 + {
  252 + dataType: 'BOOL',
  253 + name: '右耳',
  254 + value: 1,
  255 + },
  256 + ],
  257 + dataType: 'STRUCT',
  258 + identifier: 'Eyear',
  259 + isStd: 0,
  260 + name: '耳朵',
94 }, 261 },
95 ], 262 ],
96 dataType: 'STRUCT', 263 dataType: 'STRUCT',
97 - description: '21212',  
98 - identifier: 'iden1',  
99 - name: '测试功能', 264 + description: '用于人脸特征下发,基于人脸门禁1.0物模型\n设备级开关',
  265 + identifier: 'SupportFaceFeature',
  266 + name: '支持人脸特征下发',
100 productKey: 'hsrnXEfGFDv', 267 productKey: 'hsrnXEfGFDv',
101 required: false, 268 required: false,
102 rwFlag: 'READ_WRITE', 269 rwFlag: 'READ_WRITE',
@@ -105,249 +272,329 @@ export const mockData = { @@ -105,249 +272,329 @@ export const mockData = {
105 ], 272 ],
106 services: [ 273 services: [
107 { 274 {
108 - callType: 'ASYNC',  
109 - createTs: 1666343456853, 275 + callType: 'SYNC',
  276 + createTs: 1666603858325,
110 custom: true, 277 custom: true,
111 - description: '4343',  
112 - identifier: 'Iide1', 278 + description: '更新模型',
  279 + identifier: 'UpdateModel',
113 inputParams: [ 280 inputParams: [
114 { 281 {
115 id: buildUUID(), 282 id: buildUUID(),
116 custom: true, 283 custom: true,
117 dataSpecs: { 284 dataSpecs: {
  285 + dataType: 'TEXT',
  286 + length: 128,
  287 + },
  288 + dataType: 'TEXT',
  289 + direction: 'PARAM_INPUT',
  290 + identifier: 'UpdateTaskID',
  291 + name: '更新任务ID',
  292 + paraOrder: 0,
  293 + },
  294 + {
  295 + id: buildUUID(),
  296 + custom: true,
  297 + dataSpecs: {
  298 + dataType: 'TEXT',
  299 + length: 128,
  300 + },
  301 + dataType: 'TEXT',
  302 + direction: 'PARAM_INPUT',
  303 + identifier: 'AlgorithmID',
  304 + name: '算法任务唯一标识',
  305 + paraOrder: 1,
  306 + },
  307 + {
  308 + id: buildUUID(),
  309 +
  310 + custom: true,
  311 + dataSpecs: {
  312 + dataType: 'TEXT',
  313 + length: 64,
  314 + },
  315 + dataType: 'TEXT',
  316 + direction: 'PARAM_INPUT',
  317 + identifier: 'AlgorithmName',
  318 + name: '算法名称',
  319 + paraOrder: 2,
  320 + },
  321 + {
  322 + id: buildUUID(),
  323 +
  324 + custom: true,
  325 + dataSpecs: {
118 dataType: 'INT', 326 dataType: 'INT',
119 - max: '20',  
120 - min: '10',  
121 - step: '2',  
122 - unit: 'dS/m',  
123 - unitName: '土壤EC值', 327 + max: '128',
  328 + min: '0',
  329 + precise: 0,
  330 + step: '1',
  331 + unit: '',
  332 + unitName: '无',
124 }, 333 },
125 dataType: 'INT', 334 dataType: 'INT',
126 direction: 'PARAM_INPUT', 335 direction: 'PARAM_INPUT',
127 - identifier: 'i1',  
128 - name: '参数名字1',  
129 - paraOrder: 0, 336 + identifier: 'NumThreads',
  337 + name: '使用线程数',
  338 + paraOrder: 4,
  339 + },
  340 + {
  341 + id: buildUUID(),
  342 +
  343 + custom: true,
  344 + dataSpecs: {
  345 + dataType: 'TEXT',
  346 + length: 128,
  347 + },
  348 + dataType: 'TEXT',
  349 + direction: 'PARAM_INPUT',
  350 + identifier: 'ModelID',
  351 + name: '模型唯一标识',
  352 + paraOrder: 5,
  353 + },
  354 + {
  355 + id: buildUUID(),
  356 +
  357 + custom: true,
  358 + dataSpecs: {
  359 + dataType: 'TEXT',
  360 + length: 64,
  361 + },
  362 + dataType: 'TEXT',
  363 + direction: 'PARAM_INPUT',
  364 + identifier: 'ModelName',
  365 + name: '模型名称',
  366 + paraOrder: 6,
  367 + },
  368 + {
  369 + id: buildUUID(),
  370 +
  371 + custom: true,
  372 + dataSpecs: {
  373 + dataType: 'TEXT',
  374 + length: 64,
  375 + },
  376 + dataType: 'TEXT',
  377 + direction: 'PARAM_INPUT',
  378 + identifier: 'ModelVersion',
  379 + name: '模型版本',
  380 + paraOrder: 7,
  381 + },
  382 + {
  383 + id: buildUUID(),
  384 +
  385 + custom: true,
  386 + dataSpecs: {
  387 + dataType: 'TEXT',
  388 + length: 1024,
  389 + },
  390 + dataType: 'TEXT',
  391 + direction: 'PARAM_INPUT',
  392 + identifier: 'ModelURL',
  393 + name: '模型地址',
  394 + paraOrder: 8,
  395 + },
  396 + {
  397 + id: buildUUID(),
  398 +
  399 + custom: true,
  400 + dataSpecs: {
  401 + dataType: 'TEXT',
  402 + length: 128,
  403 + },
  404 + dataType: 'TEXT',
  405 + direction: 'PARAM_INPUT',
  406 + identifier: 'ModelMD5',
  407 + name: '模型文件MD5',
  408 + paraOrder: 9,
  409 + },
  410 + {
  411 + id: buildUUID(),
  412 +
  413 + custom: true,
  414 + dataSpecs: {
  415 + dataType: 'TEXT',
  416 + length: 64,
  417 + },
  418 + dataType: 'TEXT',
  419 + direction: 'PARAM_INPUT',
  420 + identifier: 'ModelPlatform',
  421 + name: '模型平台',
  422 + paraOrder: 10,
  423 + },
  424 + {
  425 + id: buildUUID(),
  426 +
  427 + custom: true,
  428 + dataSpecs: {
  429 + dataType: 'TEXT',
  430 + length: 128,
  431 + },
  432 + dataType: 'TEXT',
  433 + direction: 'PARAM_INPUT',
  434 + identifier: 'ModelTaskID',
  435 + name: '模型生成任务ID',
  436 + paraOrder: 11,
  437 + },
  438 + {
  439 + id: buildUUID(),
  440 +
  441 + custom: true,
  442 + dataSpecs: {
  443 + dataType: 'TEXT',
  444 + length: 64,
  445 + },
  446 + dataType: 'TEXT',
  447 + direction: 'PARAM_INPUT',
  448 + identifier: 'ModelEncryptType',
  449 + name: '模型加密方式',
  450 + paraOrder: 12,
  451 + },
  452 + {
  453 + id: buildUUID(),
  454 +
  455 + custom: true,
  456 + dataSpecs: {
  457 + dataType: 'TEXT',
  458 + length: 2048,
  459 + },
  460 + dataType: 'TEXT',
  461 + direction: 'PARAM_INPUT',
  462 + identifier: 'ModelExtension',
  463 + name: '扩展信息',
  464 + paraOrder: 13,
  465 + },
  466 + {
  467 + id: buildUUID(),
  468 +
  469 + custom: true,
  470 + dataSpecsList: [
  471 + {
  472 + id: buildUUID(),
  473 +
  474 + childDataType: 'TEXT',
  475 + childName: '模型结构体参数1',
  476 + childSpecsDTO: {
  477 + dataType: 'TEXT',
  478 + length: 10240,
  479 + },
  480 + custom: true,
  481 + dataSpecs: {
  482 + dataType: 'TEXT',
  483 + length: 10240,
  484 + },
  485 + dataType: 'STRUCT',
  486 + identifier: 'ModelParams1',
  487 + isStd: 0,
  488 + name: '模型结构体参数1',
  489 + },
  490 + {
  491 + id: buildUUID(),
  492 +
  493 + childDataType: 'BOOL',
  494 + childEnumSpecsDTO: [
  495 + {
  496 + dataType: 'BOOL',
  497 + name: '1',
  498 + value: 0,
  499 + },
  500 + {
  501 + dataType: 'BOOL',
  502 + name: '0',
  503 + value: 1,
  504 + },
  505 + ],
  506 + childName: '模型结构体参数2',
  507 + custom: true,
  508 + dataSpecsList: [
  509 + {
  510 + id: buildUUID(),
  511 +
  512 + dataType: 'BOOL',
  513 + name: '1',
  514 + value: 0,
  515 + },
  516 + {
  517 + id: buildUUID(),
  518 +
  519 + dataType: 'BOOL',
  520 + name: '0',
  521 + value: 1,
  522 + },
  523 + ],
  524 + dataType: 'STRUCT',
  525 + identifier: 'ModelParams2',
  526 + isStd: 0,
  527 + name: '模型结构体参数2',
  528 + },
  529 + ],
  530 + dataType: 'STRUCT',
  531 + direction: 'PARAM_INPUT',
  532 + identifier: 'ModelStruct',
  533 + name: '模型结构体',
  534 + paraOrder: 3,
130 }, 535 },
131 ], 536 ],
132 outputParams: [ 537 outputParams: [
133 { 538 {
134 id: buildUUID(), 539 id: buildUUID(),
  540 +
  541 + custom: true,
  542 + dataSpecs: {
  543 + dataType: 'TEXT',
  544 + length: 10240,
  545 + },
  546 + dataType: 'TEXT',
  547 + direction: 'PARAM_OUTPUT',
  548 + identifier: 'Django',
  549 + name: 'django',
  550 + paraOrder: 0,
  551 + },
  552 + {
  553 + id: buildUUID(),
  554 +
  555 + custom: true,
  556 + dataSpecsList: [
  557 + {
  558 + id: buildUUID(),
  559 +
  560 + dataType: 'BOOL',
  561 + name: '1',
  562 + value: 0,
  563 + },
  564 + {
  565 + id: buildUUID(),
  566 + dataType: 'BOOL',
  567 + name: '0',
  568 + value: 1,
  569 + },
  570 + ],
  571 + dataType: 'BOOL',
  572 + direction: 'PARAM_OUTPUT',
  573 + identifier: 'Flask',
  574 + name: 'flask',
  575 + paraOrder: 1,
  576 + },
  577 + {
  578 + id: buildUUID(),
135 custom: true, 579 custom: true,
136 dataSpecs: { 580 dataSpecs: {
137 dataType: 'INT', 581 dataType: 'INT',
138 - max: '20',  
139 - min: '10', 582 + max: '22',
  583 + min: '11',
140 step: '3', 584 step: '3',
141 - unit: 'pH',  
142 - unitName: 'PH值', 585 + unit: '只',
  586 + unitName: '只',
143 }, 587 },
144 dataType: 'INT', 588 dataType: 'INT',
145 direction: 'PARAM_OUTPUT', 589 direction: 'PARAM_OUTPUT',
146 - identifier: 'i2',  
147 - name: '输出参数2',  
148 - paraOrder: 0, 590 + identifier: 'Tornado',
  591 + name: 'tornado',
  592 + paraOrder: 2,
149 }, 593 },
150 ], 594 ],
151 productKey: 'hsrnXEfGFDv', 595 productKey: 'hsrnXEfGFDv',
152 required: false, 596 required: false,
153 - serviceName: '服务1', 597 + serviceName: '更新模型',
154 }, 598 },
155 ], 599 ],
156 }; 600 };
157 -  
158 -// {  
159 -// _ppk: {},  
160 -// events: [],  
161 -// productKey: 'hsrnXEfGFDv',  
162 -// properties: [  
163 -// {  
164 -// createTs: 1666259889029,  
165 -// custom: true,  
166 -// customFlag: true,  
167 -// dataSpecsList: [  
168 -// {  
169 -// id: buildUUID(),  
170 -// childDataType: 'INT',  
171 -// childName: '测试参数1',  
172 -// childSpecsDTO: {  
173 -// dataType: 'INT',  
174 -// max: '30',  
175 -// min: '20',  
176 -// step: '1',  
177 -// unit: 'mm/hour',  
178 -// unitName: '降雨量',  
179 -// },  
180 -// custom: true,  
181 -// dataSpecs: {  
182 -// dataType: 'INT',  
183 -// max: '30',  
184 -// min: '20',  
185 -// step: '1',  
186 -// unit: 'mm/hour',  
187 -// unitName: '降雨量',  
188 -// },  
189 -// dataType: 'STRUCT',  
190 -// identifier: 'iden2',  
191 -// isStd: 0,  
192 -// name: '测试参数1',  
193 -// },  
194 -// {  
195 -// id: buildUUID(),  
196 -// childDataType: 'INT',  
197 -// childName: '测试参数2',  
198 -// childSpecsDTO: {  
199 -// dataType: 'INT',  
200 -// max: '40',  
201 -// min: '30',  
202 -// step: '2',  
203 -// unit: 'pH',  
204 -// unitName: 'PH值',  
205 -// },  
206 -// custom: true,  
207 -// dataSpecs: {  
208 -// dataType: 'INT',  
209 -// max: '40',  
210 -// min: '30',  
211 -// step: '2',  
212 -// unit: 'pH',  
213 -// unitName: 'PH值',  
214 -// },  
215 -// dataType: 'STRUCT',  
216 -// identifier: 'idne2',  
217 -// isStd: 0,  
218 -// name: '测试参数2',  
219 -// },  
220 -// ],  
221 -// dataType: 'STRUCT',  
222 -// description: '21212',  
223 -// identifier: 'iden1',  
224 -// name: '测试功能',  
225 -// productKey: 'hsrnXEfGFDv',  
226 -// required: false,  
227 -// rwFlag: 'READ_WRITE',  
228 -// std: false,  
229 -// },  
230 -// ],  
231 -// services: [],  
232 -// };  
233 -  
234 -// {  
235 -// "_ppk": {},  
236 -// "events": [],  
237 -// "productKey": "hsrnXEfGFDv",  
238 -// "properties": [  
239 -// {  
240 -// "createTs": 1666259889029,  
241 -// "custom": true,  
242 -// "customFlag": true,  
243 -// "dataSpecsList": [  
244 -// {  
245 -// "childDataType": "INT",  
246 -// "childName": "测试参数1",  
247 -// "childSpecsDTO": {  
248 -// "dataType": "INT",  
249 -// "max": "30",  
250 -// "min": "20",  
251 -// "step": "1",  
252 -// "unit": "mm/hour",  
253 -// "unitName": "降雨量"  
254 -// },  
255 -// "custom": true,  
256 -// "dataSpecs": {  
257 -// "dataType": "INT",  
258 -// "max": "30",  
259 -// "min": "20",  
260 -// "step": "1",  
261 -// "unit": "mm/hour",  
262 -// "unitName": "降雨量"  
263 -// },  
264 -// "dataType": "STRUCT",  
265 -// "identifier": "iden2",  
266 -// "isStd": 0,  
267 -// "name": "测试参数1"  
268 -// },  
269 -// {  
270 -// "childDataType": "INT",  
271 -// "childName": "测试参数2",  
272 -// "childSpecsDTO": {  
273 -// "dataType": "INT",  
274 -// "max": "40",  
275 -// "min": "30",  
276 -// "step": "2",  
277 -// "unit": "pH",  
278 -// "unitName": "PH值"  
279 -// },  
280 -// "custom": true,  
281 -// "dataSpecs": {  
282 -// "dataType": "INT",  
283 -// "max": "40",  
284 -// "min": "30",  
285 -// "step": "2",  
286 -// "unit": "pH",  
287 -// "unitName": "PH值"  
288 -// },  
289 -// "dataType": "STRUCT",  
290 -// "identifier": "idne2",  
291 -// "isStd": 0,  
292 -// "name": "测试参数2"  
293 -// }  
294 -// ],  
295 -// "dataType": "STRUCT",  
296 -// "description": "21212",  
297 -// "identifier": "iden1",  
298 -// "name": "测试功能",  
299 -// "productKey": "hsrnXEfGFDv",  
300 -// "required": false,  
301 -// "rwFlag": "READ_WRITE",  
302 -// "std": false  
303 -// }  
304 -// ],  
305 -// "services": [  
306 -// {  
307 -// "callType": "ASYNC",  
308 -// "createTs": 1666343456853,  
309 -// "custom": true,  
310 -// "description": "4343",  
311 -// "identifier": "Iide1",  
312 -// "inputParams": [  
313 -// {  
314 -// "custom": true,  
315 -// "dataSpecs": {  
316 -// "dataType": "INT",  
317 -// "max": "20",  
318 -// "min": "10",  
319 -// "step": "2",  
320 -// "unit": "dS/m",  
321 -// "unitName": "土壤EC值"  
322 -// },  
323 -// "dataType": "INT",  
324 -// "direction": "PARAM_INPUT",  
325 -// "identifier": "i1",  
326 -// "name": "参数名字1",  
327 -// "paraOrder": 0  
328 -// }  
329 -// ],  
330 -// "outputParams": [  
331 -// {  
332 -// "custom": true,  
333 -// "dataSpecs": {  
334 -// "dataType": "INT",  
335 -// "max": "20",  
336 -// "min": "10",  
337 -// "step": "3",  
338 -// "unit": "pH",  
339 -// "unitName": "PH值"  
340 -// },  
341 -// "dataType": "INT",  
342 -// "direction": "PARAM_OUTPUT",  
343 -// "identifier": "i2",  
344 -// "name": "输出参数2",  
345 -// "paraOrder": 0  
346 -// }  
347 -// ],  
348 -// "productKey": "hsrnXEfGFDv",  
349 -// "required": false,  
350 -// "serviceName": "服务1"  
351 -// }  
352 -// ]  
353 -// }  
@@ -139,14 +139,17 @@ export const attrSchemas: FormSchema[] = [ @@ -139,14 +139,17 @@ export const attrSchemas: FormSchema[] = [
139 }, 139 },
140 { 140 {
141 field: 'length', 141 field: 'length',
142 - component: 'Input', 142 + component: 'InputNumber',
143 required: true, 143 required: true,
144 label: '数据长度', 144 label: '数据长度',
145 - defaultValue: '10240', 145 + defaultValue: 10240,
146 colProps: { 146 colProps: {
147 - span: 18, 147 + span: 8,
  148 + },
  149 + componentProps: {
  150 + max: 10240,
  151 + min: 1,
148 }, 152 },
149 - suffix: '字节',  
150 ifShow: ({ values }) => isString(values.dataType), 153 ifShow: ({ values }) => isString(values.dataType),
151 }, 154 },
152 { 155 {
@@ -224,7 +227,7 @@ export const serviceSchemas: FormSchema[] = [ @@ -224,7 +227,7 @@ export const serviceSchemas: FormSchema[] = [
224 colProps: { 227 colProps: {
225 span: 24, 228 span: 24,
226 }, 229 },
227 - defaultValue: 'asynchronous', 230 + defaultValue: 'ASYNC',
228 componentProps: { 231 componentProps: {
229 placeholder: '请选择调用方式', 232 placeholder: '请选择调用方式',
230 api: findDictItemByCode, 233 api: findDictItemByCode,
@@ -296,7 +299,7 @@ export const eventSchemas: FormSchema[] = [ @@ -296,7 +299,7 @@ export const eventSchemas: FormSchema[] = [
296 colProps: { 299 colProps: {
297 span: 24, 300 span: 24,
298 }, 301 },
299 - defaultValue: 'message', 302 + defaultValue: 'INFO_EVENT_TYPE',
300 componentProps: { 303 componentProps: {
301 placeholder: '请选择事件类型', 304 placeholder: '请选择事件类型',
302 api: findDictItemByCode, 305 api: findDictItemByCode,
@@ -400,7 +403,7 @@ export const addParamsSchemas: FormSchema[] = [ @@ -400,7 +403,7 @@ export const addParamsSchemas: FormSchema[] = [
400 { 403 {
401 field: 'structSlot', 404 field: 'structSlot',
402 label: 'JSON 对象', 405 label: 'JSON 对象',
403 - required: true, 406 + // required: true,
404 component: 'Input', 407 component: 'Input',
405 slot: 'structSlot', 408 slot: 'structSlot',
406 colProps: { 409 colProps: {
@@ -436,14 +439,17 @@ export const addParamsSchemas: FormSchema[] = [ @@ -436,14 +439,17 @@ export const addParamsSchemas: FormSchema[] = [
436 }, 439 },
437 { 440 {
438 field: 'length', 441 field: 'length',
439 - component: 'Input', 442 + component: 'InputNumber',
440 required: true, 443 required: true,
441 label: '数据长度', 444 label: '数据长度',
442 - defaultValue: '10240', 445 + defaultValue: 10240,
443 colProps: { 446 colProps: {
444 - span: 24, 447 + span: 8,
  448 + },
  449 + componentProps: {
  450 + max: 50000,
  451 + min: 1,
445 }, 452 },
446 - suffix: '字节',  
447 ifShow: ({ values }) => isString(values.dataType), 453 ifShow: ({ values }) => isString(values.dataType),
448 }, 454 },
449 { 455 {
@@ -14,3 +14,10 @@ export const validateValueRangeAndStep = (min, step, max) => { @@ -14,3 +14,10 @@ export const validateValueRangeAndStep = (min, step, max) => {
14 throw '步长不能大于取值范围的差值'; 14 throw '步长不能大于取值范围的差值';
15 } 15 }
16 }; 16 };
  17 +
  18 +export const validateValueBool = (boolClose, boolOpen) => {
  19 + if (boolClose == boolOpen) {
  20 + createMessage.error('布尔值不能相同');
  21 + throw '布尔值不能相同';
  22 + }
  23 +};
@@ -39,7 +39,9 @@ @@ -39,7 +39,9 @@
39 import { Select } from 'ant-design-vue'; 39 import { Select } from 'ant-design-vue';
40 import { useModal } from '/@/components/Modal'; 40 import { useModal } from '/@/components/Modal';
41 import ConverScriptModal from './ConverScriptModal.vue'; 41 import ConverScriptModal from './ConverScriptModal.vue';
  42 + import { useMessage } from '/@/hooks/web/useMessage';
42 43
  44 + const { createMessage } = useMessage();
43 const selectScript = reactive({ 45 const selectScript = reactive({
44 script: null, 46 script: null,
45 }); 47 });
@@ -78,6 +80,10 @@ @@ -78,6 +80,10 @@
78 }; 80 };
79 81
80 const getFormData = () => { 82 const getFormData = () => {
  83 + if (!selectScript.script) {
  84 + createMessage.error('请选择转换脚本');
  85 + throw '请选择转换脚本';
  86 + }
81 const value = { 87 const value = {
82 ...{ 88 ...{
83 scriptId: selectScript.script, 89 scriptId: selectScript.script,
@@ -16,16 +16,16 @@ @@ -16,16 +16,16 @@
16 <a-input v-if="ifAdd" v-model:value="scriptForm.scriptName" placeholder="请输入脚本名称" /> 16 <a-input v-if="ifAdd" v-model:value="scriptForm.scriptName" placeholder="请输入脚本名称" />
17 <a-input v-else v-model:value="scriptForm.inputParams" placeholder="请输入参数" /> 17 <a-input v-else v-model:value="scriptForm.inputParams" placeholder="请输入参数" />
18 </a-form-item> 18 </a-form-item>
19 - <a-form-item label="上报数据类型" name="reportType"> 19 + <a-form-item
  20 + label="上报数据类型"
  21 + name="reportType"
  22 + :rules="[{ required: true, message: '请选择上报数据类型' }]"
  23 + >
20 <a-space direction="vertical"> 24 <a-space direction="vertical">
21 <a-radio-group v-model:value="scriptForm.reportType" :options="typeOptions" /> 25 <a-radio-group v-model:value="scriptForm.reportType" :options="typeOptions" />
22 </a-space> 26 </a-space>
23 </a-form-item> 27 </a-form-item>
24 - <a-form-item  
25 - label="脚本内容"  
26 - name="scriptContent"  
27 - :rules="[{ required: true, message: '请输入脚本内容' }]"  
28 - > 28 + <a-form-item label="脚本内容" name="scriptContent">
29 <Card title="脚本内容" :bodyStyle="{ padding: 0, height: '280px' }"> 29 <Card title="脚本内容" :bodyStyle="{ padding: 0, height: '280px' }">
30 <template #extra> 30 <template #extra>
31 <a-button @click="handleFormat" size="small">格式化</a-button> 31 <a-button @click="handleFormat" size="small">格式化</a-button>
@@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
60 </div> 60 </div>
61 </template> 61 </template>
62 <script setup lang="ts"> 62 <script setup lang="ts">
63 - import { ref, unref, reactive, onMounted, toRef } from 'vue'; 63 + import { ref, unref, reactive, onMounted, toRefs } from 'vue';
64 import ace from 'ace-builds'; 64 import ace from 'ace-builds';
65 import { Card, Button } from 'ant-design-vue'; 65 import { Card, Button } from 'ant-design-vue';
66 import 'ace-builds/src-noconflict/theme-chrome'; // 默认设置的主题 66 import 'ace-builds/src-noconflict/theme-chrome'; // 默认设置的主题
@@ -81,12 +81,12 @@ @@ -81,12 +81,12 @@
81 scriptContent: '', 81 scriptContent: '',
82 inputParams: '', 82 inputParams: '',
83 outputParams: '', 83 outputParams: '',
84 - reportType: ['define 16'], 84 + reportType: 'HEX',
85 }); 85 });
86 const reportTypeOptions = reactive({ 86 const reportTypeOptions = reactive({
87 typeOptions: [], 87 typeOptions: [],
88 }); 88 });
89 - const typeOptions = toRef(reportTypeOptions, 'typeOptions'); 89 + const { typeOptions } = toRefs(reportTypeOptions);
90 const { createMessage } = useMessage(); 90 const { createMessage } = useMessage();
91 const { clipboardRef, copiedRef } = useCopyToClipboard(); 91 const { clipboardRef, copiedRef } = useCopyToClipboard();
92 const aceEditor = ref(); 92 const aceEditor = ref();
@@ -144,8 +144,16 @@ @@ -144,8 +144,16 @@
144 const formRef = ref(); 144 const formRef = ref();
145 const getFormData = async () => { 145 const getFormData = async () => {
146 const value = await formRef.value.validateFields(); 146 const value = await formRef.value.validateFields();
  147 + scriptForm.scriptContent = aceEditor.value.getValue();
  148 + if (scriptForm.scriptContent == '') {
  149 + createMessage.error('请编写脚本内容');
  150 + throw '请编写脚本内容';
  151 + }
147 if (!value) return; 152 if (!value) return;
148 - return value; 153 + return {
  154 + ...value,
  155 + ...{ scriptContent: scriptForm.scriptContent },
  156 + };
149 }; 157 };
150 const setFormData = (v) => { 158 const setFormData = (v) => {
151 for (let i in scriptForm) { 159 for (let i in scriptForm) {
@@ -90,6 +90,7 @@ export const formSchema: FormSchema[] = [ @@ -90,6 +90,7 @@ export const formSchema: FormSchema[] = [
90 colProps: { 90 colProps: {
91 span: 23, 91 span: 23,
92 }, 92 },
  93 + defaultValue: 'HEX',
93 componentProps: { 94 componentProps: {
94 placeholder: '请上报数据类型', 95 placeholder: '请上报数据类型',
95 api: findDictItemByCode, 96 api: findDictItemByCode,