Przeglądaj źródła

企业操作添加loading

Xiao_123 1 miesiąc temu
rodzic
commit
fbadfcd085

+ 1 - 1
src/api/recruit/enterprise/talentMap/labeling/index.js

@@ -3,7 +3,7 @@ import request from '@/config/axios'
 // 根据条件获取人才列表
 export const getLabelingList = async (data) => {
   return await request.post({
-    url: '/api/data_parse/query-kg',
+    url: '/api/parse/query-kg',
     data
 	})
 }

+ 34 - 22
src/views/recruit/components/message/index.vue

@@ -824,15 +824,21 @@ const handleSubmit = async () => {
     Snackbar.warning('时间不能为空')
     return
   }
-  query.userId = info.value.userId
-  query.positionInfo = positionList.value.find(e => e.value === query.jobId)
-  // 需要id
-  const data = await saveInterviewInvite(query)
-  // 保留邀请id
-  query.id = data.id
-  showTip.value = true
-  send(JSON.stringify(query), channelItem.value, 101)
-  showInvite.value = false
+
+  pageLoading.value = true
+  try {
+    query.userId = info.value.userId
+    query.positionInfo = positionList.value.find(e => e.value === query.jobId)
+    // 需要id
+    const data = await saveInterviewInvite(query)
+    // 保留邀请id
+    query.id = data.id
+    showTip.value = true
+    send(JSON.stringify(query), channelItem.value, 101)
+    showInvite.value = false
+  } finally {
+    pageLoading.value = false
+  }
 }
 
 const router = useRouter()
