baseInfo.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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 handleChangePublic = () => {
  36. const value = items.value.options.find(e => e.key === 'isPublicRecruitment').value
  37. const obj = items.value.options.find(e => e.key === 'moneyReward')
  38. obj.hide = value === '1' ? false : true
  39. }
  40. const formPageRef = ref()
  41. let query = reactive({})
  42. const items = ref({
  43. options: [
  44. {
  45. type: 'ifRadio',
  46. key: 'isPublicRecruitment',
  47. value: '0',
  48. label: '众聘岗位 *',
  49. width: 90,
  50. noParam: true,
  51. items: [
  52. { label: '是', value: '1' },
  53. { label: '否', value: '0' }
  54. ],
  55. change: handleChangePublic
  56. },
  57. {
  58. type: 'number',
  59. key: 'moneyReward',
  60. value: null,
  61. label: '众聘赏金 *',
  62. hide: true,
  63. noParam: true,
  64. rules: [v => !!v || '请填写众聘赏金']
  65. },
  66. {
  67. type: 'text',
  68. key: 'name',
  69. value: '',
  70. label: '职位名称 *',
  71. rules: [v => !!v || '请填写职位名称']
  72. },
  73. {
  74. slotName: 'positionId',
  75. key: 'positionId',
  76. value: '',
  77. labelKey: 'positionName',
  78. label: '职位类型 *',
  79. noParam: true,
  80. rules: [v => !!v || '请选择职位类型']
  81. },
  82. {
  83. type: 'datePicker',
  84. key: 'expireTime',
  85. value: null,
  86. class: 'mb-3',
  87. options: {
  88. format: 'timestamp',
  89. placeholder: '到期时间 *',
  90. },
  91. rules: [v => !!v || '请选择到期时间']
  92. },
  93. {
  94. type: 'textarea',
  95. key: 'content',
  96. rows: 10,
  97. value: '',
  98. label: '岗位职责 *',
  99. counter: 5000,
  100. clearable: true,
  101. rules: [
  102. value => {
  103. if (value) return true
  104. return '请输入岗位职责'
  105. },
  106. value => {
  107. if (value?.length <= 5000) return true
  108. return '请输入2-5000个字符'
  109. }
  110. ]
  111. },
  112. {
  113. type: 'textarea',
  114. key: 'requirement',
  115. rows: 10,
  116. value: '',
  117. label: '岗位要求 *',
  118. counter: 5000,
  119. clearable: true,
  120. rules: [
  121. value => {
  122. if (value) return true
  123. return '请输入岗位要求'
  124. },
  125. value => {
  126. if (value?.length <= 5000) return true
  127. return '请输入2-5000个字符'
  128. }
  129. ]
  130. }
  131. ]
  132. })
  133. const setValue = (key, value) => {
  134. items.value.options.find(e => e.key === key).value = value
  135. }
  136. // 编辑回显
  137. watch(
  138. () => props.itemData,
  139. (val) => {
  140. if (!Object.keys(val).length) return
  141. items.value.options.forEach(e => {
  142. if (e.labelKey) {
  143. query[e.key] = val[e.key]
  144. e.value = val[e.labelKey]
  145. return
  146. }
  147. if (e.noParam) return
  148. e.value = val[e.key]
  149. })
  150. },
  151. { immediate: true },
  152. { deep: true }
  153. )
  154. // 职位类型
  155. const handleJobClickItem = (list, name) => {
  156. if (!list.length) {
  157. delete query.positionId
  158. setValue('positionId', '')
  159. return
  160. }
  161. query.positionId = list[0]
  162. setValue('positionId', name)
  163. }
  164. const getQuery = async () => {
  165. const { valid } = await formPageRef.value.formRef.validate()
  166. if (!valid) return
  167. const obj = {}
  168. items.value.options.forEach(e => {
  169. if (e.noParam) return
  170. obj[e.key] = e.value
  171. })
  172. query = Object.assign(query, obj)
  173. return query
  174. }
  175. defineExpose({
  176. formPageRef,
  177. getQuery
  178. })
  179. </script>
  180. <style scoped lang="scss">
  181. .enterpriseName {
  182. color: var(--color-666);
  183. }
  184. .jobTypeCardBox {
  185. position: absolute;
  186. top: -22px;
  187. left: 0;
  188. }
  189. </style>