infoForm.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <template>
  2. <div style="width: 100%;">
  3. <CtForm ref="formPageRef" :items="items"></CtForm>
  4. </div>
  5. </template>
  6. <script setup>
  7. import { getDict } from '@/hooks/web/useDictionaries'
  8. defineOptions({name: 'necessaryInfo-InfoForm'})
  9. import { reactive, ref } from 'vue'
  10. import { checkEmail } from '@/utils/validate'
  11. import { enterpriseSearchByName } from '@/api/recruit/personal/resume'
  12. const props = defineProps({
  13. option: {
  14. type: Object,
  15. default: () => {}
  16. }
  17. })
  18. const setInfo = ref(props.option?.setInfo ? props.option.setInfo : {})
  19. // console.log(1, 'setInfo', setInfo)
  20. const formPageRef = ref()
  21. let query = reactive({})
  22. // 企业名称下拉列表
  23. let enterpriseName = null
  24. // const enterpriseNameInput = ref('')
  25. const getEnterpriseData = async (name) => {
  26. const item = items.value.options.find(e => e.key === 'enterpriseId')
  27. if (!item) return
  28. if (item.items?.length && (enterpriseName === name)) return // 防抖
  29. // item[item.itemTextName] =
  30. enterpriseName = name
  31. if (name === null || name === '') { item.items = [] }
  32. else {
  33. const data = await enterpriseSearchByName({ name })
  34. item.items = data
  35. }
  36. }
  37. let positionName = null
  38. const items = ref({
  39. options: [
  40. {
  41. type: 'text',
  42. key: 'name',
  43. value: '',
  44. default: null,
  45. label: '姓名 *',
  46. outlined: true,
  47. rules: [v => !!v || '请输入姓名']
  48. },
  49. {
  50. type: 'autocomplete',
  51. key: 'sex',
  52. value: '1', // '1' ? '男' : '女'
  53. default: '1',
  54. label: '性别 *',
  55. outlined: true,
  56. dictTypeName: 'menduner_sex',
  57. rules: [v => !!v || '请选择性别'],
  58. items: []
  59. },
  60. {
  61. type: 'phoneNumber',
  62. key: 'phone',
  63. value: '',
  64. clearable: true,
  65. label: '联系手机号 *',
  66. rules: [v => !!v || '请填写联系手机号']
  67. },
  68. {
  69. type: 'text',
  70. key: 'email',
  71. value: null,
  72. default: null,
  73. label: '常用邮箱',
  74. outlined: true,
  75. rules: [
  76. value => {
  77. if (value) return true
  78. return '请输入联系邮箱'
  79. },
  80. value => {
  81. if (value && !checkEmail(value)) return '请输入正确的电子邮箱'
  82. return true
  83. }
  84. ]
  85. },
  86. {
  87. type: 'datePicker',
  88. mode: 'date',
  89. labelWidth: 80,
  90. key: 'birthday',
  91. value: '1990-01-01',
  92. defaultValue: new Date(1990, 1, 1),
  93. label: '出生日期 *',
  94. disabledFutureDates: true,
  95. format: 'YYYY/MM/DD',
  96. flexStyle: 'mb-7',
  97. outlined: true,
  98. rules: [v => !!v || '请选择出生日期']
  99. },
  100. {
  101. type: 'combobox',
  102. key: 'enterpriseId',
  103. value: null,
  104. default: null,
  105. label: '任职企业名称(可填暂无)',
  106. outlined: true,
  107. clearable: true,
  108. canBeInputted: true, //
  109. itemTextName: 'enterpriseName',
  110. itemText: 'value',
  111. itemValue: 'key',
  112. // rules: [v => !!v || '任职企业名称(可填“暂无”)'],
  113. search: getEnterpriseData,
  114. items: []
  115. },
  116. {
  117. type: 'combobox',
  118. key: 'positionId',
  119. value: null,
  120. default: null,
  121. label: '任职职位名称(可填暂无)',
  122. outlined: true,
  123. clearable: true,
  124. canBeInputted: true, //
  125. itemTextName: 'positionName',
  126. itemText: 'nameCn',
  127. itemValue: 'id',
  128. dictTypeName: 'positionSecondData',
  129. // rules: [v => !!v || '任职职位名称(没有可填“暂无”)'],
  130. search: val => positionName = val,
  131. items: []
  132. },
  133. {
  134. type: 'autocomplete',
  135. key: 'interestedPositionList',
  136. value: null,
  137. default: null,
  138. label: '意向职位 *',
  139. outlined: true,
  140. itemText: 'nameCn',
  141. itemValue: 'id',
  142. multiple: true,
  143. dictTypeName: 'positionSecondData',
  144. rules: [v => !!v || '请选择意向职位'],
  145. items: []
  146. },
  147. {
  148. type: 'autocomplete',
  149. key: 'jobStatus',
  150. value: '',
  151. default: null,
  152. label: '求职状态 *',
  153. outlined: true,
  154. itemText: 'label',
  155. itemValue: 'value',
  156. dictTypeName: 'menduner_job_seek_status',
  157. rules: [v => !!v || '请选择求职状态'],
  158. items: []
  159. },
  160. {
  161. type: 'autocomplete',
  162. key: 'expType',
  163. value: '',
  164. default: null,
  165. label: '工作经验 *',
  166. outlined: true,
  167. itemText: 'label',
  168. itemValue: 'value',
  169. dictTypeName: 'menduner_exp_type',
  170. rules: [v => !!v || '请选择工作经验'],
  171. items: []
  172. },
  173. {
  174. type: 'autocomplete',
  175. key: 'eduType',
  176. value: '',
  177. default: null,
  178. label: '最高学历 *',
  179. outlined: true,
  180. itemText: 'label',
  181. itemValue: 'value',
  182. dictTypeName: 'menduner_education_type',
  183. rules: [v => !!v || '请选择最高学历'],
  184. items: []
  185. },
  186. // label: '学制类型 *', menduner_education_system_type
  187. ]
  188. })
  189. // 获取字典内容
  190. const getDictData = async (dictTypeName, key) => {
  191. const item = items.value.options.find(e => e.key === key)
  192. if (item) {
  193. const apiType = dictTypeName === 'positionSecondData' ? 'positionSecondData' : 'dict'
  194. const { data } = await getDict(dictTypeName, apiType === 'dict' ? null : {}, apiType)
  195. item.items = data
  196. // console.log(dictTypeName, '字典内容', data)
  197. }
  198. }
  199. const userInfo = ref(localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : {})
  200. const baseInfo = ref(localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {})
  201. items.value.options.forEach((e) => {
  202. if (e.dictTypeName) getDictData(e.dictTypeName, e.key) // 查字典set options
  203. if (baseInfo.value && baseInfo.value[e.key]) e.value = baseInfo.value[e.key] // 人才信息回显
  204. if (userInfo.value && userInfo.value[e.key]) e.value = userInfo.value[e.key] // 人才信息回显
  205. if (e.key === 'sex' && e.value === '0') e.value = e.default
  206. if (setInfo.value[e.key]) e.value = setInfo.value[e.key]
  207. })
  208. // const getName = (obj, key) => {
  209. // const item = items.value.options.find(e => e.key === key)
  210. // if (!item && !item.value) return
  211. // const select = item.items.find(e => item.value === e[item.itemValue || 'value'])
  212. // if (select) {
  213. // obj[item.itemTextName] = select[item.itemText || 'label']
  214. // }
  215. // }
  216. const dealQuery = () => {
  217. query.positionName = positionName || null
  218. if (query.positionId === positionName) delete query.positionId // 有选中id传id和name,否者只传name
  219. query.enterpriseName = enterpriseName || null
  220. if (query.enterpriseId === enterpriseName) delete query.enterpriseId // 有选中id传id和name,否者只传name
  221. //
  222. if (query.interestedPositionList?.length) {
  223. query.interestedList = query.interestedPositionList.map(e => { return {positionId: e} })
  224. }
  225. query.workExpList = [{
  226. enterpriseId: query.enterpriseId,
  227. enterpriseName: query.enterpriseName || null,
  228. positionId: query.positionId,
  229. positionName: query.positionName || null,
  230. }]
  231. }
  232. const getQuery = async () => {
  233. const { valid } = await formPageRef.value.formRef.validate()
  234. if (!valid) return false
  235. const obj = {}
  236. items.value.options.forEach(e => {
  237. if (Object.prototype.hasOwnProperty.call(e, 'data')) return obj[e.key] = e.data
  238. obj[e.key] = e.value === '' ? null : e.value
  239. })
  240. query = Object.assign(query, obj)
  241. dealQuery()
  242. return query
  243. }
  244. defineExpose({
  245. getQuery
  246. })
  247. </script>