@@ -844,21 +850,27 @@ const handleToInterviewManagement = () => {
 const handleRequestResumeSubmit = async () => {
   const { valid } = await requestFromRef.value.formRef.validate()
   if (!valid) return
-  const jobId = requestFormItems.value.options.find(e => e.key === 'jobId').value
-  const positionInfo = positionList.value.find(e => e.value === jobId)
 
-  const text = {
-    remark: '求简历',
-    query: {
-      src: '',
-      title: '',
-      id: '',
-      positionInfo
-    },
-    type: 2
+  pageLoading.value = true
+  try {
+    const jobId = requestFormItems.value.options.find(e => e.key === 'jobId').value
+    const positionInfo = positionList.value.find(e => e.value === jobId)
+
+    const text = {
+      remark: '求简历',
+      query: {
+        src: '',
+        title: '',
+        id: '',
+        positionInfo
+      },
+      type: 2
+    }
+    send (JSON.stringify(text), channelItem.value, 105)
+  } finally {
+    showSelectPosition.value = false
+    pageLoading.value = false
   }
-  send (JSON.stringify(text), channelItem.value, 105)
-  showSelectPosition.value = false
 }
 
 const handleAgree = (val) => {

+ 33 - 13
src/views/recruit/enterprise/interviewManagement/components/item.vue

@@ -84,6 +84,7 @@
     <TextArea v-else v-model="query.reason" :item="textItems2"></TextArea>
   </CtDialog>
 
+  <Loading :visible="loading" />
 </template>
 
 <script setup>
@@ -106,6 +107,7 @@ defineProps({
 const emit = defineEmits(['refresh', 'action'])
 
 const { t } = useI18n()
+const loading = ref(false)
 const editStatus = ['0'] // 修改面试状态
 const againStatus = ['98', '99'] // 重新邀约状态
 const actions = ref([
@@ -206,10 +208,16 @@ const handleEditClose = () => {
 const handleEditSubmit = async () => {
   const query = inviteRef.value.getQuery()
   if (!Object.keys(query).length) return
-  await saveInterviewInvite(query)
-  Snackbar.success(t('common.operationSuccessful'))
-  handleEditClose()
-  emit('refresh')
+
+  loading.value = true
+  try {
+    await saveInterviewInvite(query)
+    Snackbar.success(t('common.operationSuccessful'))
+    handleEditClose()
+    emit('refresh')
+  } finally {
+    loading.value = false
+  }
 }
 
 // 取消面试
@@ -223,10 +231,16 @@ const handleCancelClose = () => {
 
 const handleCancelSubmit = async () => {
   if (!cancelQuery.value.reason) return Snackbar.warning('请填写取消原因')
-  await cancelInterviewInvite(cancelQuery.value)
-  Snackbar.success(t('common.operationSuccessful'))
-  handleCancelClose()
-  emit('refresh')
+  
+  loading.value = true
+  try {
+    await cancelInterviewInvite(cancelQuery.value)
+    Snackbar.success(t('common.operationSuccessful'))
+    handleCancelClose()
+    emit('refresh')
+  } finally {
+    loading.value = false
+  }
 }
 
 // 爽约、反馈
@@ -238,11 +252,17 @@ const handleClose = () => {
 const handleSubmit = async () => {
   const key = currentAction.value === 'feedback' ? 'evaluate' : 'reason'
   if (!query.value[key]) return Snackbar.warning('请填写您的' + (currentAction.value === 'feedback' ? '反馈' : '爽约原因'))
-  const api = currentAction.value === 'feedback' ? feedbackInterviewInvite : noAttendInterviewInvite
-  await api(query.value)
-  Snackbar.success(t('common.operationSuccessful'))
-  emit('refresh')
-  handleClose()
+  
+  loading.value = true
+  try {
+    const api = currentAction.value === 'feedback' ? feedbackInterviewInvite : noAttendInterviewInvite
+    await api(query.value)
+    Snackbar.success(t('common.operationSuccessful'))
+    emit('refresh')
+    handleClose()
+  } finally {
+    loading.value = false
+  }
 }
 </script>
 

+ 14 - 5
src/views/recruit/enterprise/invoiceManagement/index.vue

@@ -38,6 +38,8 @@
       </template>
     </CtForm>
   </CtDialog>
+
+  <Loading :visible="loading" />
 </template>
 
 <script setup>
@@ -278,6 +280,7 @@ const handleClose = () => {
   editId.value = null
 }
 
+const loading = ref(false)
 const { userId } = JSON.parse(localStorage.getItem('accountInfo'))
 const handleSubmit = async () => {
   const { valid } = await CtFormRef.value.formRef.validate()
@@ -290,11 +293,17 @@ const handleSubmit = async () => {
   })
   if (obj.type === undefined || obj.type === null || obj.type === '') return Snackbar.warning('请选择发票类型')
   if (editId.value) obj.id = editId.value
-  const api = editId.value ? updateInvoiceTitle : createInvoiceTitle
-  await api(obj)
-  Snackbar.success(editId.value ? t('common.editSuccessMsg') : t('common.addMsg'))
-  handleClose()
-  getList()
+
+  loading.value = true
+  try {
+    const api = editId.value ? updateInvoiceTitle : createInvoiceTitle
+    await api(obj)
+    Snackbar.success(editId.value ? t('common.editSuccessMsg') : t('common.addMsg'))
+    handleClose()
+    getList()
+  } finally {
+    loading.value = false
+  }
 }
 </script>
 

+ 13 - 5
src/views/recruit/enterprise/jobFair/details.vue

@@ -108,6 +108,8 @@
     </div>
   </v-card>
 
+  <Loading :visible="entryLoading" />
+
   <PreviewImage v-if="showPreview" :urlList="[previewSrc]" :fileName="enterpriseName" @close="showPreview = !showPreview, showShare = false" />
 </template>
 
@@ -183,12 +185,18 @@ const handleChangePage = (index) => {
 }
 
 // 添加至招聘会
+const entryLoading = ref(false)
 const handleTo = async (val) => {
-  await joinJobFairPosition({ jobFairId: id, jobId: val.id })
-  Snackbar.success('加入成功')
-  showDrawer.value = false
-  getJobNum()
-  getJobList()
+  entryLoading.value = true
+  try {
+    await joinJobFairPosition({ jobFairId: id, jobId: val.id })
+    Snackbar.success('加入成功')
+    showDrawer.value = false
+    getJobNum()
+    getJobList()
+  } finally {
+    entryLoading.value = false
+  }
 }
 
 // 获取职位列表

+ 52 - 32
src/views/recruit/enterprise/resume/components/table.vue

@@ -76,6 +76,8 @@
     <TipDialog :visible="showTip" icon="mdi-check-circle-outline" message="面试邀请发送成功" @close="showTip = false">
       <div class="color-primary text-decoration-underline cursor-pointer" @click="handleToInterviewManagement">点击到面试中查看。</div>
     </TipDialog>
+
+    <Loading :visible="formLoading" />
   </div>
 </template>
 
@@ -89,6 +91,7 @@ import { hireJobCvRelSettlement } from '@/api/recruit/public/delivery'
 import { useI18n } from '@/hooks/web/useI18n'
 import { useUserStore } from '@/store/user'
 import Snackbar from '@/plugins/snackbar'
+import Confirm from '@/plugins/confirm'
 import InvitePage from './invite.vue'
 import { getUserAvatar } from '@/utils/avatar'
 import { getBlob, saveAs } from '@/utils'
@@ -114,6 +117,7 @@ const badgeIcon = computed(() => (item) => {
   return (item.person && item.person.sex) ? (item.person.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
 })
 
+const formLoading = ref(false)
 const userStore = useUserStore()
 const inviteRef = ref()
 const showInvite = ref(false)
@@ -167,46 +171,54 @@ const handleToPersonDetail = async ({ userId, id }) => {
 // 加入人才库 
 const handleJoinToTalentPool = async (item) => {
   if (!item.userId) return Snackbar.warning('数据异常')
-  await joinToTalentPool(item.userId)
-  Snackbar.success(t('common.operationSuccessful'))
-  emit('refresh')
+  Confirm('系统提示', '是否确认将此求职者加入人才库?').then(async () => {
+    await joinToTalentPool(item.userId)
+    Snackbar.success(t('common.operationSuccessful'))
+    emit('refresh')
+  })
 }
 
 // 入职
 const handleEnterByEnterprise = async (item) => {
   if (!item.id) return
-  await personEntryByEnterprise(item.id)
-  Snackbar.success(t('common.operationSuccessful'))
-  emit('refresh')
+  Confirm('系统提示', '是否确认将此求职者操作入职?').then(async () => {
+    await personEntryByEnterprise(item.id)
+    Snackbar.success(t('common.operationSuccessful'))
+    emit('refresh')
+  })
 }
 
 // 不合适
 const handleEliminate = async (item) => {
   if (!item.id || !item?.job?.id) return
-  const query = {
-    bizId: item.id,
-    jobId: item.job.id,
-    userId: item.userId,
-    type: props.tab === 0 ? '0' : '1' // 投递简历0 已邀约1
-  }
-  // 招聘会职位则带id
-  if (item?.jobFairId) query.jobFairId = item.jobFairId
-  await joinEliminate(query)
-  Snackbar.success(t('common.operationSuccessful'))
-  emit('refresh')
+  Confirm('系统提示', '是否确认加入不合适?').then(async () => {
+    const query = {
+      bizId: item.id,
+      jobId: item.job.id,
+      userId: item.userId,
+      type: props.tab === 0 ? '0' : '1' // 投递简历0 已邀约1
+    }
+    // 招聘会职位则带id
+    if (item?.jobFairId) query.jobFairId = item.jobFairId
+    await joinEliminate(query)
+    Snackbar.success(t('common.operationSuccessful'))
+    emit('refresh')
+  })
 }
 
 // 取消不合适
 const handleCancelEliminate = async (item) => {
   if (!item.id) return
-  await personCvUnfitCancel(item.id)
-  Snackbar.success(t('common.operationSuccessful'))
-  emit('refresh')
+  Confirm('系统提示', '是否确认取消不合适?').then(async () => {
+    await personCvUnfitCancel(item.id)
+    Snackbar.success(t('common.operationSuccessful'))
+    emit('refresh')
+  })
 }
 
 // 查看简历
 const handlePreviewResume = async ({ url, id }) => {
-  if (!url || !id) return
+  if (!url || !id) return Snackbar.warning('简历不存在')
   try {
     const res = await personJobCvLook(id)
     if (res) {
@@ -244,22 +256,30 @@ const handleEditSubmit = async () => {
   if (!valid) return
   const query = inviteRef.value.getQuery()
   if (!query?.time) return Snackbar.warning('请选择面试时间')
-  await saveInterviewInvite(query)
-  showTip.value = true
-  handleEditClose()
-  emit('refresh')
+
+  formLoading.value = true
+  try {
+    await saveInterviewInvite(query)
+    showTip.value = true
+    handleEditClose()
+    emit('refresh')
+  } finally {
+    formLoading.value = false
+  }
 }
 
 // 结算
 const handleSettlement = async (item) => {
   if (!item.id) return
-  await hireJobCvRelSettlement(item.id)
-  Snackbar.success(t('common.operationSuccessful'))
-  emit('refresh')
-  // 更新账户信息
-  setTimeout(async () => {
-    await userStore.getEnterpriseUserAccountInfo()
-  }, 2000)
+  Confirm('系统提示', '是否确认结算?').then(async () => {
+    await hireJobCvRelSettlement(item.id)
+    Snackbar.success(t('common.operationSuccessful'))
+    emit('refresh')
+    // 更新账户信息
+    setTimeout(async () => {
+      await userStore.getEnterpriseUserAccountInfo()
+    }, 2000)
+  })
 }
 
 const handleToInterviewManagement = () => {

+ 14 - 5
src/views/recruit/enterprise/search/recommend/index.vue

@@ -51,6 +51,8 @@
   <TipDialog :visible="showTip" icon="mdi-check-circle-outline" message="面试邀请发送成功" @close="showTip = false">
     <div class="color-primary text-decoration-underline cursor-pointer" @click="handleToInterviewManagement">点击到面试中查看。</div>
   </TipDialog>
+
+  <Loading :visible="formLoading" />
 </template>
 
 <script setup>
@@ -82,6 +84,7 @@ const selectItems = ref({
 const total = ref(0)
 const items = ref([])
 const loading = ref(false)
+const formLoading = ref(false)
 const headers = ref([
   { title: '姓名', key: 'name', sortable: false },
   { title: '求职状态', key: 'jobStatusName', sortable: false },
@@ -172,11 +175,17 @@ const handleSubmit = async () => {
     Snackbar.warning('面试时间不能为空')
     return
   }
-  await saveInterviewInvite(query)
-  showInvite.value = false
-  showTip.value = true
-  getData()
-  itemData .value = {}
+
+  formLoading.value = true
+  try {
+    await saveInterviewInvite(query)
+    showInvite.value = false
+    showTip.value = true
+    getData()
+  } finally {
+    itemData .value = {}
+    formLoading.value = false
+  }
 }
 
 // 立即沟通

+ 12 - 3
src/views/recruit/enterprise/search/retrieval/index.vue

@@ -101,6 +101,8 @@
   <TipDialog :visible="showTip" icon="mdi-check-circle-outline" message="面试邀请发送成功" @close="showTip = false">
     <div class="color-primary text-decoration-underline cursor-pointer" @click="handleToInterviewManagement">点击到面试中查看。</div>
   </TipDialog>
+
+  <Loading :visible="formLoading" />
 </template>
 
 <script setup>
@@ -121,6 +123,7 @@ import { getDict } from '@/hooks/web/useDictionaries'
 import { getTimeDifferenceInChinese } from '@/utils/date'
 import { formatName } from '@/utils/getText'
 
+const formLoading = ref(false)
 const textItem = ref({
   type: 'text',
   width: 600,
@@ -321,9 +324,15 @@ const handleSubmit = async () => {
     return
   }
   delete query.id
-  await saveInterviewInvite(query)
-  showInvite.value = false
-  showTip.value = true
+  
+  formLoading.value = true
+  try {
+    await saveInterviewInvite(query)
+    showInvite.value = false
+    showTip.value = true
+  } finally {
+    formLoading.value = false
+  }
 }
 
 const handleToInterviewManagement = () => {

+ 19 - 10
src/views/recruit/enterprise/systemManagement/groupAccount/index.vue

@@ -53,7 +53,7 @@
           <template #actions="{ item }">
             <v-btn v-if="item.userType === '0'" color="primary" variant="text" @click="handleEdit(item)">编辑</v-btn>
             <v-btn v-if="item.status === '1' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 0, item)">{{ $t('enterprise.userManagement.enable') }}</v-btn>
-            <v-btn v-if="item.status === '0' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 1, item)">{{ $t('enterprise.userManagement.disable') }}</v-btn>
+            <v-btn v-if="item.status === '0' && item.userType !== '1'" color="error" variant="text" @click="handleAction('', 1, item)">{{ $t('enterprise.userManagement.disable') }}</v-btn>
           </template>
         </CtTable>
       </div>
@@ -84,6 +84,8 @@
     </CtForm>
   </CtDialog>
 
+  <Loading :visible="editLoading" />
+
   <ImgCropper :visible="isShowCopper" :image="selectPic" :cropBoxResizable="true" @submit="handleHideCopper" :aspectRatio="1 / 1" @close="isShowCopper = false"></ImgCropper>
 </template>
 
@@ -301,18 +303,25 @@ const handleHideCopper = (data) => {
 }
 
 // 提交
+const editLoading = ref(false)
 const handleSubmit = async () => {
   const { valid } = await CtFormRef.value.formRef.validate()
   if (!valid) return
-  const obj = {
-    id: editId.value
-  } 
-  formItems.value.options.forEach(e => { obj[e.key] = e.value })
-  await updateGroupUserAccount(obj)
-  showEdit.value = false
-  editId.value = null
-  Snackbar.success('编辑成功')
-  getUserList()
+  
+  editLoading.value = true
+  try {
+    const obj = {
+      id: editId.value
+    } 
+    formItems.value.options.forEach(e => { obj[e.key] = e.value })
+    await updateGroupUserAccount(obj)
+    showEdit.value = false
+    editId.value = null
+    Snackbar.success('编辑成功')
+    getUserList()
+  } finally {
+    editLoading.value = false
+  }
 }
 </script>
 

+ 6 - 3
src/views/recruit/enterprise/talentPool/index.vue

@@ -59,6 +59,7 @@ defineOptions({ name: 'enterprise-talent-pool'})
 import { useI18n } from '@/hooks/web/useI18n'; const { t } = useI18n()
 import { computed, reactive, ref } from 'vue'
 import Snackbar from '@/plugins/snackbar'
+import Confirm from '@/plugins/confirm'
 import FilterPage from './components/filter.vue'
 import { dealDictArrayData } from '@/utils/position'
 import { getTalentPoolPage } from '@/api/recruit/enterprise/talentPool'
@@ -92,9 +93,11 @@ getData()
 // 移出人才库 
 const handleRemove = async (item) => {
   if (!item.userId) return Snackbar.warning('数据异常')
-  await removeFormTalentPool(item.userId)
-  Snackbar.success(t('common.operationSuccessful'))
-  getData()
+  Confirm('系统提示', `是否确认将【${item.name}】移出人才库?`).then(async () => {
+    await removeFormTalentPool(item.userId)
+    Snackbar.success(t('common.operationSuccessful'))
+    getData()
+  })
 }
 
 const handleChangePage = (e) => {

+ 0 - 355
src/views/recruit/enterprise/talentPool/indexCopy.vue

@@ -1,355 +0,0 @@
-<!-- 样式备份 -->
-<template>
-  <v-card class="card-box pa-5">
-    <div class="d-flex justify-space-between">
-      <TextUI v-if="showTextUI" :item="textItem" @enter="handleEnter" @appendInnerClick="handleEnter"></TextUI>
-      <div></div>
-      <v-btn color="primary" prependIcon="mdi-filter-multiple-outline" class="half-button" variant="tonal" @click="openDrawer">筛选</v-btn>
-    </div>
-    <div v-if="items.length && showTextUI" class="d-flex align-center" style="margin-left: 14px;">
-      <v-checkbox v-model="selectAll" :label="!selectAll ? '全选' : `已选中${selectList.length}条`" hide-details color="primary" @update:model-value="handleChangeSelectAll"></v-checkbox>
-      <v-btn class="ml-8" :disabled="!selectAll" color="primary" variant="tonal" size="small">邀请面试</v-btn>
-      <v-btn class="mx-3" :disabled="!selectAll" color="primary" variant="tonal" size="small">简历回复</v-btn>
-      <v-btn :disabled="!selectAll" color="primary" variant="tonal" size="small">批量导出</v-btn>
-      <v-btn class="mx-3" :disabled="!selectAll" color="primary" variant="tonal" size="small">移除</v-btn>
-      <v-btn :disabled="!selectAll" color="primary" variant="tonal" size="small">移动到回收站</v-btn>
-      <v-btn class="ml-3" :disabled="!selectAll" color="primary" variant="tonal" size="small">加入黑名单</v-btn>
-    </div>
-    <div v-if="items.length" class="mt-3">
-      <div v-for="val in items" :key="val.id" class="list-item mb-3">
-        <div class="top">
-          <v-checkbox class="mr-5" v-model="val.select" color="primary" density="compact" hide-details @update:model-value="handleChangeSelect"></v-checkbox>
-          <span>应聘/意向职位:{{ val.job.name }}</span>
-          <span class="mx-10">加入时间:{{ val.createTime }}</span>
-          <span>人才分类:{{ val.type }}</span>
-        </div>
-        <div @click.stop="talentPoolDetails(val)" class="px-5 py-3 d-flex justify-space-between align-center cursor-pointer">
-          <div class="d-flex">
-            <v-badge
-              bordered
-              offset-x="6"
-              offset-y="44"
-              :color="val.sex ? (val.sex === '1' ? '#1867c0' : 'error') : 'error'"
-              :icon="val.sex ? (val.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'">
-              <v-avatar size="large" :image="val.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
-            </v-badge>
-            <div class="ml-5">
-              <div class="user-name">{{ val.name }}</div>
-              <div class="mt-2 user-info">
-                <span v-for="(k, i) in dict" :key="k">
-                  {{ val[k] }}
-                  <span v-if="i !== dict.length - 1" class="mx-3">|</span>
-                </span>
-              </div>
-            </div>
-          </div>
-          <div>
-            <!-- <v-btn color="primary" variant="tonal" @click.stop="{}">和TA聊聊</v-btn>
-            <v-btn class="ml-3" color="primary" @click.stop="{}">邀请面试</v-btn> -->
-            <v-btn class="ml-3" color="primary" variant="tonal" @click.stop="handleRemove(val)">移除</v-btn>
-          </div>
-        </div>
-        <div class="d-flex mx-5 bottom cursor-pointer">
-          <div class="experience" v-if="val.exp.length">
-            <div class="second-title">工作经验</div>
-            <v-timeline density="compact" align="start" side="end" truncate-line="both">
-              <v-timeline-item v-for="(j, i) in val.exp" :key="i" dot-color="primary" size="small">
-                <div class="timeline-item mt-1">
-                  <div>{{ j.startTime }}-{{ j.endTime }} ({{ j.year }})</div>
-                  <div class="timeline-item-name ellipsis">{{ j.name }}</div>
-                  <div class="timeline-item-name ellipsis">{{ j.jobName }}</div>
-                </div>
-              </v-timeline-item>
-            </v-timeline>
-          </div>
-          <div class="edu" v-if="val.edu.length">
-            <div class="second-title">教育经历</div>
-            <v-timeline density="compact" align="start" side="end" truncate-line="both">
-              <v-timeline-item v-for="(j, i) in val.edu" :key="i" dot-color="primary" size="small">
-                <div class="timeline-item mt-1">
-                  <div>{{ j.startTime }}-{{ j.endTime }}</div>
-                  <div class="timeline-item-name ellipsis">{{ j.name }}</div>
-                  <div class="timeline-item-name ellipsis">{{ j.major }}</div>
-                </div>
-              </v-timeline-item>
-            </v-timeline>
-          </div>
-        </div>
-      </div>
-      <CtPagination
-        :total="total"
-        :page="pageInfo.pageNo"
-        :limit="pageInfo.pageSize"
-        @handleChange="handleChangePage"
-      ></CtPagination>
-    </div>
-    <Empty v-else :message="tipsText" :elevation="false" class="mt-15"></Empty>
-
-    <v-navigation-drawer v-model="screen" location="right" absolute temporary width="700">
-      <FilterPage
-        ref="FilterPageRef"
-        @confirm="handleConfirm"
-        @cancel="screen = false"
-      ></FilterPage>
-    </v-navigation-drawer>
-  </v-card>
-</template>
-
-<script setup>
-// import { useRouter } from 'vue-router'
-// const router = useRouter()
-defineOptions({ name: 'enterprise-talent-pool'})
-import { useI18n } from '@/hooks/web/useI18n'; const { t } = useI18n()
-import { reactive, ref } from 'vue'
-import Snackbar from '@/plugins/snackbar'
-import TextUI from '@/components/FormUI/TextInput'
-import FilterPage from './components/filter.vue'
-import { dealDictArrayData } from '@/utils/position'
-import { getTalentPoolPage } from '@/api/recruit/enterprise/talentPool'
-import { removeFormTalentPool } from '@/api/recruit/enterprise/personnel'
-
-
-let query = {}
-const showTextUI = ref(false)
-const screen = ref(false)
-const selectAll = ref(false)
-const selectList = ref([])
-const items = ref([
-  {
-    job: {
-      name: '客房服务员'
-    },
-    createTime: '2026-11-12',
-    type: '默认分类',
-    name: '花城',
-    age: '27岁',
-    expName: '3年经验',
-    areaName: '广州',
-    userId: '1',
-    id: '1793583467288223745',
-    sex: '2',
-    select: false,
-    eduName: '本科',
-    payName: '薪资面议',
-    avatar: 'https://cdn.vuetifyjs.com/images/john.jpg',
-    exp: [
-      {
-        startTime: '2016.05',
-        endTime: '2018.05',
-        year: '2年',
-        name: '广州辞图科技有限公司',
-        jobName: '前台'
-      },
-      {
-        startTime: '2016.05',
-        endTime: '2018.05',
-        year: '2年',
-        name: '广州辞图科技有限公司',
-        jobName: '前台'
-      }
-    ],
-    edu: [
-      {
-        startTime: '2016.05',
-        endTime: '2018.05',
-        name: '广州大学',
-        major: '酒店管理'
-      }
-    ]
-  },
-  {
-    job: {
-      name: '客房服务员'
-    },
-    createTime: '2026-11-12',
-    type: '默认分类',
-    name: '花城',
-    age: '27岁',
-    expName: '3年经验',
-    areaName: '广州',
-    userId: '1',
-    id: '1793583467288223745',
-    sex: '2',
-    select: false,
-    eduName: '本科',
-    payName: '薪资面议',
-    avatar: 'https://cdn.vuetifyjs.com/images/john.jpg',
-    exp: [
-      {
-        startTime: '2016.05',
-        endTime: '2018.05',
-        year: '2年',
-        name: '广州辞图科技有限公司',
-        jobName: '前台'
-      },
-      {
-        startTime: '2016.05',
-        endTime: '2018.05',
-        year: '2年',
-        name: '广州辞图科技有限公司',
-        jobName: '前台'
-      }
-    ],
-    edu: [
-      {
-        startTime: '2016.05',
-        endTime: '2018.05',
-        name: '广州大学',
-        major: '酒店管理'
-      }
-    ]
-  }
-])
-// items.value = [] // 暂定无数据展示
-const tipsText = ref('暂无数据')
-const total = ref(2)
-const pageInfo = reactive({ pageNo: 1, pageSize: 10 })
-
-const textItem = ref({
-  type: 'text',
-  width: 600,
-  value: '',
-  label: '请输入简历姓名/职位名称',
-  appendInnerIcon: 'mdi-magnify'
-})
-const dict = ['age', 'expName', 'areaName', 'eduName', 'payName']
-
-// 获取数据
-const getData = async () => {
-  const obj = { ...pageInfo, ...query }
-  console.log('obj', obj)
-  const { list, total: number } = await getTalentPoolPage(pageInfo)
-  total.value = number
-  if (showTextUI.value) items.value = list?.length ? dealDictArrayData([], list) : []
-}
-// getData()
-
-const handleEnter = (e) => {
-  console.log(e, 'enter')
-}
-
-// 移出人才库 
-const handleRemove = async (item) => {
-  if (!item.userId) return Snackbar.warning('数据异常')
-  await removeFormTalentPool(item.userId)
-  Snackbar.success(t('common.operationSuccessful'))
-}
-
-const dealSelect = () => {
-  selectList.value = items.value.filter(e => e.select).map(k => k.id)
-}
-
-// 全选
-const handleChangeSelectAll = () => {
-  items.value.map(k => {
-    k.select = selectAll.value
-    return k
-  })
-  dealSelect()
-}
-// 单选
-const handleChangeSelect = () => {
-  const length = items.value.filter(k => k.select).length
-  selectAll.value = length > 0 ? true : false
-  dealSelect()
-}
-
-const handleChangePage = () => {
-  // 分页获取新数据后勾选
-  selectList.value.forEach(e => {
-    const obj = items.value.find(k => k.id === e)
-    if (obj) obj.select = true
-  })
-  getData()
-}
-
-// 筛选
-const handleConfirm = (params) => {
-  screen.value = false
-  pageInfo.pageNo = 1
-  query = { ...params }
-  getData()
-}
-
-const FilterPageRef = ref()
-const openDrawer = () => {
-  screen.value = true
-  if (Object.keys(query).length) FilterPageRef.value?.setValue(query)
-  else FilterPageRef.value?.resetValue()
-}
-
-
-// 人才详情
-const talentPoolDetails = ({ userId }) => {
-  if (!userId) return
-  window.open(`/recruit/enterprise/talentPool/details/${userId}`)
-}
-</script>
-
-<style scoped lang="scss">
-.list-item {
-  border: 1px solid #e5e6eb;
-}
-.top {
-  display: flex;
-  background-color: #f7f8fa;
-  height: 50px;
-  line-height: 50px;
-  font-size: 14px;
-  color: var(--color-666);
-  padding: 0 20px;
-}
-.user-name {
-  font-size: 18px;
-  font-weight: 700;
-  color: #555;
-}
-.user-info {
-  color: var(--color-666);
-  font-size: 14px;
-  font-weight: 500;
-}
-:deep(.v-timeline-divider__dot--size-small) {
-  width: 10px !important;
-  height: 10px !important;
-  margin-top: 10px !important;
-}
-:deep(.v-timeline-divider__inner-dot) {
-  width: 10px !important;
-  height: 10px !important;
-}
-.bottom {
-  display: flex;
-  justify-content: space-between;
-  padding-bottom: 12px;
-  .experience {
-    width: 54%;
-    height: 100%;
-  }
-  .edu {
-    width: 40%;
-    height: 100%;
-  }
-}
-.second-title {
-  color: var(--color-666);
-  font-size: 15px;
-}
-.timeline-item {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  width: 100%;
-  color: var(--color-666);
-  font-size: 13px;
-  .timeline-item-name {
-    width: 26%;
-  }
-}
-:deep(.v-timeline-item__body) {
-  width: 100%;
-}
-:deep(.v-timeline--vertical.v-timeline) {
-  row-gap: 0;
-}
-</style>

+ 1 - 0
src/views/recruit/enterprise/tradingOrder/components/trading/balance.vue → src/views/recruit/enterprise/tradingOrder/components/balance.vue

@@ -17,6 +17,7 @@
 </template>
 
 <script setup>
+// M豆交易明细
 defineOptions({ name: 'trading-order-balance'})
 import { ref } from 'vue'
 import { timesTampChange } from '@/utils/date'

+ 0 - 33
src/views/recruit/enterprise/tradingOrder/components/public.vue

@@ -1,33 +0,0 @@
-<template>
-  <div v-for="val in list" :key="val.value" class="font-size-14 color-666 my-3">
-    <span>{{ val.label }}</span>
-    <span class="ml-5">{{ val.value }}</span>
-  </div>
-  <div class="color-error font-size-14">
-    <v-icon>mdi-information-outline</v-icon>
-    请在对公汇款时务必备注订单号
-  </div>
-</template>
-
-<script setup>
-defineOptions({ name: 'public-page'})
-
-const props = defineProps({
-  price: {
-    type: Number,
-    default: 200
-  }
-})
-
-const list = [
-  { label: '账户名称:', value: '苏州识喜识谊科技有限公司' },
-  { label: '开户银行:', value: '招商银行北京分行三里屯支行' },
-  { label: '银行账号:', value: '1109 1354 8610 601' },
-  { label: '汇款金额:', value: '¥' + props.price },
-  { label: '汇款备注:', value: '订单号UIzi232rmwwzpif' }
-]
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 1 - 0
src/views/recruit/enterprise/tradingOrder/components/trading/recharge.vue → src/views/recruit/enterprise/tradingOrder/components/recharge.vue

@@ -17,6 +17,7 @@
 </template>
 
 <script setup>
+// 充值订单
 defineOptions({ name: 'trading-order-recharge'})
 import { ref } from 'vue'
 import { timesTampChange } from '@/utils/date'

+ 0 - 22
src/views/recruit/enterprise/tradingOrder/components/trading.vue

@@ -1,22 +0,0 @@
-<template>
-  <div class="white-bgc pa-3 pt-3">
-    <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa">
-      <v-tab value="tab_transaction">{{ '交易订单' }}</v-tab>
-      <v-tab value="tab_recharge">{{ '充值订单' }}</v-tab>
-    </v-tabs>
-    <Transaction v-if="tab === 'tab_transaction'"></Transaction>
-    <Recharge v-if="tab === 'tab_recharge'"></Recharge>
-  </div>
-</template>
-
-<script setup>
-defineOptions({name: 'enterprise-memberCenter-tradingOrder'})
-import { ref } from 'vue'
-import Transaction from './trading/transaction.vue'
-import Recharge from './trading/recharge.vue'
-
-const tab = ref('tab_transaction')
-</script>
-
-<style lang="scss" scoped>
-</style>

+ 7 - 0
src/views/recruit/enterprise/tradingOrder/components/trading/transaction.vue → src/views/recruit/enterprise/tradingOrder/components/transaction.vue

@@ -43,9 +43,12 @@
     </div>
   </CtDialog>
+
+  <Loading :visible="loading" />
 </template>
 
 <script setup>
+// 交易订单
 defineOptions({ name: 'trading-order-transaction'})
 import { ref } from 'vue'
 import { timesTampChange } from '@/utils/date'
@@ -163,8 +166,10 @@ const handleClose = () => {
   radio.value = null
 }
 
+const loading = ref(false)
 const handleSubmit = async () => {
   if (!radio.value) return Snackbar.warning('请选择要进行开票的抬头信息')
+  loading.value = true
   const obj = invoiceTitleList.value.find(e => e.id === radio.value)
   delete obj.id
   try {
@@ -175,6 +180,8 @@ const handleSubmit = async () => {
     getData()
   } catch (error) {
     console.log(error)
+  } finally {
+    loading.value = false
   }
 }
 

+ 3 - 3
src/views/recruit/enterprise/tradingOrder/index.vue

@@ -15,9 +15,9 @@
 defineOptions({name: 'enterprise-memberCenter-myAccount'})
 import { ref } from 'vue'
 import { useUserStore } from '@/store/user'
-import Transaction from './components/trading/transaction.vue'
-import Recharge from './components/trading/recharge.vue'
-import Balance from './components/trading/balance.vue'
+import Transaction from './components/transaction.vue'
+import Recharge from './components/recharge.vue'
+import Balance from './components/balance.vue'
 import { useRouter } from 'vue-router'
 
 const router = useRouter()

+ 1 - 1
vite.config.mjs

@@ -92,7 +92,7 @@ export default defineConfig({
     proxy: {
       '/api': {
         target: 'http://192.168.3.143:5500',
-        // target: https://company.citupro.com:18183,
+        // target: 'https://company.citupro.com:18183',
         secure: false, // 是否支持 https,默认 false
         changeOrigin: true, // 是否支持跨域
         pathRewrite: {