candidateAll.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. <!--
  2. * @Description: create
  3. * @Version: 1.0
  4. * @Autor: XuTongZhang
  5. * @Date: 2020-07-30 10:17:25
  6. * @LastEditors : yuanrunwei
  7. * @LastEditTime : 2021-02-04 20:21:30
  8. -->
  9. <template>
  10. <div class="indexPage">
  11. <v-input :btn="btn" :list="list" @search="search" @exports="exports" @upload="upload=true"></v-input>
  12. <v-table :table="table" :tableList="tableList" :sortType="true" :queryData="queryData" :form="searchForm" @details="details" @update="update"></v-table>
  13. <v-pager @page="callPage" :total="totalrecords"></v-pager>
  14. <!-- <resume :dialogFormVisible="dialogFormVisible" :close="close" :info="info" :searchForm="searchForm" :queryData="queryData"></resume> -->
  15. <el-dialog :visible.sync="dialogVisible" width="600px" :before-close="closeDia" :close-on-click-modal="false">
  16. <el-form :model="form" ref="uform" label-width="140px" :rules="rules" label-position="right">
  17. <el-form-item label="姓名" prop="delivererName">
  18. <el-input placeholder="请输入姓名" v-model="form.delivererName" maxlength="32" show-word-limit></el-input>
  19. </el-form-item>
  20. <el-form-item label="性别" prop="delivererSex">
  21. <el-select v-model="form.delivererSex" class="select" placeholder="请选择性别">
  22. <el-option v-for="item in [{ value: 0, label: '女' }, { value: 1, label: '男' }]" :key="item.value" :label="item.label" :value="item.value">
  23. </el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="投递职位" prop="positionApplied">
  27. <el-input placeholder="请输入投递职位" v-model="form.positionApplied" maxlength="32" show-word-limit></el-input>
  28. </el-form-item>
  29. <el-form-item label="工作年限" prop="delivererWorkExp">
  30. <el-input placeholder="请输入工作年限" v-model="form.delivererWorkExp" maxlength="200" show-word-limit></el-input>
  31. </el-form-item>
  32. <el-form-item label="学历" prop="delivererEducation">
  33. <el-select class="select" v-model="form.delivererEducation" placeholder="请选择学历">
  34. <el-option v-for="item in ['大专', '本科', '研究生', '博士', '其他']" :key="item" :label="item" :value="item">
  35. </el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="联系电话" prop="delivererPhone">
  39. <el-input placeholder="请输入联系电话" v-model.number="form.delivererPhone" maxlength="11" show-word-limit></el-input>
  40. </el-form-item>
  41. <el-form-item label="邮箱地址" prop="delivererMail">
  42. <el-input placeholder="请输入邮箱地址" v-model="form.delivererMail" maxlength="32" show-word-limit></el-input>
  43. </el-form-item>
  44. <el-form-item label="应聘职位" prop="desiredPositionId">
  45. <el-select class="select" v-model="form.desiredPositionId" placeholder="请选择应聘职位">
  46. <el-option v-for="item in positionList" :key="item.value" :label="item.label" :value="item.value">
  47. </el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item>
  51. <el-button @click="closeDia">取 消</el-button>
  52. <el-button type="primary" @click="submit">修 改</el-button>
  53. </el-form-item>
  54. </el-form>
  55. </el-dialog>
  56. <!-- upload -->
  57. <el-dialog :visible.sync="upload" width="600px" :before-close="() => {upload=false}" :close-on-click-modal="false">
  58. <el-form label-width="140px" label-position="right">
  59. <el-form-item label="姓名">
  60. <el-input placeholder="请输入姓名" v-model="uploadForm.delivererName" maxlength="32" show-word-limit></el-input>
  61. </el-form-item>
  62. <el-form-item label="性别">
  63. <el-select v-model="uploadForm.delivererSex" class="select" placeholder="请选择性别">
  64. <el-option v-for="item in [{ value: 0, label: '女' }, { value: 1, label: '男' }]" :key="item.value" :label="item.label" :value="item.value">
  65. </el-option>
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item label="请选择出生日期">
  69. <el-date-picker
  70. v-model="uploadForm.delivererBirthday"
  71. value-format="yyyy/MM/dd"
  72. type="date"
  73. placeholder="选择日期">
  74. </el-date-picker>
  75. </el-form-item>
  76. <el-form-item label="手机号码">
  77. <el-input placeholder="请输入手机号码" v-model.number="uploadForm.delivererPhone" maxlength="11" show-word-limit></el-input>
  78. </el-form-item>
  79. <el-form-item label="邮箱">
  80. <el-input placeholder="请输入邮箱" v-model="uploadForm.delivererMail" maxlength="32" show-word-limit></el-input>
  81. </el-form-item>
  82. <el-form-item label="国籍">
  83. <el-input placeholder="请输入国籍" v-model="uploadForm.delivererNationality" maxlength="32" show-word-limit></el-input>
  84. </el-form-item>
  85. <el-form-item label="联系地址">
  86. <el-input placeholder="请输入联系地址" v-model="uploadForm.delivererAddress" maxlength="32" show-word-limit></el-input>
  87. </el-form-item>
  88. <el-form-item label="意向城市-省市">
  89. <!-- <el-input placeholder="请选择意向城市-省市" v-model="uploadForm.delivererIntention" maxlength="32" show-word-limit></el-input> -->
  90. <!-- <el-cascader placeholder="请选择意向城市-省市" v-model="uploadForm.delivererIntention" :props="{
  91. lazy: true,
  92. value: 'id',
  93. label: 'name',
  94. lazyLoad (node, resolve) {
  95. const { level } = node;
  96. $api.post('/addr/all_addr').then(result=>{
  97. resolve(result.list.map(item => ({
  98. value: item.id,
  99. label: item.name,
  100. leaf: level >= 2,
  101. })))
  102. })
  103. }
  104. }"></el-cascader> -->
  105. <el-cascader :options="addrOptions" placeholder="请选择意向城市-省市" v-model="uploadForm.delivererIntention" :props="{
  106. value: 'name',
  107. label: 'name'
  108. }"></el-cascader>
  109. </el-form-item>
  110. <el-form-item label="学历">
  111. <el-select class="select" v-model="uploadForm.delivererEducation" placeholder="请选择学历">
  112. <el-option v-for="item in ['大专', '本科', '研究生', '博士', '其他']" :key="item" :label="item" :value="item"></el-option>
  113. </el-select>
  114. </el-form-item>
  115. <el-form-item label="年级">
  116. <el-input placeholder="请输入年级" v-model="uploadForm.delivererGrade" maxlength="200" show-word-limit></el-input>
  117. </el-form-item>
  118. <el-form-item label="语言能力">
  119. <el-cascader
  120. v-model="uploadForm.delivererLanguageAbility"
  121. :options="options"
  122. :props="{
  123. multiple:false,
  124. emitPath:false
  125. }"
  126. :show-all-levels="false"
  127. clearable></el-cascader>
  128. </el-form-item>
  129. <el-form-item label="期望薪资">
  130. <el-input placeholder="请输入期望薪资" v-model="uploadForm.delivererExpectSalary" maxlength="200" show-word-limit></el-input>
  131. </el-form-item>
  132. <el-form-item label="工作年限">
  133. <el-select v-model="uploadForm.delivererWorkExp" class="select" placeholder="请选择工作年限">
  134. <el-option v-for="item in expOptions" :key="item.value" :label="item.label" :value="item.value">
  135. </el-option>
  136. </el-select>
  137. </el-form-item>
  138. <el-form-item>
  139. <el-button @click="upload = false">取 消</el-button>
  140. <el-button type="primary" @click="handleSubmit">提 交</el-button>
  141. </el-form-item>
  142. </el-form>
  143. </el-dialog>
  144. </div>
  145. </template>
  146. <script>
  147. export default {
  148. data () {
  149. let validator = (rule, value, callback) => {
  150. if (value === '') {
  151. callback(new Error('请输入手机号'))
  152. } else {
  153. if (!(/^1[3456789]\d{9}$/.test(value))) {
  154. callback(new Error('请输入正确的手机格式'))
  155. }
  156. callback()
  157. }
  158. }
  159. return {
  160. tableList: [],
  161. dialogFormVisible: false,
  162. dialogVisible: false,
  163. upload: false,
  164. page: 1,
  165. totalrecords: 0,
  166. pickList: [],
  167. downList1: [],
  168. searchForm: {},
  169. form: {},
  170. uploadForm: {
  171. delivererName: '',
  172. delivererSex: 0,
  173. delivererBirthday: '',
  174. delivererPhone: '',
  175. delivererMail: '',
  176. delivererNationality: '',
  177. delivererAddress: '',
  178. delivererIntention: '',
  179. delivererEducation: '',
  180. delivererGrade: '',
  181. delivererLanguageAbility: '',
  182. delivererExpectSalary: '',
  183. delivererWorkExp: ''
  184. },
  185. options: [],
  186. addrOptions: [],
  187. expOptions: [
  188. {
  189. value: '1年以内工作经验',
  190. label: '1年以内工作经验'
  191. },
  192. {
  193. value: '1-3年工作经验',
  194. label: '1-3年工作经验'
  195. },
  196. {
  197. value: '3-5年工作经验',
  198. label: '3-5年工作经验'
  199. },
  200. {
  201. value: '5-10年工作经验',
  202. label: '5-10年工作经验'
  203. },
  204. {
  205. value: '10年以上工作经验',
  206. label: '10年以上工作经验'
  207. }
  208. ],
  209. rules: {
  210. delivererEducation: [{
  211. required: true,
  212. message: '请选择学历',
  213. trigger: 'change'
  214. }],
  215. delivererName: [{
  216. required: true,
  217. message: '请输入姓名',
  218. trigger: 'change'
  219. }],
  220. delivererPhone: [{
  221. required: true,
  222. validator,
  223. trigger: 'change'
  224. }],
  225. delivererMail: [{
  226. required: true,
  227. message: '请输入邮箱',
  228. trigger: 'change'
  229. }],
  230. delivererSex: [{
  231. required: true,
  232. message: '请选择性别',
  233. trigger: 'change'
  234. }],
  235. delivererWorkExp: [{
  236. required: true,
  237. message: '请填写工作经验',
  238. trigger: 'change'
  239. }],
  240. // desiredPositionId: [{
  241. // required: true,
  242. // message: '请选择应聘职位',
  243. // trigger: 'change'
  244. // }],
  245. positionApplied: [{
  246. required: true,
  247. message: '请填写投递职位',
  248. trigger: 'change'
  249. }]
  250. },
  251. positionList: [],
  252. info: {},
  253. list: [{
  254. placeholder: '请输入关键字查询',
  255. props: 'condition'
  256. },
  257. {
  258. type: 'select',
  259. placeholder: '性别',
  260. props: 'delivererSex',
  261. options: [{
  262. label: '全部',
  263. value: null
  264. }, {
  265. label: '男',
  266. value: 1
  267. }, {
  268. label: '女',
  269. value: 0
  270. }]
  271. },
  272. {
  273. type: 'select',
  274. placeholder: '来源',
  275. props: 'resumeFrom',
  276. options: [{
  277. label: '全部',
  278. value: null
  279. },
  280. {
  281. label: '51job',
  282. value: 0
  283. },
  284. {
  285. label: '智联',
  286. value: 1
  287. },
  288. {
  289. label: '58同城',
  290. value: 2
  291. },
  292. {
  293. label: '平台',
  294. value: 3
  295. },
  296. {
  297. label: 'boss直聘',
  298. value: 4
  299. }
  300. ]
  301. }
  302. ],
  303. btn: [{
  304. name: '确定',
  305. type: 'primary',
  306. method: 'search'
  307. },
  308. {
  309. name: '导出',
  310. type: 'primary',
  311. method: 'exports'
  312. },
  313. {
  314. name: '上传简历',
  315. type: 'primary',
  316. method: 'upload'
  317. }
  318. ],
  319. table: {
  320. selection: true,
  321. column: [{
  322. label: this.$t('field.serialNumber'),
  323. props: 'serialNumber'
  324. },
  325. {
  326. label: '姓名',
  327. props: 'delivererName',
  328. width: 60
  329. },
  330. {
  331. label: '性别',
  332. props: 'delivererSex',
  333. options: ['女', '男'],
  334. width: 60
  335. },
  336. {
  337. label: '简历来源',
  338. props: 'resumeFrom',
  339. options: ['51job', '智联招聘', '58同城', '平台', 'boss直聘'],
  340. width: 80
  341. },
  342. {
  343. label: '招聘类型',
  344. props: 'recruitType',
  345. options: ['社招', '校招', '直接校招'],
  346. width: 80
  347. },
  348. {
  349. label: '投递职位',
  350. props: 'positionApplied'
  351. },
  352. {
  353. label: '简历状态',
  354. props: 'state'
  355. },
  356. {
  357. label: '工作年限',
  358. props: 'delivererWorkExp'
  359. },
  360. {
  361. label: '学历',
  362. props: 'delivererEducation'
  363. },
  364. {
  365. label: '联系电话',
  366. props: 'delivererPhone'
  367. },
  368. {
  369. label: '邮箱',
  370. props: 'delivererMail'
  371. },
  372. {
  373. label: '应聘职位',
  374. props: 'positionName'
  375. },
  376. {
  377. label: '通知时间',
  378. props: 'sendMailTime'
  379. },
  380. {
  381. label: '完成时间',
  382. props: 'confirmInterviewTime'
  383. },
  384. {
  385. label: '面试状态',
  386. props: 'interviewStatus',
  387. options: ['未面试', '已面试']
  388. },
  389. {
  390. label: '面试结果',
  391. props: 'interviewResult',
  392. options: ['未读', '已通过', '已淘汰']
  393. }
  394. ],
  395. // fixed: true,
  396. width: 200,
  397. handle: [{
  398. title: '修改',
  399. method: 'update',
  400. type: 'warning'
  401. }
  402. // {
  403. // title: '查看简历',
  404. // method: 'details',
  405. // type: 'info'
  406. // }
  407. ]
  408. }
  409. }
  410. },
  411. mounted () {
  412. this.queryData()
  413. this.queryDownList()
  414. this.handleOptions()
  415. },
  416. methods: {
  417. queryData (form = {}) {
  418. let page = this.page
  419. this.searchForm = form
  420. let reqdata = form
  421. this.$api
  422. .post('/resumeInfo/queryTalentPoolList', {
  423. reqdata,
  424. page
  425. })
  426. .then((res) => {
  427. this.totalrecords = res.totalrecords
  428. this.tableList = res.list.map((item, index) => {
  429. item.delivererSex = item.delivererSex - 0 || 0
  430. item.desiredPositionId = item.desiredPositionId - 0 || null
  431. item.serialNumber = (this.page - 1) * 10 + index + 1
  432. // item.desiredPositionId = item.desiredPositionId ? this.downList1.some(i => i.id === item.desiredPositionId) ? this.downList1.find(i => i.id === item.desiredPositionId).positionName : '' : ''
  433. item.state = item.interviewResult ? ['', '已通过', '未通过'][item.interviewResult] : item.isSendInviteMail ? '已通知' : ['未读', '通过', '淘汰', '待定'][item.isPass]
  434. return item
  435. })
  436. })
  437. },
  438. queryDownList () {
  439. this.$api
  440. .post('/position/queryPositionList', {
  441. reqdata: {}
  442. })
  443. .then((res) => {
  444. this.positionList = res.list.map((item) => ({
  445. value: item.id,
  446. label: item.positionName
  447. }))
  448. this.downList1 = res.list
  449. })
  450. },
  451. search (form) {
  452. this.queryData(form)
  453. },
  454. update (row) {
  455. this.openDia()
  456. this.form = Object.assign({}, row)
  457. },
  458. submit () {
  459. let a
  460. this.$refs['uform'].validate((valid) => {
  461. a = valid
  462. })
  463. if (!a) return
  464. let reqdata = this.form
  465. this.$api
  466. .post('/resumeInfo/updateResumeInfo', {
  467. reqdata
  468. })
  469. .then((res) => {
  470. this.$message({
  471. message: '修改成功!',
  472. type: 'success'
  473. })
  474. this.closeDia()
  475. this.queryData()
  476. })
  477. },
  478. details (row) {
  479. this.open()
  480. this.info = row
  481. },
  482. exports () {
  483. this.$api
  484. .post('/export/export2Web', {
  485. reqdata: this.searchForm
  486. })
  487. .then((res) => {
  488. })
  489. },
  490. openDia () {
  491. this.dialogVisible = true
  492. },
  493. closeDia () {
  494. this.dialogVisible = false
  495. this.form = {}
  496. },
  497. open () {
  498. this.dialogFormVisible = true
  499. },
  500. close () {
  501. this.dialogFormVisible = false
  502. this.form = {}
  503. },
  504. callPage (val) {
  505. this.page = val
  506. this.queryData(this.searchForm)
  507. },
  508. handleOptions () {
  509. this.options = ['不限', '英语', '日语', '俄语', '阿拉伯语', '法语', '德语', '西班牙语', '葡萄牙语', '意大利语', '韩语/朝鲜语', '普通话', '粤语', '闽南话', '上海话', '其他'].map(item => {
  510. return {
  511. label: item,
  512. value: item,
  513. children: [item + '-一般', item + '-良好', item + '-熟练', item + '-精通'].map(item => {
  514. return {
  515. label: item,
  516. value: item
  517. }
  518. })
  519. }
  520. })
  521. this.$api.post('/addr/all_addr').then(result => {
  522. this.addrOptions = result.list.map(item => (
  523. {
  524. name: item.name,
  525. children: item.children.map(item => ({
  526. name: item.name
  527. }))
  528. }
  529. ))
  530. })
  531. },
  532. handleSubmit () {
  533. const reg = /^\w+@[a-z0-9]+\.[a-z]{2,4}$/
  534. if (!reg.test(this.uploadForm.delivererMail)) {
  535. this.$message.error('请输入正确的邮箱')
  536. return false
  537. }
  538. this.$api.post('/resumeInfo/uploadResume', {
  539. reqdata: {
  540. ...this.uploadForm,
  541. delivererIntention: `${this.uploadForm.delivererIntention[0]} ${this.uploadForm.delivererIntention[1]}`
  542. }
  543. }).then(result => {
  544. this.upload = false
  545. this.uploadForm = {
  546. delivererName: '',
  547. delivererSex: 0,
  548. delivererBirthday: '',
  549. delivererPhone: '',
  550. delivererMail: '',
  551. delivererNationality: '',
  552. delivererAddress: '',
  553. delivererIntention: '',
  554. delivererEducation: '',
  555. delivererGrade: '',
  556. delivererLanguageAbility: '',
  557. delivererExpectSalary: '',
  558. delivererWorkExp: ''
  559. }
  560. this.queryData()
  561. })
  562. }
  563. }
  564. }
  565. </script>