personInfo-list.vue 49 KB

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