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="采集频率" prop="samplingRate">
32             <el-input v-model="formData.samplingRate" 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-row>
49         <el-col :span="24">
50           <el-form-item label="描述" prop="tagDesc">
51             <el-input v-model="formData.tagDesc" placeholder="描述"/>
52           </el-form-item>
53         </el-col>
54       </el-row>
55     </el-form>
56     <template #footer>
57       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
58       <el-button @click="dialogVisible = false">取 消</el-button>
59     </template>
60   </Dialog>
61 </template>
62 <script lang="ts" setup>
63   import * as KioTagApi from '@/api/data/channel/kio/tag'
6c2636 64   import {CommonEnabled} from '@/utils/constants'
24d32b 65   import {isPositiveInteger} from '@/utils/validate'
6c2636 66   import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict'
24d32b 67
68   defineOptions({name: 'KioTagForm'})
69
70   const {t} = useI18n() // 国际化
71   const message = useMessage() // 消息弹窗
72   const dialogVisible = ref(false) // 弹窗的是否展示
73   const dialogTitle = ref('') // 弹窗的标题
74   const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
75   const formType = ref('') // 表单的类型:create - 新增;update - 修改
76   const formData = ref({
77     id: undefined,
78     tagName: undefined,
79     dataType: undefined,
80     tagId: undefined,
81     tagDesc: '',
6c2636 82     enabled: CommonEnabled.ENABLE,
24d32b 83     device: undefined,
84     samplingRate: undefined
85
86   })
87   const validateNum = (rule, value, callback) => {
88     if (!isPositiveInteger(value)) {
89       callback(new Error('格式不正确'))
90     } else {
91       callback()
92     }
93   }
94   const formRules = reactive({
95     tagName: [{required: true, message: 'Tag名称不能为空', trigger: 'blur'}],
96     dataType: [{required: true, message: '数据类型不能为空', trigger: 'blur'}]
97   })
98   const formRef = ref() // 表单 Ref
99
100   /** 打开弹窗 */
101   const open = async (type: string, id?: number, device?: string) => {
102     dialogVisible.value = true
103     dialogTitle.value = t('action.' + type)
104     formType.value = type
105     resetForm()
106     if (device) {
107       formData.value.device = device
108     }
109     // 修改时,设置数据
110     if (id) {
111       formLoading.value = true
112       try {
113         formData.value = await KioTagApi.getKioTag(id)
114       } finally {
115         formLoading.value = false
116       }
117     }
118   }
119   defineExpose({open}) // 提供 open 方法,用于打开弹窗
120
121   /** 提交表单 */
122   const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
123   const submitForm = async () => {
124     // 校验表单
125     if (!formRef) return
126     const valid = await formRef.value.validate()
127     if (!valid) return
128     // 提交请求
129     formLoading.value = true
130     try {
131       const data = formData.value as unknown as KioTagApi.KioTagVO
132       if (formType.value === 'create') {
133         await KioTagApi.createKioTag(data)
134         message.success(t('common.createSuccess'))
135       } else {
136         await KioTagApi.updateKioTag(data)
137         message.success(t('common.updateSuccess'))
138       }
139       dialogVisible.value = false
140       // 发送操作成功的事件
141       emit('success')
142     } finally {
143       formLoading.value = false
144     }
145   }
146
147   /** 重置表单 */
148   const resetForm = () => {
149     formData.value = {
150       id: undefined,
151       tagName: undefined,
152       dataType: undefined,
153       tagId: undefined,
154       tagDesc: '',
6c2636 155       enabled: CommonEnabled.ENABLE,
24d32b 156       device: undefined,
157       samplingRate: undefined
158     }
159     formRef.value?.resetFields()
160   }
161 </script>
162 ss