Pārlūkot izejas kodu

发布众聘支付

lifanagju_citu 9 mēneši atpakaļ
vecāks
revīzija
32ca4f67d2

+ 1 - 0
components.d.ts

@@ -40,6 +40,7 @@ declare module 'vue' {
     LongCompany: typeof import('./src/components/Position/longCompany.vue')['default']
     LongStrip: typeof import('./src/components/Position/longStrip.vue')['default']
     NestedListGroup: typeof import('./src/components/FormUI/nestedListGroup/index.vue')['default']
+    Pay: typeof import('./src/components/pay/index.vue')['default']
     Positions: typeof import('./src/components/Enterprise/components/positions.vue')['default']
     PreviewImg: typeof import('./src/components/PreviewImg/index.vue')['default']
     PublicRecruitment: typeof import('./src/components/publicRecruitment/index.vue')['default']

+ 9 - 1
src/api/common/index.js

@@ -263,4 +263,12 @@ export const getInterviewInviteListByInviteUserId = async (inviteUserId) => {
   return await request.get({
     url: `/app-api/menduner/system/interview-invite/get/list/by/${inviteUserId}`
   })
-}
+}
+
+// 获得指定应用的开启的支付渠道编码列表
+export const getEnableCodeList = async (params) => {
+  return await request.get({
+    url: '/app-api/pay/channel/get-enable-code-list',
+    params
+  })
+}

+ 14 - 5
src/components/Recharge/index.vue

@@ -3,7 +3,7 @@
     <template #tips>
       <div class="my-3">
         <v-icon color="warning">mdi-information</v-icon>
-        <span class="color-warning ml-3">当前余额不足,请先充值后再试</span>
+        <span class="color-warning ml-3">{{ props.params?.txt || '当前余额不足,请选择其他支付方式' }}</span>
       </div>
     </template>
     <template #paymentAmount>
@@ -19,6 +19,12 @@
 defineOptions({ name: 'Recharge-index'})
 import { ref, computed } from 'vue'
 import CtForm from '@/components/CtForm/index.vue'
+const props = defineProps({
+  params: {
+    type: Array,
+    default: () => {}
+  }
+})
 
 // 余额充值
 const CtFormRef = ref()
