form.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. <template>
  2. <div>
  3. <div class="description-title">
  4. <span>基本信息</span>
  5. </div>
  6. <el-form :model="form" :rules="rules" ref="ruleForm" label-width="0px">
  7. <div class="description-view">
  8. <table class="description-table">
  9. <tbody>
  10. <tr class="description-tr">
  11. <th class="description-label">姓名</th>
  12. <td class="description-content">
  13. <el-form-item prop="realName">
  14. <el-input v-model="form.realName" size="mini" placeholder="请输入姓名"/>
  15. </el-form-item>
  16. </td>
  17. <th class="description-label">手机号</th>
  18. <td class="description-content">
  19. <el-form-item prop="mobileNo">
  20. <el-input size="mini" minlength="11" maxlength="11" v-model="form.mobileNo" placeholder="请输入手机号"/>
  21. </el-form-item>
  22. </td>
  23. <th class="description-label">微信号</th>
  24. <td class="description-content">
  25. <el-form-item prop="wechatNo">
  26. <el-input size="mini" v-model="form.wechatNo" placeholder="请输入微信号"/>
  27. </el-form-item>
  28. </td>
  29. </tr>
  30. <tr class="description-tr" v-for="(item, index) in form.educations" :key="index">
  31. <th class="description-label desc-item">
  32. <span class="close">
  33. <i v-if="index === 0" @click="addEducation" class="el-icon-circle-plus-outline"/>
  34. <i v-else @click="removeEducation(index)" class="el-icon-remove-outline"/>
  35. </span>学历</th>
  36. <td class="description-content">
  37. <el-form-item
  38. :prop="'educations.' + index + '.level'"
  39. :rules="{ required: true, message: '请输入学历', trigger: 'blur' }"
  40. >
  41. <el-input v-model="form.educations[index].level" size="mini" placeholder="请输入学历"/>
  42. </el-form-item>
  43. </td>
  44. <th class="description-label">学校</th>
  45. <td class="description-content">
  46. <el-form-item
  47. :prop="'educations.' + index + '.school'"
  48. :rules="{ required: true, message: '请选择毕业时间', trigger: 'blur' }"
  49. >
  50. <el-input size="mini" v-model="form.educations[index].school" placeholder="请输入学校"/>
  51. </el-form-item>
  52. </td>
  53. <th class="description-label">毕业时间</th>
  54. <td class="description-content">
  55. <el-form-item
  56. :prop="'educations.' + index + '.year'"
  57. :rules="{ required: true, message: '请选择毕业时间', trigger: 'blur' }"
  58. >
  59. <el-date-picker
  60. type="month"
  61. placeholder="请选择毕业时间"
  62. size="mini"
  63. v-model="form.educations[index].year"
  64. />
  65. </el-form-item>
  66. </td>
  67. </tr>
  68. <tr class="description-tr">
  69. <th class="description-label">所在城市</th>
  70. <td class="description-content">
  71. <el-form-item prop="liveCity">
  72. <el-input size="mini" v-model.trim="form.liveCity" placeholder="请输入所在城市"/>
  73. </el-form-item>
  74. </td>
  75. <th class="description-label">工作意向</th>
  76. <td class="description-content">
  77. <el-form-item prop="intentionCity">
  78. <el-input size="mini" v-model.trim="form.intentionCity" placeholder="请输入工作意向"/>
  79. </el-form-item>
  80. </td>
  81. <th class="description-label">声部</th>
  82. <td class="description-content">
  83. <el-form-item prop="subjectIdList">
  84. <el-select
  85. v-model.trim="form.subjectIdList"
  86. clearable
  87. filterable
  88. multiple
  89. size="mini"
  90. collapse-tags
  91. placeholder='请选择声部'
  92. >
  93. <el-option-group v-for="group in subjectList"
  94. :key="group.label"
  95. :label="group.label">
  96. <el-option v-for="item in group.options"
  97. :key="item.value"
  98. :label="item.label"
  99. :value="String(item.value)">
  100. </el-option>
  101. </el-option-group>
  102. </el-select>
  103. </el-form-item>
  104. </td>
  105. </tr>
  106. <tr class="description-tr">
  107. <th class="description-label">信息来源</th>
  108. <td class="description-content">
  109. <el-form-item prop="sourceFrom">
  110. <el-select v-model.trim="form.sourceFrom"
  111. clearable
  112. filterable
  113. size="mini"
  114. placeholder="请选择信息来源">
  115. <el-option label="BOSS"
  116. value="BOSS"></el-option>
  117. <el-option label="转介绍"
  118. value="转介绍"></el-option>
  119. </el-select>
  120. </el-form-item>
  121. </td>
  122. <th class="description-label">评估结果</th>
  123. <td class="description-content" colspan="3">
  124. <el-form-item prop="assessmentResult">
  125. <el-input size="mini" v-model.trim="form.assessmentResult" placeholder="请输入评估结果"/>
  126. </el-form-item>
  127. </td>
  128. </tr>
  129. <tr class="description-tr">
  130. <th class="description-label">人员状态</th>
  131. <td class="description-content">
  132. <el-form-item prop="status">
  133. <el-select size="mini" v-model.trim="form.status"
  134. clearable
  135. filterable
  136. placeholder="请选择人员状态">
  137. <el-option label="未录用"
  138. value="NOT_EMPLOYED"></el-option>
  139. <el-option label="面试中"
  140. value="INTERVIEWING"></el-option>
  141. <el-option label="储备"
  142. value="RESERVE"></el-option>
  143. <el-option label="全职"
  144. value="PART_TIME"></el-option>
  145. <el-option label="兼职"
  146. value="FULL_TIME"></el-option>
  147. <el-option label="离职"
  148. value="DIMISSION"></el-option>
  149. </el-select>
  150. </el-form-item>
  151. </td>
  152. <th class="description-label">其他综合情况</th>
  153. <td class="description-content" colspan="3">
  154. <el-form-item prop="otherComment">
  155. <el-input size="mini" v-model.trim="form.otherComment" placeholder="请输入其他综合情况"/>
  156. </el-form-item>
  157. </td>
  158. </tr>
  159. </tbody>
  160. </table>
  161. </div>
  162. <div class="description-title" style="margin-top: 20px">
  163. <span>在职信息</span>
  164. </div>
  165. <div class="description-view">
  166. <table class="description-table">
  167. <tbody>
  168. <tr class="description-tr">
  169. <th class="description-label">入职日期</th>
  170. <td class="description-content">
  171. <el-form-item
  172. prop="entryDate"
  173. :rules="{ required: propRequred, message: '请输入入职日期', trigger: 'change' }"
  174. >
  175. <el-date-picker
  176. type="date"
  177. placeholder="选择入职日期"
  178. size="mini"
  179. v-model="form.entryDate"
  180. />
  181. </el-form-item>
  182. </td>
  183. <th class="description-label">职位</th>
  184. <td class="description-content">
  185. <el-form-item
  186. prop="position"
  187. :rules="{ required: propRequred, message: '请输入职位', trigger: 'change' }"
  188. >
  189. <el-select v-model.trim="form.position"
  190. clearable
  191. filterable
  192. size="mini"
  193. placeholder="请选择职位">
  194. <el-option label="指导老师"
  195. value="ADVISER"></el-option>
  196. <el-option label="教务老师"
  197. value="ACADEMIC"></el-option>
  198. <el-option label="乐队指导"
  199. value="TEACHING"></el-option>
  200. </el-select>
  201. </el-form-item>
  202. </td>
  203. <th class="description-label">分部</th>
  204. <td class="description-content">
  205. <el-form-item
  206. prop="organId"
  207. :rules="{ required: propRequred, message: '请选择分部', trigger: 'change' }"
  208. >
  209. <el-select v-model.trim="form.organId"
  210. placeholder='请选择分部'
  211. clearable
  212. filterable
  213. size="mini"
  214. >
  215. <el-option v-for='(item,index) in organList'
  216. :key="index"
  217. :value="item.id"
  218. :label="item.name"
  219. >
  220. </el-option>
  221. </el-select>
  222. </el-form-item>
  223. </td>
  224. </tr>
  225. <tr class="description-tr">
  226. <th class="description-label">是否试用期</th>
  227. <td class="description-content">
  228. <el-form-item
  229. prop="isProbationPeriod"
  230. :rules="{ required: propRequred, message: '请选择是否试用期', trigger: 'change' }"
  231. >
  232. <el-select size="mini" v-model.trim="form.isProbationPeriod"
  233. clearable
  234. filterable
  235. placeholder="请选择是否试用期">
  236. <el-option label="是"
  237. :value="true"></el-option>
  238. <el-option label="否"
  239. :value="false"></el-option>
  240. </el-select>
  241. </el-form-item>
  242. </td>
  243. <th class="description-label">证件号码</th>
  244. <td class="description-content" colspan="3">
  245. <el-form-item
  246. prop="idCard"
  247. :rules="{ required: propRequred, message: '请输入证件号码', trigger: 'blur' }"
  248. >
  249. <el-input size="mini" v-model="form.idCard" placeholder="请输入证件号码"/>
  250. </el-form-item>
  251. </td>
  252. </tr>
  253. <tr class="description-tr">
  254. <th class="description-label">年龄</th>
  255. <td class="description-content">
  256. <el-form-item
  257. prop="age"
  258. :rules="[
  259. { required: propRequred, message: '请输入年龄', trigger: 'blur' }
  260. ]"
  261. >
  262. <el-input v-model="form.age" size="mini" type="number" min="1" step="1" placeholder="请输入年龄"/>
  263. </el-form-item>
  264. </td>
  265. <th class="description-label">性别</th>
  266. <td class="description-content">
  267. <el-form-item
  268. prop="gender"
  269. :rules="{ required: propRequred, message: '请选择性别', trigger: 'change' }"
  270. >
  271. <el-select size="mini" v-model.trim="form.gender"
  272. clearable
  273. filterable
  274. placeholder="请选择性别">
  275. <el-option label="男"
  276. :value="true"></el-option>
  277. <el-option label="女"
  278. :value="false"></el-option>
  279. </el-select>
  280. </el-form-item>
  281. </td>
  282. <th class="description-label">离职日期</th>
  283. <td class="description-content">
  284. <el-form-item
  285. prop="resignationDate"
  286. :rules="{ required: form.status === 'DIMISSION', message: '请选择离职日期', trigger: 'change' }"
  287. >
  288. <el-date-picker
  289. type="date"
  290. placeholder="选择离职日期"
  291. size="mini"
  292. v-model="form.resignationDate"
  293. />
  294. </el-form-item>
  295. </td>
  296. </tr>
  297. <tr class="description-tr">
  298. <th class="description-label">开户行</th>
  299. <td class="description-content">
  300. <el-form-item
  301. prop="bankAddress"
  302. :rules="{ required: propRequred, message: '请输入开户行', trigger: 'blur' }"
  303. >
  304. <el-input size="mini" v-model="form.bankAddress" placeholder="请输入开户行"/>
  305. </el-form-item>
  306. </td>
  307. <th class="description-label">银行卡号</th>
  308. <td class="description-content" colspan="3">
  309. <el-form-item
  310. prop="bankCardNo"
  311. :rules="{ required: propRequred, message: '请输入银行卡号', trigger: 'blur' }"
  312. >
  313. <el-input size="mini" v-model="form.bankCardNo" placeholder="请输入银行卡号"/>
  314. </el-form-item>
  315. </td>
  316. </tr>
  317. <tr class="description-tr">
  318. <th class="description-label">紧急联系人姓名</th>
  319. <td class="description-content">
  320. <el-form-item
  321. prop="emergencyContactName"
  322. :rules="{ required: propRequred, message: '请输入紧急联系人姓名', trigger: 'blur' }"
  323. >
  324. <el-input size="mini" v-model.trim="form.emergencyContactName" placeholder="请输入紧急联系人姓名"/>
  325. </el-form-item>
  326. </td>
  327. <th class="description-label">紧急联系人关系</th>
  328. <td class="description-content">
  329. <el-form-item
  330. prop="emergencyContactRelation"
  331. :rules="{ required: propRequred, message: '请输入紧急联系人关系', trigger: 'blur' }"
  332. >
  333. <el-input size="mini" v-model.trim="form.emergencyContactRelation" placeholder="请输入紧急联系人关系"/>
  334. </el-form-item>
  335. </td>
  336. <th class="description-label">紧急联系人电话</th>
  337. <td class="description-content">
  338. <el-form-item
  339. prop="emergencyContactPhone"
  340. :rules="[
  341. { required: propRequred, message: '请输入紧急联系人电话', trigger: 'blur' },
  342. { min: 11, max: 11, message: '请输入正确的手机号码', trigger: 'blur' }
  343. ]"
  344. >
  345. <el-input size="mini" v-model.trim="form.emergencyContactPhone" minlength="11" maxlength="11" placeholder="请输入紧急联系人电话"/>
  346. </el-form-item>
  347. </td>
  348. </tr>
  349. </tbody>
  350. </table>
  351. </div>
  352. </el-form>
  353. <span class="dialog-footer">
  354. <el-button @click="close('ruleForm')">取 消</el-button>
  355. <el-button type="primary" class="main-button" @click="onTypeSubmit('ruleForm')">确 定</el-button>
  356. </span>
  357. </div>
  358. </template>
  359. <script>
  360. // import Vue from 'vue'
  361. import { employeeCreate, employeeUpdate } from '@/api/appTenant'
  362. import Descriptions from '@/components/Descriptions'
  363. // Vue.use(Descriptions)
  364. export default {
  365. name: 'hrform',
  366. props: ['detail', 'subjectList', 'organList', 'close', 'getList'],
  367. components: {
  368. descriptions: Descriptions
  369. },
  370. data() {
  371. return {
  372. realName: '',
  373. form: {
  374. age: '',
  375. bankAddress: '',
  376. bankCardNo: '',
  377. birthdate: '',
  378. educationalBackground: '',
  379. emergencyContactName: '',
  380. emergencyContactPhone: '',
  381. emergencyContactRelation: '',
  382. entryDate: '',
  383. gender: '',
  384. idCard: '',
  385. intentionCity: '',
  386. assessmentResult: '',
  387. status: '',
  388. isProbationPeriod: '',
  389. liveCity: '',
  390. mobileNo: '',
  391. otherComment: '',
  392. position: '',
  393. realName: '',
  394. resignationDate: '',
  395. subjectIdList: [],
  396. wechatNo: '',
  397. organId: '',
  398. sourceFrom: '',
  399. educations: [{level: '', school: '', year: ''}]
  400. },
  401. rules: {
  402. birthdate: [
  403. { required: true, message: '请输入生日', trigger: 'blur' },
  404. ],
  405. sourceFrom: [
  406. { required: true, message: '请选择信息来源', trigger: 'change' },
  407. ],
  408. intentionCity: [
  409. { required: true, message: '请输入工作意向', trigger: 'blur' },
  410. ],
  411. status: [
  412. { required: true, message: '请选择员工状态', trigger: 'change' },
  413. ],
  414. liveCity: [
  415. { required: true, message: '请输入所在城市', trigger: 'blur' },
  416. ],
  417. mobileNo: [
  418. { required: true, message: '请输入手机号', trigger: 'blur' },
  419. { min: 11, max: 11, message: '请输入正确的手机号码', trigger: 'blur' }
  420. ],
  421. otherComment: [
  422. { required: true, message: '请输入其他综合情况', trigger: 'blur' },
  423. ],
  424. position: [
  425. { required: true, message: '请输入职位', trigger: 'blur' },
  426. ],
  427. realName: [
  428. { required: true, message: '请输入姓名', trigger: 'blur' },
  429. ],
  430. subjectIdList: [
  431. { required: true, message: '请选择声部', trigger: 'change' },
  432. ],
  433. }
  434. }
  435. },
  436. watch: {
  437. detail() {
  438. this.updateData()
  439. },
  440. },
  441. mounted() {
  442. this.updateData()
  443. },
  444. computed: {
  445. propRequred() {
  446. return this.form.status === 'PART_TIME' || this.form.status === 'FULL_TIME' || this.form.status === 'DIMISSION'
  447. }
  448. },
  449. methods: {
  450. updateData() {
  451. if (this.detail) {
  452. try {
  453. this.detail.subjectIdList = this.detail.subjectIdList.split(',')
  454. } catch (error) {}
  455. if (this.detail.organId === 0) {
  456. this.detail.organId = ''
  457. }
  458. if (this.detail.age === 0) {
  459. this.detail.age = ''
  460. }
  461. this.form = Object.assign({
  462. educations: [{level: '', school: '', year: ''}]
  463. }, this.detail)
  464. try {
  465. this.form.educations = JSON.parse(this.detail.educationalBackground)
  466. if (this.form.educations.length < 1) {
  467. this.form.educations = [{level: '', school: '', year: ''}]
  468. }
  469. this.form = {...this.form}
  470. } catch (error) {}
  471. } else {
  472. this.form.educations = [{level: '', school: '', year: ''}]
  473. this.form = {...this.form}
  474. }
  475. },
  476. addEducation() {
  477. this.form.educations = [...this.form.educations, {level: '', school: '', year: ''}]
  478. this.form = {...this.form}
  479. },
  480. removeEducation(index) {
  481. this.form.educations[index] = null
  482. this.form.educations = this.form.educations.filter(item => !!item)
  483. this.form = {...this.form}
  484. },
  485. onTypeSubmit() {
  486. this.$refs['ruleForm'].validate(valid => {
  487. if (valid) {
  488. const { $message } = this
  489. this.form.educationalBackground = JSON.stringify(this.form.educations)
  490. const {educations, subjectIdList, ...rest} = this.form
  491. if (this.detail && this.detail.id) {
  492. employeeUpdate(Object.assign({id: this.detail.id, subjectIdList: (subjectIdList || []).join(',')}, rest))
  493. .then(res => {
  494. if (res.code === 200) {
  495. $message.success('修改成功')
  496. this.close('ruleForm')
  497. this.getList()
  498. }
  499. })
  500. } else {
  501. employeeCreate({subjectIdList: (subjectIdList || []).join(','), ...rest})
  502. .then(res => {
  503. if (res.code === 200) {
  504. $message.success('创建成功')
  505. this.close('ruleForm')
  506. this.getList()
  507. }
  508. })
  509. }
  510. }
  511. })
  512. }
  513. }
  514. }
  515. </script>
  516. <style lang="less" scoped>
  517. .desc-item{
  518. position: relative;
  519. .close{
  520. position: absolute;
  521. left: 10px;
  522. cursor: pointer;
  523. }
  524. }
  525. .main-button{
  526. background-color: #14928a;
  527. border-color: #14928a;
  528. }
  529. .dialog-footer{
  530. display: block;
  531. text-align: right;
  532. margin-top: 20px;
  533. }
  534. .description-title {
  535. margin-bottom: 20px;
  536. color: rgba(0,0,0,.85);
  537. font-weight: 700;
  538. font-size: 16px;
  539. line-height: 1.5;
  540. }
  541. .description-view {
  542. width: 100%;
  543. border: 1px solid #e8e8e8;
  544. }
  545. .description-view .description-table {
  546. width: 100%;
  547. /* border: 1px solid #e8e8e8; */
  548. border-collapse: collapse;
  549. table-layout: fixed;
  550. }
  551. .description-view .description-tr {
  552. border-bottom: 1px solid #e8e8e8;
  553. width: 100%;
  554. }
  555. .description-view .description-tr:last-child {
  556. border-bottom: none;
  557. }
  558. .description-view .description-label {
  559. border-right: 1px solid #e8e8e8;
  560. background-color: #fafafa;
  561. color: rgba(0, 0, 0, 0.85);
  562. font-weight: 400;
  563. font-size: 14px;
  564. line-height: 22px;
  565. /* margin-right: 8px; */
  566. padding: 12px 16px;
  567. white-space: nowrap;
  568. display: table-cell;
  569. }
  570. .description-view .description-label:after {
  571. content: ""; /** content: ":" */
  572. margin: 0 8px 0 2px;
  573. position: relative;
  574. top: -0.5px;
  575. }
  576. .description-view .description-content {
  577. white-space: nowrap;
  578. overflow: hidden;
  579. text-overflow: ellipsis;
  580. border-right: 1px solid #e8e8e8;
  581. font-size: 14px;
  582. line-height: 1.5;
  583. padding: 12px 16px;
  584. padding-bottom: 0;
  585. color: rgba(0, 0, 0, 0.65);
  586. display: table-cell;
  587. }
  588. .description-tr .description-content:last-child {
  589. border-right: none;
  590. }
  591. </style>