deviceInfo-list.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">基础信息</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <a href="/deviceInfo">设备管理</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form ref="queryForm" :model="queryModel" inline class="demo-form-inline">
  17. <el-form-item label="所属单位" prop="companyId">
  18. <!-- <el-select
  19. v-model="queryModel.companyId"
  20. size="mini"
  21. filterable
  22. placeholder="请选择"
  23. style="width:280px"
  24. >
  25. <el-option
  26. v-for="company in companyResult"
  27. :key="company.id"
  28. :label="company.name"
  29. :value="company.id"
  30. ></el-option>
  31. </el-select>-->
  32. <el-select-tree
  33. size="mini"
  34. :props="props"
  35. :options="companyResult"
  36. v-model="queryModel.companyId"
  37. height="200"
  38. ></el-select-tree>&nbsp;
  39. </el-form-item>
  40. <el-form-item label="关联单位" prop="companyName">
  41. <el-input type="text" size="mini" v-model="queryModel.companyName"></el-input>
  42. </el-form-item>
  43. <el-form-item label="设备编号" prop="deviceNo">
  44. <el-input type="text" size="mini" v-model="queryModel.deviceNo"></el-input>
  45. </el-form-item>
  46. <el-form-item label="设备别名" prop="aliasName">
  47. <el-input type="text" size="mini" v-model="queryModel.aliasName"></el-input>
  48. </el-form-item>
  49. <el-form-item label="内部编号" prop="code">
  50. <el-input type="text" size="mini" v-model="queryModel.code" style="width:100px;"></el-input>
  51. </el-form-item>
  52. <el-form-item label="立柱颜色" prop="columnColor">
  53. <el-select v-model="queryModel.columnColor" size="mini" style="width:100px;" clearable>
  54. <el-option v-for="(item,index) in columnColorList"
  55. :label="item.name" :value="item.value" :key="index"></el-option>
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item label="立柱高度" prop="columnHeight">
  59. <el-select v-model="queryModel.columnHeight" size="mini" style="width:100px;" clearable>
  60. <el-option v-for="(item,index) in columnHeightList"
  61. :label="item.name" :value="item.value" :key="index"></el-option>
  62. </el-select>
  63. </el-form-item>
  64. <el-form-item label="模块类型" prop="type">
  65. <el-select v-model="queryModel.type" size="mini" style="width:100px;" clearable>
  66. <el-option v-for="(item,index) in moduleTypeList"
  67. :label="item.name" :value="item.value" :key="index"></el-option>
  68. </el-select>
  69. </el-form-item>
  70. <el-form-item label="设备类型" prop="deviceType">
  71. <el-select v-model="queryModel.deviceType" size="mini" style="width:100px;" clearable>
  72. <el-option v-for="(item,index) in deviceTypeList"
  73. :label="item.name" :value="item.value" :key="index"></el-option>
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item label="设备厂家" prop="manufacturer">
  77. <el-select v-model="queryModel.manufacturer" size="mini" style="width:100px;" clearable>
  78. <el-option v-for="(item,index) in manufacturerList"
  79. :label="item.name" :value="item.value" :key="index"></el-option>
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item>
  83. <el-button
  84. type="primary"
  85. size="mini"
  86. icon="ios-search"
  87. @click="changePage(1)"
  88. :loading="loading"
  89. >查询</el-button>&nbsp;
  90. <el-button
  91. type="info"
  92. size="mini"
  93. style="margin-left: 8px"
  94. @click="handleReset('queryForm')"
  95. >重置</el-button>&nbsp;
  96. </el-form-item>
  97. </el-form>
  98. <el-divider></el-divider>
  99. <el-row class="button-group">
  100. <el-button type="primary" size="small" plain icon="el-icon-circle-plus" @click="handleAdd">新增</el-button>
  101. <el-button
  102. type="primary"
  103. size="small"
  104. plain
  105. icon="el-icon-remove"
  106. :disabled="multipleSelection.length==0"
  107. @click="handleBatchDelete"
  108. >删除选中项</el-button>
  109. <el-button
  110. type="primary"
  111. size="small"
  112. plain
  113. icon="el-icon-search"
  114. @click="showChannelListModal = true"
  115. >设备连接列表</el-button>
  116. <el-button type="primary" size="small" plain icon="el-icon-download" @click="exportXls()">导出</el-button>
  117. </el-row>
  118. <el-table
  119. ref="formTable"
  120. :data="tableData"
  121. v-loading="loading"
  122. :element-loading-text="loadingText"
  123. stripe
  124. :height="tableHeight"
  125. @sort-change="sortChange"
  126. @selection-change="handleSelectionChange"
  127. >
  128. <el-table-column type="selection" width="55"></el-table-column>
  129. <el-table-column type="index" label="序号" :index="indexMethod" width="50"></el-table-column>
  130. <el-table-column prop="deviceNo" label="设备编号" width="200" sort-by="a.device_no"
  131. sortable="custom"></el-table-column>
  132. <el-table-column prop="code" label="内部编号" width="100" sort-by="a.code_"
  133. sortable="custom"></el-table-column>
  134. <el-table-column prop="companyName" label="单位" width="250" show-overflow-tooltip sort-by="b.name_"
  135. sortable="custom"></el-table-column>
  136. <el-table-column prop="aliasName" label="设备别名" width="200" show-overflow-tooltip></el-table-column>
  137. <el-table-column prop="isOnline" label="运行状态" width="100" sort-by="a.is_online"
  138. sortable="custom">
  139. <template slot-scope="{row}">
  140. <div
  141. v-if="row.isOnline"
  142. style="border-radius: 30px;background-color:#67C23A;width:20px;height:20px;"
  143. ></div>
  144. <div
  145. v-if="!row.isOnline"
  146. style="border-radius: 30px;background-color:#F56C6C;width:20px;height:20px;"
  147. ></div>
  148. </template>
  149. </el-table-column>
  150. <!-- <el-table-column prop="ipAddress" label="ip地址" width="150"></el-table-column>
  151. <el-table-column prop="port" label="端口" width="80"></el-table-column> -->
  152. <!-- <el-table-column prop="unlockPassword" label="开锁密码" width="150"></el-table-column>
  153. <el-table-column prop="codeAddress" label="二维码地址" width="180"></el-table-column>-->
  154. <el-table-column prop="typeN" label="模块类型"></el-table-column>
  155. <el-table-column prop="deviceTypeN" label="设备类型"></el-table-column>
  156. <el-table-column prop="columnColorN" label="立柱颜色"></el-table-column>
  157. <el-table-column prop="columnHeightN" label="立柱高度"></el-table-column>
  158. <el-table-column prop="manufacturerN" label="设备厂家"></el-table-column>
  159. <el-table-column prop="heartbeatUpdateTime" sort-by="a.heartbeat_update_time"
  160. sortable="custom" label="心跳更新时间" width="160"></el-table-column>
  161. <el-table-column prop="updateTime" label="记录更新时间" width="160"></el-table-column>
  162. <el-table-column prop="remoteOpenStartTime" label="远程开门开始时间"></el-table-column>
  163. <el-table-column prop="remoteOpenEndTime" label="远程开门结束时间"></el-table-column>
  164. <el-table-column label="照片库" width="120">
  165. <template slot-scope="{row}">
  166. <el-link
  167. v-if="row.manufacturer=='1'"
  168. type="primary" @click="handleViewPersonLib(row)" icon="el-icon-view" :disabled="!row.isOnline">查看</el-link>
  169. &nbsp;
  170. <el-link type="primary" @click="handleExistPersonImageInDevice(row)" icon="el-icon-refresh" :disabled="!row.isOnline">同步</el-link>
  171. </template>
  172. </el-table-column>
  173. <el-table-column label="操作" width="250" fixed="right">
  174. <template slot-scope="{row}">
  175. <el-row>
  176. <el-col :span="8">
  177. <el-link type="primary" @click="handleEdit(row)">编辑</el-link>
  178. </el-col>
  179. <el-col :span="8">
  180. <el-link type="danger" @click="handleDelete(row)">删除</el-link>
  181. </el-col>
  182. <el-col :span="8">
  183. <el-link type="primary" @click="handlePoint(row)">定位</el-link>
  184. </el-col>
  185. <!-- <el-col :span="6">
  186. <el-link type="primary" @click="handleBindCompany(row)">单位关联</el-link>
  187. </el-col> -->
  188. </el-row>
  189. <el-row>
  190. <!-- <el-col :span="8">
  191. <el-link type="primary" @click="handleBindPerson(row)">用户关联</el-link>
  192. </el-col> -->
  193. <el-col :span="8" v-if="row.manufacturer=='1'">
  194. <el-link type="primary" @click="handleEditRule(row)">验证规则</el-link>
  195. </el-col>
  196. <el-col :span="8" v-if="row.manufacturer=='2'">
  197. <el-link type="primary" @click="handleAcsCfg(row)">参数设置</el-link>
  198. </el-col>
  199. <el-col :span="8">
  200. <el-link type="primary" @click="handleReboot(row)">重启设备</el-link>
  201. </el-col>
  202. </el-row>
  203. </template>
  204. </el-table-column>
  205. </el-table>
  206. <el-pagination
  207. :current-page.sync="pageIndex"
  208. :total="totalElements"
  209. :page-sizes="pageSizeList"
  210. @current-change="changePage"
  211. @size-change="pageSizeChange"
  212. layout="total, sizes, prev, pager, next, jumper"
  213. ></el-pagination>
  214. <deviceInfo-detail
  215. v-if="showModal"
  216. :businessKey="businessKey"
  217. :title="modalTitle"
  218. :companyResult="companyResult"
  219. @close="onDetailModalClose"
  220. ></deviceInfo-detail>
  221. <!-------------设备验证规则start------------------>
  222. <el-dialog
  223. title="设备验证规则"
  224. :visible.sync="dialogVisible"
  225. :close-on-click-modal="false"
  226. append-to-body
  227. width="30%"
  228. >
  229. <el-form
  230. :model="ruleModel"
  231. ref="ruleForm"
  232. :rules="ruleValidate"
  233. inline
  234. :label-width="'100px'"
  235. style="text-align:left;"
  236. >
  237. <el-row>
  238. <el-col>
  239. <el-form-item label="开门模式">
  240. <el-radio-group v-model="ruleModel.mode">
  241. <el-radio :label="0">校验通过</el-radio>
  242. <el-radio :label="1">刷脸</el-radio>
  243. <el-radio :label="2">远程</el-radio>
  244. </el-radio-group>
  245. </el-form-item>
  246. </el-col>
  247. </el-row>
  248. <el-row>
  249. <el-col>
  250. <el-form-item label="安全帽">
  251. <el-radio-group v-model="ruleModel.needCap">
  252. <el-radio :label="1">是</el-radio>
  253. <el-radio :label="0">否</el-radio>
  254. </el-radio-group>
  255. </el-form-item>
  256. </el-col>
  257. </el-row>
  258. <el-row>
  259. <el-col>
  260. <el-form-item label="口罩">
  261. <el-radio-group v-model="ruleModel.needMask">
  262. <el-radio :label="1">是</el-radio>
  263. <el-radio :label="0">否</el-radio>
  264. </el-radio-group>
  265. </el-form-item>
  266. </el-col>
  267. </el-row>
  268. <el-row>
  269. <el-col>
  270. <el-form-item label="测温">
  271. <el-radio-group v-model="ruleModel.measureTemperature">
  272. <el-radio :label="1">是</el-radio>
  273. <el-radio :label="0">否</el-radio>
  274. </el-radio-group>
  275. </el-form-item>
  276. </el-col>
  277. </el-row>
  278. <el-row v-if="ruleModel.measureTemperature == 1">
  279. <el-row>
  280. <el-col>
  281. <el-form-item label="位置">
  282. <el-radio-group v-model="ruleModel.type">
  283. <el-radio :label="0">额头</el-radio>
  284. <el-radio :label="1">手腕</el-radio>
  285. </el-radio-group>
  286. </el-form-item>
  287. </el-col>
  288. </el-row>
  289. <el-row>
  290. <el-col>
  291. <el-form-item label="最低温度" prop="minimum">
  292. <el-input-number
  293. v-model="ruleModel.minimum"
  294. placeholder="请输入最低温度"
  295. :precision="2"
  296. :step="0.1"
  297. :max="45"
  298. :min="30"
  299. style="width:200px"
  300. ></el-input-number>
  301. </el-form-item>
  302. </el-col>
  303. </el-row>
  304. <el-row>
  305. <el-col>
  306. <el-form-item label="最高温度" prop="maximum">
  307. <el-input-number
  308. v-model="ruleModel.maximum"
  309. placeholder="请输入最高温度"
  310. :precision="2"
  311. :step="0.1"
  312. :max="45"
  313. :min="30"
  314. style="width:200px"
  315. ></el-input-number>
  316. </el-form-item>
  317. </el-col>
  318. </el-row>
  319. <el-row>
  320. <el-col>
  321. <el-form-item label="温度误差" prop="preAlarmOffset">
  322. <el-input-number
  323. v-model="ruleModel.preAlarmOffset"
  324. placeholder="请输入温度误差"
  325. :precision="2"
  326. :step="0.1"
  327. :max="1"
  328. :min="0.1"
  329. style="width:200px"
  330. ></el-input-number>
  331. </el-form-item>
  332. </el-col>
  333. </el-row>
  334. <el-row>
  335. <el-col>
  336. <el-form-item label="报警温度" prop="alarmThreshold">
  337. <el-input-number
  338. v-model="ruleModel.alarmThreshold"
  339. placeholder="请输入报警温度"
  340. :precision="2"
  341. :step="0.1"
  342. :max="45"
  343. :min="30"
  344. style="width:200px"
  345. ></el-input-number>
  346. </el-form-item>
  347. </el-col>
  348. </el-row>
  349. </el-row>
  350. </el-form>
  351. <span slot="footer" class="dialog-footer">
  352. <el-button @click="dialogVisible = false">取 消</el-button>
  353. <el-button type="primary" @click="saveDeviceRule">确 定</el-button>
  354. </span>
  355. </el-dialog>
  356. <!-------------设备验证规则end------------------>
  357. <deviceInfo-ehome
  358. v-if="showEhomeModal"
  359. :deviceNo="selectedDevice.deviceNo"
  360. title="海康设备设置"
  361. @close="onEhomeModalClose"
  362. ></deviceInfo-ehome>
  363. <deviceInfo-map
  364. v-if="showMapModal"
  365. :businessKey="businessKey"
  366. :title="modalTitle"
  367. @close="onDetailModalClose"
  368. ></deviceInfo-map>
  369. <deviceInfo-channelList
  370. v-if="showChannelListModal"
  371. :companyResult="companyResult"
  372. @close="onDetailModalClose"
  373. ></deviceInfo-channelList>
  374. <devicePhoto-list
  375. :device="selectedDevice"
  376. v-if="showPhotoListModal"
  377. @close="onDevicePhotoListClose"
  378. >
  379. </devicePhoto-list>
  380. </div>
  381. </template>
  382. <script>
  383. import Constant from "@/constant";
  384. import DeviceInfoDetail from "./deviceInfo-detail";
  385. import DeviceInfoEhome from "./deviceInfo-ehome";
  386. import DeviceInfoChannelList from "./deviceInfo-channelList";
  387. import DevicePhotoList from "./devicePhoto-list";
  388. import DeviceInfoMap from "./deviceInfo-amap";
  389. import deviceInfoApi from "@/api/base/deviceInfo";
  390. import dataDictionaryApi from "@/api/sys/dataDictionary";
  391. import companyInfoApi from "@/api/base/companyInfo";
  392. import SelectTree from "@/components/SelectTree";
  393. import pageUtil from "@/utils/page";
  394. import NProgress from "nprogress"; // progress bar
  395. import "nprogress/nprogress.css"; // progress bar style
  396. export default {
  397. name: 'BaseDeviceInfoList',
  398. data() {
  399. var self = this;
  400. return {
  401. ruleValidate: {
  402. minimum: [{ required: true, message: "不能为空", trigger: "blur" }],
  403. maximum: [{ required: true, message: "不能为空", trigger: "blur" }],
  404. alarmThreshold: [
  405. { required: true, message: "不能为空", trigger: "blur" }
  406. ]
  407. },
  408. queryModel: {
  409. deviceNo: "",
  410. aliasName: "",
  411. companyId: "",
  412. companyName: "",
  413. code: "",
  414. columnColor: "",
  415. columnHeight: "",
  416. moduleType: "",
  417. deviceType: ""
  418. },
  419. loading: false,
  420. loadingText: "加载中",
  421. tableData: [],
  422. pageIndex: 1,
  423. pageSize: 10,
  424. totalPages: 0,
  425. totalElements: 0,
  426. field: "",
  427. direction: "",
  428. pageSizeList: [10, 20, 30],
  429. multipleSelection: [],
  430. showModal: false,
  431. modalTitle: "",
  432. businessKey: "",
  433. companyResult: [],
  434. tableHeight: 400,
  435. dialogVisible: false,
  436. ruleDeviceId: "",
  437. ruleModel: {
  438. mode: "",
  439. needCap: "",
  440. needMask: "",
  441. measureTemperature: "",
  442. type: "",
  443. minimum: "",
  444. maximum: "",
  445. preAlarmOffset: "",
  446. alarmThreshold: ""
  447. },
  448. treeData: [],
  449. props: {
  450. // 配置项(必选)
  451. value: "id",
  452. label: "name",
  453. children: "children"
  454. },
  455. showMapModal: false,
  456. showChannelListModal: false,
  457. showPhotoListModal: false,
  458. showEhomeModal: false,
  459. selectedDevice: {},
  460. columnColorList: [],
  461. columnHeightList: [],
  462. moduleTypeList: [],
  463. deviceTypeList: [],
  464. manufacturerList: []
  465. };
  466. },
  467. created() {
  468. dataDictionaryApi.findByCatalogName({
  469. "catalogName" : "立柱颜色"
  470. }).then(response => {
  471. var jsonData = response.data;
  472. this.columnColorList = jsonData.data;
  473. });
  474. dataDictionaryApi.findByCatalogName({
  475. "catalogName" : "立柱高度"
  476. }).then(response => {
  477. var jsonData = response.data;
  478. this.columnHeightList = jsonData.data;
  479. });
  480. dataDictionaryApi.findByCatalogName({"catalogName": "模块类型"})
  481. .then(response => {
  482. var jsonData = response.data;
  483. this.moduleTypeList = jsonData.data;
  484. });
  485. dataDictionaryApi.findByCatalogName({
  486. "catalogName" : "设备类型"
  487. }).then(response => {
  488. var jsonData = response.data;
  489. this.deviceTypeList = jsonData.data;
  490. });
  491. dataDictionaryApi.findByCatalogName({
  492. "catalogName" : "设备厂家"
  493. }).then(response => {
  494. var jsonData = response.data;
  495. this.manufacturerList = jsonData.data;
  496. });
  497. var self = this;
  498. companyInfoApi.list().then(function(response) {
  499. var jsonData = response.data;
  500. if (jsonData.result) {
  501. self.companyResult = jsonData.data;
  502. }
  503. });
  504. this.loadTree();
  505. },
  506. methods: {
  507. indexMethod(index) {
  508. return (this.pageIndex - 1) * this.pageSize + (index + 1);
  509. },
  510. loadTree() {
  511. var formData = new FormData();
  512. companyInfoApi.loadChildren(formData).then(resp => {
  513. var jsonData = resp.data;
  514. if (jsonData.result) {
  515. this.treeData = jsonData.data;
  516. } else {
  517. this.$message.error(jsonData.message + "");
  518. }
  519. });
  520. },
  521. loadChildren(tree, treeNode, resolve) {
  522. console.log(tree);
  523. var formData = new FormData();
  524. formData.append("parentId", tree.id);
  525. companyInfoApi.loadChildren(formData).then(resp => {
  526. var jsonData = resp.data;
  527. if (jsonData.result) {
  528. resolve(jsonData.data);
  529. } else {
  530. this.$message.error(jsonData.message + "");
  531. }
  532. });
  533. },
  534. changePage(pageIndex,exportFlag) {
  535. var self = this;
  536. self.loading = true;
  537. self.loadingText = "加载中...";
  538. self.pageIndex = pageIndex;
  539. var formData = new FormData();
  540. formData.append("pageIndex", self.pageIndex);
  541. if(exportFlag!=null) {
  542. formData.append("exportFlag", 1);
  543. formData.append("pageSize", 10000);
  544. }
  545. else{
  546. formData.append("pageSize", self.pageSize);
  547. }
  548. formData.append("deviceNo", self.queryModel.deviceNo);
  549. formData.append("aliasName", self.queryModel.aliasName);
  550. if (self.queryModel.companyId != null) {
  551. formData.append("companyId", self.queryModel.companyId);
  552. }
  553. if (self.queryModel.companyName != null) {
  554. formData.append("companyName", self.queryModel.companyName);
  555. }
  556. if (self.queryModel.code != null) {
  557. formData.append("code", self.queryModel.code);
  558. }
  559. if (self.queryModel.columnColor != null) {
  560. formData.append("columnColor", self.queryModel.columnColor);
  561. }
  562. if (self.queryModel.columnHeight != null) {
  563. formData.append("columnHeight", self.queryModel.columnHeight);
  564. }
  565. if (self.queryModel.moduleType != null) {
  566. formData.append("moduleType", self.queryModel.moduleType);
  567. }
  568. if (self.queryModel.deviceType != null) {
  569. formData.append("deviceType", self.queryModel.deviceType);
  570. }
  571. if (self.queryModel.manufacturer != null) {
  572. formData.append("manufacturer", self.queryModel.manufacturer);
  573. }
  574. if (this.field != null) {
  575. formData.append("field", this.field);
  576. }
  577. if (this.direction != null) {
  578. formData.append("direction", this.direction);
  579. }
  580. deviceInfoApi
  581. .pageList(formData)
  582. .then(function(response) {
  583. self.loading = false;
  584. var jsonData = response.data;
  585. if(jsonData.result) {
  586. if(exportFlag){
  587. if(document.location.href.startsWith("https://")){
  588. jsonData.data = jsonData.data.replace("http://","https://");
  589. }
  590. //导出
  591. self.$message({
  592. showClose: true,
  593. type: "success",
  594. message: `报表已生成,<a href="${jsonData.data}">请点击链接下载</a>`,
  595. dangerouslyUseHTMLString: true,
  596. duration: 30000
  597. });
  598. }
  599. else{
  600. //分页查看
  601. var page = jsonData.data;
  602. self.tableData = page.data;
  603. self.totalPages = page.totalPages;
  604. self.totalElements = page.recordsTotal;
  605. }
  606. }
  607. else{
  608. self.$message.warning(jsonData.message + "");
  609. }
  610. })
  611. .catch(error => {
  612. self.loading = false;
  613. });
  614. },
  615. pageSizeChange(pageSize) {
  616. this.pageSize = pageSize;
  617. },
  618. sortChange(data) {
  619. console.log(data);
  620. this.field = data.column.sortBy;
  621. this.direction = data.order == "ascending" ? "asc" : "desc";
  622. this.changePage(this.pageIndex);
  623. },
  624. handleSelectionChange(val) {
  625. this.multipleSelection = val;
  626. },
  627. handleReset(name) {
  628. this.$refs[name].resetFields();
  629. },
  630. handleAdd() {
  631. this.modalTitle = "新增";
  632. this.businessKey = "";
  633. this.showModal = true;
  634. },
  635. handleEdit(record) {
  636. this.modalTitle = "编辑";
  637. this.businessKey = record.id;
  638. this.showModal = true;
  639. },
  640. handleDelete(record) {
  641. var self = this;
  642. self
  643. .$confirm("是否确认删除?", "提示", {
  644. confirmButtonText: "确定",
  645. cancelButtonText: "取消",
  646. type: "warning"
  647. })
  648. .then(() => {
  649. deviceInfoApi.remove(record.id).then(function(response) {
  650. var jsonData = response.data;
  651. if (jsonData.result) {
  652. // var index = self.tableData.indexOf(record);
  653. // self.tableData.splice(index, 1);
  654. self.changePage(self.pageIndex);
  655. self.$message({
  656. type: "success",
  657. message: "删除成功!"
  658. });
  659. }
  660. });
  661. });
  662. },
  663. handleBatchDelete() {
  664. var self = this;
  665. var idList = this.multipleSelection.map(record => {
  666. return record.id;
  667. });
  668. this.$confirm("是否确认删除选中项?", "提示", {
  669. confirmButtonText: "确定",
  670. cancelButtonText: "取消",
  671. type: "warning"
  672. }).then(() => {
  673. deviceInfoApi.batchRemove(idList).then(function(response) {
  674. var jsonData = response.data;
  675. if (jsonData.result) {
  676. self.changePage(self.pageIndex);
  677. self.$message({
  678. type: "success",
  679. message: "删除成功!"
  680. });
  681. }
  682. });
  683. });
  684. },
  685. onDetailModalClose(refreshed) {
  686. //保存成功后回调
  687. this.showModal = false;
  688. this.showMapModal = false;
  689. this.showChannelListModal = false;
  690. if (refreshed) {
  691. this.changePage(this.pageIndex);
  692. }
  693. },
  694. handleRestart(record) {
  695. //重启
  696. },
  697. handleClear(record) {
  698. //清楚人脸数据
  699. },
  700. handleQRcode(record) {
  701. //二维码地址
  702. },
  703. handleEditRule(record) {
  704. var self = this;
  705. self.loading = true;
  706. var formData = new FormData();
  707. formData.append("deviceId", record.id);
  708. self.ruleDeviceId = record.id;
  709. deviceInfoApi.getDeviceRule(formData).then(function(response) {
  710. var jsonData = response.data;
  711. if (jsonData.result) {
  712. self.loading = false;
  713. self.dialogVisible = true;
  714. console.log(jsonData.data);
  715. //开关列表
  716. var ruleList = jsonData.data.RuleList;
  717. ruleList.forEach((item, index) => {
  718. if (item.Mode == "1") {
  719. self.ruleModel.needCap = item.Enabled;
  720. } else if (item.Mode == "2") {
  721. self.ruleModel.needMask = item.Enabled;
  722. } else if (item.Mode == "3") {
  723. self.ruleModel.measureTemperature = item.Enabled;
  724. }
  725. });
  726. //获取温度设置列表
  727. var temperatureRule = jsonData.data.TemperatureRule;
  728. self.ruleModel.type = temperatureRule.Type;
  729. self.ruleModel.minimum = temperatureRule.Minimum;
  730. self.ruleModel.maximum = temperatureRule.Maximum;
  731. self.ruleModel.preAlarmOffset = temperatureRule.PreAlarmOffset;
  732. self.ruleModel.alarmThreshold = temperatureRule.AlarmThreshold;
  733. console.log(jsonData.data);
  734. self.ruleModel.mode = jsonData.data.mode;
  735. } else {
  736. self.loading = false;
  737. self.$alert(jsonData.message, "提示", {
  738. confirmButtonText: "确定"
  739. });
  740. }
  741. });
  742. },
  743. saveDeviceRule() {
  744. var self = this;
  745. this.$refs["ruleForm"].validate(valid => {
  746. if (valid) {
  747. var formData = new FormData();
  748. formData.append("deviceInfoId", self.ruleDeviceId);
  749. formData.append("mode", self.ruleModel.mode);
  750. formData.append("needCap", self.ruleModel.needCap);
  751. formData.append("needMask", self.ruleModel.needMask);
  752. formData.append(
  753. "measureTemperature",
  754. self.ruleModel.measureTemperature
  755. );
  756. formData.append("type", self.ruleModel.type);
  757. formData.append("minTemper", self.ruleModel.minimum);
  758. formData.append("maxTemper", self.ruleModel.maximum);
  759. formData.append("alarmThreshold", self.ruleModel.alarmThreshold);
  760. deviceInfoApi.saveDeviceRule(formData).then(function(response) {
  761. var jsonData = response.data;
  762. if (jsonData.result) {
  763. self.$message({
  764. type: "success",
  765. message: "成功"
  766. });
  767. self.dialogVisible = false;
  768. } else {
  769. self.$message({
  770. type: "success",
  771. message: jsonData.message
  772. });
  773. }
  774. });
  775. }
  776. });
  777. },
  778. handlePoint(record) {
  779. this.modalTitle = "定位";
  780. this.businessKey = record.id;
  781. this.showMapModal = true;
  782. },
  783. handleBindPerson(record) {
  784. var self = this;
  785. this.$confirm(
  786. "将" + record.companyName + "中所有关联用户关联到该设备?",
  787. "提示",
  788. {
  789. confirmButtonText: "确定",
  790. cancelButtonText: "取消",
  791. type: "warning"
  792. }
  793. ).then(() => {
  794. self.loading = true;
  795. self.loadingText = "关联中...";
  796. var formData = new FormData();
  797. formData.append("deviceId", record.id);
  798. //增加定时器查询关联进度
  799. self.queryBindDeviceProgress(record.id);
  800. deviceInfoApi.bindDeviceToPerson(formData).then(function(response) {
  801. var jsonData = response.data;
  802. self.loading = false;
  803. self.loadingText = "";
  804. if (jsonData.result) {
  805. self.$message.success("关联成功!新增关联用户数:" + jsonData.data);
  806. } else {
  807. self.$message.warning(jsonData.message);
  808. }
  809. });
  810. });
  811. },
  812. queryBindDeviceProgress(deviceId) {
  813. var self = this;
  814. deviceInfoApi.queryBindDeviceProgress(deviceId).then(response => {
  815. var jsonData = response.data;
  816. if (jsonData.result) {
  817. self.loadingText =
  818. "关联人员进度:" +
  819. (jsonData.data == "null" ? "..." : jsonData.data);
  820. }
  821. if (self.loading) {
  822. //如果没有执行完成则1秒后继续查询
  823. setTimeout(() => {
  824. self.queryBindDeviceProgress(deviceId);
  825. }, 1000);
  826. }
  827. });
  828. },
  829. handleExistPersonImageInDevice(record) {
  830. var self = this;
  831. this.$confirm("确定更新【" + record.aliasName + "】关联用户图片是否存在设备中状态?此为耗时操作将在后台进行!", "提示", {
  832. confirmButtonText: "确定",
  833. cancelButtonText: "取消",
  834. type: "warning"
  835. }).then(() => {
  836. self.loading = true;
  837. self.loadingText = "提交中...";
  838. var formData = new FormData();
  839. formData.append("deviceId", record.id);
  840. deviceInfoApi.existPersonImageInDevice(formData).then(function(response) {
  841. var jsonData = response.data;
  842. self.loading = false;
  843. self.loadingText = "";
  844. if(jsonData.result) {
  845. self.$message.success(jsonData.message + "");
  846. }
  847. else{
  848. self.$message.warning(jsonData.message + "");
  849. }
  850. });
  851. });
  852. },
  853. handleReboot(record) {
  854. var self = this;
  855. this.$confirm("是否确定将" + record.aliasName + "重启?", "提示", {
  856. confirmButtonText: "确定",
  857. cancelButtonText: "取消",
  858. type: "warning"
  859. }).then(() => {
  860. self.loading = true;
  861. self.loadingText = "重启中...";
  862. var formData = new FormData();
  863. formData.append("deviceId", record.id);
  864. deviceInfoApi.reboot(formData).then(function(response) {
  865. var jsonData = response.data;
  866. self.loading = false;
  867. self.loadingText = "";
  868. if (jsonData.result) {
  869. self.$message.success(jsonData.message + "");
  870. } else {
  871. self.$message.warning(jsonData.message + "");
  872. }
  873. });
  874. });
  875. },
  876. handleViewPersonLib (device){
  877. this.selectedDevice = device;
  878. this.showPhotoListModal = true;
  879. },
  880. onDevicePhotoListClose (){
  881. this.showPhotoListModal = false;
  882. },
  883. handleAcsCfg(device) {
  884. this.selectedDevice = device;
  885. this.showEhomeModal = true;
  886. },
  887. onEhomeModalClose() {
  888. this.showEhomeModal = false;
  889. },
  890. exportXls() {
  891. this.changePage(1,true);
  892. }
  893. },
  894. mounted: function() {
  895. var self = this;
  896. this.changePage(1);
  897. setTimeout(()=>{
  898. self.tableHeight = pageUtil.autoAdjustHeight(self.$refs.formTable.$el);
  899. },1000);
  900. },
  901. components: {
  902. "deviceInfo-detail": DeviceInfoDetail,
  903. "deviceInfo-channelList": DeviceInfoChannelList,
  904. "deviceInfo-map": DeviceInfoMap,
  905. "el-select-tree": SelectTree,
  906. "devicePhoto-list": DevicePhotoList,
  907. "deviceInfo-ehome": DeviceInfoEhome
  908. }
  909. };
  910. </script>
  911. <style lang="scss" scoped>
  912. .el-breadcrumb {
  913. margin: 10px;
  914. line-height: 20px;
  915. }
  916. .el-divider {
  917. margin: 5px 0;
  918. }
  919. .demo-form-inline {
  920. margin-left: 10px;
  921. text-align: left;
  922. }
  923. .button-group {
  924. margin-left: 10px;
  925. text-align: left;
  926. }
  927. </style>