潘志宝
2024-11-22 df90c0c5cfa4de114798015b92120ad8ba8b4826
提交 | 用户 | 时间
24d32b 1 <template>
2   <Dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
3     <el-form
4       ref="formRef"
5       v-loading="formLoading"
6       :model="formData"
7       :rules="formRules"
8       label-width="120px"
9     >
10       <el-row>
11         <el-col :span="12">
12           <el-form-item label="Tag名称" prop="tagName">
13             <el-input v-model="formData.tagName" placeholder="请输Tag名称"/>
14           </el-form-item>
15         </el-col>
16         <el-col :span="12">
17           <el-form-item label="数据类型" prop="dataType">
18             <el-select v-model="formData.dataType" placeholder="请选择">
19               <el-option
20                 v-for="dict in getStrDictOptions(DICT_TYPE.TAG_DATA_TYPE)"
21                 :key="dict.value"
22                 :label="dict.label"
23                 :value="dict.value"
24               />
25             </el-select>
26           </el-form-item>
27         </el-col>
28       </el-row>
29       <el-row>
30         <el-col :span="12">
31           <el-form-item label="itemId" prop="itemId">
32             <el-input v-model="formData.itemId" placeholder="请输入ItemId"/>
33           </el-form-item>
34         </el-col>
35         <el-col :span="12">
36           <el-form-item label="是否启用" prop="enabled">
37             <el-select v-model="formData.enabled" placeholder="请选择">
38               <el-option
6c2636 39                 v-for="dict in getIntDictOptions(DICT_TYPE.COM_IS_INT)"
24d32b 40                 :key="dict.value"
41                 :label="dict.label"
42                 :value="dict.value"
43               />
44             </el-select>
45           </el-form-item>
46         </el-col>
47       </el-row>
48     </el-form>
49     <template #footer>
50       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
51       <el-button @click="dialogVisible = false">取 消</el-button>
52     </template>
53   </Dialog>
54 </template>
55 <script lang="ts" setup>
56   import * as OpcdaTagApi from '@/api/data/channel/opcda/tag'
6c2636 57   import {CommonEnabled} from '@/utils/constants'
J 58   import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict'
24d32b 59
60   defineOptions({name: 'OpcdaTagForm'})
61
62   const {t} = useI18n() // 国际化
63   const message = useMessage() // 消息弹窗
64   const dialogVisible = ref(false) // 弹窗的是否展示
65   const dialogTitle = ref('') // 弹窗的标题
66   const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
67   const formType = ref('') // 表单的类型:create - 新增;update - 修改
68   const formData = ref({
69     id: undefined,
70     serverId: undefined,
71     tagName: undefined,
72     dataType: undefined,
6c2636 73     enabled: CommonEnabled.ENABLE,
24d32b 74     itemId: undefined
75   })
76   const formRules = reactive({
77     tagName: [{required: true, message: '标签名不能为空', trigger: 'blur'}],
78     dataType: [{required: true, message: '数据类型不能为空', trigger: 'blur'}]
79   })
80   const formRef = ref() // 表单 Ref
81
82   /** 打开弹窗 */
83   const open = async (type: string, id?: number, serverId?: string) => {
84     dialogVisible.value = true
85     dialogTitle.value = t('action.' + type)
86     formType.value = type
87     resetForm()
88     if (serverId) {
89       formData.value.serverId = serverId
90     }
91     // 修改时,设置数据
92     if (id) {
93       formLoading.value = true
94       try {
95         formData.value = await OpcdaTagApi.getOpcdaTag(id)
96       } finally {
97         formLoading.value = false
98       }
99     }
100   }
101   defineExpose({open}) // 提供 open 方法,用于打开弹窗
102
103   /** 提交表单 */
104   const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
105   const submitForm = async () => {
106     // 校验表单
107     if (!formRef) return
108     const valid = await formRef.value.validate()
109     if (!valid) return
110     // 提交请求
111     formLoading.value = true
112     try {
113       const data = formData.value as unknown as OpcdaTagApi.OpcdaTagVO
114       if (formType.value === 'create') {
115         await OpcdaTagApi.createOpcdaTag(data)
116         message.success(t('common.createSuccess'))
117       } else {
118         await OpcdaTagApi.updateOpcdaTag(data)
119         message.success(t('common.updateSuccess'))
120       }
121       dialogVisible.value = false
122       // 发送操作成功的事件
123       emit('success')
124     } finally {
125       formLoading.value = false
126     }
127   }
128
129   /** 重置表单 */
130   const resetForm = () => {
131     formData.value = {
132       id: undefined,
133       serverId: undefined,
134       tagName: undefined,
135       dataType: undefined,
6c2636 136       enabled: CommonEnabled.ENABLE,
24d32b 137       itemId: undefined
138     }
139     formRef.value?.resetFields()
140   }
141 </script>