editOption.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(typeof ruleForm.valueType !== 'undefined' ? '修改' : '添加') + '参数'" v-model="isShowDialog" width="769px">
  4. <el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="120px">
  5. <el-form-item label="参数标识" prop="key">
  6. <el-input v-model="ruleForm.key" placeholder="请输入参数标识" />
  7. </el-form-item>
  8. <el-form-item label="参数名称" prop="name">
  9. <el-input v-model="ruleForm.name" placeholder="请输入参数名称" />
  10. </el-form-item>
  11. <el-form-item label="数据类型" prop="type">
  12. <el-select v-model="valueType.type" placeholder="请选择数据类型" @change="seletChange">
  13. <el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
  14. <el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" />
  15. </el-option-group>
  16. </el-select>
  17. </el-form-item>
  18. <TypeItem :valueType="valueType" :typeData="typeData"></TypeItem>
  19. <div v-if="type == 'array'">
  20. <el-form-item label="元素类型" prop="type">
  21. <el-select v-model="elementType.type" placeholder="请选择元素类型" @change="seletChanges">
  22. <el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
  23. <el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" :disabled="['array', 'enum'].includes(item.type)" />
  24. </el-option-group>
  25. </el-select>
  26. </el-form-item>
  27. <TypeItem :valueType="elementType" :typeData="typeData"></TypeItem>
  28. </div>
  29. <el-form-item label="参数描述 " prop="desc">
  30. <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入参数描述"></el-input>
  31. </el-form-item>
  32. </el-form>
  33. <template #footer>
  34. <span class="dialog-footer">
  35. <el-button @click="onCancel">取 消</el-button>
  36. <el-button type="primary" @click="onSubmit">{{ typeof ruleForm.valueType !== 'undefined' ? '修 改' : '添 加' }}</el-button>
  37. </span>
  38. </template>
  39. </el-dialog>
  40. </div>
  41. </template>
  42. <script lang="ts">
  43. import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
  44. import api from '/@/api/device';
  45. import TypeItem from './typeItem.vue';
  46. import { Plus, Minus, Right } from '@element-plus/icons-vue';
  47. import { ElMessage } from 'element-plus';
  48. import { validateNoSpace } from '/@/utils/validator';
  49. interface stateType {
  50. isShowDialog: boolean
  51. rules: any
  52. ruleForm: any
  53. valueType: any
  54. typeData: any
  55. elementType: any
  56. type: string
  57. [key: string]: any
  58. }
  59. const valueTypeBase = {
  60. // max: null,
  61. // min: null,
  62. unit: null,
  63. decimals: null,
  64. trueText: null,
  65. falseText: null,
  66. trueValue: null,
  67. falseValue: null,
  68. type: null,
  69. maxLength: null,
  70. }
  71. const valueType = {
  72. ...valueTypeBase,
  73. properties: [{
  74. 'key': '',
  75. 'name': '',
  76. 'desc': '',
  77. 'valueType': {
  78. ...valueTypeBase,
  79. elements: [{
  80. 'text': '',
  81. 'value': ''
  82. }]
  83. }
  84. }],
  85. elements: [{
  86. 'text': '',
  87. 'value': ''
  88. }]
  89. }
  90. export default defineComponent({
  91. name: 'deviceEditPro',
  92. components: { Plus, Minus, Right, TypeItem },
  93. setup(prop, { emit }) {
  94. const formRef = ref<HTMLElement | null>(null);
  95. const state = reactive<stateType>({
  96. isShowDialog: false,
  97. typeData: [], //
  98. type: '',
  99. types: '',
  100. valueType: JSON.parse(JSON.stringify(valueType)),
  101. elementType: JSON.parse(JSON.stringify(valueType)),
  102. properties: [JSON.parse(JSON.stringify(valueType))],
  103. enumdata: [
  104. {
  105. 'text': '',
  106. 'value': '',
  107. },
  108. ],
  109. ruleForm: {
  110. id: 0,
  111. name: '',
  112. key: '',
  113. transportProtocol: '',
  114. accessMode: '0',
  115. status: 1,
  116. valueType: {},
  117. desc: '',
  118. },
  119. rules: {
  120. name: [
  121. { required: true, message: '参数名称不能为空', trigger: 'blur' },
  122. { max: 32, message: '参数名称不能超过32个字符', trigger: 'blur' },
  123. { validator: validateNoSpace, message: '参数名称不能包含空格', trigger: 'blur' }
  124. ],
  125. key: [{ required: true, message: '参数标识不能为空', trigger: 'blur' }],
  126. accessMode: [{ required: true, message: '请选择是否只读', trigger: 'blur' }],
  127. },
  128. });
  129. // 打开弹窗
  130. const openDialog = (row?: any) => {
  131. resetForm();
  132. api.product.getDataType({ status: -1 }).then((res: any) => {
  133. const datat: any = Object.values(res.dataType);
  134. datat.forEach((item: any, index: number) => {
  135. if (index == 0) {
  136. datat[index]['label'] = '基础类型';
  137. datat[index]['options'] = item;
  138. } else {
  139. datat[index]['label'] = '扩展类型';
  140. datat[index]['options'] = item;
  141. }
  142. });
  143. state.typeData = datat || [];
  144. });
  145. if (row) {
  146. if (typeof row.valueType !== 'undefined') {
  147. state.type = row.valueType.type;
  148. if (typeof row.valueType.elementType !== 'undefined') state.elementType = row.valueType.elementType;
  149. if (typeof row.valueType.elements !== 'undefined') state.enumdata = row.valueType.elements;
  150. if (typeof row.valueType.properties !== 'undefined') state.properties = row.valueType.properties;
  151. if (typeof row.valueType.type !== 'undefined') state.valueType.type = row.valueType.type;
  152. const fieldCount = Object.keys(row.valueType).length;
  153. if (fieldCount > 1) state.valueType = row.valueType;
  154. }
  155. state.ruleForm = row;
  156. }
  157. state.isShowDialog = true;
  158. };
  159. const resetForm = () => {
  160. state.ruleForm = {
  161. name: '',
  162. desc: '',
  163. };
  164. state.valueType = JSON.parse(JSON.stringify(valueType));
  165. state.enumdata = [{
  166. 'text': '',
  167. 'value': '',
  168. }];
  169. state.elementType = JSON.parse(JSON.stringify(valueType));
  170. };
  171. const seletChange = (val: string) => {
  172. state.type = val;
  173. };
  174. const seletChanges = (val: string) => {
  175. state.types = val;
  176. };
  177. const addEnum = () => {
  178. state.enumdata.push({
  179. 'text': '',
  180. 'value': '',
  181. });
  182. };
  183. const delEnum = (index: number) => {
  184. state.enumdata.splice(index, 1);
  185. }
  186. // 关闭弹窗
  187. const closeDialog = () => {
  188. state.isShowDialog = false;
  189. };
  190. // 取消
  191. const onCancel = () => {
  192. closeDialog();
  193. };
  194. // 新增
  195. const onSubmit = () => {
  196. const formWrap = unref(formRef) as any;
  197. if (!formWrap) return;
  198. formWrap.validate((valid: boolean) => {
  199. if (valid) {
  200. if (typeof state.ruleForm.valueType !== 'undefined') {
  201. //修改
  202. if (state.type == 'array') {
  203. state.valueType.elementType = state.elementType;
  204. }
  205. state.ruleForm.valueType = state.valueType;
  206. // ElMessage.success('参数类型修改成功');
  207. closeDialog(); // 关闭弹窗
  208. emit('editTypeList', state.ruleForm, state.ruleForm.type_data);
  209. } else {
  210. // //添加
  211. if (state.type == 'array') {
  212. state.valueType.elementType = state.elementType;
  213. }
  214. state.ruleForm.valueType = state.valueType;
  215. ElMessage.success('参数类型添加成功');
  216. closeDialog(); // 关闭弹窗
  217. emit('typeList', state.ruleForm, state.ruleForm.type_data);
  218. }
  219. }
  220. });
  221. };
  222. return {
  223. openDialog,
  224. addEnum,
  225. delEnum,
  226. seletChange,
  227. seletChanges,
  228. closeDialog,
  229. onCancel,
  230. onSubmit,
  231. formRef,
  232. ...toRefs(state),
  233. };
  234. },
  235. });
  236. </script>
  237. <style scoped>
  238. .input-box {
  239. display: flex;
  240. flex-direction: row;
  241. justify-content: space-between;
  242. margin-top: 10px;
  243. }
  244. .input-option {
  245. line-height: 30px;
  246. padding-top: 5px;
  247. width: 140px;
  248. }
  249. .input-option i {
  250. margin: 0px 5px;
  251. border: 1px solid #c3c3c3;
  252. font-size: 16px;
  253. }
  254. .input-options {
  255. display: flex;
  256. align-items: center;
  257. color: #409eff;
  258. cursor: pointer
  259. }
  260. </style>