houzhongjian
2024-11-27 9e876a11f6f0b384d4b1f0a60e066944dbcdeaa5
提交 | 用户 | 时间
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="address" prop="address">
32             <el-input v-model="formData.address" placeholder="请输入地址"/>
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 OpcuaTagApi from '@/api/data/channel/opcua/tag'
6c2636 57   import {CommonEnabled} from '@/utils/constants'
J 58   import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict'
24d32b 59
60   defineOptions({name: 'OpcuaTagForm'})
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     device: undefined,
71     tagName: undefined,
72     dataType: undefined,
6c2636 73     enabled: CommonEnabled.ENABLE,
24d32b 74     address: undefined,
75     samplingRate: undefined
76   })
77   const formRules = reactive({
78     tagName: [{required: true, message: '标签名不能为空', trigger: 'blur'}],
79     dataType: [{required: true, message: '数据类型不能为空', trigger: 'blur'}]
80   })
81   const formRef = ref() // 表单 Ref
82
83   /** 打开弹窗 */
84   const open = async (type: string, id?: number, device?: string) => {
85     dialogVisible.value = true
86     dialogTitle.value = t('action.' + type)
87     formType.value = type
88     resetForm()
89     if (device) {
90       formData.value.device = device
91     }
92     // 修改时,设置数据
93     if (id) {
94       formLoading.value = true
95       try {
96         formData.value = await OpcuaTagApi.getOpcuaTag(id)
97       } finally {
98         formLoading.value = false
99       }
100     }
101   }
102   defineExpose({open}) // 提供 open 方法,用于打开弹窗
103
104   /** 提交表单 */
105   const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
106   const submitForm = async () => {
107     // 校验表单
108     if (!formRef) return
109     const valid = await formRef.value.validate()
110     if (!valid) return
111     // 提交请求
112     formLoading.value = true
113     try {
114       const data = formData.value as unknown as OpcuaTagApi.OpcuaTagVO
115       if (formType.value === 'create') {
116         await OpcuaTagApi.createOpcuaTag(data)
117         message.success(t('common.createSuccess'))
118       } else {
119         await OpcuaTagApi.updateOpcuaTag(data)
120         message.success(t('common.updateSuccess'))
121       }
122       dialogVisible.value = false
123       // 发送操作成功的事件
124       emit('success')
125     } finally {
126       formLoading.value = false
127     }
128   }
129
130   /** 重置表单 */
131   const resetForm = () => {
132     formData.value = {
133       id: undefined,
134       device: undefined,
135       tagName: undefined,
136       dataType: undefined,
6c2636 137       enabled: CommonEnabled.ENABLE,
24d32b 138       address: undefined,
139       samplingRate: undefined
140     }
141     formRef.value?.resetFields()
142   }
143 </script>