edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <div class="card-edit">
  3. <a-form :model="dataModel" autocomplete="off" @finish="onFinish">
  4. <h1>岗位基础信息</h1>
  5. <a-row justify="start" :gutter="24" >
  6. <a-col flex="800px">
  7. <a-form-item label="企业名称" :label-col="{ span: 3}"
  8. name="companyID" :rules="[{ required: true, message: '请选择关联企业!' }]" >
  9. <a-select :disabled="isEdit" ref="select" show-search optionFilterProp="label" v-model:value="dataModel.companyID" >
  10. <a-select-option v-for="item in companyList" :label="item.companyName" :value="item.companyID"
  11. :key="item.companyID">
  12. <span>{{ item.companyName }}</span>
  13. </a-select-option>
  14. </a-select>
  15. </a-form-item>
  16. </a-col>
  17. </a-row>
  18. <a-row justify="start">
  19. <a-col flex="520px">
  20. <a-form-item label="岗位名称" :label-col="{ span: 5 }"
  21. name="professionName" :rules="[{ required: true, message: '请选择岗位名称!' }]" >
  22. <a-cascader :load-data="loadLevelProfessionList" v-model:value="dataModel.professionName"
  23. :options="firstProfessionList" change-on-select>
  24. </a-cascader>
  25. </a-form-item>
  26. </a-col>
  27. <a-col flex="340px">
  28. <a-form-item label="招聘人数" :label-col="{ span: 8}"
  29. name="recruitCount" :rules="[{ required: true, message: '请输入招聘人数!' }]" >
  30. <a-input v-model:value="dataModel.recruitCount" placeholder=""/>
  31. </a-form-item>
  32. </a-col>
  33. <a-col flex="280px">
  34. <a-form-item label="招聘日期" :label-col="{ span: 9 }"
  35. name="startTime" :rules="[{ required: true, message: '请输入招聘开始时间' }]" >
  36. <a-date-picker v-model:value="dataModel.startTime" picker="date" value-format="YYYY-MM-DD" />
  37. </a-form-item>
  38. </a-col>
  39. <label style="margin:5px;">至</label>
  40. <a-col flex="170px">
  41. <a-form-item name="endTime" :rules="[{ required: true, message: '请输入招聘结束时间' }]" >
  42. <a-date-picker v-model:value="dataModel.endTime" picker="date" value-format="YYYY-MM-DD" />
  43. </a-form-item>
  44. </a-col>
  45. </a-row>
  46. <a-row justify="start">
  47. <a-col flex="1330px">
  48. <a-form-item label="招聘地点" :label-col="{span:2}" name="jobPlace"
  49. :rules="[{ required: true, message: '请输入招聘地点' }]" >
  50. <a-textarea v-model:value="dataModel.jobPlace" placeholder="" :rows="4"/>
  51. </a-form-item>
  52. </a-col>
  53. </a-row>
  54. <h1>岗位其他信息</h1>
  55. <a-row justify="start">
  56. <a-col flex="300px" >
  57. <a-form-item
  58. label="岗位月薪(元)"
  59. name="minSalary"
  60. :label-col="{span:9}"
  61. :rules="[{ required: false, message: '请输入金额!' }]"
  62. >
  63. <a-input v-model:value="dataModel.minSalary" placeholder="请输入金额"/>
  64. </a-form-item>
  65. </a-col>
  66. <label style="margin:5px 8px 5px 8px;">至</label>
  67. <a-col flex="200px">
  68. <a-form-item
  69. :label-col="{ span: 6 }"
  70. name="maxSalary"
  71. :rules="[{ required: false, message: '请输入金额' }]"
  72. >
  73. <a-input v-model:value="dataModel.maxSalary" placeholder="请输入金额"/>
  74. </a-form-item>
  75. </a-col>
  76. <a-col flex="400px">
  77. <a-form-item
  78. label="是否有试用期"
  79. :label-col="{ span: 9 }"
  80. name="isTrail"
  81. :rules="[{ required: false, message: '请选择是否试用期!' }]"
  82. >
  83. <a-select
  84. ref="select"
  85. v-model:value="dataModel.isTrail"
  86. :options="trialStatusList"
  87. :field-names="{ label: 'name', value: 'value' }"
  88. >
  89. </a-select>
  90. </a-form-item>
  91. </a-col>
  92. <a-col flex="400px" >
  93. <a-form-item
  94. label="试用期(月)"
  95. :label-col="{ span: 7 }"
  96. name="trailMonths"
  97. :rules="[{ required: false, message: '请选择试用期时长!' }]"
  98. >
  99. <a-input v-model:value="dataModel.trailMonths" placeholder=""/>
  100. </a-form-item>
  101. </a-col>
  102. </a-row>
  103. <a-row justify="start">
  104. <a-col flex="300px">
  105. <a-form-item
  106. label="试用期月薪(元)"
  107. name="trailMaxSalary"
  108. :label-col="{span:9}"
  109. :rules="[{ required: false, message: '请输入金额!' }]"
  110. >
  111. <a-input v-model:value="dataModel.trailMaxSalary" placeholder="请输入金额"/>
  112. </a-form-item>
  113. </a-col>
  114. <label style="margin:5px 8px 5px 8px;">至</label>
  115. <a-col flex="200px">
  116. <a-form-item
  117. :label-col="{ span: 6 }"
  118. name="trailMinSalary"
  119. :rules="[{ required: false, message: '请输入金额' }]"
  120. >
  121. <a-input v-model:value="dataModel.trailMinSalary" placeholder="请输入金额"/>
  122. </a-form-item>
  123. </a-col>
  124. <a-col flex="400px">
  125. <a-form-item
  126. label="工作年限要求"
  127. :label-col="{ span: 9 }"
  128. name="workYear"
  129. :rules="[{ required: false, message: '请选择工作年限!' }]"
  130. >
  131. <a-select
  132. ref="select"
  133. v-model:value="dataModel.workYear"
  134. :options="WorkYearTypeList"
  135. :field-names="{ label: 'name', value: 'value' }"
  136. >
  137. </a-select>
  138. </a-form-item>
  139. </a-col>
  140. <a-col flex="400px">
  141. <a-form-item
  142. label="学历要求"
  143. :label-col="{ span: 7 }"
  144. name="cultureRank"
  145. :rules="[{ required: false, message: '请选择试用期时长!' }]"
  146. >
  147. <a-select
  148. ref="select"
  149. v-model:value="dataModel.cultureRank"
  150. :options="cultureLevelList"
  151. :field-names="{ label: 'name', value: 'value' }"
  152. >
  153. </a-select>
  154. </a-form-item>
  155. </a-col>
  156. </a-row>
  157. <a-row justify="start">
  158. <a-col flex="1330px">
  159. <a-form-item :label-col="{span:2}" name="welfare" label="福利待遇">
  160. <a-textarea v-model:value="dataModel.welfare" placeholder="" :rows="4"/>
  161. </a-form-item>
  162. </a-col>
  163. </a-row>
  164. <a-row justify="start">
  165. <a-col flex="1330px">
  166. <a-form-item :label-col="{span:2}" name="postDesc" label="其他要求">
  167. <a-textarea v-model:value="dataModel.postDesc" placeholder="" :rows="4"/>
  168. </a-form-item>
  169. </a-col>
  170. </a-row>
  171. <a-row >
  172. <a-col flex="1330px">
  173. <a-form-item class="buttom-btns">
  174. <a-button @click="onClose">取消</a-button>
  175. <a-button type="primary" html-type="submit">提交</a-button>
  176. </a-form-item>
  177. </a-col>
  178. </a-row>
  179. </a-form>
  180. </div>
  181. </template>
  182. <script lang="ts">
  183. import {defineComponent, reactive, ref, toRefs, watch} from 'vue';
  184. import {useRouter} from 'vue-router';
  185. import {savePost, getPostByID} from '@/api/companyService/post';
  186. import type {CascaderProps,SelectProps} from 'ant-design-vue';
  187. import {useTabsViewStore} from '@/store/modules/tabsView';
  188. import BUploadFile from '@/components/file/uploadFile.vue';
  189. import {get} from '@/api/common';
  190. import {message} from "ant-design-vue";
  191. interface postModel {
  192. dataModel: any;
  193. }
  194. export default defineComponent(
  195. {
  196. name: 'PostEdit',
  197. components: {BUploadFile},
  198. setup() {
  199. const postCompany = reactive<postModel>({dataModel:{}});
  200. const router = useRouter();
  201. const fullpath = router.currentRoute.value.fullPath;
  202. const tabsViewStore = useTabsViewStore();
  203. const isEdit = ref<boolean>(false);
  204. const cultureLevelList = ref<SelectProps['options']>();
  205. const WorkYearTypeList = ref<SelectProps['options']>();
  206. const companyList = ref<SelectProps['options']>();
  207. const postStatusList = [{name: '启用', value: 1}, {name: '停用', value: 0}];
  208. const trialStatusList = [{name: '是', value: true}, {name: '否', value: false}];
  209. const firstProfessionList = ref<CascaderProps['options']>([]);
  210. const getFirstProfessionList = () => {
  211. get("profession/getFirstProfessionList", null).then(data=>{
  212. firstProfessionList.value = (data as any[]).map((x) => {
  213. return {
  214. label: x.name,
  215. value: x.code,
  216. isLeaf: false,
  217. tag: 'firstLevel'
  218. }
  219. });
  220. });
  221. }
  222. const loadLevelProfessionList = (selectedOptions) => {
  223. let targetOption = selectedOptions[selectedOptions.length - 1];
  224. if (targetOption) {
  225. if (targetOption.tag == 'firstLevel') {
  226. get("profession/getListByParentProfessionID",{parentProfessionID:targetOption.value}).then(data => {
  227. targetOption.loading = false;
  228. targetOption.children = (data as any[]).map((x) => {
  229. return {
  230. label: x.name,
  231. value: x.code,
  232. isLeaf: false,
  233. tag: 'secondLevel'
  234. };
  235. });
  236. });
  237. postCompany.dataModel.hasProfession = false;
  238. } else if (targetOption.tag == "secondLevel") {
  239. get("profession/getListByParentProfessionID",{parentProfessionID:targetOption.value}).then(data => {
  240. targetOption.loading = false;
  241. targetOption.children = (data as any[]).map((x) => {
  242. return {
  243. label: x.name,
  244. value: x.code,
  245. isLeaf: true,
  246. tag: 'thirdLevel'
  247. };
  248. });
  249. });
  250. postCompany.dataModel.hasProfession = false;
  251. }
  252. }
  253. };
  254. watch(() => postCompany.dataModel.professionName, (selectedValues) => {
  255. console.log("dd",selectedValues);
  256. if (selectedValues && selectedValues.length == 3) {
  257. postCompany.dataModel.professionID = selectedValues[2];
  258. postCompany.dataModel.hasProfession = true;
  259. } else {
  260. postCompany.dataModel.professionID = '';
  261. postCompany.dataModel.hasProfession = false;
  262. }
  263. });
  264. get('system/dictionary/getDictionaryItemByCodeList', {code: 'CultureLevel'}).then(result => {
  265. cultureLevelList.value = result;
  266. });
  267. get('system/dictionary/getDictionaryItemByCodeList', {code: 'WorkYearType'}).then(result => {
  268. WorkYearTypeList.value = result;
  269. });
  270. get('companyService/company/getList', {pageIndex: 1, pageSize: 9999}).then(result => {
  271. companyList.value = result.list;
  272. })
  273. const onClose = () => {
  274. tabsViewStore.closeCurrentTabByPath('/companyService/post/add');
  275. tabsViewStore.closeCurrentTabByPath('/companyService/post/edit');
  276. router.push({name: '/companyService/post/index'});
  277. };
  278. const onFinish = () => {
  279. if(!postCompany.dataModel.hasProfession){
  280. message.error("请选择完整的岗位信息!")
  281. }else{
  282. postCompany.dataModel.professionName=null;
  283. console.log("当前岗位信息",postCompany.dataModel);
  284. savePost(postCompany.dataModel).then((result) => {
  285. if (result) {
  286. tabsViewStore.closeCurrentTab(fullpath);
  287. tabsViewStore.addTabByPath('/companyService/post/index', {reload: 1});
  288. }
  289. });
  290. }
  291. }
  292. const loadData = (id: any) => {
  293. isEdit.value = id != null;
  294. getFirstProfessionList();
  295. getPostByID(id).then(result => {
  296. console.log(result);
  297. postCompany.dataModel = result;
  298. })
  299. };
  300. return {
  301. ...toRefs(postCompany),
  302. loadData,
  303. onClose,
  304. onFinish,
  305. loadLevelProfessionList,
  306. firstProfessionList,
  307. companyList,
  308. postStatusList,
  309. trialStatusList,
  310. cultureLevelList,
  311. WorkYearTypeList,
  312. postCompany,
  313. isEdit
  314. }
  315. },
  316. created() {
  317. const id = history.state.params?.id;
  318. if (id) this.isEdit = true;
  319. this.loadData(id);
  320. }
  321. })
  322. </script>
  323. <style>
  324. h1 {
  325. font-size: 18px;
  326. font-weight: bold;
  327. color: rgb(24, 144, 255);
  328. margin-bottom: 10px;
  329. }
  330. </style>