detail.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. <template>
  2. <div id="detail">
  3. <detail-layout>
  4. <template #title v-if="!isDialog">
  5. <back-bar to="/manager/jobs/index" title="职位信息管理"></back-bar>
  6. </template>
  7. <template #main>
  8. <el-row v-loading="loading">
  9. <el-form :model="info" :rules="rules" ref="info" class="demo-ruleForm">
  10. <form-item label="企业名称">
  11. {{ user.corpname }}
  12. </form-item>
  13. <form-item label="职位名称" prop="job_name">
  14. <el-input placeholder="每个职位职能录入一个岗位" v-model="info.job_name"></el-input>
  15. </form-item>
  16. <form-item label="职位分类" prop="category">
  17. <el-select v-model="info.category" placeholder="点击选择职位" multiple style="width:100%;">
  18. <el-option v-for="(item, index) in jobTypeList" :key="index" :label="item.name" :value="item.name"></el-option>
  19. </el-select>
  20. </form-item>
  21. <form-item label="工作城市" prop="city">
  22. <tag-all-select
  23. placeholder="点击选择城市"
  24. :firstList="provinceList"
  25. :secondList="cityList"
  26. @selectChange="selectChange"
  27. @listChange="listChange"
  28. :selected="info.city"
  29. type="city"
  30. ></tag-all-select>
  31. </form-item>
  32. <form-item label="工作性质" prop="is_practice">
  33. <el-radio-group v-model="info.is_practice" size="small">
  34. <el-radio v-for="(item, index) in type_list" :key="index" :label="item.type_value" border>{{ item.type_label }}</el-radio>
  35. </el-radio-group>
  36. </form-item>
  37. <form-item label="学历要求" prop="xl_req">
  38. <el-select v-model="info.xl_req" placeholder="请选择学历要求">
  39. <el-option v-for="(item, index) in edu_list" :key="index" :label="item.name" :value="item.name"></el-option>
  40. </el-select>
  41. </form-item>
  42. <form-item label="职位诱惑" prop="job_tag">
  43. <tagCheckbox
  44. placeholder="点击选择职位诱惑"
  45. :firstList="entice_list"
  46. @selectChange="selectChange"
  47. @listChange="listChange"
  48. :selected="info.job_tag"
  49. type="job_tag"
  50. ></tagCheckbox>
  51. </form-item>
  52. <form-item label="招聘人数" prop="job_number">
  53. <el-input-number v-model="info.job_number" :min="1" placeholder="添加需要招聘的人数" style="width:100%"></el-input-number>
  54. </form-item>
  55. <form-item label="截止日期" prop="end_date">
  56. <el-date-picker v-model="info.end_date" type="date" placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
  57. </el-date-picker>
  58. </form-item>
  59. <form-item label="薪资" prop="">
  60. <el-col :span="6">
  61. <el-input type="number" v-model="info.salary.min">
  62. <template #append>
  63. <strong>K</strong>
  64. </template>
  65. </el-input>
  66. </el-col>
  67. <el-col :span="6" style="text-align:center;">
  68. </el-col>
  69. <el-col :span="6">
  70. <el-input type="number" v-model="info.salary.max">
  71. <template #append>
  72. <strong>K</strong>
  73. </template>
  74. </el-input>
  75. </el-col>
  76. </form-item>
  77. <form-item label="薪酬福利" prop="welfare">
  78. <el-col :span="8" v-for="(item, index) in welfare_list" :key="index">
  79. <el-radio v-model="info.welfare" :label="item.name" :border="true" size="small">
  80. {{ item.name }}
  81. </el-radio>
  82. </el-col>
  83. </form-item>
  84. <form-item label="职位相关专业" prop="zy_req">
  85. <!-- <tagSecSelect
  86. placeholder="点击选择相关专业"
  87. :selected="info.zy_req"
  88. :firstList="subjectList"
  89. :secondList="subjectSubList"
  90. @selectChange="selectChange"
  91. @listChange="listChange"
  92. type="zy_req"
  93. ></tagSecSelect> -->
  94. <el-input type="text" :rows="5" placeholder="请输入职位相关专业" v-model="info.zy_req"> </el-input>
  95. <span style="color:red;">职位要求多专业时,用;分号相隔</span>
  96. </form-item>
  97. <form-item label="职位描述" prop="job_desc">
  98. <el-input type="textarea" :rows="5" placeholder="请输入职位描述" v-model="info.job_desc"> </el-input>
  99. </form-item>
  100. <form-item label="简历投递说明" prop="apply_intro">
  101. <el-input type="textarea" :rows="5" placeholder="请输入简历投递说明" v-model="info.apply_intro"> </el-input>
  102. </form-item>
  103. <form-item label="岗位要求" prop="job_req">
  104. <el-input type="textarea" :rows="5" placeholder="请输入岗位要求" v-model="info.job_req"> </el-input>
  105. </form-item>
  106. <form-item label="其他描述" prop="other">
  107. <el-input type="textarea" :rows="5" placeholder="请输入其他描述" v-model="info.other"> </el-input>
  108. </form-item>
  109. <el-row type="flex" align="middle" justify="center">
  110. <el-col :span="6">
  111. <el-button type="success" style="width:100%; margin: 1rem 0;" @click="toSubmit('info')"
  112. >提&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;交</el-button
  113. >
  114. </el-col>
  115. </el-row>
  116. </el-form>
  117. </el-row>
  118. </template>
  119. </detail-layout>
  120. </div>
  121. </template>
  122. <script>
  123. import backBar from '@/components/back-bar.vue';
  124. import tagSecSelect from '@/components/tag-sec-select.vue';
  125. import tagCheckbox from '@/components/tag-checkbox.vue';
  126. import tagAllSelect from '@/components/tag-all-select.vue';
  127. import formItem from '@/components/form-item.vue';
  128. import detailLayout from '@/layout/detail-layout.vue';
  129. import { mapActions, mapState } from 'vuex';
  130. export default {
  131. name: 'detail',
  132. props: {
  133. isDialog: { type: Boolean, default: false },
  134. },
  135. components: {
  136. detailLayout,
  137. formItem,
  138. tagAllSelect,
  139. tagCheckbox,
  140. // tagSecSelect,
  141. backBar,
  142. },
  143. data: () => ({
  144. loading: false,
  145. info: {
  146. salary: {
  147. min: '',
  148. max: '',
  149. },
  150. },
  151. jobType: '',
  152. drawer: false,
  153. jobTypeList: [],
  154. provinceList: [
  155. { label: '北京市', value: '110000' },
  156. { label: '吉林省', value: '220000' },
  157. { label: '沈阳省', value: '210000' },
  158. ],
  159. secondList: [
  160. { label: '长春市', value: '220100' },
  161. { label: '吉林市', value: '220200' },
  162. ],
  163. secondList1: [
  164. { label: '沈阳市', value: '210100' },
  165. { label: '大连市', value: '210200' },
  166. ],
  167. cityList: [],
  168. type_list: [
  169. { type_value: 0, type_label: '全职' },
  170. { type_value: 1, type_label: '实习' },
  171. ],
  172. edu_list: [],
  173. entice_list: [
  174. { value: '1', label: '年底双薪' },
  175. { value: '2', label: '绩效奖金' },
  176. { value: '3', label: '岗前培训' },
  177. { value: '4', label: '节日礼物' },
  178. { value: '5', label: '扁平管理' },
  179. { value: '6', label: '年度旅游' },
  180. { value: '7', label: '岗位晋升' },
  181. { value: '8', label: '股票期权' },
  182. { value: '9', label: '弹性工作' },
  183. { value: '10', label: '带薪年假' },
  184. { value: '11', label: '交通补助' },
  185. { value: '12', label: '餐补' },
  186. { value: '13', label: '房补' },
  187. { value: '14', label: '免费班车' },
  188. { value: '15', label: '员工旅游' },
  189. { value: '16', label: '包吃包住' },
  190. { value: '17', label: '健康体检' },
  191. { value: '18', label: '留人基金' },
  192. { value: '19', label: '学费返还' },
  193. ],
  194. welfare_list: [],
  195. subjectList: [
  196. { label: '不限专业', value: '0' },
  197. { label: '哲学', value: '1' },
  198. { label: '经济学', value: '2' },
  199. { label: '法学', value: '3' },
  200. { label: '教育学', value: '4' },
  201. { label: '文学', value: '5' },
  202. { label: '历史学', value: '6' },
  203. { label: '理学', value: '7' },
  204. { label: '工学', value: '8' },
  205. { label: '农学', value: '9' },
  206. { label: '医学', value: '10' },
  207. ],
  208. subjectSubList: [],
  209. subjectSub: [
  210. { label: '哲学类', value: '11' },
  211. { label: '哲学', value: '12' },
  212. { label: '逻辑类', value: '13' },
  213. { label: '宗教类', value: '14' },
  214. { label: '伦理类', value: '15' },
  215. ],
  216. subjectSub2: [
  217. { label: '社会经济学', value: '16' },
  218. { label: '国际经济学', value: '17' },
  219. { label: '资本主义经济学', value: '18' },
  220. ],
  221. rules: {
  222. job_name: [{ required: true, message: '请输入职位名称', trigger: 'blur' }],
  223. category: [{ required: false, message: '请输入职位分类', trigger: 'change' }],
  224. city: [{ required: false, message: '请输入城市', trigger: 'blur' }],
  225. is_practice: [{ required: true, message: '请输入工作性质', trigger: 'change' }],
  226. xl_req: [{ required: true, message: '请输入学历要求', trigger: 'change' }],
  227. job_tag: [{ required: false, message: '请输入职位标签', trigger: 'blur' }],
  228. job_number: [{ required: true, message: '请输入招聘人数', trigger: 'blur' }],
  229. end_date: [{ required: true, message: '请选择截止日期', trigger: 'blur' }],
  230. welfare: [{ required: false, message: '请输入福利待遇', trigger: 'blur' }],
  231. zy_req: [{ required: true, message: '请输入专业要求', trigger: 'blur' }],
  232. job_desc: [{ required: true, message: '请输入职位描述', trigger: 'blur' }],
  233. apply_intro: [{ required: true, message: '请输入简历投递说明', trigger: 'blur' }],
  234. job_req: [{ required: false, message: '请输入岗位要求', trigger: 'blur' }],
  235. other: [{ required: false, message: '请输入其他说明', trigger: 'blur' }],
  236. },
  237. }),
  238. created() {
  239. this.otherList();
  240. if (this.$route.query.id) {
  241. this.search();
  242. }
  243. },
  244. computed: {
  245. ...mapState(['user']),
  246. },
  247. methods: {
  248. ...mapActions(['postOperation', 'dicOperation']),
  249. async search() {
  250. this.loading = true;
  251. let result = await this.postOperation({ type: 'search', data: { id: this.$route.query.id } });
  252. let infos = JSON.parse(JSON.stringify(result.data));
  253. let newData = await this.returnData(infos);
  254. var jobArr = newData.category.split(',');
  255. // this.$set(this.info, 'category', jobArr);
  256. newData.category = jobArr;
  257. this.$set(this, `info`, newData);
  258. this.loading = false;
  259. },
  260. selectChange({ val, type }) {
  261. //此方法是同步选择
  262. this.$set(this.info, type, val);
  263. },
  264. async listChange({ val, type }) {
  265. //此方法是更换子列表的
  266. if (type === 'city') {
  267. this.getCityList(val);
  268. } else if (type === 'zy_req') {
  269. //专业查询模拟
  270. this.$set(this, `subjectSubList`, val === '1' ? this.subjectSub : this.subjectSub2);
  271. }
  272. },
  273. async getCityList(parent) {
  274. let result = await this.dicOperation({ level: 2, parent: parent });
  275. if (`${result.errcode}` === `0`) {
  276. let res = result.data.map(item => {
  277. let object = { label: item.name, value: item.code };
  278. return object;
  279. });
  280. this.$set(this, `cityList`, res);
  281. }
  282. },
  283. async toSubmit(formName) {
  284. this.$refs[formName].validate(async valid => {
  285. if (valid) {
  286. let result;
  287. let infos = JSON.parse(JSON.stringify(this.info));
  288. let mid = '';
  289. infos.salary.text = infos.salary.min + 'k-' + infos.salary.max + 'k/月';
  290. if (typeof infos.city === 'object') {
  291. infos.city.map(item => {
  292. mid === '' ? (mid = item.label) : (mid += `,${item.label}`);
  293. });
  294. infos.city = mid;
  295. mid = '';
  296. }
  297. if (typeof infos.job_tag === 'object') {
  298. infos.job_tag.map(item => {
  299. mid === '' ? (mid = item.label) : (mid += `,${item.label}`);
  300. });
  301. infos.job_tag = mid;
  302. mid = '';
  303. }
  304. if (typeof infos.zy_req === 'object') {
  305. infos.zy_req.map(item => {
  306. mid === '' ? (mid = item.label) : (mid += `,${item.label}`);
  307. });
  308. infos.zy_req = mid;
  309. mid = '';
  310. }
  311. if (typeof infos.category === 'object') {
  312. infos.category.map(item => {
  313. mid === '' ? (mid = item) : (mid += `,${item}`);
  314. });
  315. infos.category = mid;
  316. }
  317. if (this.info.id) {
  318. result = await this.postOperation({ type: 'update', data: { info: infos, id: this.$route.query.id } });
  319. } else {
  320. result = await this.postOperation({ type: 'add', data: { info: infos, corpname: this.user.corpname, corpid: this.user.corpid } });
  321. }
  322. if (`${result.errcode}` === '0') {
  323. this.$message.success('操作成功');
  324. if (this.isDialog) {
  325. this.$emit('jobSubmit', true);
  326. return;
  327. } else {
  328. this.$router.push('/manager/jobs/index');
  329. }
  330. } else {
  331. this.$message.error(result.errmsg);
  332. }
  333. } else {
  334. console.log('error submit!!');
  335. return false;
  336. }
  337. });
  338. },
  339. selectJobs(item) {
  340. this.$set(this.info, `category`, item.label);
  341. this.drawer = false;
  342. },
  343. async returnData(data) {
  344. if (data.city) {
  345. let mid = data.city.split(',');
  346. let selected = [];
  347. for (const select of mid) {
  348. let result = await this.dicOperation({ name: select });
  349. if (`${result.errcode}` === '0') {
  350. selected.push(result.data);
  351. }
  352. }
  353. selected = selected.map(item => {
  354. return { label: item.name, value: item.code };
  355. });
  356. data.city = selected;
  357. // this.$set(this.info, `city`, selected);
  358. }
  359. // if (data.zy_req) {
  360. // let mid = data.zy_req.split(',');
  361. // let selected = [];
  362. // for (const select of mid) {
  363. // let res = this.subjectList.filter(item => item.label === select && item.value === '0');
  364. // if (res.length <= 0) {
  365. // res = this.subjectSub.filter(item => item.label === select);
  366. // selected = [...selected, ...res];
  367. // res = this.subjectSub2.filter(item => item.label === select);
  368. // selected = [...selected, ...res];
  369. // // this.$set(this.info, `zy_req`, selected);
  370. // data.zy_req = selected;
  371. // } else {
  372. // data.zy_req = res;
  373. // // this.$set(this.info, `zy_req`, res);
  374. // }
  375. // }
  376. // }
  377. if (data.job_tag) {
  378. let mid = data.job_tag.split(',');
  379. let selected = [];
  380. for (const select of mid) {
  381. let res = this.entice_list.filter(item => item.label === select);
  382. selected = [...selected, ...res];
  383. }
  384. data.job_tag = selected;
  385. // this.$set(this.info, `job_tag`, selected);
  386. }
  387. return data;
  388. },
  389. async otherList(type) {
  390. let result = await this.dicOperation('zwlb');
  391. if (`${result.errcode}` === '0') {
  392. this.$set(this, `jobTypeList`, result.data);
  393. } else {
  394. this.$message.error(result.errmsg ? result.errmsg : 'error');
  395. }
  396. result = await this.dicOperation('xl');
  397. if (`${result.errcode}` === '0') {
  398. this.$set(this, `edu_list`, result.data);
  399. } else {
  400. this.$message.error(result.errmsg ? result.errmsg : 'error');
  401. }
  402. result = await this.dicOperation('zwyh');
  403. if (`${result.errcode}` === '0') {
  404. var enticeNew = result.data.map(item => ({ value: item.code, label: item.name }));
  405. this.$set(this, `entice_list`, enticeNew);
  406. } else {
  407. this.$message.error(result.errmsg ? result.errmsg : 'error');
  408. }
  409. result = await this.dicOperation('xcfl');
  410. if (`${result.errcode}` === '0') {
  411. this.$set(this, `welfare_list`, result.data);
  412. } else {
  413. this.$message.error(result.errmsg ? result.errmsg : 'error');
  414. }
  415. result = await this.dicOperation({ level: 1 });
  416. if (`${result.errcode}` === `0`) {
  417. let res = result.data.map(item => {
  418. let object = { label: item.name, value: item.code };
  419. return object;
  420. });
  421. this.$set(this, `provinceList`, res);
  422. }
  423. },
  424. },
  425. };
  426. </script>
  427. <style lang="less" scoped>
  428. .selfInput {
  429. height: 40px;
  430. border-color: #c0c4cc;
  431. }
  432. .bord {
  433. background: #f4f5f9;
  434. border: 1px solid #e7e8ec;
  435. }
  436. </style>