add.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <div>
  3. <v-card class="pa-5">
  4. <v-timeline align="start" side="end">
  5. <v-timeline-item
  6. v-for="(val, i) in list"
  7. :key="i"
  8. :dot-color="val.color"
  9. :icon="val.icon"
  10. >
  11. <div>
  12. <h2 class="mt-n1 headline font-weight-regular">{{ val.title }}</h2>
  13. <div class="mb-4 desc">{{ val.desc }}</div>
  14. <component :is="val.path" :ref="val.ref" :itemData="itemData"></component>
  15. </div>
  16. </v-timeline-item>
  17. </v-timeline>
  18. <div class="text-center mb">
  19. <v-btn class="half-button mr-3" color="primary" variant="outlined" @click="handleCancel()">{{ $t('common.cancel') }}</v-btn>
  20. <v-btn class="half-button" color="primary" :loading="loading" @click="handleSave">{{ $t('common.release') }}</v-btn>
  21. </div>
  22. </v-card>
  23. </div>
  24. </template>
  25. <script setup>
  26. defineOptions({ name: 'enterprise-position-add'})
  27. import { ref } from 'vue'
  28. import { useRouter, useRoute } from 'vue-router'
  29. import { dealDictObjData } from '@/utils/position'
  30. import { saveJobAdvertised, getJobDetails, createTradeOrder } from '@/api/position'
  31. import baseInfo from './baseInfo.vue'
  32. import jobRequirements from './jobRequirements.vue'
  33. import Snackbar from '@/plugins/snackbar'
  34. import { useI18n } from '@/hooks/web/useI18n'
  35. import { useUserStore } from '@/store/user'
  36. const { t } = useI18n()
  37. const route = useRoute()
  38. const router = useRouter()
  39. const userStore = useUserStore()
  40. const baseInfoRef = ref()
  41. const jobRequirementsRef = ref()
  42. const itemData = ref({})
  43. const loading = ref(false)
  44. const list = [
  45. {
  46. color: '#00897B',
  47. icon: 'mdi-numeric-1',
  48. title: t('position.positionInformation'),
  49. desc: '',
  50. path: baseInfo,
  51. ref: baseInfoRef
  52. },
  53. {
  54. color: 'indigo-lighten-2',
  55. icon: 'mdi-numeric-2',
  56. title: t('position.jobRequirements'),
  57. desc: t('position.requirementDesc'),
  58. path: jobRequirements,
  59. ref: jobRequirementsRef
  60. }
  61. ]
  62. let submitParams = {}
  63. // 发布
  64. const handleSave = async () => {
  65. const baseInfo = await baseInfoRef.value[0].getQuery()
  66. if (baseInfo === 'failed') return
  67. const requirement = await jobRequirementsRef.value[0].getQuery()
  68. if (!baseInfo.hirePrice) {
  69. Snackbar.warning('请填写点数')
  70. window.scrollTo({ top: 0, behavior: 'smooth' })
  71. return
  72. }
  73. if (!baseInfo.expireTime && !baseInfo.soFar) {
  74. Snackbar.warning('请选择职位过期时间')
  75. window.scrollTo({ top: 0, behavior: 'smooth' })
  76. return
  77. }
  78. if (!requirement) return Snackbar.warning('请按要求填写信息')
  79. // if (!requirement?.areaId) return Snackbar.warning('请选择工作城市')
  80. if (!baseInfo || !requirement) return Snackbar.warning('请将信息填写完整')
  81. submitParams = Object.assign(baseInfo, requirement, { currency_type: 0, source: '1', bizId: null }) // currency_type: 写死0(人民币)
  82. if (route.query && route.query.id) submitParams.id = route.query.id // 有id则为编辑
  83. saveEmit(submitParams) // 正常发布,到列表中发起支付(暂定解决方案)
  84. }
  85. const saveEmit = async () => {
  86. loading.value = true
  87. try {
  88. const res = await saveJobAdvertised(submitParams)
  89. Snackbar.success(submitParams.id ? t('common.editSuccessMsg') : '已发布到职位列表《全员猎寻》,请前往支付')
  90. // 生成订单
  91. await createTradeOrder({
  92. spuId: res,
  93. spuName: submitParams.name,
  94. price: submitParams.hirePrice,
  95. type: 2 // 发布众聘职位订单
  96. })
  97. handleCancel()
  98. } catch (error) {
  99. console.log('error', error)
  100. } finally {
  101. loading.value = false
  102. }
  103. }
  104. // 获取编辑的职位详情
  105. const getPositionDetail = async (id) => {
  106. const data = await getJobDetails({ id })
  107. if (!data && !Object.keys(data).length) return
  108. itemData.value = {...data, ...dealDictObjData({}, data)}
  109. }
  110. // 有id为编辑
  111. if (route.query && route.query.id) {
  112. if (route.query.id) getPositionDetail(route.query.id)
  113. }
  114. // 取消
  115. const handleCancel = () => {
  116. itemData.value = {}
  117. router.push({ path: '/recruit/enterprise/hirePosition/index' })
  118. // 新增职位发布需更新账户信息
  119. if (route.query && !route.query?.id) {
  120. setTimeout(async () => {
  121. await userStore.getEnterpriseUserAccountInfo()
  122. }, 2000)
  123. }
  124. }
  125. </script>
  126. <style scoped lang="scss">
  127. .desc {
  128. font-size: 13px;
  129. color: var(--color-666);
  130. }
  131. </style>
  132. <style lang="scss" scoped>
  133. .mb {
  134. margin-bottom: 100px;
  135. }
  136. </style>