baseInfo.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <div>
  3. <CtForm ref="formPageRef" :items="items" style="width: 600px;">
  4. <template #explain>
  5. <span style="color: var(--v-error-base); cursor: pointer;" @click="handleViewRule">
  6. <v-icon size="25" color="error">mdi-help-circle-outline</v-icon>
  7. 众聘岗位规则说明
  8. </span>
  9. </template>
  10. <template #ratio>
  11. <div class="font-size-13 mb-3" style="color: red;">
  12. 众聘岗位分配比例:平台占比{{ ratio.headhuntRate }}%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 推荐人占比{{ ratio.recommendRate }}%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投递人占比{{ ratio.cvRate }}%
  13. </div>
  14. </template>
  15. <template #positionId="{ item }">
  16. <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs">
  17. <template v-slot:activator="{ props }">
  18. <textUI
  19. :modelValue="item.value"
  20. :item="item"
  21. v-bind="props"
  22. style="position: relative;"
  23. ></textUI>
  24. </template>
  25. <jobTypeCard class="jobTypeCardBox" :select="[query.positionId].filter(Boolean)" :isSingle="true" @handleJobClick="handleJobClickItem"></jobTypeCard>
  26. </v-menu>
  27. </template>
  28. </CtForm>
  29. <CtDialog :visible="show" :widthType="1" titleClass="text-h6" title="众聘岗位规则说明" :footer="false" @close="show = false">
  30. <RulePage />
  31. </CtDialog>
  32. </div>
  33. </template>
  34. <script setup>
  35. defineOptions({ name: 'position-add-baseInfo'})
  36. import CtForm from '@/components/CtForm'
  37. import { reactive, ref, defineExpose, watch } from 'vue'
  38. import textUI from '@/components/FormUI/TextInput'
  39. import jobTypeCard from '@/components/jobTypeCard'
  40. import RulePage from './rule.vue'
  41. import { getPublicRatio } from '@/api/recruit/enterprise/position'
  42. const props = defineProps({
  43. itemData: Object
  44. })
  45. const show = ref(false)
  46. const ratio = ref({})
  47. const getValue = (key) => {
  48. return items.value.options.find(e => e.key === key)
  49. }
  50. // 众聘奖励类型
  51. const handleChangeHireType = () => {
  52. const hireType = getValue('hireType')
  53. let hirePrice = getValue('hirePrice')
  54. let hirePoint = getValue('hirePoint')
  55. if (hireType.value) {
  56. hirePrice.hide = false
  57. hirePoint.hide = true
  58. hirePoint.value = null
  59. } else {
  60. hirePoint.hide = false
  61. hirePrice.hide = true
  62. hirePrice.value = null
  63. }
  64. }
  65. // 是否众聘岗位
  66. const handleChangePublic = (val) => {
  67. let hireType
  68. items.value.options.forEach(e => {
  69. if (!val && Object.prototype.hasOwnProperty.call(e, 'hide')) {
  70. e.hide = true
  71. e.value = null
  72. return
  73. }
  74. if (e.key === 'hireType') {
  75. e.hide = !val
  76. e.value = props.itemData && props.itemData.hirePoint ? false : true
  77. hireType = e
  78. }
  79. if (Object.prototype.hasOwnProperty.call(e, 'show')) {
  80. if (hireType.value === e.show) e.hide = false
  81. return
  82. }
  83. if (e.slotName === 'explain') e.hide = val ? false : true
  84. })
  85. }
  86. const formPageRef = ref()
  87. let query = reactive({})
  88. const items = ref({
  89. options: [
  90. {
  91. type: 'ifRadio',
  92. key: 'hire',
  93. value: false,
  94. label: '众聘岗位 *',
  95. width: 90,
  96. disabled: false,
  97. hideDetails: true,
  98. items: [
  99. { label: '是', value: true },
  100. { label: '否', value: false }
  101. ],
  102. change: val => handleChangePublic(val)
  103. },
  104. {
  105. slotName: 'explain',
  106. noParam: true,
  107. value: null,
  108. disabled: false,
  109. hide: true,
  110. flexStyle: 'mb-3'
  111. },
  112. {
  113. type: 'ifRadio',
  114. key: 'hireType',
  115. value: null,
  116. label: '众聘奖励类型 *',
  117. width: 120,
  118. hide: true,
  119. disabled: false,
  120. noParam: true,
  121. hideDetails: true,
  122. items: [
  123. { label: '赏金', value: true },
  124. { label: '积分', value: false }
  125. ],
  126. change: handleChangeHireType
  127. },
  128. {
  129. slotName: 'ratio',
  130. noParam: true,
  131. show: true,
  132. hide: true
  133. },
  134. {
  135. type: 'number',
  136. key: 'hirePrice',
  137. value: null,
  138. label: '众聘赏金 *',
  139. suffix: '元',
  140. hide: true,
  141. show: true,
  142. rules: [
  143. value => {
  144. if (value) return true
  145. return '请填写众聘赏金'
  146. },
  147. value => {
  148. if (value >= 1) return true
  149. return '赏金金额不得小于1'
  150. }
  151. ]
  152. },
  153. {
  154. type: 'number',
  155. key: 'hirePoint',
  156. value: null,
  157. label: '众聘奖励积分数 *',
  158. suffix: '点',
  159. hide: true,
  160. disabled: false,
  161. show: false,
  162. rules: [
  163. value => {
  164. if (value) return true
  165. return '请填写众聘众聘奖励积分数'
  166. },
  167. value => {
  168. if (value >= 1) return true
  169. return '积分数不得小于1'
  170. }
  171. ]
  172. },
  173. {
  174. type: 'text',
  175. key: 'name',
  176. value: '',
  177. label: '职位名称 *',
  178. rules: [v => !!v || '请填写职位名称']
  179. },
  180. {
  181. slotName: 'positionId',
  182. key: 'positionId',
  183. value: '',
  184. labelKey: 'positionName',
  185. label: '职位类型 *',
  186. noParam: true,
  187. rules: [v => !!v || '请选择职位类型']
  188. },
  189. {
  190. type: 'datePicker',
  191. key: 'expireTime',
  192. value: null,
  193. class: 'mb-3',
  194. options: {
  195. format: 'timestamp',
  196. placeholder: '到期时间 *',
  197. },
  198. rules: [v => !!v || '请选择到期时间']
  199. },
  200. {
  201. type: 'textarea',
  202. key: 'content',
  203. rows: 10,
  204. value: '',
  205. label: '岗位职责 *',
  206. counter: 5000,
  207. clearable: true,
  208. rules: [
  209. value => {
  210. if (value) return true
  211. return '请输入岗位职责'
  212. },
  213. value => {
  214. if (value?.length <= 5000) return true
  215. return '请输入2-5000个字符'
  216. }
  217. ]
  218. },
  219. {
  220. type: 'textarea',
  221. key: 'requirement',
  222. rows: 10,
  223. value: '',
  224. label: '岗位要求 *',
  225. counter: 5000,
  226. clearable: true,
  227. rules: [
  228. value => {
  229. if (value) return true
  230. return '请输入岗位要求'
  231. },
  232. value => {
  233. if (value?.length <= 5000) return true
  234. return '请输入2-5000个字符'
  235. }
  236. ]
  237. }
  238. ]
  239. })
  240. // 获取众聘分配比例
  241. const getRatio = async () => {
  242. const data = await getPublicRatio()
  243. ratio.value = data
  244. }
  245. getRatio()
  246. // 编辑回显
  247. watch(
  248. () => props.itemData,
  249. (val) => {
  250. if (!Object.keys(val).length) return
  251. items.value.options.forEach(e => {
  252. if (Object.prototype.hasOwnProperty.call(e, 'disabled')) e.disabled = val.hire
  253. if (e.labelKey) {
  254. query[e.key] = val[e.key]
  255. e.value = val[e.labelKey]
  256. return
  257. }
  258. if (e.noParam) return
  259. e.value = val[e.key]
  260. e.change && e.change(e.value)
  261. })
  262. },
  263. { immediate: true },
  264. { deep: true }
  265. )
  266. // 职位类型
  267. const handleJobClickItem = (list, name) => {
  268. const positionId = getValue('positionId')
  269. if (!list.length) {
  270. delete query.positionId
  271. positionId.value = ''
  272. return
  273. }
  274. query.positionId = list[0]
  275. positionId.value = name
  276. }
  277. // 众聘规则查看
  278. const handleViewRule = () => {
  279. show.value = true
  280. }
  281. const getQuery = async () => {
  282. const { valid } = await formPageRef.value.formRef.validate()
  283. if (!valid) return
  284. const obj = {}
  285. items.value.options.forEach(e => {
  286. if (e.noParam) return
  287. else obj[e.key] = e.value
  288. })
  289. // 不是众聘岗位的默认给0
  290. if (!obj.hire) {
  291. obj.hirePoint = 0
  292. obj.hirePrice = 0
  293. }
  294. query = Object.assign(query, obj)
  295. return query
  296. }
  297. defineExpose({
  298. formPageRef,
  299. getQuery
  300. })
  301. </script>
  302. <style scoped lang="scss">
  303. .jobTypeCardBox {
  304. position: absolute;
  305. top: -22px;
  306. left: 0;
  307. }
  308. </style>