personInfo-list.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098
  1. <template>
  2. <div>
  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 ref="queryForm" :model="queryModel" inline class="demo-form-inline">
  17. <div>
  18. <el-form-item label="姓名" prop="name">
  19. <el-input type="text" size="mini" v-model="queryModel.name"></el-input>
  20. </el-form-item>
  21. <el-form-item label="手机号" prop="phone">
  22. <el-input type="text" size="mini" v-model="queryModel.phone"></el-input>
  23. </el-form-item>
  24. <el-form-item label="身份证" prop="idCard">
  25. <el-input type="text" size="mini" v-model="queryModel.idCard"></el-input>
  26. </el-form-item>
  27. <el-form-item>
  28. <el-button
  29. type="primary"
  30. size="mini"
  31. icon="ios-search"
  32. @click="changePage(1)"
  33. :loading="loading"
  34. >查询</el-button>&nbsp;
  35. <el-button
  36. type="info"
  37. size="mini"
  38. style="margin-left: 8px"
  39. @click="handleReset('queryForm')"
  40. >重置</el-button>&nbsp;
  41. </el-form-item>
  42. </div>
  43. <div>
  44. <el-form-item label="单位" prop="companyCode">
  45. <el-select
  46. v-model="queryModel.companyCode"
  47. size="mini"
  48. filterable
  49. placeholder="请选择"
  50. style="width:220px"
  51. >
  52. <el-option
  53. v-for="company in companyResult"
  54. :key="company.id"
  55. :label="company.name"
  56. :value="company.code"
  57. ></el-option>
  58. </el-select>&nbsp;
  59. <el-checkbox v-model="queryModel.subordinate">是否包含下级单位</el-checkbox>
  60. </el-form-item>
  61. <el-form-item label="是否上传照片" prop="companyId">
  62. <el-select
  63. v-model="queryModel.isUploadPhoto"
  64. size="mini"
  65. filterable
  66. placeholder="请选择"
  67. style="width:120px"
  68. >
  69. <el-option value label="全部"></el-option>
  70. <el-option value="1" label="已上传"></el-option>
  71. <el-option value="0" label="未上传"></el-option>
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item label="是否同步" prop="faceBound">
  75. <el-select
  76. v-model="queryModel.faceBound"
  77. size="mini"
  78. filterable
  79. placeholder="请选择"
  80. style="width:120px"
  81. >
  82. <el-option value label="全部"></el-option>
  83. <el-option value="1" label="已同步"></el-option>
  84. <el-option value="0" label="未同步"></el-option>
  85. </el-select>
  86. </el-form-item>
  87. </div>
  88. </el-form>
  89. <el-divider></el-divider>
  90. <el-row class="button-group">
  91. <el-button type="primary" size="small" plain icon="el-icon-remove" @click="handleAdd">新增</el-button>
  92. <el-button
  93. type="primary"
  94. size="small"
  95. plain
  96. icon="el-icon-remove"
  97. :disabled="multipleSelection.length==0"
  98. @click="handleBatchDelete"
  99. >删除选中项</el-button>
  100. <el-button
  101. type="primary"
  102. size="small"
  103. plain
  104. icon="el-icon-upload2"
  105. @click="batchImportVisible = true"
  106. >导入</el-button>
  107. <el-button
  108. type="primary"
  109. size="small"
  110. plain
  111. icon="el-icon-download"
  112. :loading="xlsLoading"
  113. @click="downloadAll"
  114. >导出数据</el-button>
  115. <el-button
  116. type="primary"
  117. size="small"
  118. plain
  119. icon="el-icon-refresh"
  120. :disabled="multipleSelection.length==0"
  121. @click="dataSync"
  122. >数据同步</el-button>
  123. <el-button
  124. type="primary"
  125. size="small"
  126. plain
  127. icon="el-icon-refresh"
  128. :disabled="multipleSelection.length==0"
  129. @click="handleBatchEnabledFace"
  130. >人脸授权</el-button>
  131. <el-button
  132. type="primary"
  133. size="small"
  134. plain
  135. icon="el-icon-refresh"
  136. :disabled="multipleSelection.length==0"
  137. @click="batchBoundDevice = true"
  138. >绑定设备</el-button>
  139. <el-button
  140. type="primary"
  141. size="small"
  142. plain
  143. icon="el-icon-refresh"
  144. :disabled="multipleSelection.length==0"
  145. @click="batchUnBoundDevice = true"
  146. >解绑设备</el-button>
  147. </el-row>
  148. <el-table
  149. :data="tableData"
  150. style="min-height:400px;"
  151. v-loading="loading"
  152. stripe
  153. :height="tableHeight"
  154. @sort-change="sortChange"
  155. @selection-change="handleSelectionChange"
  156. >
  157. <el-table-column type="selection" width="55"></el-table-column>
  158. <el-table-column prop="id" label="序号" width="80" fixed="left"></el-table-column>
  159. <el-table-column prop="name" label="姓名" width="80" fixed="left"></el-table-column>
  160. <el-table-column prop="faceImageUrl" label="人员照片" width="80" fixed="left">
  161. <template slot-scope="{row}">
  162. <a :href="row.faceImageUrl" target="_blank">
  163. <el-avatar
  164. :size="48"
  165. shape="circle"
  166. :src="row.faceImageUrl+'?x-oss-process=image/resize,m_fill,w_64,h_64'"
  167. :key="row.id"
  168. ></el-avatar>
  169. </a>
  170. </template>
  171. </el-table-column>
  172. <el-table-column prop="companyName" label="单位" width="250"></el-table-column>
  173. <el-table-column prop="phone" label="手机号" width="180"></el-table-column>
  174. <el-table-column prop="idCard" label="身份证" width="100" show-overflow-tooltip></el-table-column>
  175. <el-table-column prop="deviceName" label="绑定设备" width="150" show-overflow-tooltip></el-table-column>
  176. <el-table-column prop="position1" :label="position1" width="250" v-if="position1Show"></el-table-column>
  177. <el-table-column prop="position2" :label="position2" width="250" v-if="position2Show"></el-table-column>
  178. <el-table-column prop="position3" :label="position3" width="250" v-if="position3Show"></el-table-column>
  179. <el-table-column prop="position4" :label="position4" width="250" v-if="position4Show"></el-table-column>
  180. <el-table-column prop="position5" :label="position5" width="250" v-if="position5Show"></el-table-column>
  181. <el-table-column prop="openId" label="是否绑定公众号" width="180">
  182. <template slot-scope="{row}">{{row.openId == null ? "否" : "是"}}</template>
  183. </el-table-column>
  184. <el-table-column prop="faceBound" label="是否同步人脸信息" width="180">
  185. <template slot-scope="{row}">{{row.faceBound ? "是" : "否"}}</template>
  186. </el-table-column>
  187. <el-table-column prop="popedom" label="用户身份" width="200">
  188. <template slot-scope="{row}">
  189. <el-row>
  190. <el-col :span="10" v-if="row.popedom.indexOf('1')!= -1">个人用户</el-col>
  191. <el-col :span="10" v-if="row.popedom.indexOf('2')!= -1">单位管理员</el-col>
  192. <el-col :span="10" v-if="row.popedom.indexOf('3')!= -1">监管专员</el-col>
  193. </el-row>
  194. </template>
  195. </el-table-column>
  196. <el-table-column label="人脸授权">
  197. <template slot-scope="{row}">
  198. <el-switch
  199. v-model="row.faceEnabled"
  200. @change="enabledTo(row,'face',row.faceEnabled)"
  201. active-color="#13ce66"
  202. inactive-color="#ff4949"
  203. :disabled="disabled"
  204. ></el-switch>
  205. </template>
  206. </el-table-column>
  207. <el-table-column label="刷卡授权">
  208. <template slot-scope="{row}">
  209. <el-switch
  210. v-model="row.cardEnabled"
  211. @change="enabledTo(row,'card','')"
  212. active-color="#13ce66"
  213. inactive-color="#ff4949"
  214. :disabled="disabled"
  215. ></el-switch>
  216. </template>
  217. </el-table-column>
  218. <el-table-column label="手机授权">
  219. <template slot-scope="{row}">
  220. <el-switch
  221. v-model="row.appEnabled"
  222. @change="enabledTo(row,'app','')"
  223. active-color="#13ce66"
  224. inactive-color="#ff4949"
  225. :disabled="disabled"
  226. ></el-switch>
  227. </template>
  228. </el-table-column>
  229. <!-- <el-table-column label="密码">
  230. <template slot-scope="{row}">
  231. <el-switch v-model="row.passwordEnabled" @change="enabledTo(row.id,'face')" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
  232. </template>
  233. </el-table-column>-->
  234. <el-table-column label="访客授权">
  235. <template slot-scope="{row}">
  236. <el-switch
  237. v-model="row.guestEnabled"
  238. @change="enabledTo(row,'guest','')"
  239. active-color="#13ce66"
  240. inactive-color="#ff4949"
  241. :disabled="disabled"
  242. ></el-switch>
  243. </template>
  244. </el-table-column>
  245. <el-table-column label="接收微信通知">
  246. <template slot-scope="{row}">
  247. <el-switch
  248. v-model="row.wechatNoticeEnabled"
  249. @change="enabledTo(row,'wechatNotice','')"
  250. active-color="#13ce66"
  251. inactive-color="#ff4949"
  252. :disabled="disabled"
  253. ></el-switch>
  254. </template>
  255. </el-table-column>
  256. <el-table-column prop="openId" label="微信openid" width="180"></el-table-column>
  257. <el-table-column label="操作" width="300" fixed="right">
  258. <template slot-scope="{row}">
  259. <el-row>
  260. <el-col>
  261. <el-link type="primary" :underline="false" @click="handleEdit(row)">编辑</el-link>-
  262. <el-link type="danger" :underline="false" @click="handleDelete(row)">删除</el-link>-
  263. <el-link type="primary" :underline="false" @click="bindDevice(row)">绑定设备</el-link>-
  264. <span v-if="row.faceBound">
  265. <el-link
  266. type="primary"
  267. :underline="false"
  268. :disabled="true"
  269. @click="uploadData(row)"
  270. >数据同步</el-link>-
  271. </span>
  272. <span v-if="!row.faceBound">
  273. <el-link type="primary" :underline="false" @click="uploadData(row)">数据同步</el-link>-
  274. </span>
  275. <el-link type="primary" :underline="false" @click="showBound(row)">已绑定设备</el-link>
  276. </el-col>
  277. </el-row>
  278. </template>
  279. </el-table-column>
  280. </el-table>
  281. <el-pagination
  282. :current-page.sync="pageIndex"
  283. :total="totalElements"
  284. :page-sizes="pageSizeList"
  285. @current-change="changePage"
  286. @size-change="pageSizeChange"
  287. layout="total, sizes, prev, pager, next, jumper"
  288. ></el-pagination>
  289. <personInfo-detail
  290. v-if="showModal"
  291. :businessKey="businessKey"
  292. :title="modalTitle"
  293. :companyResult="companyResult"
  294. :companyPosition1="position1"
  295. :companyPosition2="position2"
  296. :companyPosition3="position3"
  297. :companyPosition4="position4"
  298. :companyPosition5="position5"
  299. @close="onDetailModalClose"
  300. ></personInfo-detail>
  301. <personDeviceRelation-list
  302. v-if="showDeviceModal"
  303. :personId="personId"
  304. @close="onDetailModalClose"
  305. ></personDeviceRelation-list>
  306. <personDeviceRelation-BoundList
  307. v-if="showBoundModal"
  308. :personId="personId"
  309. @close="onDetailModalClose"
  310. ></personDeviceRelation-BoundList>
  311. <!--批量导入S-->
  312. <el-dialog
  313. title="批量导入人员"
  314. :visible.sync="batchImportVisible"
  315. :modal-append-to-body="false"
  316. style="text-align: left;"
  317. :close-on-click-modal="false"
  318. >
  319. <el-form label-width="150px">
  320. <el-form-item label="模板下载">
  321. <el-link
  322. href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/companyInfo/2020/3/16170226996.xls"
  323. type="primary"
  324. target="_blank"
  325. >点击下载模板</el-link>
  326. </el-form-item>
  327. <el-form-item label="单位">
  328. <el-select
  329. v-model="uploadCompanyId"
  330. filterable
  331. placeholder="请选择"
  332. @change="changeUploadCompayId"
  333. style="width:280px"
  334. >
  335. <el-option
  336. v-for="company in companyResult"
  337. :key="company.id"
  338. :label="company.name"
  339. :value="company.id"
  340. ></el-option>
  341. </el-select>
  342. </el-form-item>
  343. <el-form-item label="上传文件">
  344. <el-upload
  345. class="upload-demo"
  346. accept=".xls"
  347. :action="uploadUrlXls"
  348. :data="uploadXlsData"
  349. :headers="headers"
  350. :on-preview="handleBatchImportPreview"
  351. name="uploadFile"
  352. :multiple="true"
  353. :limit="1"
  354. :on-remove="handleBatchImportRemove"
  355. :before-remove="beforeBatchImportRemove"
  356. :before-upload="beforeUpload"
  357. :on-exceed="handleBatchImportExceed"
  358. :on-success="handleBatchImportSuccess"
  359. :file-list="batchImportFileList"
  360. >
  361. <el-button size="small" type="primary" :loading="xlsLoading">点击上传</el-button>
  362. <div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kb</div>
  363. </el-upload>
  364. </el-form-item>
  365. </el-form>
  366. <div slot="footer" class="dialog-footer">
  367. <el-button type="primary" @click="batchImportVisible = false">关 闭</el-button>
  368. </div>
  369. </el-dialog>
  370. <!--批量导入E-->
  371. <!-- 批量绑定设备 -->
  372. <el-dialog
  373. title="绑定设备"
  374. :visible.sync="batchBoundDevice"
  375. :modal-append-to-body="false"
  376. style="text-align: left;"
  377. :close-on-click-modal="false"
  378. >
  379. <el-form label-width="150px" v-loading="boundDeviceDisabled">
  380. <el-form-item label="设备">
  381. <el-select v-model="boundDeviceId" filterable placeholder="请选择">
  382. <el-option
  383. v-for="devices in deviceResult"
  384. :key="devices.id"
  385. :label="devices.aliasName"
  386. :value="devices.id"
  387. ></el-option>
  388. </el-select>
  389. </el-form-item>
  390. </el-form>
  391. <div slot="footer" class="dialog-footer">
  392. <el-button @click="closeBatchBoundDevice">关 闭</el-button>
  393. <el-button type="primary" @click="handleBatchBoundDevice">确 定</el-button>
  394. </div>
  395. </el-dialog>
  396. <!-- 批量绑定设备end -->
  397. <!-- 批量解绑设备 -->
  398. <el-dialog
  399. title="解绑设备"
  400. :visible.sync="batchUnBoundDevice"
  401. :modal-append-to-body="false"
  402. style="text-align: left;"
  403. :close-on-click-modal="false"
  404. >
  405. <el-form label-width="150px" v-loading="boundDeviceDisabled">
  406. <el-form-item label="设备">
  407. <el-select v-model="boundUnDeviceId" filterable placeholder="请选择">
  408. <el-option
  409. v-for="devices in deviceResult"
  410. :key="devices.id"
  411. :label="devices.aliasName"
  412. :value="devices.id"
  413. ></el-option>
  414. </el-select>
  415. </el-form-item>
  416. </el-form>
  417. <div slot="footer" class="dialog-footer">
  418. <el-button @click="closeBatchUnBoundDevice">关 闭</el-button>
  419. <el-button type="primary" @click="handleBatchUnBoundDevice">确 定</el-button>
  420. </div>
  421. </el-dialog>
  422. <!-- 批量解绑设备end -->
  423. </div>
  424. </template>
  425. <script>
  426. import Constant from "@/constant";
  427. import PersonInfoDetail from "./personInfo-detail";
  428. import PersonDeviceRelationList from "./personDeviceRelation-list";
  429. import PersonDeviceRelationBoundList from "./personDeviceRelation-BoundList";
  430. import personInfoApi from "@/api/base/personInfo";
  431. import companyInfoApi from "@/api/base/companyInfo";
  432. import companyPositionApi from "@/api/base/companyPosition";
  433. import deviceInfoApi from "@/api/base/deviceInfo";
  434. import personDeviceRelationApi from "@/api/base/personDeviceRelation";
  435. import { getToken } from "@/utils/auth"; // get token from cookie
  436. import NProgress from "nprogress"; // progress bar
  437. import "nprogress/nprogress.css"; // progress bar style
  438. export default {
  439. data() {
  440. var self = this;
  441. return {
  442. queryModel: {
  443. companyCode: "",
  444. name: "",
  445. phone: "",
  446. idCard: "",
  447. faceBound: "",
  448. isUploadPhoto: "",
  449. subordinate: false
  450. },
  451. loading: false,
  452. tableData: [],
  453. pageIndex: 1,
  454. pageSize: 30,
  455. totalPages: 0,
  456. totalElements: 0,
  457. field: "",
  458. direction: "",
  459. pageSizeList: [30, 100, 500],
  460. multipleSelection: [],
  461. showModal: false,
  462. modalTitle: "",
  463. businessKey: "",
  464. companyResult: "",
  465. uploadCompanyId: "",
  466. batchImportVisible: false,
  467. batchImportFileList: [],
  468. uploadUrlXls: Constant.serverUrl + "/base/personInfo/importXls",
  469. uploadXlsData: {
  470. subFolder: "company",
  471. companyId: ""
  472. },
  473. headers: {
  474. Authorization: getToken()
  475. },
  476. disabled: false,
  477. position1: "",
  478. position2: "",
  479. position3: "",
  480. position4: "",
  481. position5: "",
  482. position1Show: false,
  483. position2Show: false,
  484. position3Show: false,
  485. position4Show: false,
  486. position5Show: false,
  487. showDeviceModal: false,
  488. showBoundModal: false,
  489. personId: "",
  490. batchBoundDevice: false,
  491. batchUnBoundDevice: false,
  492. deviceResult: "",
  493. boundDeviceId: "",
  494. boundUnDeviceId: "",
  495. xlsLoading: false,
  496. tableHeight: "",
  497. boundDeviceDisabled: false
  498. };
  499. },
  500. created() {
  501. var self = this;
  502. companyInfoApi.list().then(function(response) {
  503. var jsonData = response.data;
  504. if (jsonData.result) {
  505. if (jsonData.data != null && jsonData.data != "") {
  506. self.companyResult = jsonData.data;
  507. }
  508. }
  509. });
  510. deviceInfoApi.list().then(function(response) {
  511. var jsonData = response.data;
  512. if (jsonData.result) {
  513. if (jsonData.data != null && jsonData.data != "") {
  514. self.deviceResult = jsonData.data;
  515. }
  516. }
  517. });
  518. companyPositionApi.detailForCompany().then(function(response) {
  519. var jsonData = response.data.data;
  520. if (jsonData.position1Name != null && jsonData.position1Name != "") {
  521. self.position1 = jsonData.position1Name;
  522. self.position1Show = true;
  523. }
  524. if (jsonData.position2Name != null && jsonData.position2Name != "") {
  525. self.position2 = jsonData.position2Name;
  526. self.position2Show = true;
  527. }
  528. if (jsonData.position3Name != null && jsonData.position3Name != "") {
  529. self.position3 = jsonData.position3Name;
  530. self.position3Show = true;
  531. }
  532. if (jsonData.position4Name != null && jsonData.position4Name != "") {
  533. self.position4 = jsonData.position4Name;
  534. self.position4Show = true;
  535. }
  536. if (jsonData.position5Name != null && jsonData.position5Name != "") {
  537. self.position5 = jsonData.position5Name;
  538. self.position5Show = true;
  539. }
  540. });
  541. },
  542. methods: {
  543. changePage(pageIndex) {
  544. var self = this;
  545. self.loading = true;
  546. self.pageIndex = pageIndex;
  547. var formData = new FormData();
  548. formData.append("pageIndex", self.pageIndex);
  549. formData.append("pageSize", self.pageSize);
  550. formData.append("companyCode", self.queryModel.companyCode);
  551. formData.append("subordinate", self.queryModel.subordinate);
  552. formData.append("name", self.queryModel.name);
  553. formData.append("phone", self.queryModel.phone);
  554. formData.append("idCard", self.queryModel.idCard);
  555. formData.append("faceBound", self.queryModel.faceBound);
  556. formData.append("isUploadPhoto", self.queryModel.isUploadPhoto);
  557. if (this.field != null) {
  558. formData.append("field", this.field);
  559. }
  560. if (this.direction != null) {
  561. formData.append("direction", this.direction);
  562. }
  563. personInfoApi
  564. .pageList(formData)
  565. .then(function(response) {
  566. self.loading = false;
  567. var jsonData = response.data.data;
  568. self.tableData = jsonData.data;
  569. self.totalPages = jsonData.totalPages;
  570. self.totalElements = jsonData.recordsTotal;
  571. self.tableHeight = window.innerHeight - 320;
  572. })
  573. .catch(error => {
  574. self.loading = false;
  575. // self.$message.error(error + "");
  576. });
  577. },
  578. pageSizeChange(pageSize) {
  579. this.pageSize = pageSize;
  580. this.changePage(this.pageIndex);
  581. },
  582. sortChange(data) {
  583. this.field = data.column.field;
  584. this.changePage(this.pageIndex);
  585. },
  586. handleSelectionChange(val) {
  587. this.multipleSelection = val;
  588. },
  589. handleReset(name) {
  590. this.$refs[name].resetFields();
  591. },
  592. handleAdd() {
  593. this.modalTitle = "新增";
  594. this.businessKey = "";
  595. this.showModal = true;
  596. },
  597. handleEdit(record) {
  598. this.modalTitle = "编辑";
  599. this.businessKey = record.id;
  600. this.showModal = true;
  601. },
  602. handleDelete(record) {
  603. var self = this;
  604. self
  605. .$confirm("是否确认删除?", "提示", {
  606. confirmButtonText: "确定",
  607. cancelButtonText: "取消",
  608. type: "warning"
  609. })
  610. .then(() => {
  611. self.loading = true;
  612. personInfoApi.remove(record.id).then(function(response) {
  613. var jsonData = response.data;
  614. self.loading = false;
  615. if (jsonData.result) {
  616. // var index = self.tableData.indexOf(record);
  617. // self.tableData.splice(index, 1);
  618. self.changePage(self.pageIndex);
  619. self.$message({
  620. type: "success",
  621. message: "删除成功!"
  622. });
  623. }
  624. });
  625. })
  626. .catch(() => {
  627. self.loading = false;
  628. });
  629. },
  630. handleBatchDelete() {
  631. var self = this;
  632. var idList = this.multipleSelection.map(record => {
  633. return record.id;
  634. });
  635. this.$confirm("是否确认删除选中项?", "提示", {
  636. confirmButtonText: "确定",
  637. cancelButtonText: "取消",
  638. type: "warning"
  639. }).then(() => {
  640. self.loading = true;
  641. personInfoApi
  642. .batchRemove(idList)
  643. .then(function(response) {
  644. var jsonData = response.data;
  645. self.loading = false;
  646. if (jsonData.result) {
  647. self.changePage(self.pageIndex);
  648. self.$message({
  649. type: "success",
  650. message: "删除成功!"
  651. });
  652. }
  653. })
  654. .catch(() => {
  655. self.loading = false;
  656. });
  657. });
  658. },
  659. onDetailModalClose(refreshed) {
  660. //保存成功后回调
  661. this.showModal = false;
  662. this.showDeviceModal = false;
  663. this.showBoundModal = false;
  664. if (refreshed) {
  665. this.changePage(this.pageIndex);
  666. }
  667. },
  668. changeUploadCompayId(value) {
  669. var self = this;
  670. self.uploadXlsData.companyId = value;
  671. },
  672. bindDevice(record) {
  673. //绑定设备
  674. this.personId = record.id;
  675. this.showDeviceModal = true;
  676. },
  677. showBound(record) {
  678. //展示绑定设备
  679. //人员信息ID
  680. this.personId = record.id;
  681. this.showBoundModal = true;
  682. },
  683. beforeUpload(file, fileList) {
  684. //导入前判断
  685. var self = this;
  686. if (self.uploadCompanyId == null || self.uploadCompanyId == "") {
  687. self.$message({
  688. type: "warning",
  689. message: "请选择单位"
  690. });
  691. self.xlsLoading = false;
  692. return false;
  693. } else {
  694. self.xlsLoading = true;
  695. return true;
  696. }
  697. },
  698. //批量导入-上传成功
  699. handleBatchImportSuccess(response, file, fileList) {
  700. var self = this;
  701. self.xlsLoading = false;
  702. if (response.result) {
  703. self.$message.success(response.message);
  704. this.batchImportFileList = [];
  705. this.changePage(1);
  706. this.uploadCompanyId = "";
  707. this.uploadXlsData.companyId = "";
  708. this.batchImportVisible = false;
  709. } else {
  710. //this.$message.error(response.message);
  711. this.batchImportFileList = [];
  712. this.changePage(1);
  713. this.uploadCompanyId = "";
  714. this.uploadXlsData.companyId = "";
  715. if (response.data != null) {
  716. //下载有错误信息提示的报表
  717. //window.open(response.data);
  718. self.$message({
  719. showClose: true,
  720. dangerouslyUseHTMLString: true,
  721. message:
  722. response.message +
  723. `,<a href="${response.data}" target="_blank">点击下载未导入的数据报表</a>&nbsp;`,
  724. duration: 30000
  725. });
  726. }
  727. }
  728. },
  729. //批量导入-预览
  730. handleBatchImportPreview(file) {
  731. console.log(file.url);
  732. },
  733. //批量导入-移除
  734. handleBatchImportRemove(file, fileList) {
  735. console.log(file, fileList);
  736. },
  737. //批量导入-移除前操作
  738. beforeBatchImportRemove(file, fileList) {
  739. console.log(file, fileList);
  740. },
  741. //批量导入-文件超出个数限制时的钩子
  742. handleBatchImportExceed(files, fileList) {
  743. this.$message.warning(
  744. `当前限制选择 3 个文件,本次选择了 ${
  745. files.length
  746. } 个文件,共选择了 ${files.length + fileList.length} 个文件`
  747. );
  748. },
  749. downloadAll() {
  750. //导出
  751. var self = this;
  752. var formData = new FormData();
  753. formData.append("companyCode", self.queryModel.companyCode);
  754. formData.append("subordinate", self.queryModel.subordinate);
  755. formData.append("name", self.queryModel.name);
  756. formData.append("phone", self.queryModel.phone);
  757. formData.append("idCard", self.queryModel.idCard);
  758. formData.append("faceBound", self.queryModel.faceBound);
  759. formData.append("isUploadPhoto", self.queryModel.isUploadPhoto);
  760. self.xlsLoading = true;
  761. personInfoApi.exportXls(formData).then(function(response) {
  762. self.xlsLoading = false;
  763. var jsonData = response.data;
  764. if (jsonData.result) {
  765. if (jsonData.data != null) {
  766. //下载有错误信息提示的报表
  767. self.$message({
  768. showClose: true,
  769. dangerouslyUseHTMLString: true,
  770. message: `<a href="${jsonData.data}" target="_blank">点击下载报表</a>&nbsp;`,
  771. duration: 30000
  772. });
  773. }
  774. }
  775. });
  776. },
  777. enabledTo(row, type, value) {
  778. var self = this;
  779. if(type=="wechatNotice"){
  780. var formData = new FormData();
  781. formData.append("id", row.id);
  782. personInfoApi.enabledWechatNotice(formData);
  783. }
  784. else{
  785. this.$confirm("该操作会对设备上的信息进行操作,请确认?", "提示", {
  786. confirmButtonText: "确定",
  787. cancelButtonText: "取消",
  788. type: "warning"
  789. })
  790. .then(() => {
  791. //self.loading = true;
  792. if (!self.disabled) {
  793. var formData = new FormData();
  794. formData.append("id", row.id);
  795. if ("face" == type) {
  796. personInfoApi.enabledFace(formData);
  797. } else if ("card" == type) {
  798. personInfoApi.enabledCard(formData);
  799. } else if ("app" == type) {
  800. personInfoApi.enabledApp(formData);
  801. } else if ("guest" == type) {
  802. personInfoApi.enabledGuest(formData);
  803. }else if ("wechatNotice" == type) {
  804. personInfoApi.enabledWechatNotice(formData);
  805. }
  806. //关闭开关,是自动同步到服务器
  807. //打开开关需要手动同步服务器
  808. // if (!value) {
  809. // //如果是打开开关,则修改状态
  810. // row.faceBound = false;
  811. // }
  812. self.disabled = true;
  813. setTimeout(function() {
  814. self.disabled = false;
  815. //self.loading = false;
  816. }, 1000); //一秒内不能重复点击
  817. } else {
  818. self.$message({
  819. type: "success",
  820. message: "操作过快!"
  821. });
  822. }
  823. })
  824. .catch(() => {
  825. // self.loading = false;
  826. if (row.faceEnabled) {
  827. row.faceEnabled = false;
  828. } else {
  829. row.faceEnabled = true;
  830. }
  831. });
  832. }
  833. },
  834. uploadData(record) {
  835. //同步人脸数据
  836. var self = this;
  837. self.loading = true;
  838. var uploadSync = new Array(0);
  839. uploadSync.push(record.id);
  840. personInfoApi.dataSync(uploadSync).then(function(response) {
  841. var jsonData = response.data;
  842. self.loading = false;
  843. if (jsonData.result) {
  844. if (jsonData.data) {
  845. self.changePage(self.pageIndex);
  846. self.$message({
  847. type: "success",
  848. message: "同步成功!"
  849. });
  850. } else {
  851. if (jsonData.message != null) {
  852. //下载有错误信息提示的报表
  853. //window.open(response.data);
  854. self.$message({
  855. showClose: true,
  856. dangerouslyUseHTMLString: true,
  857. message:
  858. "错误" +
  859. `,<a href="${jsonData.message}" target="_blank">点击下载错误报表</a>&nbsp;`,
  860. duration: 30000
  861. });
  862. }
  863. }
  864. } else {
  865. self.$message({
  866. type: "warning",
  867. message: jsonData.message
  868. });
  869. }
  870. });
  871. },
  872. dataSync() {
  873. //批量同步人脸
  874. var self = this;
  875. var idList = this.multipleSelection.map(record => {
  876. return record.id;
  877. });
  878. this.$confirm("是否确认同步选中项?", "提示", {
  879. confirmButtonText: "确定",
  880. cancelButtonText: "取消",
  881. type: "warning"
  882. })
  883. .then(() => {
  884. self.loading = true;
  885. personInfoApi.dataSync(idList).then(function(response) {
  886. var jsonData = response.data;
  887. self.loading = false;
  888. if (jsonData.result) {
  889. if (jsonData.data) {
  890. self.changePage(self.pageIndex);
  891. self.$message({
  892. type: "success",
  893. message: "同步成功!"
  894. });
  895. } else {
  896. if (jsonData.message != null) {
  897. //下载有错误信息提示的报表
  898. //window.open(response.data);
  899. self.$message({
  900. showClose: true,
  901. dangerouslyUseHTMLString: true,
  902. message:
  903. "错误" +
  904. `,<a href="${jsonData.message}" target="_blank">点击下载错误报表</a>&nbsp;`,
  905. duration: 30000
  906. });
  907. }
  908. }
  909. } else {
  910. self.$message({
  911. type: "warning",
  912. message: jsonData.message
  913. });
  914. }
  915. });
  916. })
  917. .catch(() => {
  918. self.loading = false;
  919. });
  920. },
  921. handleBatchBoundDevice() {
  922. //批量人脸
  923. var self = this;
  924. //self.loading = true;
  925. self.boundDeviceDisabled = true;
  926. let boundDeviceId = self.boundDeviceId;
  927. var idList = this.multipleSelection.map(record => {
  928. return record.id;
  929. });
  930. var formData = new FormData();
  931. formData.append("persons", idList);
  932. formData.append("deviceId", boundDeviceId);
  933. personDeviceRelationApi
  934. .batchBindPerson(formData)
  935. .then(function(response) {
  936. var jsonData = response.data;
  937. //self.loading = false;
  938. self.boundDeviceDisabled = false;
  939. if (jsonData.result) {
  940. self.changePage(self.pageIndex);
  941. self.batchBoundDevice = false;
  942. self.boundDeviceId = "";
  943. self.$message({
  944. type: "success",
  945. message: "绑定成功!"
  946. });
  947. } else {
  948. self.$message({
  949. showClose: true,
  950. dangerouslyUseHTMLString: true,
  951. message: `有部分人员绑定失败,<a href="${jsonData.message}" target="_blank">点击下载错误信息报表</a>&nbsp;`,
  952. duration: 30000
  953. });
  954. }
  955. });
  956. },
  957. handleBatchUnBoundDevice() {
  958. //批量人脸
  959. var self = this;
  960. //self.loading = true;
  961. self.boundDeviceDisabled = true;
  962. var idList = this.multipleSelection.map(record => {
  963. return record.id;
  964. });
  965. var formData = new FormData();
  966. formData.append("persons", idList);
  967. formData.append("deviceId", self.boundUnDeviceId);
  968. personDeviceRelationApi
  969. .batchUnBindPerson(formData)
  970. .then(function(response) {
  971. var jsonData = response.data;
  972. //self.loading = false;
  973. self.boundDeviceDisabled = false;
  974. if (jsonData.result) {
  975. self.changePage(self.pageIndex);
  976. self.batchBoundDevice = false;
  977. self.boundDeviceId = "";
  978. self.$message({
  979. type: "success",
  980. message: "解除绑定成功!"
  981. });
  982. }
  983. });
  984. },
  985. closeBatchBoundDevice() {
  986. var self = this;
  987. self.batchBoundDevice = false;
  988. self.boundDeviceId = "";
  989. },
  990. closeBatchUnBoundDevice() {
  991. var self = this;
  992. self.batchUnBoundDevice = false;
  993. self.boundUnDeviceId = "";
  994. },
  995. handleBatchEnabledFace() {
  996. //批量人脸授权
  997. var self = this;
  998. self.loading = true;
  999. let boundDeviceId = self.boundDeviceId;
  1000. var idList = this.multipleSelection.map(record => {
  1001. return record.id;
  1002. });
  1003. var formData = new FormData();
  1004. formData.append("ids", idList);
  1005. personInfoApi.enabledFaceList(idList).then(function(response) {
  1006. var jsonData = response.data;
  1007. self.loading = false;
  1008. if (jsonData.result) {
  1009. self.changePage(self.pageIndex);
  1010. self.$message({
  1011. type: "success",
  1012. message: "授权成功!"
  1013. });
  1014. } else {
  1015. self.$message({
  1016. type: "warning",
  1017. message: jsonData.message
  1018. });
  1019. }
  1020. });
  1021. }
  1022. },
  1023. async mounted() {
  1024. var self = this;
  1025. this.changePage(1);
  1026. //self.tableHeight = window.innerHeight - self.$refs.queryForm.$el.offsetTop - 100;
  1027. },
  1028. components: {
  1029. "personInfo-detail": PersonInfoDetail,
  1030. "personDeviceRelation-list": PersonDeviceRelationList,
  1031. "personDeviceRelation-BoundList": PersonDeviceRelationBoundList
  1032. }
  1033. };
  1034. </script>
  1035. <style lang="scss" scoped>
  1036. .el-breadcrumb {
  1037. margin: 10px;
  1038. line-height: 20px;
  1039. }
  1040. .el-divider {
  1041. margin: 5px 0;
  1042. }
  1043. .demo-form-inline {
  1044. margin-left: 10px;
  1045. text-align: left;
  1046. }
  1047. .button-group {
  1048. margin-left: 10px;
  1049. text-align: left;
  1050. }
  1051. </style>