deviceAdmin.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. <template>
  2. <div class="device-management">
  3. <div class="header_title">设备管理</div>
  4. <!-- 设备管理 -->
  5. <div class="box">
  6. <div class="box_item" v-for="item in boxList" :key="item.id">
  7. <p>{{item.name}}</p>
  8. <p>{{item.value}}</p>
  9. </div>
  10. </div>
  11. <!-- 查询条件 -->
  12. <div class="conditions">
  13. <el-form ref="searchForm" inline :model="searchForm" size="mini" label-width="110px">
  14. <el-form-item label="注册时间:" prop="registerTime" style="width: 310px">
  15. <!-- <el-input v-model="searchForm.registerTime" placeholder=""></el-input> -->
  16. <el-date-picker
  17. v-model="searchForm.registerTime"
  18. type="daterange"
  19. placeholder="选择日期"
  20. style="width: 200px"
  21. value-format="yyyy-MM-dd">
  22. </el-date-picker>
  23. </el-form-item>
  24. <el-form-item label="省市县:" prop="countyName" style="width: 310px">
  25. <el-input v-model="searchForm.countyName" placeholder="地县名/编码" style="width: 200px"></el-input>
  26. </el-form-item>
  27. <el-form-item label="牧场:" prop="farmName" style="width: 310px">
  28. <el-input v-model="searchForm.farmName" placeholder="牧场名/编码" style="width: 200px"></el-input>
  29. </el-form-item>
  30. <!-- <el-form-item label="栋舍:" prop="pigsty" style="width: 310px">
  31. <el-input v-model="searchForm.pigsty" placeholder="" style="width: 200px"></el-input>
  32. </el-form-item> -->
  33. <el-form-item label="网络通信状态:" prop="networkStatus" style="width: 310px">
  34. <el-select v-model="searchForm.networkStatus" style="width: 200px">
  35. <el-option
  36. v-for="item in networkList"
  37. :key="item.value"
  38. :label="item.label"
  39. :value="item.value">
  40. </el-option>
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item label="采集状态:" prop="acqStatus" style="width: 310px">
  44. <el-select v-model="searchForm.acqStatus" style="width: 200px">
  45. <el-option
  46. v-for="item in acqList"
  47. :key="item.value"
  48. :label="item.label"
  49. :value="item.value">
  50. </el-option>
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item label="注销状态:" prop="canStatus" style="width: 310px">
  54. <el-select v-model="searchForm.canStatus" style="width: 200px">
  55. <el-option
  56. v-for="item in canList"
  57. :key="item.value"
  58. :label="item.label"
  59. :value="item.value">
  60. </el-option>
  61. </el-select>
  62. </el-form-item>
  63. <el-form-item label="设备编码:" prop="deviceCode" style="width: 310px">
  64. <el-input v-model="searchForm.deviceCode" placeholder="" style="width: 200px"></el-input>
  65. </el-form-item>
  66. <el-form-item style="margin-left: 55px">
  67. <el-button type="primary" @click="init">查询</el-button>
  68. <el-button plain type="info" @click="resetForm('searchForm')">清空</el-button>
  69. </el-form-item>
  70. </el-form>
  71. </div>
  72. <!-- 按钮栏 -->
  73. <div class="title">
  74. <div class="title-left">
  75. <i class="el-icon-s-unfold"></i>
  76. <span>设备列表</span>
  77. <el-button plain size="mini" class="button-margin">批量上传</el-button>
  78. <el-button type="primary" plain size="mini" @click="handleAddOrEdit">新增设备</el-button>
  79. </div>
  80. </div>
  81. <!-- 表格 -->
  82. <el-table
  83. :data="tableData"
  84. style="width: 100%"
  85. height="700"
  86. border
  87. stripe
  88. :default-sort="{prop: 'date', order: 'descending'}"
  89. size="mini"
  90. v-loading="dataListLoading">
  91. <el-table-column
  92. type="selection"
  93. width="40"
  94. align="center">
  95. </el-table-column>
  96. <el-table-column
  97. prop="id"
  98. label="注册ID"
  99. width="60"
  100. align="center">
  101. </el-table-column>
  102. <el-table-column
  103. prop="registerTime"
  104. label="注册时间"
  105. width="90"
  106. align="center">
  107. </el-table-column>
  108. <el-table-column
  109. prop="deviceCode"
  110. label="设备编码"
  111. width="80"
  112. align="center">
  113. </el-table-column>
  114. <el-table-column
  115. prop="countyName"
  116. label="省市县"
  117. align="center">
  118. </el-table-column>
  119. <el-table-column
  120. prop="countyCode"
  121. label="省市县编码"
  122. align="center">
  123. </el-table-column>
  124. <el-table-column
  125. prop="farmName"
  126. label="牧场名称"
  127. width="90"
  128. align="center">
  129. </el-table-column>
  130. <el-table-column
  131. prop="farmCode"
  132. label="牧场编码"
  133. width="90"
  134. align="center">
  135. </el-table-column>
  136. <el-table-column
  137. label="阶段"
  138. sortable
  139. width="70"
  140. align="center">
  141. <template slot-scope="scope">
  142. <span>{{ stageList[scope.row.stage - 1].label }}</span>
  143. <!-- <span>{{ scope.row.stage }}</span> -->
  144. </template>
  145. </el-table-column>
  146. <el-table-column
  147. prop="pigpenName"
  148. label="栋舍"
  149. width="100"
  150. align="center">
  151. </el-table-column>
  152. <el-table-column
  153. prop="serverIp"
  154. label="上传服务器地址"
  155. width="105"
  156. align="center">
  157. </el-table-column>
  158. <el-table-column
  159. prop="port"
  160. label="端口"
  161. width="60"
  162. align="center">
  163. </el-table-column>
  164. <el-table-column
  165. prop="lastTime"
  166. label="最后上传时间"
  167. sortable
  168. align="center">
  169. </el-table-column>
  170. <el-table-column
  171. label="网络通信状态"
  172. width="70"
  173. align="center">
  174. <template slot-scope="scope">
  175. <span :class="{ 'normal': scope.row.networkStatus === 1, 'abnormal': scope.row.networkStatus === 0}">{{ networkList[1 - scope.row.networkStatus].label }}</span>
  176. </template>
  177. </el-table-column>
  178. <el-table-column
  179. label="采集状态"
  180. width="70"
  181. align="center">
  182. <template slot-scope="scope">
  183. <span :class="{ 'normal': scope.row.acqStatus === 1, 'abnormal': scope.row.acqStatus === 2}">{{ acqList[scope.row.acqStatus - 1].label }}</span>
  184. </template>
  185. </el-table-column>
  186. <el-table-column
  187. label="注销状态"
  188. width="70"
  189. align="center">
  190. <template slot-scope="scope">
  191. <span :class="{ 'normal': scope.row.canStatus === 1, 'logout': scope.row.canStatus === 0}">{{ canList[1 - scope.row.canStatus].label }}</span>
  192. </template>
  193. </el-table-column>
  194. <el-table-column
  195. label="操作"
  196. align="center">
  197. <template slot-scope="scope">
  198. <el-button type="text" size="small" @click="handleCheck(scope.row)">查看</el-button>
  199. <el-button type="text" size="small" @click="handleAddOrEdit(scope.row)">编辑</el-button>
  200. <el-button v-if="scope.row.canStatus === 1" type="text" size="small" @click="handleLogout(scope.row)">注销</el-button>
  201. <el-button v-else type="text" size="small" @click="handleLogin(scope.row)">在线</el-button>
  202. <el-button type="text" size="small" @click="handleDelete(scope.row)">删除</el-button>
  203. </template>
  204. <!-- TODO: 按钮 -->
  205. </el-table-column>
  206. </el-table>
  207. <table-footer
  208. :totals="totalPages"
  209. :size="pageSize"
  210. @sizeChange="sizeChange"
  211. @pageChange="pageChange">
  212. </table-footer>
  213. <!-- 新增或者编辑设备弹出框 -->
  214. <add-or-update ref="addOrUpdate" @refreshData="init"></add-or-update>
  215. </div>
  216. </template>
  217. <script>
  218. import TableFooter from "../../components/TableFooter";
  219. import addOrUpdate from './addOrUpdate.vue'
  220. import {mapState} from 'vuex'
  221. export default {
  222. name: "deviceAdmin",
  223. data() {
  224. return {
  225. boxList: [ // 设备管理的方框
  226. {
  227. id: 1,
  228. name: '采集设备总数',
  229. value: 2500,
  230. },
  231. {
  232. id: 2,
  233. name: '正常设备总数',
  234. value: 2498
  235. },
  236. {
  237. id: 3,
  238. name: '异常设备总数',
  239. value: 1
  240. },
  241. {
  242. id: 4,
  243. name: '注销设备总数',
  244. value: 1
  245. }
  246. ],
  247. farmList: [ // 查询条件 - 牧场选择
  248. //
  249. ],
  250. searchForm: { // 查询条件
  251. registerTime: [],
  252. deviceCode: '',
  253. countyName: '',
  254. farmName: '',
  255. networkStatus: undefined,
  256. acqStatus: undefined,
  257. canStatus: undefined,
  258. // sortord: ''
  259. },
  260. pageSizeList: [ // 表格显示条数
  261. {
  262. value: 0,
  263. label: '显示条数'
  264. },
  265. {
  266. value: 10,
  267. label: '10条/页'
  268. },
  269. {
  270. value: 20,
  271. label: '20条/页'
  272. },
  273. {
  274. value: 50,
  275. label: '50条/页'
  276. }
  277. ],
  278. pageSize: 20, // 表格显示条数
  279. tableData: [], // 表格数据
  280. totalPages: 0, // 共 n 条数据
  281. pageIndex: 1, // 表格当前页数
  282. dataListLoading: true,
  283. stageList: [ // 阶段
  284. {
  285. value: 1,
  286. label: '配怀'
  287. },
  288. {
  289. value: 2,
  290. label: '分娩'
  291. },
  292. {
  293. value: 3,
  294. label: '保育'
  295. },
  296. {
  297. value: 4,
  298. label: '育成育肥'
  299. },
  300. {
  301. value: 5,
  302. label: '空怀'
  303. },
  304. {
  305. value: 6,
  306. label: '后备母猪'
  307. },
  308. {
  309. value: 7,
  310. label: '公猪'
  311. },
  312. {
  313. value: 8,
  314. label: '病死猪场内收集'
  315. },
  316. {
  317. value: 9,
  318. label: '病死猪无害化'
  319. }
  320. ],
  321. networkList: [ // 网络通信状态 —— 查询条件 + 表格通用
  322. {
  323. value: 1,
  324. label: '正常'
  325. },
  326. {
  327. value: 0,
  328. label: '异常'
  329. }
  330. ],
  331. acqList: [ // 采集状态 —— 查询条件 + 表格通用
  332. {
  333. value: 1,
  334. label: '正常'
  335. },
  336. {
  337. value: 2,
  338. label: '异常'
  339. }
  340. ],
  341. canList: [ // 注销状态 —— 查询条件 + 表格通用
  342. {
  343. value: 1,
  344. label: '正常'
  345. },
  346. {
  347. value: 0,
  348. label: '注销'
  349. }
  350. ]
  351. }
  352. },
  353. components: {
  354. TableFooter,
  355. addOrUpdate
  356. },
  357. computed: {
  358. ...mapState(['baseUrl'])
  359. },
  360. methods: {
  361. // 初始化
  362. init () {
  363. console.log(this.searchForm.registerTime);
  364. this.$http({
  365. url: this.$http.adornUrl(`${this.baseUrl}/manager/collectorregister/list`),
  366. method: 'get',
  367. params: this.$http.adornParams({
  368. 'page': this.pageIndex,
  369. 'limit': this.pageSize,
  370. 'farmName': this.searchForm.farmName || undefined,
  371. 'registerStartTime': this.searchForm.registerTime[0] || undefined,
  372. 'registerEndTime': this.searchForm.registerTime[1] || undefined,
  373. 'deviceCode': this.searchForm.deviceCode || undefined,
  374. 'countyName': this.searchForm.countyName || undefined,
  375. 'networkStatus': this.searchForm.networkStatus?? undefined,
  376. 'acqStatus': this.searchForm.acqStatus?? undefined,
  377. 'canStatus': this.searchForm.canStatus?? undefined
  378. }, false)
  379. }).then(async({data}) => {
  380. let res = await this.$http({
  381. url: this.$http.adornUrl(`${this.baseUrl}/manager/collectorregister/selectPcEveryStatusCollectors`),
  382. method: 'get'
  383. })
  384. this.boxList[0].value = res.data.data.total
  385. this.boxList[1].value = res.data.data.normal
  386. this.boxList[2].value = res.data.data.abnormal
  387. this.boxList[3].value = res.data.data.logout
  388. console.log(res);
  389. this.tableData = data.page.list
  390. this.totalPages = data.page.totalPage
  391. this.dataListLoading = false
  392. }).catch(() => {
  393. this.dataListLoading = false
  394. })
  395. },
  396. // 显示条数改变
  397. sizeChange (val) {
  398. this.pageSize = val
  399. },
  400. // 页数改变
  401. pageChange (val) {
  402. this.pageIndex = val
  403. },
  404. // 清空 el-form
  405. resetForm(form) {
  406. this.$refs[form].resetFields()
  407. },
  408. // 点击新增设备 or 编辑按钮
  409. handleAddOrEdit (row) {
  410. this.$nextTick(() => {
  411. this.$refs.addOrUpdate.init(row)
  412. })
  413. },
  414. // 查看按钮
  415. handleCheck (row) {
  416. console.log(row)
  417. // 组件间传值`/deviceInfo/${row.id}`
  418. this.$router.push({
  419. name: 'deviceInfo',
  420. params: {
  421. id: row.id,
  422. deviceCode: row.deviceCode
  423. }
  424. })
  425. },
  426. // 注销按钮
  427. handleLogout (row) {
  428. this.$confirm(`确定注销编码为{${row.deviceCode}}的设备?`, '提示', {
  429. confirmButtonText: '确定',
  430. cancelButtonText: '取消',
  431. type: 'warning'
  432. }).then(() => {
  433. this.$http({
  434. url: this.$http.adornUrl(`${this.baseUrl}/manager/collectorregister/update`),
  435. method: 'post',
  436. data: this.$http.adornData({
  437. id: row.id,
  438. canStatus: 0
  439. })
  440. }).then(result => {
  441. if (result.data.code === 0) {
  442. this.init()
  443. this.$message({
  444. message: `成功注销编码为{${row.deviceCode}}的设备`,
  445. type: 'success',
  446. duration: 1000
  447. })
  448. } else {
  449. this.$confirm(result.data.msg, '注销失败', {
  450. confirmButtonText: '确定',
  451. cancelButtonText: '取消',
  452. type: 'warning'
  453. })
  454. }
  455. })
  456. })
  457. },
  458. // 在线按钮
  459. handleLogin (row) {
  460. this.$confirm(`确定在线编码为{${row.deviceCode}}的设备?`, '提示', {
  461. confirmButtonText: '确定',
  462. cancelButtonText: '取消',
  463. type: 'warning'
  464. }).then(() => {
  465. this.$http({
  466. url: this.$http.adornUrl(`${this.baseUrl}/manager/collectorregister/update`),
  467. method: 'post',
  468. data: this.$http.adornData({
  469. id: row.id,
  470. canStatus: 1
  471. })
  472. }).then(result => {
  473. if (result.data.code === 0) {
  474. this.init()
  475. this.$message({
  476. message: `成功在线编码为{${row.deviceCode}}的设备`,
  477. type: 'success',
  478. duration: 1000
  479. })
  480. } else {
  481. this.$confirm(result.data.msg, '在线失败', {
  482. confirmButtonText: '确定',
  483. cancelButtonText: '取消',
  484. type: 'warning'
  485. })
  486. }
  487. })
  488. })
  489. },
  490. // 删除按钮
  491. handleDelete (row) {
  492. let ids = [row.id]
  493. this.$confirm(`确定删除编码为{${row.deviceCode}}的设备?`, '提示', {
  494. confirmButtonText: '确定',
  495. cancelButtonText: '取消',
  496. type: 'warning'
  497. }).then(() => {
  498. this.$http({
  499. url: this.$http.adornUrl(`${this.baseUrl}/manager/collectorregister/delete`),
  500. method: 'post',
  501. data: this.$http.adornData(ids, false)
  502. }).then(result => {
  503. if (result.data.code === 0) {
  504. this.init()
  505. this.$message({
  506. message: `成功删除编码为{${row.deviceCode}}的设备`,
  507. type: 'success',
  508. duration: 1000
  509. })
  510. } else {
  511. this.$confirm(result.data.msg, '删除失败', {
  512. confirmButtonText: '确定',
  513. cancelButtonText: '取消',
  514. type: 'warning'
  515. })
  516. }
  517. })
  518. })
  519. },
  520. },
  521. mounted() {
  522. this.init()
  523. }
  524. }
  525. </script>
  526. <style scoped>
  527. .header_title {
  528. height: 40px;
  529. background-color: #F7F7F7;
  530. border: 1px solid #ddd;
  531. line-height: 40px;
  532. color: #6FA8C8;
  533. margin-bottom: 10px;
  534. padding-left: 20px;
  535. }
  536. .box{
  537. width: 100%;
  538. height: 140px;
  539. background-color: #F9F9F9;
  540. display: flex;
  541. justify-content: space-around;
  542. align-items: center;
  543. margin-bottom: 10px;
  544. }
  545. .box_item {
  546. width: 198px;
  547. height: 78px;
  548. border: 1px solid #ddd;
  549. text-align: center;
  550. }
  551. .box_item p {
  552. height: 39px;
  553. line-height: 39px;
  554. margin: 0;
  555. }
  556. /** 选择条件 */
  557. .conditions {
  558. width: 100%;
  559. background-color: #fff;
  560. margin: 30px 0px 10px;
  561. border: 1px solid #ddd;
  562. padding: 20px;
  563. padding-bottom: 10px;
  564. }
  565. /** 设备列表 */
  566. .title {
  567. background-color: #f3f3f3;
  568. height: 50px;
  569. line-height: 50px;
  570. border: 1px solid #ddd;
  571. font-size: 12px;
  572. }
  573. .title-left {
  574. margin-left: 20px;
  575. display: inline-block;
  576. width: 300px;
  577. }
  578. .title-left span {
  579. margin-left: 2px;
  580. }
  581. .button-margin {
  582. margin: 0 5px 0 20px;
  583. }
  584. .title-right {
  585. float: right;
  586. }
  587. /* 正常 */
  588. .normal {
  589. color: #37c20ce1;
  590. }
  591. .abnormal {
  592. color: #ff0000d3;
  593. }
  594. .logout {
  595. color: #ffd900;
  596. }
  597. </style>