personInfo-list.vue 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641
  1. <template>
  2. <div style="position: relative">
  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="/personInfo">人员管理</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form
  17. ref="queryForm"
  18. :model="queryModel"
  19. inline
  20. class="demo-form-inline"
  21. >
  22. <div>
  23. <el-form-item label="编号" prop="id">
  24. <el-input
  25. type="text"
  26. size="mini"
  27. style="width: 120px"
  28. v-model="queryModel.id"
  29. ></el-input>
  30. </el-form-item>
  31. <el-form-item label="姓名" prop="name">
  32. <el-input
  33. type="text"
  34. size="mini"
  35. v-model="queryModel.name"
  36. style="width: 120px"
  37. ></el-input>
  38. </el-form-item>
  39. <el-form-item label="手机号" prop="phone">
  40. <el-input
  41. type="text"
  42. size="mini"
  43. v-model="queryModel.phone"
  44. style="width: 120px"
  45. ></el-input>
  46. </el-form-item>
  47. <el-form-item label="身份证" prop="idCard">
  48. <el-input
  49. type="text"
  50. size="mini"
  51. v-model="queryModel.idCard"
  52. style="width: 190px"
  53. ></el-input>
  54. </el-form-item>
  55. <el-form-item label="绑定设备名称" prop="derviceName">
  56. <el-input
  57. type="text"
  58. size="mini"
  59. v-model="queryModel.derviceName"
  60. style="width: 120px"
  61. ></el-input>
  62. </el-form-item>
  63. <el-form-item>
  64. <el-button
  65. type="primary"
  66. size="mini"
  67. icon="ios-search"
  68. @click="changePage(1)"
  69. :loading="loading"
  70. >查询</el-button
  71. >&nbsp;
  72. <el-button
  73. type="info"
  74. size="mini"
  75. style="margin-left: 8px"
  76. @click="handleReset('queryForm')"
  77. >重置</el-button
  78. >&nbsp;
  79. </el-form-item>
  80. </div>
  81. <div>
  82. <el-form-item label="单位" prop="companyCode">
  83. <!-- <el-select
  84. v-model="queryModel.companyCode"
  85. size="mini"
  86. filterable
  87. placeholder="请选择"
  88. style="width:220px"
  89. >
  90. <el-option
  91. v-for="company in companyResult"
  92. :key="company.id"
  93. :label="company.name"
  94. :value="company.code"
  95. ></el-option>
  96. </el-select>-->
  97. <el-select-tree
  98. size="mini"
  99. :props="props"
  100. :options="companyResult"
  101. v-model="queryModel.parentId"
  102. height="200"
  103. ></el-select-tree
  104. >&nbsp;
  105. <el-checkbox v-model="queryModel.subordinate"
  106. >是否包含下级单位</el-checkbox
  107. >
  108. </el-form-item>
  109. <el-form-item label="是否上传照片" prop="isUploadPhoto">
  110. <el-select
  111. v-model="queryModel.isUploadPhoto"
  112. size="mini"
  113. filterable
  114. placeholder="请选择"
  115. style="width: 120px"
  116. >
  117. <el-option value label="全部"></el-option>
  118. <el-option value="1" label="已上传"></el-option>
  119. <el-option value="0" label="未上传"></el-option>
  120. </el-select>
  121. </el-form-item>
  122. <el-form-item label="是否同步" prop="faceBound">
  123. <el-select
  124. v-model="queryModel.faceBound"
  125. size="mini"
  126. filterable
  127. placeholder="请选择"
  128. style="width: 120px"
  129. >
  130. <el-option value label="全部"></el-option>
  131. <el-option value="1" label="已同步"></el-option>
  132. <el-option value="0" label="未同步"></el-option>
  133. </el-select>
  134. </el-form-item>
  135. </div>
  136. <!-- <div>
  137. <el-form-item v-if="position1Show" :label="position1" prop="position1">
  138. <el-input
  139. type="text"
  140. size="mini"
  141. v-model="queryModel.position1"
  142. ></el-input>
  143. </el-form-item>
  144. <el-form-item v-if="position2Show" :label="position2" prop="position2">
  145. <el-input
  146. type="text"
  147. size="mini"
  148. v-model="queryModel.position2"
  149. ></el-input>
  150. </el-form-item>
  151. <el-form-item v-if="position3Show" :label="position3" prop="position3">
  152. <el-input
  153. type="text"
  154. size="mini"
  155. v-model="queryModel.position3"
  156. ></el-input>
  157. </el-form-item>
  158. <el-form-item v-if="position4Show" :label="position4" prop="position4">
  159. <el-input
  160. type="text"
  161. size="mini"
  162. v-model="queryModel.position4"
  163. ></el-input>
  164. </el-form-item>
  165. <el-form-item v-if="position5Show" :label="position5" prop="position5">
  166. <el-input
  167. type="text"
  168. size="mini"
  169. v-model="queryModel.position5"
  170. ></el-input>
  171. </el-form-item>
  172. </div> -->
  173. </el-form>
  174. <el-divider></el-divider>
  175. <el-row class="button-group">
  176. <el-button
  177. type="primary"
  178. size="small"
  179. plain
  180. icon="el-icon-remove"
  181. @click="handleAdd"
  182. >新增</el-button
  183. >
  184. <el-button
  185. type="primary"
  186. size="small"
  187. plain
  188. icon="el-icon-remove"
  189. :disabled="multipleSelection.length == 0"
  190. @click="handleBatchDelete"
  191. >删除选中项</el-button
  192. >
  193. <el-button
  194. type="primary"
  195. size="small"
  196. plain
  197. icon="el-icon-remove"
  198. :disabled="multipleSelection.length == 0"
  199. @click="handleBatchClearFaceImg"
  200. >清除设备照片</el-button
  201. >
  202. <el-button
  203. type="primary"
  204. size="small"
  205. plain
  206. icon="el-icon-upload2"
  207. @click="batchImportVisible = true"
  208. >导入</el-button
  209. >
  210. <el-button
  211. type="primary"
  212. size="small"
  213. plain
  214. icon="el-icon-download"
  215. :loading="xlsLoading"
  216. @click="downloadAll"
  217. >导出数据</el-button
  218. >
  219. <el-button
  220. type="primary"
  221. size="small"
  222. plain
  223. icon="el-icon-refresh"
  224. :disabled="multipleSelection.length == 0"
  225. @click="dataSync"
  226. >数据同步</el-button
  227. >
  228. <el-button
  229. type="primary"
  230. size="small"
  231. plain
  232. icon="el-icon-refresh"
  233. :disabled="multipleSelection.length == 0"
  234. @click="handleBatchEnabledFace"
  235. >开启自动同步</el-button
  236. >
  237. <el-button
  238. type="primary"
  239. size="small"
  240. plain
  241. icon="el-icon-refresh"
  242. :disabled="multipleSelection.length == 0"
  243. @click="handleBatchEnabledFace"
  244. >人脸授权</el-button
  245. >
  246. <el-button
  247. type="primary"
  248. size="small"
  249. plain
  250. icon="el-icon-refresh"
  251. :disabled="multipleSelection.length == 0"
  252. @click="batchBoundDevice = true"
  253. >关联设备</el-button
  254. >
  255. <el-button
  256. type="primary"
  257. size="small"
  258. plain
  259. icon="el-icon-refresh"
  260. :disabled="multipleSelection.length == 0"
  261. @click="batchUnBoundDevice = true"
  262. >解绑设备</el-button
  263. >
  264. </el-row>
  265. <el-table
  266. ref="formTable"
  267. :data="tableData"
  268. v-loading="loading"
  269. :height="tableHeight"
  270. stripe
  271. @sort-change="sortChange"
  272. @selection-change="handleSelectionChange"
  273. >
  274. <el-table-column type="selection" width="55"></el-table-column>
  275. <el-table-column
  276. prop="id"
  277. label="人员编号"
  278. width="80"
  279. fixed="left"
  280. ></el-table-column>
  281. <el-table-column
  282. prop="name"
  283. label="姓名"
  284. width="80"
  285. fixed="left"
  286. ></el-table-column>
  287. <el-table-column
  288. prop="faceImageUrl"
  289. label="人员照片"
  290. width="80"
  291. fixed="left"
  292. >
  293. <template slot-scope="{ row }">
  294. <a :href="row.faceImageUrl" target="_blank">
  295. <el-avatar
  296. :size="48"
  297. shape="circle"
  298. :src="
  299. row.faceImageUrl +
  300. '?x-oss-process=image/resize,m_fill,w_64,h_64'
  301. "
  302. :key="row.id"
  303. ></el-avatar>
  304. </a>
  305. </template>
  306. </el-table-column>
  307. <el-table-column
  308. prop="companyName"
  309. label="主要单位"
  310. width="250"
  311. show-overflow-tooltip
  312. ></el-table-column>
  313. <el-table-column
  314. prop="popedomName"
  315. label="主要身份"
  316. width="120"
  317. show-overflow-tooltip
  318. ></el-table-column>
  319. <el-table-column
  320. prop="mechanism"
  321. label="所有单位身份"
  322. width="250"
  323. show-overflow-tooltip
  324. ></el-table-column>
  325. <el-table-column
  326. prop="phone"
  327. label="手机号"
  328. width="180"
  329. ></el-table-column>
  330. <el-table-column
  331. prop="idCard"
  332. label="身份证"
  333. width="100"
  334. show-overflow-tooltip
  335. ></el-table-column>
  336. <el-table-column
  337. prop="deviceName"
  338. label="绑定设备"
  339. width="150"
  340. show-overflow-tooltip
  341. ></el-table-column>
  342. <el-table-column prop="openId" label="是否绑定公众号" width="180">
  343. <template slot-scope="{ row }">{{
  344. row.openId == null ? "否" : "是"
  345. }}</template>
  346. </el-table-column>
  347. <el-table-column prop="faceBound" label="是否同步人脸信息" width="180">
  348. <template slot-scope="{ row }">{{
  349. row.faceBound ? "是" : "否"
  350. }}</template>
  351. </el-table-column>
  352. <el-table-column label="是否自动同步" width="120">
  353. <template slot-scope="{ row }">
  354. <el-switch
  355. v-model="row.isSync"
  356. @change="enabledTo(row, 'sync', row.faceEnabled)"
  357. active-color="#13ce66"
  358. inactive-color="#ff4949"
  359. :disabled="disabled"
  360. ></el-switch>
  361. </template>
  362. </el-table-column>
  363. <el-table-column label="人脸授权">
  364. <template slot-scope="{ row }">
  365. <el-switch
  366. v-model="row.faceEnabled"
  367. @change="enabledTo(row, 'face', row.faceEnabled)"
  368. active-color="#13ce66"
  369. inactive-color="#ff4949"
  370. :disabled="disabled"
  371. ></el-switch>
  372. </template>
  373. </el-table-column>
  374. <!-- <el-table-column label="刷卡授权">
  375. <template slot-scope="{ row }">
  376. <el-switch
  377. v-model="row.cardEnabled"
  378. @change="enabledTo(row, 'card', '')"
  379. active-color="#13ce66"
  380. inactive-color="#ff4949"
  381. :disabled="disabled"
  382. ></el-switch>
  383. </template>
  384. </el-table-column>
  385. <el-table-column label="手机授权">
  386. <template slot-scope="{ row }">
  387. <el-switch
  388. v-model="row.appEnabled"
  389. @change="enabledTo(row, 'app', '')"
  390. active-color="#13ce66"
  391. inactive-color="#ff4949"
  392. :disabled="disabled"
  393. ></el-switch>
  394. </template>
  395. </el-table-column> -->
  396. <!-- <el-table-column label="密码">
  397. <template slot-scope="{row}">
  398. <el-switch v-model="row.passwordEnabled" @change="enabledTo(row.id,'face')" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
  399. </template>
  400. </el-table-column>-->
  401. <!-- <el-table-column label="访客授权">
  402. <template slot-scope="{ row }">
  403. <el-switch
  404. v-model="row.guestEnabled"
  405. @change="enabledTo(row, 'guest', '')"
  406. active-color="#13ce66"
  407. inactive-color="#ff4949"
  408. :disabled="disabled"
  409. ></el-switch>
  410. </template>
  411. </el-table-column> -->
  412. <el-table-column label="接收微信通知">
  413. <template slot-scope="{ row }">
  414. <el-switch
  415. v-model="row.wechatNoticeEnabled"
  416. @change="enabledTo(row, 'wechatNotice', '')"
  417. active-color="#13ce66"
  418. inactive-color="#ff4949"
  419. :disabled="disabled"
  420. ></el-switch>
  421. </template>
  422. </el-table-column>
  423. <el-table-column
  424. prop="openId"
  425. label="微信openid"
  426. width="180"
  427. ></el-table-column>
  428. <el-table-column label="操作" width="300" fixed="right">
  429. <template slot-scope="{ row }">
  430. <el-row>
  431. <el-col>
  432. <span v-if="row.delFlag">
  433. <el-link
  434. type="danger"
  435. :underline="false"
  436. @click="handleClearFaceImg(row)"
  437. >清除图片</el-link
  438. >-
  439. </span>
  440. <span v-else>
  441. <el-link
  442. type="primary"
  443. :underline="false"
  444. @click="handleEdit(row)"
  445. >编辑</el-link
  446. >-
  447. <el-link
  448. type="danger"
  449. :underline="false"
  450. @click="handleDelete(row)"
  451. >删除</el-link
  452. >-
  453. <el-link
  454. type="primary"
  455. :underline="false"
  456. @click="bindRole(row)"
  457. >机构身份管理</el-link
  458. >-
  459. <span v-if="row.faceBound">
  460. <el-link
  461. type="primary"
  462. :underline="false"
  463. :disabled="true"
  464. @click="uploadData(row)"
  465. >数据同步</el-link
  466. >-
  467. </span>
  468. <span v-if="!row.faceBound">
  469. <el-link
  470. type="primary"
  471. :underline="false"
  472. @click="uploadData(row)"
  473. >数据同步</el-link
  474. >-
  475. </span>
  476. </span>
  477. </el-col>
  478. </el-row>
  479. <el-row>
  480. <el-col>
  481. <el-link
  482. type="primary"
  483. :underline="false"
  484. @click="bindDevice(row)"
  485. >关联设备</el-link
  486. >-
  487. <el-link type="primary" :underline="false" @click="showBound(row)"
  488. >已关联设备</el-link
  489. >-
  490. <el-link
  491. type="primary"
  492. :underline="false"
  493. @click="showLifeRecord(row)"
  494. >生活记录</el-link
  495. >-
  496. </el-col>
  497. </el-row>
  498. <el-row>
  499. <el-col>
  500. <el-link
  501. type="primary"
  502. :underline="false"
  503. @click="bindWechat(row)"
  504. >微信绑定</el-link
  505. >-
  506. <el-link
  507. type="primary"
  508. :underline="false"
  509. @click="unbindWechat(row)"
  510. >微信解绑</el-link
  511. >
  512. </el-col>
  513. </el-row>
  514. </template>
  515. </el-table-column>
  516. </el-table>
  517. <el-pagination
  518. :current-page.sync="pageIndex"
  519. :total="totalElements"
  520. :page-sizes="pageSizeList"
  521. @current-change="changePage"
  522. @size-change="pageSizeChange"
  523. layout="total, sizes, prev, pager, next, jumper"
  524. ></el-pagination>
  525. <personInfo-detail
  526. v-if="showModal"
  527. :businessKey="businessKey"
  528. :title="modalTitle"
  529. :companyResult="companyResult"
  530. :companyPosition1="position1"
  531. :companyPosition2="position2"
  532. :companyPosition3="position3"
  533. :companyPosition4="position4"
  534. :companyPosition5="position5"
  535. @close="onDetailModalClose"
  536. ></personInfo-detail>
  537. <personDeviceRelation-list
  538. v-if="showDeviceModal"
  539. :personId="personId"
  540. @close="onDetailModalClose"
  541. ></personDeviceRelation-list>
  542. <personDeviceRelation-BoundList
  543. v-if="showBoundModal"
  544. :personId="personId"
  545. @close="onDetailModalClose"
  546. ></personDeviceRelation-BoundList>
  547. <!--批量导入S-->
  548. <!--生活记录 start-->
  549. <lifeRecord-list
  550. v-if="showRecordModal"
  551. :personId="businessKey"
  552. @close="recordModalClose"
  553. ></lifeRecord-list>
  554. <!--生活记录 end-->
  555. <el-dialog
  556. title="批量导入人员"
  557. :visible.sync="batchImportVisible"
  558. :modal-append-to-body="false"
  559. style="text-align: left"
  560. :close-on-click-modal="false"
  561. >
  562. <el-form label-width="150px">
  563. <el-form-item label="模板下载">
  564. <el-link
  565. href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/personInfo/2020/10/小鹏管家人员导入模板.xls"
  566. type="primary"
  567. target="_blank"
  568. >点击下载模板</el-link
  569. >
  570. </el-form-item>
  571. <el-form-item label="单位">
  572. <el-select-tree
  573. size="large"
  574. :props="props"
  575. :options="companyResult"
  576. v-model="uploadXlsData.companyId"
  577. height="200"
  578. width="300px"
  579. ></el-select-tree>
  580. </el-form-item>
  581. <el-form-item label="用户身份" prop="personRoleId">
  582. <el-select
  583. filterable
  584. placeholder="请选择"
  585. style="width: 300px;"
  586. v-model="uploadXlsData.personRoleId"
  587. >
  588. <el-option
  589. v-for="role in personRoleResult"
  590. :key="role.personRoleName"
  591. :label="role.personRoleName"
  592. :value="role.id"
  593. ></el-option>
  594. </el-select>
  595. </el-form-item>
  596. <el-form-item label="上传文件">
  597. <el-upload
  598. class="upload-demo"
  599. accept=".xls"
  600. :action="uploadUrlXls"
  601. :data="uploadXlsData"
  602. :headers="headers"
  603. :on-preview="handleBatchImportPreview"
  604. name="uploadFile"
  605. :multiple="true"
  606. :limit="1"
  607. :on-remove="handleBatchImportRemove"
  608. :before-remove="beforeBatchImportRemove"
  609. :before-upload="beforeUpload"
  610. :on-exceed="handleBatchImportExceed"
  611. :on-success="handleBatchImportSuccess"
  612. :file-list="batchImportFileList"
  613. >
  614. <el-button size="small" type="primary" :loading="xlsLoading"
  615. >点击上传</el-button
  616. >
  617. <div slot="tip" class="el-upload__tip">
  618. 只能上传xls文件,且不超过500kb
  619. </div>
  620. </el-upload>
  621. </el-form-item>
  622. </el-form>
  623. <div slot="footer" class="dialog-footer">
  624. <el-button type="primary" @click="batchImportVisible = false"
  625. >关 闭</el-button
  626. >
  627. </div>
  628. </el-dialog>
  629. <!--批量导入E-->
  630. <!-- 批量绑定设备 -->
  631. <el-dialog
  632. title="绑定设备"
  633. :visible.sync="batchBoundDevice"
  634. :modal-append-to-body="false"
  635. style="text-align: left"
  636. :close-on-click-modal="false"
  637. >
  638. <el-form
  639. label-width="150px"
  640. v-loading="boundDeviceDisabled"
  641. element-loading-text="正在操作,请稍等"
  642. element-loading-spinner="el-icon-loading"
  643. element-loading-background="rgba(0, 0, 0, 0.8)"
  644. >
  645. <el-form-item label="设备">
  646. <el-select
  647. v-model="boundDeviceIds"
  648. filterable
  649. placeholder="请选择"
  650. multiple
  651. style="width: 300px"
  652. >
  653. <el-option
  654. v-for="devices in deviceResult"
  655. :key="devices.id"
  656. :label="devices.aliasName"
  657. :value="devices.id"
  658. ></el-option>
  659. </el-select>
  660. </el-form-item>
  661. </el-form>
  662. <div slot="footer" class="dialog-footer">
  663. <el-button @click="closeBatchBoundDevice">关 闭</el-button>
  664. <el-button type="primary" @click="handleBatchBoundDevice"
  665. >确 定</el-button
  666. >
  667. </div>
  668. </el-dialog>
  669. <!-- 批量绑定设备end -->
  670. <!-- 批量解绑设备 -->
  671. <el-dialog
  672. title="解绑设备"
  673. :visible.sync="batchUnBoundDevice"
  674. :modal-append-to-body="false"
  675. style="text-align: left"
  676. :close-on-click-modal="false"
  677. >
  678. <el-form label-width="150px" v-loading="boundDeviceDisabled">
  679. <el-form-item label="设备">
  680. <el-select v-model="boundUnDeviceId" filterable placeholder="请选择">
  681. <el-option
  682. v-for="devices in deviceResult"
  683. :key="devices.id"
  684. :label="devices.aliasName"
  685. :value="devices.id"
  686. ></el-option>
  687. </el-select>
  688. </el-form-item>
  689. </el-form>
  690. <div slot="footer" class="dialog-footer">
  691. <el-button @click="closeBatchUnBoundDevice">关 闭</el-button>
  692. <el-button type="primary" @click="handleBatchUnBoundDevice">确 定</el-button>
  693. </div>
  694. </el-dialog>
  695. <!-- 批量解绑设备end -->
  696. <el-dialog
  697. title="扫码绑定微信"
  698. :visible.sync="bindWechatVisible"
  699. :modal-append-to-body="false"
  700. :close-on-click-modal="false"
  701. width="340px"
  702. >
  703. <div v-loading="bindWechatLoading">
  704. <img :src="bindWechatUrl" style="width: 300px; fit-object: cover" />
  705. </div>
  706. </el-dialog>
  707. <personPopedom-list
  708. v-if="showRoleModal"
  709. :personId="personId"
  710. @close="onDetailModalClose"
  711. ></personPopedom-list>
  712. </div>
  713. </template>
  714. <script>
  715. import Constant from "@/constant";
  716. import PersonInfoDetail from "./personInfo-detail";
  717. import PersonDeviceRelationList from "./personDeviceRelation-list";
  718. import PersonDeviceRelationBoundList from "./personDeviceRelation-BoundList";
  719. import PersonPopedomList from "./personPopedom-list";
  720. import personInfoApi from "@/api/base/personInfo";
  721. import companyInfoApi from "@/api/base/companyInfo";
  722. import personRoleInfoApi from "@/api/base/personRoleInfo";
  723. import companyPositionApi from "@/api/base/companyPosition";
  724. import deviceInfoApi from "@/api/base/deviceInfo";
  725. import personDeviceRelationApi from "@/api/base/personDeviceRelation";
  726. import SelectTree from "@/components/SelectTree";
  727. import LifeRecordList from "./lifeRecord-list";
  728. import { getToken } from "@/utils/auth"; // get token from cookie
  729. import NProgress from "nprogress"; // progress bar
  730. import "nprogress/nprogress.css"; // progress bar style
  731. export default {
  732. name: "BasePersonInfoList",
  733. data() {
  734. var self = this;
  735. return {
  736. queryModel: {
  737. id: "",
  738. companyCode: "",
  739. parentId: "",
  740. name: "",
  741. phone: "",
  742. idCard: "",
  743. faceBound: "",
  744. isUploadPhoto: "",
  745. subordinate: false,
  746. position1: "",
  747. position2: "",
  748. position3: "",
  749. position4: "",
  750. position5: "",
  751. derviceName: "",
  752. parkId: "",
  753. },
  754. loading: false,
  755. tableData: [],
  756. pageIndex: 1,
  757. pageSize: 30,
  758. totalPages: 0,
  759. totalElements: 0,
  760. field: "",
  761. direction: "",
  762. pageSizeList: [30, 100, 500],
  763. multipleSelection: [],
  764. showModal: false,
  765. modalTitle: "",
  766. businessKey: "",
  767. companyResult: [],
  768. batchImportVisible: false,
  769. batchImportFileList: [],
  770. uploadUrlXls: Constant.serverUrl + "/base/personInfo/importXls",
  771. uploadXlsData: {
  772. subFolder: "company",
  773. companyId: "",
  774. personRoleId: ""
  775. },
  776. personRoleResult: [],
  777. headers: {
  778. Authorization: getToken(),
  779. },
  780. disabled: false,
  781. position1: "",
  782. position2: "",
  783. position3: "",
  784. position4: "",
  785. position5: "",
  786. position1Show: false,
  787. position2Show: false,
  788. position3Show: false,
  789. position4Show: false,
  790. position5Show: false,
  791. showDeviceModal: false,
  792. showBoundModal: false,
  793. personId: "",
  794. batchBoundDevice: false,
  795. batchUnBoundDevice: false,
  796. deviceResult: "",
  797. boundDeviceIds: [],
  798. boundUnDeviceId: "",
  799. xlsLoading: false,
  800. tableHeight: 400,
  801. boundDeviceDisabled: false,
  802. treeData: [],
  803. props: {
  804. // 配置项(必选)
  805. value: "id",
  806. label: "name",
  807. children: "children",
  808. },
  809. showRecordModal: false,
  810. bindWechatVisible: false,
  811. bindWechatUrl: "",
  812. bindWechatLoading: false,
  813. parkList: [],
  814. showRoleModal: false,
  815. };
  816. },
  817. watch: {
  818. "uploadXlsData.companyId":function(newVal,oldVal){
  819. var self = this;
  820. if(newVal!=null){
  821. var formData = new FormData();
  822. formData.append("companyId", newVal);
  823. //查询单位下角色
  824. personRoleInfoApi.listByCompanyId(formData)
  825. .then(response=>{
  826. var jsonData = response.data;
  827. if (jsonData.result) {
  828. self.personRoleResult = jsonData.data;
  829. }
  830. })
  831. }
  832. }
  833. },
  834. created() {
  835. var self = this;
  836. companyInfoApi.list().then(function (response) {
  837. var jsonData = response.data;
  838. if (jsonData.result) {
  839. if (jsonData.data != null && jsonData.data != "") {
  840. self.companyResult = jsonData.data;
  841. }
  842. }
  843. });
  844. // companyInfoApi.list({ type: "3" }).then((response) => {
  845. // var jsonData = response.data;
  846. // this.parkList = jsonData.data;
  847. // });
  848. deviceInfoApi.list().then(function (response) {
  849. var jsonData = response.data;
  850. if (jsonData.result) {
  851. if (jsonData.data != null && jsonData.data != "") {
  852. self.deviceResult = jsonData.data;
  853. }
  854. }
  855. });
  856. companyPositionApi.detailForCompany().then(function (response) {
  857. var jsonData = response.data.data;
  858. if (jsonData.position1Name != null && jsonData.position1Name != "") {
  859. self.position1 = jsonData.position1Name;
  860. self.position1Show = true;
  861. }
  862. if (jsonData.position2Name != null && jsonData.position2Name != "") {
  863. self.position2 = jsonData.position2Name;
  864. self.position2Show = true;
  865. }
  866. if (jsonData.position3Name != null && jsonData.position3Name != "") {
  867. self.position3 = jsonData.position3Name;
  868. self.position3Show = true;
  869. }
  870. if (jsonData.position4Name != null && jsonData.position4Name != "") {
  871. self.position4 = jsonData.position4Name;
  872. self.position4Show = true;
  873. }
  874. if (jsonData.position5Name != null && jsonData.position5Name != "") {
  875. self.position5 = jsonData.position5Name;
  876. self.position5Show = true;
  877. }
  878. });
  879. this.loadTree();
  880. },
  881. methods: {
  882. getSelectedValue(value) {
  883. this.queryModel.parentId = value;
  884. },
  885. loadTree() {
  886. var formData = new FormData();
  887. companyInfoApi.loadChildren(formData).then((resp) => {
  888. var jsonData = resp.data;
  889. if (jsonData.result) {
  890. this.treeData = jsonData.data;
  891. } else {
  892. this.$message.error(jsonData.message + "");
  893. }
  894. });
  895. },
  896. loadChildren(tree, treeNode, resolve) {
  897. console.log(tree);
  898. var formData = new FormData();
  899. formData.append("parentId", tree.id);
  900. companyInfoApi.loadChildren(formData).then((resp) => {
  901. var jsonData = resp.data;
  902. if (jsonData.result) {
  903. resolve(jsonData.data);
  904. } else {
  905. this.$message.error(jsonData.message + "");
  906. }
  907. });
  908. },
  909. changePage(pageIndex) {
  910. var self = this;
  911. self.loading = true;
  912. self.pageIndex = pageIndex;
  913. var formData = new FormData();
  914. formData.append("pageIndex", self.pageIndex);
  915. formData.append("pageSize", self.pageSize);
  916. if (self.queryModel.parentId == null) {
  917. self.queryModel.parentId = "";
  918. }
  919. formData.append("companyCode", self.queryModel.companyCode);
  920. formData.append("parentId", self.queryModel.parentId);
  921. formData.append("subordinate", self.queryModel.subordinate);
  922. formData.append("id", self.queryModel.id);
  923. formData.append("name", self.queryModel.name);
  924. formData.append("phone", self.queryModel.phone);
  925. formData.append("idCard", self.queryModel.idCard);
  926. formData.append("faceBound", self.queryModel.faceBound);
  927. formData.append("isUploadPhoto", self.queryModel.isUploadPhoto);
  928. formData.append("position1", self.queryModel.position1);
  929. formData.append("position2", self.queryModel.position2);
  930. formData.append("position3", self.queryModel.position3);
  931. formData.append("position4", self.queryModel.position4);
  932. formData.append("position5", self.queryModel.position5);
  933. formData.append("derviceName", self.queryModel.derviceName);
  934. if (self.queryModel.parkId == null) {
  935. self.queryModel.parkId = "";
  936. }
  937. formData.append("parkId", self.queryModel.parkId);
  938. if (this.field != null) {
  939. formData.append("field", this.field);
  940. }
  941. if (this.direction != null) {
  942. formData.append("direction", this.direction);
  943. }
  944. personInfoApi
  945. .pageList(formData)
  946. .then(function (response) {
  947. self.loading = false;
  948. var jsonData = response.data.data;
  949. self.tableData = jsonData.data;
  950. self.totalPages = jsonData.totalPages;
  951. self.totalElements = jsonData.recordsTotal;
  952. //页面高度-列表上面的高度-分页栏高度
  953. //45为分页栏的高度
  954. self.tableHeight =
  955. window.innerHeight - self.$refs.formTable.$el.offsetTop - 110;
  956. })
  957. .catch((error) => {
  958. self.loading = false;
  959. // self.$message.error(error + "");
  960. });
  961. },
  962. pageSizeChange(pageSize) {
  963. this.pageSize = pageSize;
  964. this.changePage(this.pageIndex);
  965. },
  966. sortChange(data) {
  967. this.field = data.column.field;
  968. this.changePage(this.pageIndex);
  969. },
  970. handleSelectionChange(val) {
  971. this.multipleSelection = val;
  972. },
  973. handleReset(name) {
  974. this.$refs[name].resetFields();
  975. },
  976. handleAdd() {
  977. this.modalTitle = "新增";
  978. this.businessKey = "";
  979. this.showModal = true;
  980. },
  981. handleEdit(record) {
  982. this.modalTitle = "编辑";
  983. this.businessKey = record.id;
  984. this.showModal = true;
  985. },
  986. handleDelete(record) {
  987. var self = this;
  988. self
  989. .$confirm("是否确认删除?", "提示", {
  990. confirmButtonText: "确定",
  991. cancelButtonText: "取消",
  992. type: "warning",
  993. })
  994. .then(() => {
  995. self.loading = true;
  996. personInfoApi.remove(record.id).then(function (response) {
  997. var jsonData = response.data;
  998. self.loading = false;
  999. if (jsonData.result) {
  1000. // var index = self.tableData.indexOf(record);
  1001. // self.tableData.splice(index, 1);
  1002. self.changePage(self.pageIndex);
  1003. self.$message({
  1004. type: "success",
  1005. message: "删除成功!",
  1006. });
  1007. }
  1008. });
  1009. })
  1010. .catch(() => {
  1011. self.loading = false;
  1012. });
  1013. },
  1014. handleBatchDelete() {
  1015. var self = this;
  1016. var idList = this.multipleSelection.map((record) => {
  1017. return record.id;
  1018. });
  1019. this.$confirm("是否确认删除选中项?", "提示", {
  1020. confirmButtonText: "确定",
  1021. cancelButtonText: "取消",
  1022. type: "warning",
  1023. }).then(() => {
  1024. self.loading = true;
  1025. personInfoApi
  1026. .batchRemove(idList)
  1027. .then(function (response) {
  1028. var jsonData = response.data;
  1029. self.loading = false;
  1030. if (jsonData.result) {
  1031. self.changePage(self.pageIndex);
  1032. self.$message({
  1033. type: "success",
  1034. message: "删除成功!",
  1035. });
  1036. }
  1037. })
  1038. .catch(() => {
  1039. self.loading = false;
  1040. });
  1041. });
  1042. },
  1043. onDetailModalClose(refreshed) {
  1044. //保存成功后回调
  1045. this.showModal = false;
  1046. this.showDeviceModal = false;
  1047. this.showBoundModal = false;
  1048. this.showRoleModal = false;
  1049. if (refreshed) {
  1050. this.changePage(this.pageIndex);
  1051. }
  1052. },
  1053. bindDevice(record) {
  1054. //绑定设备
  1055. this.personId = record.id;
  1056. this.showDeviceModal = true;
  1057. },
  1058. showBound(record) {
  1059. //展示绑定设备
  1060. //人员信息ID
  1061. this.personId = record.id;
  1062. this.showBoundModal = true;
  1063. },
  1064. beforeUpload(file, fileList) {
  1065. //导入前判断
  1066. var self = this;
  1067. var companyId = self.uploadXlsData.companyId;
  1068. if (companyId==null || companyId.length==0) {
  1069. self.$message({
  1070. type: "warning",
  1071. message: "请选择单位!",
  1072. });
  1073. self.xlsLoading = false;
  1074. return false;
  1075. } else {
  1076. self.xlsLoading = true;
  1077. return true;
  1078. }
  1079. },
  1080. //批量导入-上传成功
  1081. handleBatchImportSuccess(response, file, fileList) {
  1082. var self = this;
  1083. self.xlsLoading = false;
  1084. self.uploadXlsData.companyId = null;
  1085. if (response.result) {
  1086. self.$message.success(response.message);
  1087. this.batchImportFileList = [];
  1088. this.changePage(1);
  1089. this.batchImportVisible = false;
  1090. } else {
  1091. //this.$message.error(response.message);
  1092. this.batchImportFileList = [];
  1093. this.changePage(1);
  1094. if (response.data != null) {
  1095. //下载有错误信息提示的报表
  1096. //window.open(response.data);
  1097. self.$message({
  1098. showClose: true,
  1099. dangerouslyUseHTMLString: true,
  1100. message:
  1101. response.message +
  1102. `,<a href="${response.data}" target="_blank">点击下载未导入的数据报表</a>&nbsp;`,
  1103. duration: 30000,
  1104. });
  1105. }
  1106. }
  1107. },
  1108. //批量导入-预览
  1109. handleBatchImportPreview(file) {
  1110. console.log(file.url);
  1111. },
  1112. //批量导入-移除
  1113. handleBatchImportRemove(file, fileList) {
  1114. console.log(file, fileList);
  1115. },
  1116. //批量导入-移除前操作
  1117. beforeBatchImportRemove(file, fileList) {
  1118. console.log(file, fileList);
  1119. },
  1120. //批量导入-文件超出个数限制时的钩子
  1121. handleBatchImportExceed(files, fileList) {
  1122. this.$message.warning(
  1123. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  1124. files.length + fileList.length
  1125. } 个文件`
  1126. );
  1127. },
  1128. downloadAll() {
  1129. //导出
  1130. var self = this;
  1131. var formData = new FormData();
  1132. if (self.queryModel.parentId == null) {
  1133. self.queryModel.parentId = "";
  1134. }
  1135. formData.append("companyCode", self.queryModel.companyCode);
  1136. formData.append("parentId", self.queryModel.parentId);
  1137. formData.append("subordinate", self.queryModel.subordinate);
  1138. formData.append("id", self.queryModel.id);
  1139. formData.append("name", self.queryModel.name);
  1140. formData.append("phone", self.queryModel.phone);
  1141. formData.append("idCard", self.queryModel.idCard);
  1142. formData.append("faceBound", self.queryModel.faceBound);
  1143. formData.append("isUploadPhoto", self.queryModel.isUploadPhoto);
  1144. formData.append("position1", self.queryModel.position1);
  1145. formData.append("position2", self.queryModel.position2);
  1146. formData.append("position3", self.queryModel.position3);
  1147. formData.append("position4", self.queryModel.position4);
  1148. formData.append("position5", self.queryModel.position5);
  1149. self.xlsLoading = true;
  1150. personInfoApi.exportXls(formData).then(function (response) {
  1151. self.xlsLoading = false;
  1152. var jsonData = response.data;
  1153. if (jsonData.result) {
  1154. if (jsonData.data != null) {
  1155. self.$message({
  1156. showClose: true,
  1157. type: "success",
  1158. dangerouslyUseHTMLString: true,
  1159. message: `报表已生成,<a href="${jsonData.data}" target="_blank">点击下载报表</a>&nbsp;`,
  1160. duration: 30000,
  1161. });
  1162. }
  1163. }
  1164. });
  1165. },
  1166. enabledTo(row, type, value) {
  1167. var self = this;
  1168. if (type == "wechatNotice") {
  1169. var formData = new FormData();
  1170. formData.append("id", row.id);
  1171. personInfoApi.enabledWechatNotice(formData);
  1172. } else {
  1173. this.$confirm("该操作会对设备上的信息进行操作,请确认?", "提示", {
  1174. confirmButtonText: "确定",
  1175. cancelButtonText: "取消",
  1176. type: "warning",
  1177. })
  1178. .then(() => {
  1179. //self.loading = true;
  1180. if (!self.disabled) {
  1181. var formData = new FormData();
  1182. formData.append("id", row.id);
  1183. if ("face" == type) {
  1184. personInfoApi.enabledFace(formData);
  1185. } else if ("card" == type) {
  1186. personInfoApi.enabledCard(formData);
  1187. } else if ("app" == type) {
  1188. personInfoApi.enabledApp(formData);
  1189. } else if ("guest" == type) {
  1190. personInfoApi.enabledGuest(formData);
  1191. } else if ("wechatNotice" == type) {
  1192. personInfoApi.enabledWechatNotice(formData);
  1193. } else if ("sync" == type) {
  1194. personInfoApi.enabledSync(formData);
  1195. }
  1196. //关闭开关,是自动同步到服务器
  1197. //打开开关需要手动同步服务器
  1198. // if (!value) {
  1199. // //如果是打开开关,则修改状态
  1200. // row.faceBound = false;
  1201. // }
  1202. self.disabled = true;
  1203. setTimeout(function () {
  1204. self.disabled = false;
  1205. //self.loading = false;
  1206. }, 1000); //一秒内不能重复点击
  1207. } else {
  1208. self.$message({
  1209. type: "success",
  1210. message: "操作过快!",
  1211. });
  1212. }
  1213. })
  1214. .catch(() => {
  1215. // self.loading = false;
  1216. if (row.faceEnabled) {
  1217. row.faceEnabled = false;
  1218. } else {
  1219. row.faceEnabled = true;
  1220. }
  1221. });
  1222. }
  1223. },
  1224. uploadData(record) {
  1225. //同步人脸数据
  1226. var self = this;
  1227. self.loading = true;
  1228. var uploadSync = new Array(0);
  1229. uploadSync.push(record.id);
  1230. personInfoApi.dataSync(uploadSync).then(function (response) {
  1231. var jsonData = response.data;
  1232. self.loading = false;
  1233. if (jsonData.result) {
  1234. if (jsonData.data) {
  1235. self.changePage(self.pageIndex);
  1236. self.$message({
  1237. type: "success",
  1238. message: "同步成功!",
  1239. });
  1240. } else {
  1241. if (jsonData.message != null) {
  1242. //下载有错误信息提示的报表
  1243. //window.open(response.data);
  1244. self.$message({
  1245. showClose: true,
  1246. dangerouslyUseHTMLString: true,
  1247. message:
  1248. "错误" +
  1249. `,<a href="${jsonData.message}" target="_blank">点击下载错误报表</a>&nbsp;`,
  1250. duration: 30000,
  1251. });
  1252. }
  1253. }
  1254. } else {
  1255. self.$message({
  1256. type: "warning",
  1257. message: jsonData.message,
  1258. });
  1259. }
  1260. });
  1261. },
  1262. dataSync() {
  1263. //批量同步人脸
  1264. var self = this;
  1265. var idList = this.multipleSelection.map((record) => {
  1266. return record.id;
  1267. });
  1268. this.$confirm("是否确认同步选中项?", "提示", {
  1269. confirmButtonText: "确定",
  1270. cancelButtonText: "取消",
  1271. type: "warning",
  1272. })
  1273. .then(() => {
  1274. self.loading = true;
  1275. personInfoApi.dataSync(idList).then(function (response) {
  1276. var jsonData = response.data;
  1277. self.loading = false;
  1278. if (jsonData.result) {
  1279. if (jsonData.data) {
  1280. self.changePage(self.pageIndex);
  1281. self.$message({
  1282. type: "success",
  1283. message: "同步成功!",
  1284. });
  1285. } else {
  1286. if (jsonData.message != null) {
  1287. //下载有错误信息提示的报表
  1288. //window.open(response.data);
  1289. self.$message({
  1290. showClose: true,
  1291. dangerouslyUseHTMLString: true,
  1292. message:
  1293. "错误" +
  1294. `,<a href="${jsonData.message}" target="_blank">点击下载错误报表</a>&nbsp;`,
  1295. duration: 30000,
  1296. });
  1297. }
  1298. }
  1299. } else {
  1300. self.$message({
  1301. type: "warning",
  1302. message: jsonData.message,
  1303. });
  1304. }
  1305. });
  1306. })
  1307. .catch(() => {
  1308. self.loading = false;
  1309. });
  1310. },
  1311. handleBatchBoundDevice() {
  1312. //批量人脸
  1313. var self = this;
  1314. //self.loading = true;
  1315. self.boundDeviceDisabled = true;
  1316. //选择设备
  1317. let boundDeviceIds = self.boundDeviceIds;
  1318. var idList = this.multipleSelection.map((record) => {
  1319. return record.id;
  1320. });
  1321. boundDeviceIds.forEach((boundDeviceId) => {
  1322. var formData = new FormData();
  1323. formData.append("persons", idList);
  1324. formData.append("deviceId", boundDeviceId);
  1325. personDeviceRelationApi
  1326. .batchBindPerson(formData)
  1327. .then(function (response) {
  1328. var jsonData = response.data;
  1329. //self.loading = false;
  1330. self.boundDeviceDisabled = false;
  1331. if (jsonData.result) {
  1332. self.changePage(self.pageIndex);
  1333. self.batchBoundDevice = false;
  1334. self.boundDeviceId = "";
  1335. self.$message({
  1336. type: "success",
  1337. message: "绑定成功!",
  1338. });
  1339. } else {
  1340. self.$message({
  1341. showClose: true,
  1342. dangerouslyUseHTMLString: true,
  1343. message: `有部分人员绑定失败,<a href="${jsonData.message}" target="_blank">点击下载错误信息报表</a>&nbsp;`,
  1344. duration: 30000,
  1345. });
  1346. }
  1347. });
  1348. });
  1349. },
  1350. handleBatchUnBoundDevice() {
  1351. //批量人脸
  1352. var self = this;
  1353. //self.loading = true;
  1354. self.boundDeviceDisabled = true;
  1355. var idList = this.multipleSelection.map((record) => {
  1356. return record.id;
  1357. });
  1358. var formData = new FormData();
  1359. formData.append("persons", idList);
  1360. formData.append("deviceId", self.boundUnDeviceId);
  1361. personDeviceRelationApi
  1362. .batchUnBindPerson(formData)
  1363. .then(function (response) {
  1364. var jsonData = response.data;
  1365. //self.loading = false;
  1366. self.boundDeviceDisabled = false;
  1367. if (jsonData.result) {
  1368. self.changePage(self.pageIndex);
  1369. self.batchBoundDevice = false;
  1370. self.boundDeviceId = "";
  1371. self.$message({
  1372. type: "success",
  1373. message: "解除绑定成功!",
  1374. });
  1375. }
  1376. });
  1377. },
  1378. closeBatchBoundDevice() {
  1379. var self = this;
  1380. self.batchBoundDevice = false;
  1381. self.boundDeviceId = "";
  1382. },
  1383. closeBatchUnBoundDevice() {
  1384. var self = this;
  1385. self.batchUnBoundDevice = false;
  1386. self.boundUnDeviceId = "";
  1387. },
  1388. handleBatchEnabledFace() {
  1389. //批量人脸授权
  1390. var self = this;
  1391. self.loading = true;
  1392. let boundDeviceId = self.boundDeviceId;
  1393. var idList = this.multipleSelection.map((record) => {
  1394. return record.id;
  1395. });
  1396. var formData = new FormData();
  1397. formData.append("ids", idList);
  1398. personInfoApi.enabledFaceList(idList).then(function (response) {
  1399. var jsonData = response.data;
  1400. self.loading = false;
  1401. if (jsonData.result) {
  1402. self.changePage(self.pageIndex);
  1403. self.$message({
  1404. type: "success",
  1405. message: "授权成功!",
  1406. });
  1407. } else {
  1408. self.$message({
  1409. type: "warning",
  1410. message: jsonData.message,
  1411. });
  1412. }
  1413. });
  1414. },
  1415. bindWechat(record) {
  1416. this.bindWechatVisible = true;
  1417. this.bindWechatLoading = true;
  1418. this.bindWechatUrl = "";
  1419. personInfoApi
  1420. .bindWechat(record.id + "," + record.phone)
  1421. .then((response) => {
  1422. var jsonData = response.data;
  1423. this.bindWechatLoading = false;
  1424. if (jsonData.result) {
  1425. this.bindWechatUrl = jsonData.data;
  1426. } else {
  1427. this.$message.warning(jsonData.message);
  1428. }
  1429. });
  1430. },
  1431. unbindWechat(record) {
  1432. var self = this;
  1433. this.$confirm("是否确认微信解绑?", "提示", {
  1434. confirmButtonText: "确定",
  1435. cancelButtonText: "取消",
  1436. type: "warning",
  1437. }).then(() => {
  1438. self.loading = true;
  1439. personInfoApi
  1440. .unbindWechat(record.id)
  1441. .then(function (response) {
  1442. var jsonData = response.data;
  1443. self.loading = false;
  1444. if (jsonData.result) {
  1445. self.changePage(self.pageIndex);
  1446. self.$message({
  1447. type: "success",
  1448. message: "解绑成功!",
  1449. });
  1450. }
  1451. })
  1452. .catch(() => {
  1453. self.loading = false;
  1454. });
  1455. });
  1456. },
  1457. showLifeRecord(record) {
  1458. this.showRecordModal = true;
  1459. this.businessKey = record.id;
  1460. },
  1461. recordModalClose(refreshed) {
  1462. this.showRecordModal = false;
  1463. },
  1464. handleClearFaceImg(record) {
  1465. var self = this;
  1466. self
  1467. .$confirm("是否确认清除?", "提示", {
  1468. confirmButtonText: "确定",
  1469. cancelButtonText: "取消",
  1470. type: "warning",
  1471. })
  1472. .then(() => {
  1473. self.loading = true;
  1474. personInfoApi.clearFaceImg(record.id).then(function (response) {
  1475. var jsonData = response.data;
  1476. self.loading = false;
  1477. if (jsonData.result) {
  1478. self.$message({
  1479. type: "success",
  1480. message: "清除成功!",
  1481. });
  1482. } else {
  1483. self.$message({
  1484. showClose: true,
  1485. dangerouslyUseHTMLString: true,
  1486. message:
  1487. "发生错误" +
  1488. `,<a href="${jsonData.message}" target="_blank">点击下载错误信息</a>&nbsp;`,
  1489. duration: 30000,
  1490. });
  1491. }
  1492. });
  1493. })
  1494. .catch(() => {
  1495. self.loading = false;
  1496. });
  1497. },
  1498. handleBatchClearFaceImg() {
  1499. var self = this;
  1500. var idList = this.multipleSelection.map((record) => {
  1501. return record.id;
  1502. });
  1503. this.$confirm("是否确认清除设备上的照片?", "提示", {
  1504. confirmButtonText: "确定",
  1505. cancelButtonText: "取消",
  1506. type: "warning",
  1507. }).then(() => {
  1508. self.loading = true;
  1509. personInfoApi
  1510. .batchClearFaceImg(idList)
  1511. .then(function (response) {
  1512. var jsonData = response.data;
  1513. self.loading = false;
  1514. if (jsonData.result) {
  1515. self.changePage(self.pageIndex);
  1516. self.$message({
  1517. type: "success",
  1518. message: "清除成功!",
  1519. });
  1520. }
  1521. })
  1522. .catch(() => {
  1523. self.loading = false;
  1524. });
  1525. });
  1526. },
  1527. bindRole(record) {
  1528. //绑定设备
  1529. this.personId = record.id;
  1530. this.showRoleModal = true;
  1531. },
  1532. },
  1533. async mounted() {
  1534. var self = this;
  1535. this.changePage(1);
  1536. //self.tableHeight = window.innerHeight - self.$refs.queryForm.$el.offsetTop - 100;
  1537. },
  1538. components: {
  1539. "personInfo-detail": PersonInfoDetail,
  1540. "personDeviceRelation-list": PersonDeviceRelationList,
  1541. "personDeviceRelation-BoundList": PersonDeviceRelationBoundList,
  1542. "el-select-tree": SelectTree,
  1543. "lifeRecord-list": LifeRecordList,
  1544. "personPopedom-list": PersonPopedomList,
  1545. },
  1546. };
  1547. </script>
  1548. <style lang="scss" scoped>
  1549. .el-breadcrumb {
  1550. margin: 10px;
  1551. line-height: 20px;
  1552. }
  1553. .el-divider {
  1554. margin: 5px 0;
  1555. }
  1556. .demo-form-inline {
  1557. margin-left: 10px;
  1558. text-align: left;
  1559. background-color: white;
  1560. }
  1561. .button-group {
  1562. margin-left: 10px;
  1563. text-align: left;
  1564. }
  1565. .sticky-panel {
  1566. background-color: #fff;
  1567. }
  1568. </style>