edit.vue 12 KB

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