فهرست منبع

学生上报实习企业

Xiao_123 1 هفته پیش
والد
کامیت
8144d47b7d

+ 1 - 1
src/components/Position/longCompany.vue

@@ -12,7 +12,7 @@
           <p>{{ item.industryName }}<span v-if="item.industryName && item.scaleName" class="mx-2">|</span>{{ item.scaleName }}</p>
         </div>
         <div v-if="item.active">
-          <v-btn class="half-button ml-3" color="primary" size="small" @click.stop="handleCancel(item)">取消收藏</v-btn>
+          <v-btn class="half-button ml-3" color="warning" size="small" @click.stop="handleCancel(item)">取消收藏</v-btn>
         </div>
       </div>
       <div class="company-info-bottom">

+ 31 - 9
src/components/Position/longStrip.vue

@@ -3,13 +3,7 @@
     <div class="position-item mb-3 job-closed" style="position: relative;" :class="val.active ? 'elevation-8 hoverShadowSolid' : 'elevation-3'"
       v-for="(val, i) in props.items" :key="i" @mouseenter="val.active = true" @mouseleave="val.active = false"
     >
-      <div class="info-header">
-        <div v-if="val.active && val.job.status === '0'" class="header-btn">
-          <v-btn v-if="showCancelDeliveryResumeBtn && val.cvRel?.status === '0'" class="MiSans-Medium" color="primary" size="small" @click.stop="emits('cancelDeliveryResume', val.cvRel.id)">撤销投递简历</v-btn>
-          <v-btn v-if="props.showCancelBtn" class="half-button ml-3 MiSans-Medium" color="primary" size="small" @click.stop="handleCancel(val)">取消收藏</v-btn>
-          <v-btn class="half-button ml-3 MiSans-Medium" color="primary" size="small" @click.stop="toDetails(val)">立即沟通</v-btn>
-        </div>
-        <div v-if="val.job.status === '1'" class="font-size-14 header-btn color-error">职位已关闭</div>
+      <div class="info-header d-flex align-center justify-space-between">
         <div class="img-box">
           <v-avatar :image="getUserAvatar(val.contact.avatar, val.contact.sex)" size="x-small"></v-avatar>
           <span class="name">
@@ -17,6 +11,17 @@
             <span class="gray">{{ val.contact.postNameCn }}</span>
           </span>
         </div>
+        <div class="d-flex align-center">
+          <div v-if="val.active && val.job.status === '0'" class="header-btn">
+            <v-btn v-if="showCancelDeliveryResumeBtn && val.cvRel?.status === '0'" class="MiSans-Medium" color="warning" size="small" @click.stop="emits('cancelDeliveryResume', val.cvRel.id)">撤销投递简历</v-btn>
+            <v-btn v-if="props.showCancelBtn" class="half-button ml-3 MiSans-Medium" color="warning" size="small" @click.stop="handleCancel(val)">取消收藏</v-btn>
+            <v-btn class="half-button ml-3 MiSans-Medium" color="#008BB7" size="small" @click.stop="toDetails(val)">立即沟通</v-btn>
+          </div>
+          <div v-if="val.job.status === '1'" class="font-size-14 header-btn color-error mr-3">职位已关闭</div>
+          <div v-if="showReportBtn && val.job.bizId && !val.internshipEnterprise" class="header-btn">
+            <v-btn color="primary" size="small" @click="handleReport(val)">上报为实习企业</v-btn>
+          </div>
+        </div>
       </div>
       <div class="info-content" >
         <div class="job-info">
@@ -61,6 +66,7 @@ defineOptions({ name: 'longStrip'})
 import { getPersonJobUnfavorite } from '@/api/position'
 import { useI18n } from '@/hooks/web/useI18n'
 import Snackbar from '@/plugins/snackbar'
+import Confirm from '@/plugins/confirm'
 import { getUserAvatar } from '@/utils/avatar'
 import { useRouter } from 'vue-router'
 import { ref } from 'vue'
