baseInfo.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <template>
  2. <div>
  3. <CtForm ref="formPageRef" :items="items" style="width: 600px;">
  4. <template #enterpriseName="{ item }">
  5. <div class="mb-4">
  6. <span style="color: var(--color-666);">公司:</span>
  7. <span style="color: #555">{{ item.value }}</span>
  8. </div>
  9. </template>
  10. <template #positionId="{ item }">
  11. <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs">
  12. <template v-slot:activator="{ props }">
  13. <textUI
  14. :modelValue="item.value"
  15. :item="item"
  16. v-bind="props"
  17. style="position: relative;"
  18. ></textUI>
  19. </template>
  20. <jobTypeCard class="jobTypeCardBox" :select="[query.positionId].filter(Boolean)" :isSingle="true" @handleJobClick="handleJobClickItem"></jobTypeCard>
  21. </v-menu>
  22. </template>
  23. </CtForm>
  24. </div>
  25. </template>
  26. <script setup>
  27. defineOptions({ name: 'position-add-baseInfo'})
  28. import CtForm from '@/components/CtForm'
  29. import { reactive, ref, defineExpose, watch } from 'vue'
  30. import textUI from '@/components/FormUI/TextInput'
  31. import jobTypeCard from '@/components/jobTypeCard'
  32. const props = defineProps({
  33. itemData: Object
  34. })
  35. const getValue = (key) => {
  36. return items.value.options.find(e => e.key === key)
  37. }
  38. // 众聘奖励类型
  39. const handleChangeHireType = () => {
  40. const hireType = getValue('hireType')
  41. let hirePrice = getValue('hirePrice')
  42. let hirePoint = getValue('hirePoint')
  43. if (hireType.value === '0') {
  44. hirePrice.hide = false
  45. hirePoint.hide = true
  46. hirePoint.value = null
  47. } else {
  48. hirePoint.hide = false
  49. hirePrice.hide = true
  50. hirePrice.value = null
  51. }
  52. }
  53. // 是否众聘岗位
  54. const handleChangePublic = (editHire) => {
  55. const hire = getValue('hire').value
  56. const hireType = getValue('hireType')
  57. const hirePrice = getValue('hirePrice')
  58. const hirePoint = getValue('hirePoint')
  59. if (editHire && editHire.hire) {
  60. hireType.hide = false
  61. hireType.value = editHire.hirePoint ? '1' : '0'
  62. handleChangeHireType()
  63. } else hireType.hide = hire === '1' ? false : true
  64. if (hire === '0') {
  65. hireType.value = '0'
  66. hirePoint.value = null
  67. hirePrice.value = null
  68. hirePoint.hide = true
  69. hirePrice.hide = true
  70. }
  71. }
  72. const formPageRef = ref()
  73. let query = reactive({})
  74. const items = ref({
  75. options: [
  76. {
  77. type: 'ifRadio',
  78. key: 'hire',
  79. value: '0',
  80. label: '众聘岗位 *',
  81. width: 90,
  82. items: [
  83. { label: '是', value: '1' },
  84. { label: '否', value: '0' }
  85. ],
  86. change: handleChangePublic
  87. },
  88. {
  89. type: 'ifRadio',
  90. key: 'hireType',
  91. value: '0',
  92. label: '众聘奖励类型 *',
  93. width: 120,
  94. hide: true,
  95. noParam: true,
  96. items: [
  97. { label: '赏金', value: '0' },
  98. { label: '积分', value: '1' }
  99. ],
  100. change: handleChangeHireType
  101. },
  102. {
  103. type: 'number',
  104. key: 'hirePrice',
  105. value: null,
  106. label: '众聘赏金 *',
  107. suffix: '元',
  108. hide: true,
  109. rules: [
  110. value => {
  111. if (value) return true
  112. return '请填写众聘赏金'
  113. },
  114. value => {
  115. if (value >= 1) return true
  116. return '赏金金额不得小于1'
  117. }
  118. ]
  119. },
  120. {
  121. type: 'number',
  122. key: 'hirePoint',
  123. value: null,
  124. label: '众聘奖励积分数 *',
  125. suffix: '点',
  126. hide: true,
  127. rules: [
  128. value => {
  129. if (value) return true
  130. return '请填写众聘众聘奖励积分数'
  131. },
  132. value => {
  133. if (value >= 1) return true
  134. return '积分数不得小于1'
  135. }
  136. ]
  137. },
  138. {
  139. type: 'text',
  140. key: 'name',
  141. value: '',
  142. label: '职位名称 *',
  143. rules: [v => !!v || '请填写职位名称']
  144. },
  145. {
  146. slotName: 'positionId',
  147. key: 'positionId',
  148. value: '',
  149. labelKey: 'positionName',
  150. label: '职位类型 *',
  151. noParam: true,
  152. rules: [v => !!v || '请选择职位类型']
  153. },
  154. {
  155. type: 'datePicker',
  156. key: 'expireTime',
  157. value: null,
  158. class: 'mb-3',
  159. options: {
  160. format: 'timestamp',
  161. placeholder: '到期时间 *',
  162. },
  163. rules: [v => !!v || '请选择到期时间']
  164. },
  165. {
  166. type: 'textarea',
  167. key: 'content',
  168. rows: 10,
  169. value: '',
  170. label: '岗位职责 *',
  171. counter: 5000,
  172. clearable: true,
  173. rules: [
  174. value => {
  175. if (value) return true
  176. return '请输入岗位职责'
  177. },
  178. value => {
  179. if (value?.length <= 5000) return true
  180. return '请输入2-5000个字符'
  181. }
  182. ]
  183. },
  184. {
  185. type: 'textarea',
  186. key: 'requirement',
  187. rows: 10,
  188. value: '',
  189. label: '岗位要求 *',
  190. counter: 5000,
  191. clearable: true,
  192. rules: [
  193. value => {
  194. if (value) return true
  195. return '请输入岗位要求'
  196. },
  197. value => {
  198. if (value?.length <= 5000) return true
  199. return '请输入2-5000个字符'
  200. }
  201. ]
  202. }
  203. ]
  204. })
  205. const setValue = (key, value) => {
  206. items.value.options.find(e => e.key === key).value = value
  207. }
  208. // 编辑回显
  209. watch(
  210. () => props.itemData,
  211. (val) => {
  212. if (!Object.keys(val).length) return
  213. items.value.options.forEach(e => {
  214. if (e.labelKey) {
  215. query[e.key] = val[e.key]
  216. e.value = val[e.labelKey]
  217. return
  218. }
  219. if (e.noParam) return
  220. if (e.key === 'hire') {
  221. e.value = val[e.key] ? '1' : '0'
  222. }
  223. else e.value = val[e.key]
  224. })
  225. handleChangePublic(val)
  226. },
  227. { immediate: true },
  228. { deep: true }
  229. )
  230. // 职位类型
  231. const handleJobClickItem = (list, name) => {
  232. if (!list.length) {
  233. delete query.positionId
  234. setValue('positionId', '')
  235. return
  236. }
  237. query.positionId = list[0]
  238. setValue('positionId', name)
  239. }
  240. const getQuery = async () => {
  241. const { valid } = await formPageRef.value.formRef.validate()
  242. if (!valid) return
  243. const obj = {}
  244. items.value.options.forEach(e => {
  245. if (e.noParam) return
  246. if (e.key === 'hire') obj[e.key] = e.value === '1' ? true : false
  247. else obj[e.key] = e.value
  248. })
  249. query = Object.assign(query, obj)
  250. return query
  251. }
  252. defineExpose({
  253. formPageRef,
  254. getQuery
  255. })
  256. </script>
  257. <style scoped lang="scss">
  258. .enterpriseName {
  259. color: var(--color-666);
  260. }
  261. .jobTypeCardBox {
  262. position: absolute;
  263. top: -22px;
  264. left: 0;
  265. }
  266. </style>