index.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <script lang="ts" setup>
  2. import { IotDeviceApi } from '@/api/pms/device'
  3. import { useTableComponents } from '@/components/ZmTable/useTableComponents'
  4. import { useUserStore } from '@/store/modules/user'
  5. import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
  6. import { rangeShortcuts } from '@/utils/formatTime'
  7. import { useDebounceFn } from '@vueuse/core'
  8. const { t } = useI18n()
  9. const id = useUserStore().getUser.deptId ?? 157
  10. const deptId = id
  11. interface Query {
  12. deptId?: number
  13. deviceName?: string
  14. deviceCode?: string
  15. ifInline?: number
  16. pageNo: number
  17. pageSize: number
  18. time: string[]
  19. }
  20. const query = ref<Query>({
  21. pageNo: 1,
  22. pageSize: 12,
  23. deptId: id,
  24. time: []
  25. })
  26. interface OliDevice {
  27. id: number
  28. carId?: number
  29. deviceName: string
  30. deviceCode: string
  31. assetClassName: string
  32. deviceStatus: string
  33. ifInline: number
  34. lastInlineTime: string
  35. carOnline: string
  36. deptName: string
  37. vehicleName: string
  38. }
  39. const list = ref<OliDevice[]>([])
  40. const total = ref(0)
  41. const loading = ref(false)
  42. const loadList = useDebounceFn(async function () {
  43. loading.value = true
  44. try {
  45. const data = await IotDeviceApi.getIotDeviceOliConnectPage(query.value)
  46. // const data = await IotDeviceApi.getIotDeviceTdPage(query.value)
  47. list.value = data.list
  48. total.value = data.total
  49. } finally {
  50. loading.value = false
  51. }
  52. })
  53. function handleSizeChange(val: number) {
  54. query.value.pageSize = val
  55. handleQuery()
  56. }
  57. function handleCurrentChange(val: number) {
  58. query.value.pageNo = val
  59. loadList()
  60. }
  61. function handleQuery(setPage = true) {
  62. if (setPage) {
  63. query.value.pageNo = 1
  64. }
  65. loadList()
  66. }
  67. function resetQuery() {
  68. query.value = {
  69. pageNo: 1,
  70. pageSize: 12,
  71. deptId: id,
  72. time: []
  73. }
  74. handleQuery()
  75. }
  76. watch(
  77. [
  78. () => query.value.deptId,
  79. () => query.value.deviceName,
  80. () => query.value.deviceCode,
  81. () => query.value.ifInline
  82. ],
  83. () => {
  84. handleQuery()
  85. },
  86. { immediate: true }
  87. )
  88. const { ZmTable, ZmTableColumn } = useTableComponents<OliDevice>()
  89. </script>
  90. <template>
  91. <div
  92. class="grid grid-cols-[15%_1fr] grid-rows-[62px_1fr] gap-4 h-[calc(100vh-20px-var(--top-tool-height)-var(--tags-view-height)-var(--app-footer-height))]"
  93. >
  94. <div class="p-4 bg-white dark:bg-[#1d1e1f] shadow rounded-lg row-span-2">
  95. <DeptTreeSelect
  96. :top-id="156"
  97. :deptId="deptId"
  98. v-model="query.deptId"
  99. :init-select="false"
  100. :show-title="false"
  101. />
  102. </div>
  103. <el-form
  104. size="default"
  105. class="bg-white dark:bg-[#1d1e1f] rounded-lg shadow px-8 gap-8 flex items-center justify-between"
  106. >
  107. <div class="flex items-center gap-8">
  108. <el-form-item :label="t('monitor.deviceName')">
  109. <el-input
  110. v-model="query.deviceName"
  111. :placeholder="t('monitor.nameHolder')"
  112. clearable
  113. @keyup.enter="handleQuery()"
  114. class="!w-240px"
  115. />
  116. </el-form-item>
  117. <el-form-item :label="t('monitor.deviceCode')">
  118. <el-input
  119. v-model="query.deviceCode"
  120. :placeholder="t('monitor.codeHolder')"
  121. clearable
  122. @keyup.enter="handleQuery()"
  123. class="!w-240px"
  124. />
  125. </el-form-item>
  126. <el-form-item :label="t('monitor.ifInline')">
  127. <el-select
  128. v-model="query.ifInline"
  129. :placeholder="t('monitor.ifInlineHolder')"
  130. clearable
  131. class="!w-240px"
  132. >
  133. <el-option
  134. v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_STATUS)"
  135. :key="dict.value"
  136. :label="dict.label"
  137. :value="dict.value"
  138. />
  139. </el-select>
  140. </el-form-item>
  141. <el-form-item label="时间">
  142. <el-date-picker
  143. v-model="query.time"
  144. value-format="YYYY-MM-DD HH:mm:ss"
  145. type="daterange"
  146. start-placeholder="开始日期"
  147. end-placeholder="结束日期"
  148. :shortcuts="rangeShortcuts"
  149. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  150. class="!w-220px"
  151. />
  152. </el-form-item>
  153. <el-form-item>
  154. <el-button type="primary" @click="handleQuery()">
  155. <Icon icon="ep:search" class="mr-5px" /> 搜索
  156. </el-button>
  157. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" />重置</el-button>
  158. </el-form-item>
  159. </div>
  160. </el-form>
  161. <div class="bg-white dark:bg-[#1d1e1f] shadow rounded-lg flex flex-col p-4">
  162. <div class="flex-1 relative">
  163. <el-auto-resizer class="absolute">
  164. <template #default="{ width, height }">
  165. <zm-table
  166. :data="list"
  167. :loading="loading"
  168. :width="width"
  169. :max-height="height"
  170. :height="height"
  171. >
  172. <zm-table-column type="index" :label="t('monitor.serial')" :width="60" />
  173. <zm-table-column prop="deviceName" :label="t('monitor.deviceName')" />
  174. <zm-table-column prop="deviceCode" :label="t('monitor.deviceCode')" />
  175. <zm-table-column prop="assetClassName" :label="t('monitor.category')" />
  176. <zm-table-column prop="deviceStatus" :label="t('monitor.status')">
  177. <template #default="scope">
  178. <dict-tag :type="DICT_TYPE.PMS_DEVICE_STATUS" :value="scope.row.deviceStatus" />
  179. </template>
  180. </zm-table-column>
  181. <zm-table-column prop="ifInline" :label="t('monitor.ifInline')">
  182. <template #default="scope">
  183. <dict-tag :type="DICT_TYPE.IOT_DEVICE_STATUS" :value="scope.row.ifInline" />
  184. </template>
  185. </zm-table-column>
  186. <zm-table-column prop="lastInlineTime" :label="t('monitor.latestDataTime')" />
  187. </zm-table>
  188. </template>
  189. </el-auto-resizer>
  190. </div>
  191. <div class="h-10 mt-4 flex items-center justify-end">
  192. <el-pagination
  193. size="default"
  194. v-show="total > 0"
  195. v-model:current-page="query.pageNo"
  196. v-model:page-size="query.pageSize"
  197. :background="true"
  198. :page-sizes="[12, 20, 30, 50, 100]"
  199. :total="total"
  200. layout="total, sizes, prev, pager, next, jumper"
  201. @size-change="handleSizeChange"
  202. @current-change="handleCurrentChange"
  203. />
  204. </div>
  205. </div>
  206. </div>
  207. </template>
  208. <style scoped>
  209. :deep(.el-form-item) {
  210. margin-bottom: 0;
  211. }
  212. </style>