editOption.vue 6.7 KB

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