@@ -31,11 +37,14 @@ const formItems = ref({
     {
       type: 'ifRadio',
       key: 'rechargeType',
-      value: true,
-      label: '充值类型 *',
+      value: 1,
+      // label: '支付类型 *',
+      label: '',
+      width: 1,
       items: [
-        { label: '金额', value: true },
-        { label: '积分', value: false }
+        { label: '账户余额支付', value: 1 },
+        { label: '微信扫码支付', value: 2 },
+        { label: '支付宝扫码支付', value: 3 },
       ],
       rules: [v => !!v || '请选择充值类型']
     },

+ 86 - 0
src/components/pay/index.vue

@@ -0,0 +1,86 @@
+<!-- 支付方式 -->
+<template>
+  <div>
+    <!-- 赏金所需 -->
+    <div class="pt-3 pb-5" style="color: var(--v-error-base); font-weight: bold; text-align: center;">
+      <span class="font-size-13">¥</span>
+      <span class="font-size-30">{{ needPrice }}</span>
+    </div>
+    <radioGroupUI
+      :modelValue="payType"
+      :item="payTypeItem"
+      @change="val => payTypeChange(val)"
+    ></radioGroupUI>
+    <div class="pa-5">
+      <!-- 支付 -->
+      <div v-if="payType === '余额'">
+        <div>
+          <span >{{ $t('enterprise.account.accountBalances') }}:</span>
+          <span style="color: var(--v-primary-base);">{{ balance }}</span>
+        </div>
+        <div class="my-3" v-if="balanceNotEnough">
+          <!-- <v-icon color="warning">mdi-information</v-icon> -->
+          <span class="color-warning">{{ props.params?.txt || '当前余额不足,请选择其他支付方式' }}</span>
+        </div>
+      </div>
+      <div v-if="payType !== '余额'" style="text-align: center;">
+        <QrCode text="132" :width="170" style="margin: 0 auto;" />
+        <div style="color: var(--v-error-base);">扫码支付时请勿离开</div>
+      </div>
+      <div class="mt-10" style="text-align: center;">
+        <v-btn class="buttons" color="primary" @click="emit('paySubmit', payType)">{{ payType === '余额' ? '确认' : '支付完成' }}</v-btn>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+defineOptions({ name: 'pay-index'})
+import { computed, ref } from 'vue'
+import radioGroupUI from '@/components/FormUI/radioGroup'
+import QrCode from '@/components/QrCode'
+const emit = defineEmits(['payTypeChange', ])
+const props = defineProps({
+  params: {
+    type: Object,
+    default: () => {}
+  },
+  codeList: {
+    type: Array,
+    default: () => []
+  },
+  needPrice: {
+    type: [String, Number],
+    default: 0
+  }
+})
+
+const payTypeList = ref([{ label: '账户余额支付', value: '余额' }])
+if (props.codeList?.length) {
+  for (let index = 0; index < props.codeList.length; index++) {
+    const code = props.codeList[index]
+    if (index === 0) payTypeList.value.push({ label: '微信扫码支付', value: code })
+  }
+}
+const payType = ref('余额')
+const payTypeItem = {
+  label: '',
+  width: 1,
+  hideDetails: true,
+  items: payTypeList.value
+}
+
+const balance = JSON.parse(localStorage.getItem('enterpriseUserAccount'))?.balance || 0
+const balanceNotEnough = computed(() => {
+  return (Number(props.needPrice) > Number(balance))
+})
+
+const payTypeChange = (val) => {
+  payType.value = val
+  emit('payTypeChange', val, balanceNotEnough)
+}
+// payTypeChange('余额')
+</script>
+<style lang="scss" scoped>
+.font-size-30 { font-size: 30px; }
+</style>

+ 85 - 35
src/views/recruit/enterprise/positionManagement/components/add.vue

@@ -21,8 +21,16 @@
       </div>
     </v-card>
 
-    <CtDialog :visible="recharge" :widthType="2" titleClass="text-h6" title="确认支付" @close="handleClose" @submit="handleSubmit">
-      <Recharge ref="rechargeRef"></Recharge>
+    <CtDialog :visible="recharge" :widthType="3" titleClass="text-h6" title="确认支付" :footer="false" submitText="确认" @close="handleClose" @submit="paySubmit">
+      <!-- <Recharge ref="rechargeRef"></Recharge> -->
+      <pay
+        ref="payRef"
+        :params="payParams"
+        :needPrice="needPrice"
+        :codeList="codeList"
+        @payTypeChange="payTypeChange"
+        @paySubmit="paySubmit"
+      ></pay>
     </CtDialog>
   </div>
 </template>
@@ -33,11 +41,13 @@ import { ref } from 'vue'
 import { useRouter, useRoute } from 'vue-router'
 import { dealDictObjData } from '@/utils/position'
 import { saveJobAdvertised, getJobDetails } from '@/api/position'
+import { getEnableCodeList } from '@/api/common'
 import baseInfo from './baseInfo.vue'
 import jobRequirements from './jobRequirements.vue'
 import Snackbar from '@/plugins/snackbar'
 import { useI18n } from '@/hooks/web/useI18n'
 import { useUserStore } from '@/store/user'
+import pay from '@/components/pay'
 
 const { t } = useI18n()
 const route = useRoute()
@@ -46,18 +56,8 @@ const userStore = useUserStore()
 const baseInfoRef = ref()
 const jobRequirementsRef = ref()
 const itemData = ref({})
+const payParams = ref({})
 
-// 充值
-const rechargeRef = ref()
-const handleClose = () => {
-  recharge.value = false
-  rechargeRef.value.formItems.options.find(e => e.key === 'count').value = 100
-}
-
-const handleSubmit = () => {
-  recharge.value = false
-  Snackbar.warning('此功能还在开发中')
-}
 
 const list = [
   {
@@ -80,43 +80,80 @@ const list = [
 
 // 余额充值
 const recharge = ref(false)
+const needPrice = ref(0)
 
-// 取消
-const handleCancel = (hire) => { //  hire:是否是众聘岗位
-  itemData.value = {}
-  const query = hire ? { hire } : {}; router.push({ path: '/recruit/enterprise/position', query })
-  // 新增职位发布需更新账户信息
-  if (route.query && !route.query?.id) {
-    setTimeout(async () => {
-      await userStore.getEnterpriseUserAccountInfo()
-    }, 2000)
-  }
-}
-
+let submitParams = {}
+const codeList = ref([])
 // 发布
 const handleSave = async () => {
   const baseInfo = await baseInfoRef.value[0].getQuery()
   const requirement = await jobRequirementsRef.value[0].getQuery()
   if (!baseInfo || !requirement) return Snackbar.warning('请将信息填写完整')
+  
+  submitParams = Object.assign(baseInfo, requirement)
+  if (route.query && route.query.id) submitParams.id = route.query.id // 有id则为编辑
+
   // 判断是否有选择众聘岗位,选择了是否有填赏金或积分
-  if (baseInfo.hire) {
+  if (!baseInfo?.hire) {
+    saveEmit(submitParams)
+  } else {
     if (!baseInfo.hirePrice && !baseInfo.hirePoint) return Snackbar.warning('您选择的是众聘岗位,请填写奖励赏金或积分!')
     if (Number(baseInfo.hirePrice) === 0 && Number(baseInfo.hirePoint) === 0) return Snackbar.warning('填写的赏金/积分不得小于1')
+    
+    const point = JSON.parse(localStorage.getItem('enterpriseUserAccount'))?.point
+    if (Number(baseInfo.hirePoint) && (Number(baseInfo.hirePoint) > Number(point))) {
+      // 积分不足
+      return Snackbar.warning('您所剩的积分不足,请修改奖励的积分!')
+    }
+    if (!codeList.value?.length) {
+      const list = await getEnableCodeList({appId: 10})
+      codeList.value = list || []
+    }
+    needPrice.value = Number(baseInfo.hirePrice)
+    recharge.value = true // 支付弹窗
   }
+}
 
-  const query = Object.assign(baseInfo, requirement)
+const saveEmit = async () => {
+  try {
+    await saveJobAdvertised(submitParams)
+    Snackbar.success(submitParams.id ? t('common.editSuccessMsg') : t('common.publishSuccessMsg'))
+    handleCancel(submitParams.hire)
+  } catch (error) {
+    console.log('error', error)
+  }
+}
 
-  // // 有id则为编辑
-  if (route.query && route.query.id) query.id = route.query.id
+const timer = ref(null)
+const payRef = ref()
+const paySubmit = async (payType) => {
   try {
-    await saveJobAdvertised(query)
-    Snackbar.success(route.query.id ? t('common.editSuccessMsg') : t('common.publishSuccessMsg'))
-    handleCancel(baseInfo.hire)
+    if (payType && payType !== '余额') {
+      // 打开轮巡
+      if (timer.value) clearInterval(timer.value); timer.value = null
+      timer.value = setInterval(async () => {
+        // 没有token时销毁定时器
+        // if (!getToken()) {
+        //   clearInterval(timer.value); timer.value = null
+        //   return
+        // }
+        // 执行
+      }, 3000)
+    } else {
+      if (timer.value) clearInterval(timer.value); timer.value = null
+      saveEmit(submitParams)
+    }
   } catch (error) {
-    // 余额不足展示充值窗口
-    if (error === '用户余额不足') recharge.value = true
+    console.log('error', error)
   }
-  
+}
+
+// const payTypeChange = (val, balanceNotEnough) => {
+// }
+
+const handleClose = () => {
+  recharge.value = false
+  // rechargeRef.value.formItems.options.find(e => e.key === 'count').value = 100
 }
 
 // 获取编辑的职位详情
@@ -130,6 +167,19 @@ const getPositionDetail = async (id) => {
 if (route.query && route.query.id) {
   if (route.query.id) getPositionDetail(route.query.id)
 }
+// getPositionDetail('1821128788239142913') // 测试使用
+
+// 取消
+const handleCancel = (hire) => { //  hire:是否是众聘岗位
+  itemData.value = {}
+  const query = hire ? { hire } : {}; router.push({ path: '/recruit/enterprise/position', query })
+  // 新增职位发布需更新账户信息
+  if (route.query && !route.query?.id) {
+    setTimeout(async () => {
+      await userStore.getEnterpriseUserAccountInfo()
+    }, 2000)
+  }
+}
 </script>
 
 <style scoped lang="scss">

+ 2 - 0
src/views/recruit/enterprise/positionManagement/components/baseInfo.vue

@@ -217,6 +217,8 @@ const items = ref({
   ]
 })
 
+// items.value.options.forEach(e => e.rules = []) // 测试使用
+
 // 获取众聘分配比例
 const getRatio = async () => {
   const data = await getPublicRatio()

+ 2 - 0
src/views/recruit/enterprise/positionManagement/components/jobRequirements.vue

@@ -143,6 +143,8 @@ const items = ref({
   ]
 })
 
+// items.value.options.forEach(e => e.rules = []) // 测试使用
+
 // 获取字典内容
 const getDictData = async () => {
   items.value.options.forEach(async (e) => {