潘志宝
2024-11-04 23beab5084d97f25fb40ee57055436a1c84757f1
提交 | 用户 | 时间
24d32b 1 <template>
2   <el-drawer
3     v-model="drawer"
4     size="50%"
5     title="ModBus Tag"
6     :direction="direction"
7     :before-close="handleClose"
8   >
9     <!-- 搜索 -->
10     <ContentWrap>
11       <el-form
12         class="-mb-15px"
13         :model="queryParams"
14         ref="queryFormRef"
15         :inline="true"
16         label-width="68px"
17       >
18         <el-form-item label="Tag名称" prop="tagName">
19           <el-input
20             v-model="queryParams.tagName"
21             placeholder="请输入Tag名称"
22             clearable
23             @keyup.enter="handleQuery"
24             class="!w-240px"
25           />
26         </el-form-item>
27         <el-form-item>
28           <el-button @click="handleQuery">
29             <Icon icon="ep:search" class="mr-5px" />
30             搜索
31           </el-button>
32           <el-button @click="resetQuery">
33             <Icon icon="ep:refresh" class="mr-5px" />
34             重置
35           </el-button>
36           <el-button
37             type="primary"
38             plain
39             @click="openForm('create')"
40             v-hasPermi="['data:channel-modbus:create']"
41           >
42             <Icon icon="ep:plus" class="mr-5px" />
43             新增
44           </el-button>
45         </el-form-item>
46       </el-form>
47     </ContentWrap>
48     <!-- 列表 -->
49     <ContentWrap>
50       <el-table v-loading="loading" :data="list">
51         <el-table-column
52           prop="tagName"
53           label="Tag名称"
54           header-align="center"
55           align="left"
56           min-width="150"
57         />
58         <el-table-column
59           prop="dataType"
60           label="数据类型"
61           header-align="center"
62           align="center"
63         />
64         <el-table-column
65           prop="enabled"
66           label="是否启用"
67           header-align="center"
68           align="center"
69         >
70           <template #default="scope">
71             <el-tag v-if="scope.row.enabled === true" size="small">是</el-tag>
72             <el-tag v-else size="small" type="danger">否</el-tag>
73           </template>
74         </el-table-column>
75         <el-table-column label="操作" align="center" min-width="110" fixed="right">
76           <template #default="scope">
77             <el-button
78               link
79               type="primary"
80               @click="openForm('update', scope.row.id)"
81               v-hasPermi="['data:channel-modbus:update']"
82             >
83               编辑
84             </el-button>
85             <el-button
86               link
87               type="danger"
88               @click="handleDelete(scope.row.id)"
89               v-hasPermi="['data:channel-modbus:delete']"
90             >
91               删除
92             </el-button>
93           </template>
94         </el-table-column>
95       </el-table>
96       <!-- 分页 -->
97       <Pagination
98         :total="total"
99         v-model:page="queryParams.pageNo"
100         v-model:limit="queryParams.pageSize"
101         @pagination="getList"
102       />
103     </ContentWrap>
104     <!-- 表单弹窗:添加/修改 -->
105     <TagForm ref="formRef" @success="getList" />
106   </el-drawer>
107 </template>
108 <script lang="ts" setup>
109   import type { DrawerProps } from 'element-plus'
110   import * as OpcdaTagApi from "@/api/data/channel/opcda/tag";
111   import TagForm from './TagForm.vue'
112
113   defineOptions({name: 'ModBusTag'})
114
115   const message = useMessage() // 消息弹窗
116   const {t} = useI18n() // 国际化
117
118   const drawer = ref(false)
119   const direction = ref<DrawerProps['direction']>('rtl')
120   const loading = ref(true) // 列表的加载中
121   const total = ref(0) // 列表的总页数
122   const list = ref([]) // 列表的数据
123   const queryParams = reactive({
124     pageNo: 1,
125     pageSize: 10,
126     serverId: undefined,
127     tagName: undefined
128   })
129   const queryFormRef = ref() // 搜索的表单
130   const exportLoading = ref(false) // 导出的加载中
131
132   /** 查询列表 */
133   const getList = async () => {
134     loading.value = true
135     try {
136       const page = await OpcdaTagApi.getOpcdaTagPage(queryParams)
137       list.value = page.list
138       total.value = page.total
139     } finally {
140       loading.value = false
141     }
142   }
143
144   /** 搜索按钮操作 */
145   const handleQuery = () => {
146     queryParams.pageNo = 1
147     getList()
148   }
149
150   /** 重置按钮操作 */
151   const resetQuery = () => {
152     queryFormRef.value.resetFields()
153     handleQuery()
154   }
155
156   /** 添加/修改操作 */
157   const formRef = ref()
158   const openForm = (type: string, id?: number) => {
159     formRef.value.open(type, id, queryParams.serverId)
160   }
161
162   /** 删除按钮操作 */
163   const handleDelete = async (id: number) => {
164     try {
165       // 删除的二次确认
166       await message.delConfirm()
167       // 发起删除
168       await OpcdaTagApi.deleteOpcdaTag(id)
169       message.success(t('common.delSuccess'))
170       // 刷新列表
171       await getList()
172     } catch {
173     }
174   }
175
176   /** 打开弹窗 */
177   const open = async (serverId?: string) => {
178     resetForm()
179     drawer.value = true
180     queryParams.serverId = serverId
181     if (serverId) {
182       getList()
183     }
184   }
185   defineExpose({open}) // 提供 open 方法,用于打开弹窗
186
187   /** 重置表单 */
188   const resetForm = () => {
189     queryParams.pageNo = 1
190     queryParams.pageSize = 10
191     queryParams.serverId = ''
192     queryParams.tagName = ''
193   }
194
195   const handleClose = (done: () => void) => {
196     drawer.value = false
197   }
198 </script>