personInfo-list.vue 49 KB

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