@@ -71,6 +77,7 @@ import { checkPersonBaseInfo } from '@/utils/check'
 import dialogExtend from '@/plugins/dialogExtend'
 import { formatName } from '@/utils/getText'
 import { jumpToEnterpriseDetail } from '@/utils/position'
+import { reportStudentPracticeEnterprise } from '@/api/recruit/personal/student.js'
 
 const emits = defineEmits(['refresh', 'cancelDeliveryResume'])
 const { t } = useI18n()
@@ -88,6 +95,11 @@ const props = defineProps({
   showCancelDeliveryResumeBtn: {
     type: Boolean,
     default: false
+  },
+  // 是否展示上报为实习企业按钮(只有学生需要展示)
+  showReportBtn: {
+    type: Boolean,
+    default: false
   }
 })
 
@@ -102,6 +114,16 @@ const handleCancel = async (item) => {
   Snackbar.success(t('common.operationSuccessful'))
 }
 
+// 上报为实习企业
+const handleReport = (val) => {
+  if (!val.enterprise.id || !val.job.id) return Snackbar.warning('企业或职位信息错误')
+  Confirm(t('common.confirmTitle'), '是否确定上报为实习企业?').then(async () => {
+    await reportStudentPracticeEnterprise(val.enterprise.id, val.job.id)
+    Snackbar.success('上报成功')
+    emits('refresh')
+  })
+}
+
 // 职位详情
 const handleToPositionDetails = (item) => {
   if (item.job.status === '1') return
@@ -165,6 +187,7 @@ const loginClose = () => {
   height: 144px;
   background-color: #fff;
   border-radius: 12px;
+  border: 1px solid #fff;
   .info-header {
     height: 48px;
     background: linear-gradient(90deg,#f5fcfc,#fcfbfa);
@@ -181,8 +204,7 @@ const loginClose = () => {
       }
     }
     .header-btn {
-      padding: 10px 10px 0 0;
-      float: right;
+      padding-right: 10px;
       .v-btn {
         z-index: 1;
       }

+ 8 - 2
src/views/recruit/enterprise/student/InternshipSituation/index.vue

@@ -50,7 +50,7 @@
           </div>
         </template>
 				<template #status="{ item }">
-					{{ statistics.find(e => e.value === item?.status)?.label }}
+					{{ statistics.find(e => e.value === item?.studentProcessStatus.toString())?.label }}
 				</template>
         <template #actions="{ item }">
           <v-btn v-if="!item?.recommendationLetter" color="primary" variant="text" @click="handleUploadLetter(item.id)">上传推荐信</v-btn>
@@ -95,6 +95,7 @@ const query = ref({
 	pageNo: 1,
 	pageSize: 10,
 	startTime: null,
+	status: '1',
 	enterpriseId: JSON.parse(localStorage.getItem('entBaseInfo'))?.enterpriseId
 })
 const tableData = ref([])
@@ -129,8 +130,13 @@ const getList = async () => {
 
 // 数值统计
 const getStatistics = async () => {
+	const query = { 
+		type: '-1', 
+		status: '1', 
+		enterpriseId: JSON.parse(localStorage.getItem('entBaseInfo'))?.enterpriseId 
+	}
 	try {
-		const data = await getRecordStatusCount({ type: '-1', enterpriseId: JSON.parse(localStorage.getItem('entBaseInfo'))?.enterpriseId })
+		const data = await getRecordStatusCount(query)
 		statistics.value.forEach(e => {
 			const obj = data.find(val => val.key === e.value)
 			e.count = obj ? obj.value : 0

+ 8 - 1
src/views/recruit/personal/PersonalCenter/jobFeedback/components/delivery.vue

@@ -1,7 +1,13 @@
 <template>
   <div>
     <div v-if="items.length">
-      <LongStrip :items="items" :showCancelDeliveryResumeBtn="true" @cancelDeliveryResume="handleCancelDeliveryResume"></LongStrip>
+      <LongStrip 
+        :items="items"
+        :showCancelDeliveryResumeBtn="true"
+        :showReportBtn="info?.type && Number(info.type) === 1" 
+        @cancelDeliveryResume="handleCancelDeliveryResume"
+        @refresh="handleChangePage(1)"
+      ></LongStrip>
       <CtPagination
         :total="total"
         :page="page.pageNo"
@@ -28,6 +34,7 @@ const page = ref({
   pageNo: 1,
   pageSize: 20
 })
+const info = localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
 
 
 // 获取已投递职位列表

+ 0 - 22
src/views/recruit/personal/PersonalCenter/jobFeedback/components/interview/item.vue

@@ -8,10 +8,6 @@
         <v-btn color="primary" size="small" @click.stop="handleAgree(val)">同意</v-btn>
         <v-btn class="ml-3" color="error" size="small" @click.stop="handleRefuse(val)">拒绝</v-btn>
       </div>
-      <!-- 当前角色为学生&&待面试、面试完成&&属于招聘会职位&&未上报为实习企业 -->
-      <div v-if="(info?.type && Number(info.type) === 1) && ['1', '3'].includes(val.status) && val.jobFairId && !val.internshipEnterprise" class="header-btn">
-        <v-btn color="primary" size="small" @click="handleReport(val)">上报为实习企业</v-btn>
-      </div>
       <div v-if="val.job.status === '1'" class="font-size-14 header-btn color-error">职位已关闭</div>
       <div class="img-box">
         <v-avatar :image="getUserAvatar(val.contact.avatar, val.contact.sex)" size="x-small"></v-avatar>
@@ -31,11 +27,6 @@
         </div>
         <div class="job-info color-666">
           <div class="job-name ellipsis" style="max-width: 410px;">
-            <v-tooltip text="上报的实习企业" location="top">
-              <template v-slot:activator="{ props }">
-                <svg-icon v-bind="props" v-if="val.internshipEnterprise" name="current-practice-enterprise" size="20"></svg-icon>
-              </template>
-            </v-tooltip>
             <span class="mr-3" :class="{'cursor-pointer': val.job.status === '0', 'position-name': val.job.status === '0'}" @click.stop="handleToPositionDetails(val)">{{ formatName(val.job.name) }}</span>
             <span v-if="!val.job.payFrom && !val.job.payTo">面议</span>
             <span v-else>{{ val.job.payFrom ? val.job.payFrom + '-' : '' }}{{ val.job.payTo }}{{ val.job.payName ? '/' + val.job.payName : '' }}</span>
@@ -71,9 +62,7 @@ import { getUserAvatar } from '@/utils/avatar'
 import { useRouter } from 'vue-router'
 import { formatName } from '@/utils/getText'
 import { jumpToEnterpriseDetail } from '@/utils/position'
-import { reportStudentPracticeEnterprise } from '@/api/recruit/personal/student.js'
 
-const info = localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
 const { t } = useI18n()
 const emits = defineEmits(['refresh'])
 const props = defineProps({
@@ -125,17 +114,6 @@ const handleRefuse = (val) => {
     emits('refresh')
   })
 }
-
-// 上报为实习企业
-const handleReport = async (val) => {
-  if (!val.jobFairId) return Snackbar.warning('不是招聘会职位不能上报为实习企业')
-  if (!val.enterpriseId || !val.jobId) return Snackbar.warning('企业或职位信息错误')
-  Confirm(t('common.confirmTitle'), '是否确定上报为实习企业?').then(async () => {
-    await reportStudentPracticeEnterprise(val.enterpriseId, val.jobId)
-    Snackbar.success('上报成功')
-    emits('refresh')
-  })
-}
 </script>
 
 <style scoped lang="scss">

+ 5 - 3
src/views/recruit/personal/PersonalCenter/student/intershipCompany/index.vue

@@ -5,7 +5,7 @@
 		</v-tabs>
 
 		<div v-if="items?.length">
-			<ItemPage class="mt-3" :items="items" @preview="handlePreview" />
+			<ItemPage class="mt-3" :items="items" :tab="tab" @preview="handlePreview" @refresh="handleChangePage(1)" />
 			<CtPagination
 				v-if="total > 0"
 				:total="total"
@@ -63,13 +63,13 @@ const total = ref(0)
 const query = ref({
 	pageNo: 1,
 	pageSize: 10,
-	status: ''
+	status: '1'
 })
 const itemData = ref({})
 const studentInfo = ref(localStorage.getItem('studentInfo') ? JSON.parse(localStorage.getItem('studentInfo')) : {})
 
 const getList = async () => {
-	query.value.status = tabList.value[tab.value]?.value
+	query.value.studentProcessStatus = tabList.value[tab.value]?.value
 	const result = await getStudentPracticePage(query.value)
 	items.value = result?.list.map(e => {
 		e.enterprise = dealDictObjData({}, e.enterprise)
@@ -87,6 +87,8 @@ onMounted(async () => {
 })
 
 const handleChangeTab = () => {
+	items.value = []
+	total.value = 0
 	query.value.pageNo = 1
 	getList()
 }

+ 26 - 3
src/views/recruit/personal/PersonalCenter/student/intershipCompany/item.vue

@@ -43,7 +43,7 @@
 					<p>实习时间:{{ timesTampChange(val.startTime, 'Y-M-D') }} 至 {{ timesTampChange(val.endTime, 'Y-M-D') }}</p>
 				</div>
 				<div class="text-end">
-					<v-btn v-if="val.status === '1'" size="small" color="warning" @click="handleToReport(val)">实习报告</v-btn>
+					<v-btn v-if="tab !== '0'" size="small" color="primary" @click="handleToReport(val)">实习报告</v-btn>
 					<v-btn v-if="val.evaluate && !val.certificate" size="small" class="ml-3" color="primary" @click.stop="handlePreview(val)">实习证书</v-btn>
           <v-menu v-else-if="val.evaluate && val.certificate" open-on-hover>
             <template v-slot:activator="{ props }">
@@ -59,6 +59,12 @@
             </v-list>
           </v-menu>
 					<v-btn v-if="val.recommendationLetter" @click.stop="handleDownLoadRecommendationLetter(val)" size="small" class="ml-3" color="#00897B" prepend-icon="mdi-download">企业推荐信</v-btn>
+          <v-btn 
+            v-if="(info?.type && Number(info.type) === 1) && tab === 0 && !val.internshipEnterprise"
+            color="primary" size="small"
+            class="ml-3"
+            @click="handleReport(val)"
+          >上报为实习企业</v-btn>
 				</div>
 			</div>
     </div>
@@ -73,19 +79,37 @@ import { formatName } from '@/utils/getText'
 import { jumpToEnterpriseDetail } from '@/utils/position'
 import { timesTampChange } from '@/utils/date'
 import { getBlob, saveAs } from '@/utils'
+import Snackbar from '@/plugins/snackbar'
+import Confirm from '@/plugins/confirm'
+import { reportStudentPracticeEnterprise } from '@/api/recruit/personal/student.js'
 
-const emit = defineEmits(['preview'])
+const emit = defineEmits(['preview', 'refresh'])
 const props = defineProps({
   items: {
     type: Array,
     default: () => []
+  },
+  tab: {
+    type: Number,
+    default: 0
   }
 })
 
 const router = useRouter()
 
+const info = localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')) : {}
 const desc = ['industryName', 'scaleName']
 
+// 上报为实习企业
+const handleReport = async (val) => {
+  if (!val.enterpriseId || !val.jobId) return Snackbar.warning('企业或职位信息错误')
+  Confirm(t('common.confirmTitle'), '是否确定上报为实习企业?').then(async () => {
+    await reportStudentPracticeEnterprise(val.enterpriseId, val.jobId)
+    Snackbar.success('上报成功')
+    emit('refresh')
+  })
+}
+
 // 实习证书预览
 const handlePreview = (item) => {
   emit('preview', item)
@@ -113,7 +137,6 @@ const handleToPositionDetails = (item) => {
 
 // 实习报告
 const handleToReport = (val) => {
-	console.log(val, 'report')
 	router.push(`/recruit/personal/personalCenter/student/internshipReport?id=${val.enterprise.id}`)
 }