personInfo-list.vue 51 KB

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