equipment.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <!-- 装备管理 -->
  2. <template>
  3. <Container :query-form="queryForm" class="three-model-container">
  4. <!-- 查询表单 -->
  5. <template #query-form>
  6. <el-form-item label="装备名称">
  7. <el-input
  8. v-model="queryForm.modelName"
  9. placeholder="输入装备名称"
  10. clearable
  11. @keyup.enter.native="handleQuery"
  12. />
  13. </el-form-item>
  14. <el-form-item label="装备类型">
  15. <el-select v-model="queryForm.modelType" placeholder="全部" clearable>
  16. <el-option label="第一" value="building"/>
  17. <el-option label="第二" value="equipment"/>
  18. <el-option label="第三" value="vehicle"/>
  19. </el-select>
  20. </el-form-item>
  21. </template>
  22. <!-- 顶部操作 -->
  23. <template #header-actions>
  24. <el-button type="primary" icon="el-icon-search" @click="handleQuery">查询</el-button>
  25. <el-button @click="resetQuery">重置</el-button>
  26. <el-button type="primary" icon="el-icon-plus" @click="openAdd">新建</el-button>
  27. </template>
  28. <!-- 表格 -->
  29. <div class="table-container">
  30. <el-table
  31. ref="table"
  32. :data="tableData"
  33. border
  34. stripe
  35. size="mini"
  36. highlight-current-row
  37. @selection-change="handleSelectionChange"
  38. >
  39. <el-table-column type="selection" width="55"/>
  40. <el-table-column type="index" label="序号" width="60"/>
  41. <el-table-column prop="zbTypeName" label="所属装备类型" width="120" align="center"/>
  42. <el-table-column prop="zbModelName" label="所属装备型号名称" width="180" align="center" show-overflow-tooltip/>
  43. <el-table-column prop="zbName" label="装备名称" min-width="180" show-overflow-tooltip/>
  44. <el-table-column prop="zbCode" label="装备编号" width="120" align="center"/>
  45. <el-table-column prop="ipAddress" label="IP地址" width="120" align="center"/>
  46. <el-table-column prop="port" label="端口" width="100" align="center"/>
  47. <el-table-column prop="communicationType" label="通讯方式" width="100" align="center">
  48. <template slot-scope="{ row }">
  49. <span v-if="row.communicationType === '0'">PDXP</span>
  50. <span v-if="row.communicationType === '1'">UDP</span>
  51. <span v-else>TCP</span>
  52. </template>
  53. </el-table-column>
  54. <el-table-column prop="connectionStatus" label="连通状态" width="100" align="center">
  55. <template slot-scope="{ row }">
  56. <span v-if="row.connectionStatus === '0'">断开</span>
  57. <span v-if="row.connectionStatus === '1'">连接</span>
  58. <span v-else>-</span>
  59. </template>
  60. </el-table-column>
  61. <el-table-column prop="createTime" label="创建时间" align="center" sortable/>
  62. <el-table-column prop="userName" label="创建人" align="center" sortable/>
  63. <el-table-column label="操作" fixed="right" align="center">
  64. <template slot-scope="{ row }">
  65. <div class="action-bar">
  66. <el-link type="primary" :underline="false" @click="handleEdit(row)">编辑</el-link>
  67. <el-link type="danger" :underline="false" @click="handleDelete(row)">删除</el-link>
  68. </div>
  69. </template>
  70. </el-table-column>
  71. </el-table>
  72. <!-- 分页 -->
  73. <div class="pagination-container">
  74. <el-pagination
  75. background
  76. :current-page="pagination.currentPage"
  77. :page-sizes="[10, 20, 50]"
  78. :page-size="pagination.pageSize"
  79. layout="total, sizes, prev, pager, next, jumper"
  80. :total="pagination.total"
  81. @size-change="handleSizeChange"
  82. @current-change="handleCurrentChange"
  83. />
  84. </div>
  85. </div>
  86. <!-- 底部操作 -->
  87. <!--<template #footer-actions>-->
  88. <!-- <el-button icon="el-icon-download" @click="exportList">导出清单</el-button>-->
  89. <!-- <span class="footer-tips">选中 {{ selectedRows.length }} 项</span>-->
  90. <!--</template>-->
  91. <!-- 新增装备弹窗 -->
  92. <el-dialog
  93. :title="addOrUpdateTitle"
  94. :visible.sync="addVisible"
  95. width="720px"
  96. :close-on-click-modal="false"
  97. class="model-dialog"
  98. @closed="onAddClosed"
  99. >
  100. <el-form ref="addFormRef" :model="addForm" :rules="addRules" label-width="110px" size="small">
  101. <el-row :gutter="16">
  102. <el-col :span="12">
  103. <el-form-item label="所属装备类型" prop="zbTypeId">
  104. <el-select v-model="addForm.zbTypeId" placeholder="请选择所属装备类型">
  105. <el-option v-for="(item, index) in zbTypeList" :key="index" :label="item.zbTypeName" :value="item.id"></el-option>
  106. </el-select>
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="12">
  110. <el-form-item label="所属装备型号" prop="zbModelId">
  111. <el-select v-model="addForm.zbModelId" placeholder="请输入所属装备型号名称">
  112. <el-option v-for="(item, index) in zbModelList" :key="index" :label="item.zbModelName" :value="item.id"></el-option>
  113. </el-select>
  114. </el-form-item>
  115. </el-col>
  116. <el-col :span="24">
  117. <el-form-item label="装备名称" prop="zbName">
  118. <el-input v-model="addForm.zbName" placeholder="请输入装备名称" />
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="24">
  122. <el-form-item label="装备编号" prop="zbCode">
  123. <el-input v-model="addForm.zbCode" placeholder="请输入装备编号" />
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="12">
  127. <el-form-item label="IP地址" prop="ipAddress">
  128. <el-input
  129. v-model.trim="addForm.ipAddress"
  130. placeholder="请输入IP地址"
  131. />
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="12">
  135. <el-form-item label="端口号" prop="port">
  136. <el-input
  137. v-model.trim="addForm.port"
  138. placeholder="请输入端口号"
  139. />
  140. </el-form-item>
  141. </el-col>
  142. <el-col :span="12">
  143. <el-form-item label="通讯方式" prop="communicationType">
  144. <el-select v-model="addForm.communicationType">
  145. <el-option value="0" label="PDXP">PDXP</el-option>
  146. <el-option value="1" label="UDP">UDP</el-option>
  147. <el-option value="2" label="TCP">TCP</el-option>
  148. </el-select>
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="12">
  152. <el-form-item label="状态" prop="connectionStatus">
  153. <el-select v-model="addForm.connectionStatus">
  154. <el-option :value="0" label="断开"></el-option>
  155. <el-option :value="1" label="连接"></el-option>
  156. </el-select>
  157. </el-form-item>
  158. </el-col>
  159. </el-row>
  160. </el-form>
  161. <div slot="footer" class="dialog-footer">
  162. <el-button @click="addVisible=false">取 消</el-button>
  163. <el-button type="primary" @click="handleAddSubmit">确 定</el-button>
  164. </div>
  165. </el-dialog>
  166. </Container>
  167. </template>
  168. <script>
  169. import {getDataList, addEqu, editEqu, delEqu, getEquDetails, getAllEquTypes, getAllEquModels} from '@/api/equipment'
  170. export default {
  171. name: 'equipment',
  172. data() {
  173. return {
  174. addOrUpdateTitle: '新建',
  175. // 查询
  176. queryForm: {modelName: '', modelType: '', modelCategory: ''},
  177. // 列表&分页
  178. tableData: [],
  179. allData: [],
  180. selectedRows: [],
  181. pagination: {currentPage: 1, pageSize: 10, total: 0},
  182. // 新增弹窗
  183. addVisible: false,
  184. addForm: {
  185. id: '', // 主键(编辑时必填)
  186. zbTypeId: '', // 所属装备类型
  187. zbModelId: '', // 所属装备型号名称
  188. zbName: '', // 装备名称
  189. zbCode: '', // 装备编号
  190. ipAddress: '', // IP地址
  191. port: '', // 端口号
  192. communicationType: '',// 通讯方式(默认PDXP)
  193. },
  194. addRules: {
  195. },
  196. zbTypeList: [],
  197. zbModelList: [],
  198. }
  199. },
  200. created() {
  201. this.handleQuery()
  202. this.getTypes()
  203. this.getModels()
  204. },
  205. methods: {
  206. // 获取所有装备类型
  207. getTypes() {
  208. getAllEquTypes().then(res => {
  209. if (res.code !==0) {
  210. return
  211. }
  212. this.zbTypeList = res.data
  213. })
  214. },
  215. // 获取所有装备型号
  216. getModels() {
  217. getAllEquModels().then(res => {
  218. if (res.code !==0) {
  219. return
  220. }
  221. this.zbModelList = res.data
  222. })
  223. },
  224. /* ====== 查询&分页 ====== */
  225. handleQuery() {
  226. let param = {
  227. pageNo: this.pagination.currentPage,
  228. pageSize: this.pagination.pageSize,
  229. // ...this.queryForm
  230. }
  231. getDataList(param).then(res => {
  232. if (res.code !== 0) {
  233. return
  234. }
  235. this.tableData = res.data.rows || []
  236. this.pagination.total = res.data.total
  237. console.log(res)
  238. }).catch(() => {
  239. })
  240. },
  241. resetQuery() {
  242. this.queryForm = {modelName: '', modelType: '', modelCategory: ''}
  243. this.pagination.currentPage = 1
  244. this.handleQuery()
  245. },
  246. handleSizeChange(size) {
  247. this.pagination.pageSize = size
  248. this.pagination.currentPage = 1
  249. this.handleQuery()
  250. },
  251. handleCurrentChange(p) {
  252. this.pagination.currentPage = p
  253. this.handleQuery()
  254. },
  255. /* ====== 表格操作 ====== */
  256. handleSelectionChange(val) {
  257. this.selectedRows = val
  258. },
  259. handleEdit(row) {
  260. this.addForm = {...row}
  261. // getEquDetails(row.id).then(res => {
  262. // console.log(res)
  263. // })
  264. this.addOrUpdateTitle = '编辑'
  265. this.addVisible = true
  266. },
  267. togglePublish(row) {
  268. row.modelCategory = row.modelCategory === 'published' ? 'draft' : 'published'
  269. this.$message.success('状态已更新')
  270. },
  271. handleDelete(row) {
  272. // this.allData = this.allData.filter(r => r.code !== row.code)
  273. delEqu(row.id).then(res => {
  274. if (res.code !== 0) {
  275. return
  276. }
  277. this.$message.success('删除成功')
  278. this.handleQuery()
  279. }).catch(() => {
  280. })
  281. },
  282. /* ====== 新增或修改弹窗 ====== */
  283. openAdd() {
  284. this.addForm = {
  285. zbTypeId: '', // 所属装备类型
  286. zbModelId: '', // 所属装备型号名称
  287. zbName: '', // 装备名称
  288. zbCode: '', // 装备编号
  289. ipAddress: '', // IP地址
  290. port: '', // 端口号
  291. communicationType: '',// 通讯方式
  292. connectionStatus: '',
  293. }
  294. this.addOrUpdateTitle = '新建'
  295. this.addVisible = true
  296. this.$nextTick(() => {
  297. this.$refs.addFormRef && this.$refs.addFormRef.clearValidate()
  298. this.$refs.uploader && this.$refs.uploader.clearFiles()
  299. })
  300. },
  301. onAddClosed() {
  302. this.$refs.addFormRef && this.$refs.addFormRef.resetFields()
  303. },
  304. handleAddSubmit() {
  305. this.$refs.addFormRef.validate(valid => {
  306. if (!valid) return
  307. (this.addOrUpdateTitle === '编辑' ? editEqu : addEqu)(this.addForm).then(res => {
  308. if (res.code !== 0) {
  309. return
  310. }
  311. this.$message({
  312. message: '操作成功',
  313. type: 'info',
  314. duration: 500,
  315. onClose: () => {
  316. this.pagination.currentPage = 1
  317. this.addVisible = false
  318. this.handleQuery()
  319. }
  320. })
  321. })
  322. })
  323. },
  324. },
  325. }
  326. </script>
  327. <style>
  328. /* 统一表格暗色风格,消除白色条纹和容器 */
  329. .three-model-container .el-table,
  330. .three-model-container .el-table__fixed,
  331. .three-model-container .el-table__fixed-right {
  332. background: rgba(15, 31, 56, 0.86) !important;
  333. }
  334. .three-model-container .el-table__body-wrapper,
  335. .three-model-container .el-table__fixed-body-wrapper {
  336. background: rgba(15, 31, 56, 0.86) !important;
  337. }
  338. .three-model-container .el-table td,
  339. .three-model-container .el-table th.is-leaf {
  340. background: rgba(15, 31, 56, 0.86) !important;
  341. border-color: rgba(255, 255, 255, 0.08) !important;
  342. color: #e6efff;
  343. }
  344. .three-model-container .el-table th {
  345. background: rgba(30, 55, 95, 0.85) !important;
  346. color: #cfd9e6 !important;
  347. }
  348. .three-model-container .el-table--striped .el-table__body tr.el-table__row--striped td {
  349. background: rgba(15, 31, 56, 0.9) !important;
  350. }
  351. .three-model-container .el-table__body tr:hover > td {
  352. background: rgba(30, 64, 175, 0.25) !important;
  353. }
  354. .three-model-container .el-table__current-row > td {
  355. background: rgba(64, 150, 255, 0.2) !important;
  356. }
  357. .three-model-container .el-table__fixed::before,
  358. .three-model-container .el-table__fixed-right::before,
  359. .three-model-container .el-table::before {
  360. background-color: rgba(255, 255, 255, 0.08) !important;
  361. }
  362. .three-model-container .el-table__gutter,
  363. .three-model-container .el-table__fixed-right .el-table__fixed-header-wrapper,
  364. .three-model-container .el-table__fixed-right .el-table__fixed-body-wrapper,
  365. .three-model-container .el-table__fixed .el-table__fixed-header-wrapper,
  366. .three-model-container .el-table__fixed .el-table__fixed-body-wrapper {
  367. background: rgba(15, 31, 56, 0.86) !important;
  368. }
  369. .pagination-container {
  370. margin-top: 14px;
  371. display: flex;
  372. justify-content: flex-end;
  373. }
  374. .action-bar {
  375. display: flex;
  376. justify-content: space-around;
  377. width: 100%;
  378. }
  379. .model-dialog .el-dialog {
  380. background: #0b254a;
  381. border: 1px solid #364a64;
  382. }
  383. .model-dialog .el-dialog__title {
  384. color: #e6efff;
  385. }
  386. .model-dialog .el-dialog__header,
  387. .model-dialog .el-dialog__footer {
  388. border-color: #364a64;
  389. }
  390. .model-dialog .el-upload-list__item {
  391. background: rgba(255, 255, 255, 0.04);
  392. border-color: #364a64;
  393. color: #e6efff;
  394. }
  395. .footer-tips {
  396. color: #94a3b8;
  397. margin-left: 10px;
  398. }
  399. </style>