MainPlanDeviceList.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <Dialog v-model="dialogVisible" title="选择设备"
  3. style="width: 1100px; max-height: 800px" @close="handleClose">
  4. <ContentWrap>
  5. <el-form
  6. class="-mb-15px"
  7. :model="queryParams"
  8. ref="queryFormRef"
  9. :inline="true"
  10. label-width="68px"
  11. >
  12. <el-form-item label="设备名称" prop="deviceName">
  13. <el-input
  14. v-model="queryParams.deviceName"
  15. placeholder="请输入设备名称"
  16. clearable
  17. @keyup.enter="handleQuery"
  18. class="!w-240px"
  19. />
  20. </el-form-item>
  21. <el-form-item>
  22. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  23. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  24. <el-button @click="handleConfirm" class="custom-green-button"><Icon icon="ep:check" class="mr-5px" /> 确认选择</el-button>
  25. </el-form-item>
  26. </el-form>
  27. </ContentWrap>
  28. <ContentWrap>
  29. <el-table
  30. v-loading="loading"
  31. :data="list"
  32. :stripe="true"
  33. ref="tableRef"
  34. :show-overflow-tooltip="true"
  35. @row-click="handleRowClick"
  36. >
  37. <el-table-column width="60" label="选择">
  38. <template #default="{ row }">
  39. <el-checkbox
  40. :model-value="selectedRows.some(item => item.id === row.id)"
  41. @click.stop="toggleRow(row)"
  42. class="no-label-radio"
  43. />
  44. </template>
  45. </el-table-column>
  46. <el-table-column label="资产编码" align="center" prop="deviceCode" />
  47. <el-table-column label="设备名称" align="center" prop="deviceName" />
  48. <el-table-column label="所在部门id" align="center" prop="deptId" v-if="false"/>
  49. <el-table-column label="所在部门" align="center" prop="deptName" />
  50. <el-table-column label="设备状态" align="center" prop="deviceStatus">
  51. <template #default="scope">
  52. <dict-tag :type="DICT_TYPE.PMS_DEVICE_STATUS" :value="scope.row.status" />
  53. </template>
  54. </el-table-column>
  55. <el-table-column
  56. label="创建时间"
  57. align="center"
  58. prop="createTime"
  59. width="180"
  60. :formatter="dateFormatter"
  61. />
  62. </el-table>
  63. <!-- 分页 -->
  64. <Pagination
  65. :total="total"
  66. v-model:page="queryParams.pageNo"
  67. v-model:limit="queryParams.pageSize"
  68. @pagination="getList"
  69. />
  70. </ContentWrap>
  71. </Dialog>
  72. </template>
  73. <script setup lang="ts">
  74. import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
  75. import { DICT_TYPE } from '@/utils/dict'
  76. import { dateFormatter } from '@/utils/formatTime'
  77. import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
  78. const dialogVisible = ref(false) // 弹窗的是否展示
  79. const loading = ref(true) // 列表的加载中
  80. const queryFormRef = ref() // 搜索的表单
  81. const list = ref<IotDeviceVO[]>([]) // 列表的数据
  82. const total = ref(0) // 列表的总页数
  83. const tableRef = ref();
  84. const selectedRows = ref<IotDeviceVO[]>([]); // 多选数据(存储所有选中行的数组)
  85. // 调整 emit 类型
  86. const emit = defineEmits<{
  87. (e: 'choose', value: IotDeviceVO[]): void
  88. (e: 'close'): void
  89. }>()
  90. const queryParams = reactive({
  91. pageNo: 1,
  92. pageSize: 10,
  93. label: '',
  94. status: undefined,
  95. deptId: undefined,
  96. assetClass: undefined,
  97. deviceName: undefined
  98. })
  99. // 点击整行选中
  100. const handleRowClick = (row) => {
  101. toggleRow(row)
  102. }
  103. const open = async () => {
  104. dialogVisible.value = true
  105. // queryParams.assetClass = classify
  106. await getList()
  107. }
  108. defineExpose({ open })
  109. const { wsCache } = useCache()
  110. const getList = async () => {
  111. loading.value = true
  112. try {
  113. const user = wsCache.get(CACHE_KEY.USER)
  114. queryParams.deptId = user.user.deptId
  115. const data = await IotDeviceApi.getIotDevicePage(queryParams)
  116. list.value = data.list
  117. total.value = data.total
  118. } finally {
  119. loading.value = false
  120. }
  121. }
  122. // 多选 切换行选中状态
  123. const toggleRow = (row) => {
  124. const index = selectedRows.value.findIndex(item => item.id === row.id);
  125. if (index > -1) {
  126. selectedRows.value.splice(index, 1); // 取消选中
  127. } else {
  128. selectedRows.value.push(row); // 选中
  129. }
  130. };
  131. // 关闭时清空选择
  132. const handleClose = () => {
  133. tableRef.value?.clearSelection();
  134. selectedRows.value = []
  135. emit('close')
  136. };
  137. // 确认选择
  138. const handleConfirm = () => {
  139. if (selectedRows.value.length === 0) {
  140. ElMessage.warning('请至少选择一个物料')
  141. return
  142. }
  143. emit('choose', selectedRows.value.map(row => ({
  144. ...row,
  145. // 确保返回必要字段
  146. id: row.id,
  147. deviceCode: row.deviceCode,
  148. deviceName: row.deviceName,
  149. deviceStatus: row.deviceStatus,
  150. deptName: row.deptName,
  151. assetProperty: row.assetProperty
  152. })))
  153. dialogVisible.value = false;
  154. handleClose()
  155. };
  156. /** 搜索按钮操作 */
  157. const handleQuery = () => {
  158. queryParams.pageNo = 1
  159. getList()
  160. }
  161. const choose = (row: DictDataVO) => {
  162. emit('choose', row)
  163. dialogVisible.value = false
  164. }
  165. /** 重置按钮操作 */
  166. const resetQuery = () => {
  167. queryFormRef.value.resetFields()
  168. handleQuery()
  169. }
  170. </script>
  171. <style lang="scss" scoped>
  172. .no-label-radio .el-radio__label {
  173. display: none;
  174. }
  175. .no-label-radio .el-radio__inner {
  176. margin-right: 0;
  177. }
  178. /* 自定义淡绿色按钮 */
  179. :deep(.custom-green-button) {
  180. background-color: #e1f3d8;
  181. border-color: #e1f3d8;
  182. color: #67c23a;
  183. }
  184. /* 悬停效果 */
  185. :deep(.custom-green-button:hover) {
  186. background-color: #d1e8c0;
  187. border-color: #d1e8c0;
  188. color: #5daf34;
  189. }
  190. /* 点击效果 */
  191. :deep(.custom-green-button:active) {
  192. background-color: #c2dca8;
  193. border-color: #c2dca8;
  194. }
  195. </style>