add.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 class="mt-10" :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(itemData.hire)">{{ $t('common.cancel') }}</v-btn>
  20. <v-btn class="half-button" color="primary" @click="handleSave">{{ $t('common.release') }}</v-btn>
  21. </div>
  22. </v-card>
  23. <CtDialog :visible="recharge" :widthType="2" titleClass="text-h6" title="确认支付" @close="handleClose" @submit="handleSubmit">
  24. <Recharge ref="rechargeRef"></Recharge>
  25. </CtDialog>
  26. </div>
  27. </template>
  28. <script setup>
  29. defineOptions({ name: 'enterprise-position-add'})
  30. import { ref } from 'vue'
  31. import { useRouter, useRoute } from 'vue-router'
  32. import { dealDictObjData } from '@/utils/position'
  33. import { saveJobAdvertised, getJobDetails } from '@/api/position'
  34. import baseInfo from './baseInfo.vue'
  35. import jobRequirements from './jobRequirements.vue'
  36. import Snackbar from '@/plugins/snackbar'
  37. import { useI18n } from '@/hooks/web/useI18n'
  38. import { useUserStore } from '@/store/user'
  39. const { t } = useI18n()
  40. const route = useRoute()
  41. const router = useRouter()
  42. const userStore = useUserStore()
  43. const baseInfoRef = ref()
  44. const jobRequirementsRef = ref()
  45. const itemData = ref({})
  46. // 充值
  47. const rechargeRef = ref()
  48. const handleClose = () => {
  49. recharge.value = false
  50. rechargeRef.value.formItems.options.find(e => e.key === 'count').value = 100
  51. }
  52. const handleSubmit = () => {
  53. recharge.value = false
  54. Snackbar.warning('此功能还在开发中')
  55. }
  56. const list = [
  57. {
  58. color: '#00897B',
  59. icon: 'mdi-numeric-1',
  60. title: t('position.positionInformation'),
  61. desc: '',
  62. path: baseInfo,
  63. ref: baseInfoRef
  64. },
  65. {
  66. color: 'indigo-lighten-2',
  67. icon: 'mdi-numeric-2',
  68. title: t('position.jobRequirements'),
  69. desc: t('position.requirementDesc'),
  70. path: jobRequirements,
  71. ref: jobRequirementsRef
  72. }
  73. ]
  74. // 余额充值
  75. const recharge = ref(false)
  76. // 取消
  77. const handleCancel = (hire) => { // hire:是否是众聘岗位
  78. itemData.value = {}
  79. const query = hire ? { hire } : {}; router.push({ path: '/recruit/enterprise/position', query })
  80. // 新增职位发布需更新账户信息
  81. if (route.query && !route.query?.id) {
  82. setTimeout(async () => {
  83. await userStore.getEnterpriseUserAccountInfo()
  84. }, 2000)
  85. }
  86. }
  87. // 发布
  88. const handleSave = async () => {
  89. const baseInfo = await baseInfoRef.value[0].getQuery()
  90. const requirement = await jobRequirementsRef.value[0].getQuery()
  91. if (!baseInfo || !requirement) return Snackbar.warning('请将信息填写完整')
  92. // 判断是否有选择众聘岗位,选择了是否有填赏金或积分
  93. if (baseInfo.hire) {
  94. if (!baseInfo.hirePrice && !baseInfo.hirePoint) return Snackbar.warning('您选择的是众聘岗位,请填写奖励赏金或积分!')
  95. if (Number(baseInfo.hirePrice) === 0 && Number(baseInfo.hirePoint) === 0) return Snackbar.warning('填写的赏金/积分不得小于1')
  96. }
  97. const query = Object.assign(baseInfo, requirement)
  98. // // 有id则为编辑
  99. if (route.query && route.query.id) query.id = route.query.id
  100. try {
  101. await saveJobAdvertised(query)
  102. Snackbar.success(route.query.id ? t('common.editSuccessMsg') : t('common.publishSuccessMsg'))
  103. handleCancel(baseInfo.hire)
  104. } catch (error) {
  105. // 余额不足展示充值窗口
  106. if (error === '用户余额不足') recharge.value = true
  107. }
  108. }
  109. // 获取编辑的职位详情
  110. const getPositionDetail = async (id) => {
  111. const data = await getJobDetails({ id })
  112. if (!data && !Object.keys(data).length) return
  113. itemData.value = {...data, ...dealDictObjData({}, data)}
  114. }
  115. // 有id为编辑
  116. if (route.query && route.query.id) {
  117. if (route.query.id) getPositionDetail(route.query.id)
  118. }
  119. </script>
  120. <style scoped lang="scss">
  121. .desc {
  122. font-size: 13px;
  123. color: var(--color-666);
  124. }
  125. </style>
  126. <style lang="scss" scoped>
  127. .mb {
  128. margin-bottom: 100px;
  129. }
  130. </style>