Equipment.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <template>
  2. <div class="equipment-container">
  3. <el-card class="search-card">
  4. <el-form :inline="true" :model="searchForm" class="search-form">
  5. <el-form-item label="设备编码">
  6. <el-input v-model="searchForm.equipmentCode" placeholder="请输入设备编码" clearable style="width:180px" />
  7. </el-form-item>
  8. <el-form-item label="设备名称">
  9. <el-input v-model="searchForm.equipmentName" placeholder="请输入设备名称" clearable style="width:180px" />
  10. </el-form-item>
  11. <el-form-item label="设备型号">
  12. <el-input v-model="searchForm.equipmentModel" placeholder="请输入设备型号" clearable style="width:160px" />
  13. </el-form-item>
  14. <el-form-item label="制造商">
  15. <el-input v-model="searchForm.manufacturer" placeholder="请输入制造商" clearable style="width:160px" />
  16. </el-form-item>
  17. <el-form-item>
  18. <el-button type="primary" @click="handleSearch">查询</el-button>
  19. <el-button @click="handleReset">重置</el-button>
  20. <el-button type="success" @click="handleAdd">新增</el-button>
  21. </el-form-item>
  22. </el-form>
  23. </el-card>
  24. <el-card class="table-card">
  25. <el-table :data="tableData" border stripe v-loading="loading" style="width: 100%">
  26. <el-table-column prop="equipmentCode" label="设备编码" min-width="130" />
  27. <el-table-column prop="equipmentName" label="设备名称" min-width="160" />
  28. <el-table-column prop="equipmentModel" label="设备型号" width="110" />
  29. <el-table-column prop="manufacturer" label="制造商" width="110" />
  30. <el-table-column prop="networkName" label="所属管线" min-width="150">
  31. <template #default="{ row }">
  32. <span v-if="row.networkName">{{ row.networkName }}</span>
  33. <el-tag v-else type="info" size="small">未关联</el-tag>
  34. </template>
  35. </el-table-column>
  36. <el-table-column prop="pointName" label="所属管点" min-width="150">
  37. <template #default="{ row }">
  38. <span v-if="row.pointName">{{ row.pointName }}</span>
  39. <el-tag v-else type="info" size="small">未关联</el-tag>
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="运行状态" width="90">
  43. <template #default="{ row }">
  44. <el-tag v-if="row.currentStatus === 1" type="success" size="small">在用</el-tag>
  45. <el-tag v-else-if="row.currentStatus === 2" type="warning" size="small">闲置</el-tag>
  46. <el-tag v-else-if="row.currentStatus === 3" type="danger" size="small">维修</el-tag>
  47. <el-tag v-else-if="row.currentStatus === 4" type="info" size="small">报废</el-tag>
  48. <el-tag v-else-if="row.currentStatus === 5" type="warning" size="small">待入库</el-tag>
  49. <el-tag v-else type="info" size="small">未知</el-tag>
  50. </template>
  51. </el-table-column>
  52. <el-table-column label="报警" width="70">
  53. <template #default="{ row }">
  54. <el-tag :type="row.alarmStatus === 1 ? 'danger' : 'success'" size="small">
  55. {{ row.alarmStatus === 1 ? '报警' : '正常' }}
  56. </el-tag>
  57. </template>
  58. </el-table-column>
  59. <el-table-column label="在线" width="70">
  60. <template #default="{ row }">
  61. <el-tag :type="row.onlineStatus === 1 ? 'success' : 'info'" size="small">
  62. {{ row.onlineStatus === 1 ? '在线' : '离线' }}
  63. </el-tag>
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="操作" width="220" fixed="right">
  67. <template #default="{ row }">
  68. <el-button type="primary" size="small" @click="handleEdit(row)">编辑</el-button>
  69. <el-button type="info" size="small" @click="handleDetail(row)">详情</el-button>
  70. <el-button type="danger" size="small" @click="handleDelete(row)">删除</el-button>
  71. </template>
  72. </el-table-column>
  73. </el-table>
  74. <el-pagination
  75. v-model:current-page="pageNum" v-model:page-size="pageSize" :total="total"
  76. layout="total, prev, pager, next, sizes" :page-sizes="[10, 20, 50]"
  77. @change="loadData" style="margin-top: 16px; justify-content: flex-end"
  78. />
  79. </el-card>
  80. <el-dialog title="设备详情" v-model="detailVisible" width="1100px">
  81. <el-descriptions v-if="detailData" :column="2" border>
  82. <el-descriptions-item label="设备编码" :span="1">{{ detailData.equipmentCode }}</el-descriptions-item>
  83. <el-descriptions-item label="设备名称" :span="1">{{ detailData.equipmentName }}</el-descriptions-item>
  84. <el-descriptions-item label="设备型号">{{ detailData.equipmentModel }}</el-descriptions-item>
  85. <el-descriptions-item label="规格参数">{{ detailData.equipmentSpec }}</el-descriptions-item>
  86. <el-descriptions-item label="制造商">{{ detailData.manufacturer }}</el-descriptions-item>
  87. <el-descriptions-item label="生产日期">{{ detailData.productionDate }}</el-descriptions-item>
  88. <el-descriptions-item label="所属管线">{{ detailData.networkName || '未关联' }}</el-descriptions-item>
  89. <el-descriptions-item label="管线等级">{{ detailData.networkLevel || '-' }}</el-descriptions-item>
  90. <el-descriptions-item label="所属管点">{{ detailData.pointName || '未关联' }}</el-descriptions-item>
  91. <el-descriptions-item label="管点类型">{{ detailData.pointType || '-' }}</el-descriptions-item>
  92. <el-descriptions-item label="安装位置">{{ detailData.equipmentLocation }}</el-descriptions-item>
  93. <el-descriptions-item label="安装时间">{{ detailData.installTime }}</el-descriptions-item>
  94. <el-descriptions-item label="运行状态">
  95. <el-tag v-if="detailData.currentStatus === 1" type="success" size="small">在用</el-tag>
  96. <el-tag v-else-if="detailData.currentStatus === 2" type="warning" size="small">闲置</el-tag>
  97. <el-tag v-else-if="detailData.currentStatus === 3" type="danger" size="small">维修</el-tag>
  98. <el-tag v-else-if="detailData.currentStatus === 4" type="info" size="small">报废</el-tag>
  99. <el-tag v-else-if="detailData.currentStatus === 5" type="warning" size="small">待入库</el-tag>
  100. <span v-else>-</span>
  101. </el-descriptions-item>
  102. <el-descriptions-item label="报警状态">
  103. <el-tag :type="detailData.alarmStatus === 1 ? 'danger' : 'success'" size="small">
  104. {{ detailData.alarmStatus === 1 ? '报警' : '正常' }}
  105. </el-tag>
  106. </el-descriptions-item>
  107. <el-descriptions-item label="在线状态">
  108. <el-tag :type="detailData.onlineStatus === 1 ? 'success' : 'info'" size="small">
  109. {{ detailData.onlineStatus === 1 ? '在线' : '离线' }}
  110. </el-tag>
  111. </el-descriptions-item>
  112. <el-descriptions-item label="维护人员">{{ detailData.maintainer || '-' }}</el-descriptions-item>
  113. <el-descriptions-item label="联系方式">{{ detailData.maintainerPhone || '-' }}</el-descriptions-item>
  114. <el-descriptions-item label="备注" :span="2">{{ detailData.remark || '-' }}</el-descriptions-item>
  115. </el-descriptions>
  116. </el-dialog>
  117. <el-dialog :title="dialogTitle" v-model="dialogVisible" width="1100px" destroy-on-close>
  118. <el-form :model="formData" ref="formRef" label-width="110px" size="default">
  119. <el-row :gutter="28">
  120. <el-col :span="12">
  121. <el-form-item label="设备编码" prop="equipmentCode">
  122. <el-input v-model="formData.equipmentCode" placeholder="请输入设备编码" />
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="12">
  126. <el-form-item label="设备名称" prop="equipmentName">
  127. <el-input v-model="formData.equipmentName" placeholder="请输入设备名称" />
  128. </el-form-item>
  129. </el-col>
  130. </el-row>
  131. <el-row :gutter="28">
  132. <el-col :span="12">
  133. <el-form-item label="设备型号">
  134. <el-input v-model="formData.equipmentModel" />
  135. </el-form-item>
  136. </el-col>
  137. <el-col :span="12">
  138. <el-form-item label="规格参数">
  139. <el-input v-model="formData.equipmentSpec" />
  140. </el-form-item>
  141. </el-col>
  142. </el-row>
  143. <el-row :gutter="28">
  144. <el-col :span="12">
  145. <el-form-item label="制造商">
  146. <el-input v-model="formData.manufacturer" />
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="12">
  150. <el-form-item label="安装位置">
  151. <el-input v-model="formData.equipmentLocation" />
  152. </el-form-item>
  153. </el-col>
  154. </el-row>
  155. <el-row :gutter="28">
  156. <el-col :span="12">
  157. <el-form-item label="经度">
  158. <el-input-number v-model="formData.longitude" :precision="10" style="width:100%" />
  159. </el-form-item>
  160. </el-col>
  161. <el-col :span="12">
  162. <el-form-item label="纬度">
  163. <el-input-number v-model="formData.latitude" :precision="10" style="width:100%" />
  164. </el-form-item>
  165. </el-col>
  166. </el-row>
  167. <el-row :gutter="28">
  168. <el-col :span="12">
  169. <el-form-item label="维护人员">
  170. <el-input v-model="formData.maintainer" />
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="12">
  174. <el-form-item label="联系方式">
  175. <el-input v-model="formData.maintainerPhone" />
  176. </el-form-item>
  177. </el-col>
  178. </el-row>
  179. <el-form-item label="备注">
  180. <el-input v-model="formData.remark" type="textarea" :rows="3" />
  181. </el-form-item>
  182. </el-form>
  183. <template #footer>
  184. <el-button @click="dialogVisible = false">取消</el-button>
  185. <el-button type="primary" @click="handleSave">确定</el-button>
  186. </template>
  187. </el-dialog>
  188. </div>
  189. </template>
  190. <script setup>
  191. import { ref, reactive, onMounted } from 'vue'
  192. import { ElMessage, ElMessageBox } from 'element-plus'
  193. import { getEquipmentFullPage, getEquipmentById, addEquipment, updateEquipment, deleteEquipment } from '@/api/pipeNetwork/basic'
  194. const loading = ref(false)
  195. const tableData = ref([])
  196. const pageNum = ref(1)
  197. const pageSize = ref(10)
  198. const total = ref(0)
  199. const searchForm = reactive({ equipmentCode: '', equipmentName: '', equipmentModel: '', manufacturer: '' })
  200. const dialogVisible = ref(false)
  201. const dialogTitle = ref('新增')
  202. const formRef = ref(null)
  203. const detailVisible = ref(false)
  204. const detailData = ref(null)
  205. const formData = reactive({
  206. equipmentId: '', equipmentCode: '', equipmentName: '', equipmentModel: '',
  207. equipmentSpec: '', manufacturer: '', equipmentLocation: '',
  208. longitude: null, latitude: null, maintainer: '', maintainerPhone: '', remark: ''
  209. })
  210. async function loadData() {
  211. loading.value = true
  212. try {
  213. const res = await getEquipmentFullPage(pageNum.value, pageSize.value, searchForm)
  214. tableData.value = (res.data && res.data.records) ? res.data.records : []
  215. total.value = (res.data && res.data.total) ? res.data.total : 0
  216. } catch (e) { console.error(e) } finally { loading.value = false }
  217. }
  218. function handleSearch() { pageNum.value = 1; loadData() }
  219. function handleReset() {
  220. Object.assign(searchForm, { equipmentCode: '', equipmentName: '', equipmentModel: '', manufacturer: '' })
  221. handleSearch()
  222. }
  223. function handleAdd() {
  224. dialogTitle.value = '新增'
  225. Object.assign(formData, { equipmentId: '', equipmentCode: '', equipmentName: '', equipmentModel: '', equipmentSpec: '', manufacturer: '', equipmentLocation: '', longitude: null, latitude: null, maintainer: '', maintainerPhone: '', remark: '' })
  226. dialogVisible.value = true
  227. }
  228. function handleEdit(row) { dialogTitle.value = '编辑'; Object.assign(formData, row); dialogVisible.value = true }
  229. async function handleSave() {
  230. try {
  231. if (formData.equipmentId) { await updateEquipment(formData); ElMessage.success('修改成功') }
  232. else { await addEquipment(formData); ElMessage.success('新增成功') }
  233. dialogVisible.value = false; loadData()
  234. } catch (e) { console.error(e) }
  235. }
  236. function handleDelete(row) {
  237. ElMessageBox.confirm('确认删除该设备信息?', '提示', { type: 'warning' }).then(async () => {
  238. await deleteEquipment(row.equipmentId); ElMessage.success('删除成功'); loadData()
  239. }).catch(() => {})
  240. }
  241. async function handleDetail(row) {
  242. detailData.value = row
  243. detailVisible.value = true
  244. }
  245. onMounted(() => { loadData() })
  246. </script>
  247. <style scoped>
  248. .equipment-container { padding: 16px; }
  249. .search-card { margin-bottom: 16px; }
  250. .search-form { display: flex; flex-wrap: wrap; }
  251. </style>