personInfo-list.vue 53 KB

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