edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <div class="card-edit" :visible="formState.loading">
  3. <a-form :model="dataModel" autocomplete="off" @finish="onFinish" >
  4. <a-divider orientation="left">求职意向信息</a-divider>
  5. <a-row type="flex">
  6. <a-col :span="7">
  7. <a-form-item label="姓名" name="jobUserID" :label-col="{span:8}" :rules="[{ required: true, message: '请输选择求职人员!' }]">
  8. <label v-if="opCategory==3">{{dataModel.name}}</label>
  9. <a-select ref="select" show-search optionFilterProp="label" v-model:value="dataModel.jobUserID" >
  10. <a-select-option v-for="item in jobUserList" :label="item.text" :value="item.value"
  11. :key="item.value">
  12. <span>{{ item.text }}</span>
  13. </a-select-option>
  14. </a-select>
  15. </a-form-item>
  16. </a-col>
  17. <a-col :span="8">
  18. <a-form-item label="求职岗位" name="professionName" :label-col="{span:7}" :rules="[{ required: true,message:'请选择求职岗位!' }]">
  19. <!-- <label v-if="opCategory==3">{{dataModel.postID}}</label> -->
  20. <a-cascader :load-data="loadLevelProfessionList" v-model:value="dataModel.professionName"
  21. :options="firstProfessionList" change-on-select>
  22. </a-cascader>
  23. </a-form-item>
  24. </a-col>
  25. <a-col :span="9">
  26. <a-form-item label="月薪要求" name="salary" style="overflow: hidden;line-height: 35px;height: 35px;" :label-col="{span:7}">
  27. <label style="color:red;float: left;position:relative;right:80px;line-height: 35px;" >*</label>
  28. <a-form-item name="minSalary" :rules="[{ required: true, message: '请输入最低月薪!' }]" style="float:left;">
  29. <a-input-number :controls="false" :min="0" name="minSalary" v-model:value="dataModel.minSalary"
  30. style="min-width: 145px;max-width: 150px;" placeholder="" @change="salaryChange"/>
  31. </a-form-item>
  32. <label style="margin-right:10px;margin-left:10px;float: left;">-</label>
  33. <a-form-item name="maxSalary" :rules="[{ required: true, message: '请输入最高月薪!' }]" style="float: left;" >
  34. <a-input-number :controls="false" :min="dataModel.minSalary" name="maxSalary"
  35. v-model:value="dataModel.maxSalary"
  36. style="min-width: 145px;max-width: 150px;" placeholder="" @change="salaryChange"/>
  37. </a-form-item>
  38. </a-form-item>
  39. </a-col>
  40. </a-row>
  41. <a-row type="flex">
  42. <a-col :span="7">
  43. <a-form-item label="工作年限" name="workYear" :label-col="{span:8}" :rules="[{ required: true, message: '请输入工作年限!' }]">
  44. <!-- <label v-if="opCategory==3">{{dataModel.workYear}}</label>-->
  45. <a-input type="number" v-model:value="dataModel.workYear" placeholder="" />
  46. </a-form-item>
  47. </a-col>
  48. <a-col :span="8" >
  49. <a-form-item label="求职类型" name="jobHuntType" :label-col="{span:7}" :rules="[{ required: true, message: '请选择求职类型!' }]">
  50. <label v-if="opCategory==3">{{dataModel.jobHuntType}}</label>
  51. <a-select ref="select" v-model:value="dataModel.jobHuntType" :options="jobHuntTypeList"
  52. :field-names="{label:'name',value:'value'}" :allow-clear="true" >
  53. </a-select>
  54. </a-form-item>
  55. </a-col>
  56. <a-col :span="9">
  57. <a-form-item label="人才类型" name="jobUserType" :label-col="{span:7}" :rules="[{ required: true, message: '请选择人才类型!' }]">
  58. <label v-if="opCategory==3">{{dataModel.jobUserType }}</label>
  59. <a-select ref="select" v-model:value="dataModel.jobUserType" :options="jobUserTypeList"
  60. :field-names="{label:'name',value:'value'}" :allow-clear="true" >
  61. </a-select>
  62. </a-form-item>
  63. </a-col>
  64. </a-row>
  65. <a-row type="flex">
  66. <a-col :span="7">
  67. <a-form-item label="希望工作地区" name="areaWork" :label-col="{span:8}" :rules="[{ required: true, message: '请输入工作地区!' }]">
  68. <!-- <label v-if="opCategory==3">{{dataModel.areaWork}}</label>-->
  69. <!-- <a-input v-model:value="dataModel.areaWork" placeholder=""/>-->
  70. <a-select
  71. ref="select"
  72. v-model:value="dataModel.areaWork"
  73. :options="regionList"
  74. :field-names="{ label: 'name', value: 'name' }"
  75. :allow-clear="true"
  76. >
  77. </a-select>
  78. </a-form-item>
  79. </a-col>
  80. <a-col :span="8">
  81. <a-form-item label="可到职日期" name="inDate" :label-col="{span:7}" :rules="[{ required: true, message: '请输入工作地区!' }]">
  82. <label v-if="opCategory==3">{{dataModel.inDate}}</label>
  83. <a-date-picker v-model:value="dataModel.inDate" picker="date" value-format="YYYY-MM-DD" />
  84. </a-form-item>
  85. </a-col>
  86. <a-col :span="9">
  87. </a-col>
  88. </a-row>
  89. <a-divider orientation="left">其他信息</a-divider>
  90. <a-row>
  91. <a-textarea name="otherDemand" :auto-size="{ minRows: 4, maxRows: 10 }" v-model:value="dataModel.otherDemand" :disabled="opCategory==3"
  92. placeholder="其他信息" />
  93. </a-row>
  94. <a-form-item class="buttom-btns">
  95. <a-button @click="onClose">取消</a-button>
  96. <a-button type="primary" html-type="submit">提交</a-button>
  97. </a-form-item>
  98. </a-form>
  99. </div>
  100. </template>
  101. <script lang="ts">
  102. import {defineComponent, reactive, ref, toRefs, watch} from "vue";
  103. import {useTabsViewStore} from "@/store/modules/tabsView";
  104. import {getJobHuntByID, saveJobHuntCopy} from "@/api/jobUserManager/jobhunt"
  105. import {getJobUserDataList} from "@/api/jobUserManager/jobuser";
  106. import {getSysDictionaryList} from '@/api/system/dictionary';
  107. import BUploadFile from "@/components/file/uploadFile.vue";
  108. import {CascaderProps, message, SelectProps} from "ant-design-vue";
  109. import {get} from "@/api/common";
  110. interface jobHuntModel {
  111. dataModel: any;
  112. }
  113. export default defineComponent({
  114. name:'JobHuntEditForm',
  115. components: {BUploadFile},
  116. props: {
  117. loadData: {
  118. type: Function,
  119. default: null
  120. }
  121. },
  122. setup() {
  123. const title = ref();
  124. const opCategory = ref<any>();
  125. const tabsViewStore = useTabsViewStore();
  126. const isAllowCommit = ref<boolean>(true);
  127. const formData = reactive<jobHuntModel>({dataModel:{}});
  128. const formState = reactive({
  129. total: 0,
  130. selectedRowKeys: [],
  131. loading: false
  132. });
  133. const firstProfessionList = ref<CascaderProps['options']>([]);
  134. const jobUserList = ref<SelectProps['options']>();
  135. const jobWorkTypeList = ref<SelectProps['options']>();
  136. const jobHuntTypeList = ref<SelectProps['options']>();
  137. const jobUserTypeList = ref<SelectProps['options']>();
  138. const regionList = ref<SelectProps['options']>();
  139. const getWorkAreas = async function(){
  140. const result :any = await get('system/area/getCityList',{});
  141. regionList.value = result;
  142. }
  143. const getFirstProfessionList = () => {
  144. get("profession/getFirstProfessionList", null).then(data=>{
  145. firstProfessionList.value = (data as any[]).map((x) => {
  146. return {
  147. label: x.name,
  148. value: x.code,
  149. isLeaf: false,
  150. tag: 'firstLevel'
  151. }
  152. });
  153. });
  154. }
  155. const loadLevelProfessionList = (selectedOptions) => {
  156. let targetOption = selectedOptions[selectedOptions.length - 1];
  157. if (targetOption) {
  158. if (targetOption.tag == 'firstLevel') {
  159. get("profession/getListByParentProfessionID",{parentProfessionID:targetOption.value}).then(data => {
  160. targetOption.loading = false;
  161. targetOption.children = (data as any[]).map((x) => {
  162. return {
  163. label: x.name,
  164. value: x.code,
  165. isLeaf: false,
  166. tag: 'secondLevel'
  167. };
  168. });
  169. });
  170. formData.dataModel.hasProfession = false;
  171. } else if (targetOption.tag == "secondLevel") {
  172. get("profession/getListByParentProfessionID",{parentProfessionID:targetOption.value}).then(data => {
  173. targetOption.loading = false;
  174. targetOption.children = (data as any[]).map((x) => {
  175. return {
  176. label: x.name,
  177. value: x.code,
  178. isLeaf: true,
  179. tag: 'thirdLevel'
  180. };
  181. });
  182. });
  183. formData.dataModel.hasProfession = false;
  184. }
  185. }
  186. };
  187. watch(() => formData.dataModel.professionName, (selectedValues) => {
  188. if (selectedValues && selectedValues.length == 3) {
  189. formData.dataModel.professionID = selectedValues[2];
  190. formData.dataModel.hasProfession = true;
  191. }
  192. });
  193. const getJobUserList = async function() {
  194. const jobUserResult :any = await getJobUserDataList();
  195. jobUserList.value = jobUserResult;
  196. /*console.log('jobUserResult',jobUserResult);*/
  197. }
  198. const getJobWorkTypeList = async function(){
  199. const data :any = await getSysDictionaryList("JobWorkType");
  200. jobWorkTypeList.value = data;
  201. /*console.log('jobWorkTypeList',jobWorkTypeList.value);*/
  202. }
  203. const getJobHuntTypeList = async function(){
  204. const data :any = await getSysDictionaryList("JobHuntType");
  205. jobHuntTypeList.value = data;
  206. // console.log('jobHuntTypeList',jobHuntTypeList.value);
  207. }
  208. const getJobUserTypeList = async function(){
  209. const data :any = await getSysDictionaryList("JobUserType");
  210. jobUserTypeList.value = data;
  211. // console.log('jobUserTypeList',jobUserTypeList.value);
  212. }
  213. const loadData = (id: string) => {
  214. formState.loading = true;
  215. getWorkAreas();
  216. getFirstProfessionList();
  217. getJobUserTypeList();
  218. getJobHuntTypeList();
  219. getJobWorkTypeList();
  220. getJobHuntByID(id).then((result: any) => {
  221. formData.dataModel = result;
  222. formData.dataModel.hasProfession = true;
  223. });
  224. formState.loading = false;
  225. };
  226. const onClose = (reload: any) => {
  227. tabsViewStore.closeCurrentTabByPath('/jobusermgr/jobhunt/add');
  228. tabsViewStore.closeCurrentTabByPath('/jobusermgr/jobhunt/edit');
  229. tabsViewStore.openTab('/jobusermgr/jobhunt/index', {reload: reload});
  230. };
  231. const onFinish = () => {
  232. isAllowCommit.value = true;
  233. if(formData.dataModel.minSalary!=""&&formData.dataModel.maxSalary!=""){
  234. if(formData.dataModel.minSalary>formData.dataModel.maxSalary){
  235. message.error("最低月薪不能大于最高月薪!");
  236. isAllowCommit.value = false;
  237. }
  238. }
  239. if(!formData.dataModel.hasProfession){
  240. message.error("请选择完整的岗位信息!");
  241. isAllowCommit.value = false;
  242. }
  243. if (isAllowCommit.value){
  244. formData.dataModel.professionName=null;
  245. //console.log("当前意向信息",formData.dataModel);
  246. saveJobHuntCopy(formData.dataModel).then(result => {
  247. if (result) {
  248. onClose(1);
  249. }
  250. });
  251. }
  252. };
  253. function salaryChange() {
  254. if (formData.dataModel.maxSalary < formData.dataModel.minSalary) {
  255. formData.dataModel.maxSalary = formData.dataModel.minSalary
  256. }
  257. }
  258. return {
  259. ...toRefs(formData),
  260. loadData,
  261. onClose,
  262. onFinish,
  263. getJobUserList,
  264. loadLevelProfessionList,
  265. title,
  266. formState,
  267. opCategory,
  268. regionList,
  269. firstProfessionList,
  270. jobUserList,
  271. jobUserTypeList,
  272. jobHuntTypeList,
  273. jobWorkTypeList,
  274. isAllowCommit,
  275. salaryChange
  276. };
  277. },
  278. created() {
  279. this.getJobUserList();
  280. const id = history.state.params?.id;
  281. this.loadData(id);
  282. },
  283. })
  284. </script>