staff.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. <template>
  2. <basic-container>
  3. <avue-crud :option="option"
  4. :table-loading="loading"
  5. :data="data"
  6. :page.sync="page"
  7. :permission="permissionList"
  8. :before-open="beforeOpen"
  9. v-model="form"
  10. ref="crud"
  11. @row-update="rowUpdate"
  12. @row-save="rowSave"
  13. @row-del="rowDel"
  14. @search-change="searchChange"
  15. @search-reset="searchReset"
  16. @selection-change="selectionChange"
  17. @current-change="currentChange"
  18. @size-change="sizeChange"
  19. @refresh-change="refreshChange"
  20. @on-load="onLoad">
  21. <template slot="menuLeft">
  22. <el-button type="danger"
  23. size="small"
  24. icon="el-icon-delete"
  25. plain
  26. v-if="permission.staff_delete"
  27. @click="handleDelete">删 除
  28. </el-button>
  29. <cy-excel-import :flag="3" file-name="员工信息导入模板" @success="onLoad(page)"></cy-excel-import>
  30. <el-button type="success"
  31. size="small"
  32. icon="el-icon-sort-down"
  33. plain
  34. @click="handleBatchPushUserFace">批量下发人脸
  35. </el-button>
  36. </template>
  37. <template slot="menu" slot-scope="scope">
  38. <el-button type="text" size="small" icon="el-icon-setting">
  39. <el-dropdown>
  40. <span class="el-dropdown-link">
  41. 操作<i class="el-icon-arrow-down el-icon--right"></i>
  42. </span>
  43. <el-dropdown-menu slot="dropdown">
  44. <el-dropdown-item divided v-if="permission.staff_view" @click.native="detail(scope.row)" icon="el-icon-view">查看
  45. </el-dropdown-item>
  46. <el-dropdown-item divided v-if="permission.staff_edit" @click.native="edit(scope.row)" icon="el-icon-edit">编辑
  47. </el-dropdown-item>
  48. <el-dropdown-item style="color: limegreen" divided v-if="!!scope.row.face && scope.row.auditStatus == 1" @click.native="pushUserFaceToDevice(scope.row)" icon="el-icon-sort-down">人脸下发
  49. </el-dropdown-item>
  50. <el-dropdown-item @click.native="setAdmin(scope.row)" icon="el-icon-setting">设为管理员
  51. </el-dropdown-item>
  52. <el-dropdown-item divided icon="el-icon-s-order" @click.native="reviewHandler(scope.row)" :class=" [scope.row.auditStatus === 0 ? '' : 'recheck']">{{scope.row.auditStatus===0?'审核':'重审'}}</el-dropdown-item>
  53. </el-dropdown-menu>
  54. </el-dropdown>
  55. </el-button>
  56. <!--<el-button icon="el-icon-s-order" type="text" @click="reviewHandler(scope.row)">审核</el-button>-->
  57. </template>
  58. <template slot="auditStatus" slot-scope="scope">
  59. <el-tag v-if="scope.row.auditStatus===0" type="info">待审核</el-tag>
  60. <el-tag v-if="scope.row.auditStatus===1" type="success">审核通过</el-tag>
  61. <el-tag v-if="scope.row.auditStatus===2" type="danger">审核不通过</el-tag>
  62. </template>
  63. </avue-crud>
  64. <el-dialog :modal-append-to-body="false" title = "员工信息审核" :visible.sync = "reviewVisible" width="60%"
  65. :close-on-click-modal="false" >
  66. <review-staff :reviewDetail="reviewDetail" @visibleemit="visibleUpdate"></review-staff>
  67. </el-dialog>
  68. <el-dialog :append-to-body="true" :close-on-click-modal="false" :modal-append-to-body="false" :visible.sync="editVisible"
  69. title="编辑" width="60%">
  70. <avue-form v-model="editForm" :option="option" @submit="submitEnterprisestaff"></avue-form>
  71. </el-dialog>
  72. <el-dialog :append-to-body="true" :close-on-click-modal="false" :modal-append-to-body="false" :visible.sync="detailVisible"
  73. title="详情" width="60%">
  74. <staff-detail :detailForm="detailForm"></staff-detail>
  75. <!--<avue-detail :option="option" v-model="detailForm"></avue-detail>-->
  76. </el-dialog>
  77. <el-dialog :append-to-body="true" :close-on-click-modal="false" :modal-append-to-body="false" :visible.sync="setAdminVisible"
  78. title="设置管理员" width="60%">
  79. <set-admin :form="setAdminForm" @close="setAdminVisible = false, onLoad(page)"></set-admin>
  80. <!--<avue-detail :option="option" v-model="detailForm"></avue-detail>-->
  81. </el-dialog>
  82. </basic-container>
  83. </template>
  84. <script>
  85. import {getList, getDetail, add, update, remove, pushUserFace, pushUserFaceBatch} from "@/api/enterprise/staff";
  86. import {mapGetters} from "vuex";
  87. import {validatedEmail, validatePhone} from "../../util/validator";
  88. import StaffDetail from "../../components/staff/staffDetail";
  89. import ReviewStaff from "../../components/staff/review-staff";
  90. import SetAdmin from "./set-admin";
  91. export default {
  92. components: {SetAdmin, ReviewStaff, StaffDetail},
  93. data() {
  94. return {
  95. form: {},
  96. query: {},
  97. loading: true,
  98. reviewVisible: false,
  99. reviewDetail: {},
  100. editVisible: false,
  101. editForm: {},
  102. detailForm: {},
  103. detailVisible: false,
  104. setAdminForm: {},
  105. setAdminVisible: false,
  106. forbidden: false,
  107. page: {
  108. pageSize: 10,
  109. currentPage: 1,
  110. total: 0
  111. },
  112. selectionList: [],
  113. option: {
  114. height:'auto',
  115. calcHeight: 30,
  116. tip: false,
  117. searchShow: true,
  118. searchMenuSpan: 6,
  119. border: true,
  120. index: true,
  121. viewBtn: true,
  122. selection: true,
  123. dialogClickModal: false,
  124. column: [
  125. {
  126. label: "所属企业",
  127. prop: "enterpriseName",
  128. editDisplay: false,
  129. addDisplay: false,
  130. },
  131. {
  132. label: "所属企业",
  133. prop: "enterpriseId",
  134. type: "select",
  135. width: 250,
  136. search: true,
  137. searchSpan: 6,
  138. overHidden: true,
  139. searchFilterable: true,
  140. filterable: true,
  141. remote: true,
  142. cascaderItem: ['enterpriseDeptId'],
  143. dicUrl: '/api/cyzh-enterprise/enterprise/list?size=100&enterpriseName={{key}}',
  144. dicFormatter: (res)=>{
  145. return res.data.records;
  146. },
  147. props: {
  148. label: "enterpriseName",
  149. value: "id"
  150. },
  151. rules: [{
  152. required: true,
  153. message: "请输入所属企业",
  154. trigger: "blur"
  155. }],
  156. hide: true,
  157. viewDisplay: false
  158. },
  159. {
  160. label: "所属部门",
  161. prop: "enterpriseDeptName",
  162. editDisplay: false,
  163. addDisplay: false,
  164. },
  165. {
  166. label: "所属部门",
  167. prop: "enterpriseDeptId",
  168. type: "select",
  169. width: 250,
  170. search: true,
  171. searchSpan: 6,
  172. overHidden: true,
  173. searchFilterable: true,
  174. filterable: true,
  175. remote: true,
  176. dicUrl: '/api/cyzh-enterprise/dept/list?size=10&enterpriseId={{key}}',
  177. dicFormatter: (res)=>{
  178. return res.data.records;
  179. },
  180. props: {
  181. label: "name",
  182. value: "id"
  183. },
  184. rules: [{
  185. required: false,
  186. message: "请输入所属部门",
  187. trigger: "blur"
  188. }],
  189. hide: true,
  190. viewDisplay: false
  191. },
  192. // {
  193. // label: "企业名称",
  194. // prop: "enterpriseName",
  195. // hide: true,
  196. // display: false,
  197. // rules: [{
  198. // required: true,
  199. // message: "请输入企业名称",
  200. // trigger: "blur"
  201. // }]
  202. // },
  203. {
  204. label: "昵称",
  205. prop: "name",
  206. hide: true,
  207. display: false,
  208. rules: [{
  209. required: false,
  210. message: "请输入昵称",
  211. trigger: "blur"
  212. }]
  213. },
  214. {
  215. label: "姓名",
  216. prop: "realName",
  217. rules: [{
  218. required: true,
  219. message: "请输入真名",
  220. trigger: "blur"
  221. }]
  222. },
  223. {
  224. label: "性别",
  225. prop: "sex",
  226. type: 'select',
  227. width: 100,
  228. dataType:"number",
  229. dicUrl: "/api/blade-system/dict-biz/dictionary?code=sex",
  230. props: {
  231. label: "dictValue",
  232. value: "dictKey"
  233. },
  234. rules: [{
  235. required: false,
  236. message: "请选择性别",
  237. trigger: "blur"
  238. }]
  239. },
  240. {
  241. label: "人脸",
  242. prop: "face",
  243. type: "upload",
  244. width: 150,
  245. listType: 'picture-img',
  246. propsHttp: {
  247. res: "data",
  248. url: "link"
  249. },
  250. action: "/api/blade-resource/oss/endpoint/put-file",
  251. },
  252. {
  253. label: "邮箱",
  254. prop: "email",
  255. hide: true,
  256. rules: [{
  257. required: false,
  258. message: "请输入邮箱",
  259. trigger: "blur",
  260. validator: validatedEmail
  261. }]
  262. },
  263. {
  264. label: "头像",
  265. prop: "avatar",
  266. type: "upload",
  267. hide: true,
  268. display: false,
  269. width: 150,
  270. listType: 'picture-img',
  271. propsHttp: {
  272. res: "data",
  273. url: "link"
  274. },
  275. action: "/api/blade-resource/oss/endpoint/put-file",
  276. rules: [{
  277. required: true,
  278. message: "请输入头像",
  279. trigger: "blur"
  280. }]
  281. },
  282. {
  283. label: "手机",
  284. prop: "phone",
  285. hide: true,
  286. rules: [{
  287. required: true,
  288. message: "请输入手机",
  289. trigger: "blur",
  290. },{
  291. trigger: "blur",
  292. validator: validatePhone
  293. }]
  294. },
  295. {
  296. label: "生日",
  297. prop: "birthday",
  298. hide: true,
  299. display: false,
  300. rules: [{
  301. required: true,
  302. message: "请输入生日",
  303. trigger: "blur"
  304. }]
  305. },
  306. {
  307. label: "身份证号码",
  308. prop: "idcard",
  309. hide: true,
  310. rules: [{
  311. required: false,
  312. message: "请输入身份证号码",
  313. trigger: "blur"
  314. }]
  315. },
  316. {
  317. label: "住址",
  318. prop: "address",
  319. hide: true,
  320. display: false,
  321. rules: [{
  322. required: true,
  323. message: "请输入住址",
  324. trigger: "blur"
  325. }]
  326. },
  327. {
  328. label: "审核时间",
  329. prop: "auditTime",
  330. hide: true,
  331. display: false,
  332. rules: [{
  333. required: true,
  334. message: "请输入审核时间",
  335. trigger: "blur"
  336. }]
  337. },
  338. {
  339. label: "审核状态",
  340. prop: "auditStatus",
  341. search:"true",
  342. slot: true,
  343. display: false,
  344. type:'select',
  345. dicData:[
  346. {
  347. label:'待审核',
  348. value:0,
  349. color:'red'
  350. },{
  351. label:'审核通过',
  352. value:1
  353. },{
  354. label:'审核不通过',
  355. value:2
  356. }
  357. ],
  358. },
  359. {
  360. label: "审核意见",
  361. prop: "auditOpinion",
  362. hide: true,
  363. display: false,
  364. rules: [{
  365. required: true,
  366. message: "请输入审核意见",
  367. trigger: "blur"
  368. }]
  369. },
  370. {
  371. label: "园区id",
  372. prop: "agencyId",
  373. hide: true,
  374. display: false,
  375. rules: [{
  376. required: true,
  377. message: "请输入园区id",
  378. trigger: "blur"
  379. }]
  380. },
  381. {
  382. label: "区域id",
  383. prop: "residentialId",
  384. hide: true,
  385. display: false,
  386. rules: [{
  387. required: true,
  388. message: "请输入区域id",
  389. trigger: "blur"
  390. }]
  391. },
  392. {
  393. label: "小程序openId",
  394. prop: "openId",
  395. hide: true,
  396. display: false,
  397. rules: [{
  398. required: true,
  399. message: "请输入小程序openId",
  400. trigger: "blur"
  401. }]
  402. },
  403. {
  404. label: "部门id",
  405. prop: "deptId",
  406. hide: true,
  407. display: false,
  408. rules: [{
  409. required: true,
  410. message: "请输入部门id",
  411. trigger: "blur"
  412. }]
  413. },
  414. {
  415. label: "岗位id",
  416. prop: "postId",
  417. hide: true,
  418. display: false,
  419. rules: [{
  420. required: true,
  421. message: "请输入岗位id",
  422. trigger: "blur"
  423. }]
  424. },
  425. {
  426. label: "备注",
  427. prop: "remarks",
  428. hide: true,
  429. display: false,
  430. rules: [{
  431. required: true,
  432. message: "请输入备注",
  433. trigger: "blur"
  434. }]
  435. },
  436. {
  437. label:"来源",
  438. prop:"createType",
  439. search:"true",
  440. searchSpan: 4,
  441. type:'select',
  442. display: false,
  443. dicData:[
  444. {
  445. label:'后台',
  446. value:0
  447. },{
  448. label:'小程序',
  449. value:1
  450. }
  451. ]
  452. },
  453. {
  454. label: "机构路径",
  455. prop: "orgPosition",
  456. hide: true,
  457. display: false,
  458. rules: [{
  459. required: true,
  460. message: "请输入机构路径",
  461. trigger: "blur"
  462. }]
  463. },
  464. {
  465. label: "是否为小程序园区管理员:0-否 1-是",
  466. prop: "isAgencyManager",
  467. hide: true,
  468. display: false,
  469. rules: [{
  470. required: true,
  471. message: "请输入是否为小程序园区管理员:0-否 1-是",
  472. trigger: "blur"
  473. }]
  474. },
  475. {
  476. label: "若为园区管理员时的小程序登录账号",
  477. prop: "agencyAccount",
  478. hide: true,
  479. display: false,
  480. rules: [{
  481. required: true,
  482. message: "请输入若为园区管理员时的小程序登录账号",
  483. trigger: "blur"
  484. }]
  485. },
  486. {
  487. label: "若为园区管理员时的小程序登录密码",
  488. prop: "agencyPassword",
  489. hide: true,
  490. display: false,
  491. rules: [{
  492. required: true,
  493. message: "请输入若为园区管理员时的小程序登录密码",
  494. trigger: "blur"
  495. }]
  496. },
  497. {
  498. label: "是否为企业管理员:0-否 1-是",
  499. prop: "isEnterpriseManager",
  500. hide: true,
  501. display: false,
  502. rules: [{
  503. required: true,
  504. message: "请输入是否为企业管理员:0-否 1-是",
  505. trigger: "blur"
  506. }]
  507. },
  508. {
  509. label: "若为企业管理员时的小程序登录账号",
  510. prop: "enterpriseAccount",
  511. hide: true,
  512. display: false,
  513. rules: [{
  514. required: true,
  515. message: "请输入若为企业管理员时的小程序登录账号",
  516. trigger: "blur"
  517. }]
  518. },
  519. {
  520. label: "若为企业管理员时的小程序登录密码",
  521. prop: "enterprisePassword",
  522. hide: true,
  523. display: false,
  524. rules: [{
  525. required: true,
  526. message: "请输入若为企业管理员时的小程序登录密码",
  527. trigger: "blur"
  528. }]
  529. },
  530. ]
  531. },
  532. data: []
  533. };
  534. },
  535. computed: {
  536. ...mapGetters(["permission"]),
  537. permissionList() {
  538. return {
  539. addBtn: this.vaildData(this.permission.staff_add, false),
  540. viewBtn: this.vaildData(this.permission.staff_view, false),
  541. delBtn: this.vaildData(this.permission.staff_delete, false),
  542. editBtn: this.vaildData(this.permission.staff_edit, false)
  543. };
  544. },
  545. ids() {
  546. let ids = [];
  547. this.selectionList.forEach(ele => {
  548. ids.push(ele.id);
  549. });
  550. return ids.join(",");
  551. }
  552. },
  553. methods: {
  554. setAdmin(row){
  555. this.setAdminForm = row;
  556. this.setAdminVisible = true;
  557. },
  558. handleBatchPushUserFace() {
  559. if (this.selectionList.length === 0) {
  560. this.$message.warning("请选择至少一条数据");
  561. return;
  562. }
  563. pushUserFaceBatch(this.ids).then(() => {
  564. this.$message({
  565. type: "success",
  566. message: "操作成功!"
  567. });
  568. })
  569. },
  570. visibleUpdate(data) {
  571. this.reviewVisible = data;
  572. this.onLoad(this.page);
  573. },
  574. detail(row) {
  575. this.detailForm = row;
  576. this.detailForm['gender'] = row.$sex;
  577. this.detailVisible = true;
  578. },
  579. edit(row) {
  580. this.editForm = row;
  581. this.editVisible = true;
  582. },
  583. pushUserFaceToDevice(row){
  584. //下发人脸到测温系统和设备
  585. pushUserFace(row).then(res => {
  586. this.$message({
  587. type: "success",
  588. message: "操作成功!"
  589. });
  590. })
  591. },
  592. reviewHandler(row) {
  593. debugger
  594. this.reviewDetail = row;
  595. this.reviewVisible = true;
  596. // debugger
  597. this.url = row.face;
  598. },
  599. rowSave(row, done, loading) {
  600. if(row.$enterpriseId){
  601. row.enterpriseName = row.$enterpriseId;
  602. }
  603. if(row.$enterpriseDeptId){
  604. row.enterpriseDeptName = row.$enterpriseDeptId;
  605. }
  606. if (row.avatar.length == 0) {
  607. row.avatar = '';
  608. }
  609. add(row).then(() => {
  610. this.onLoad(this.page);
  611. this.$message({
  612. type: "success",
  613. message: "操作成功!"
  614. });
  615. done();
  616. }, error => {
  617. loading();
  618. window.console.log(error);
  619. });
  620. },
  621. rowUpdate(row, index, done, loading) {
  622. if(row.$enterpriseDeptId){
  623. row.enterpriseDeptName = row.$enterpriseDeptId;
  624. }
  625. if(row.$enterpriseId){
  626. row.enterpriseName = row.$enterpriseId;
  627. }
  628. update(row).then(() => {
  629. this.onLoad(this.page);
  630. this.$message({
  631. type: "success",
  632. message: "操作成功!"
  633. });
  634. done();
  635. }, error => {
  636. loading();
  637. console.log(error);
  638. });
  639. },
  640. rowDel(row) {
  641. this.$confirm("确定将选择数据删除?", {
  642. confirmButtonText: "确定",
  643. cancelButtonText: "取消",
  644. type: "warning"
  645. })
  646. .then(() => {
  647. return remove(row.id);
  648. })
  649. .then(() => {
  650. this.onLoad(this.page);
  651. this.$message({
  652. type: "success",
  653. message: "操作成功!"
  654. });
  655. });
  656. },
  657. handleDelete() {
  658. if (this.selectionList.length === 0) {
  659. this.$message.warning("请选择至少一条数据");
  660. return;
  661. }
  662. this.$confirm("确定将选择数据删除?", {
  663. confirmButtonText: "确定",
  664. cancelButtonText: "取消",
  665. type: "warning"
  666. })
  667. .then(() => {
  668. return remove(this.ids);
  669. })
  670. .then(() => {
  671. this.onLoad(this.page);
  672. this.$message({
  673. type: "success",
  674. message: "操作成功!"
  675. });
  676. this.$refs.crud.toggleSelection();
  677. });
  678. },
  679. beforeOpen(done, type) {
  680. if (["edit", "view"].includes(type)) {
  681. getDetail(this.form.id).then(res => {
  682. this.form = res.data.data;
  683. });
  684. }
  685. done();
  686. },
  687. searchReset() {
  688. this.query = {};
  689. this.onLoad(this.page);
  690. },
  691. searchChange(params, done) {
  692. this.query = params;
  693. this.page.currentPage = 1;
  694. this.onLoad(this.page, params);
  695. done();
  696. },
  697. selectionChange(list) {
  698. this.selectionList = list;
  699. },
  700. selectionClear() {
  701. this.selectionList = [];
  702. this.$refs.crud.toggleSelection();
  703. },
  704. currentChange(currentPage){
  705. this.page.currentPage = currentPage;
  706. },
  707. sizeChange(pageSize){
  708. this.page.pageSize = pageSize;
  709. },
  710. refreshChange() {
  711. this.onLoad(this.page, this.query);
  712. },
  713. onLoad(page, params = {}) {
  714. this.loading = true;
  715. getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  716. const data = res.data.data;
  717. this.page.total = data.total;
  718. this.data = data.records;
  719. this.loading = false;
  720. this.selectionClear();
  721. });
  722. }
  723. }
  724. };
  725. </script>
  726. <style>
  727. </style>