From abd91e2cb7117fec1d74cbf9e2b99a052a31cefe Mon Sep 17 00:00:00 2001 From: xiebin <719488417@qq.com> Date: Sun, 23 Nov 2025 18:20:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=B8=B2=E6=9F=93=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8B=20:=20=E5=B2=97=E4=BD=8D=E8=AF=A6?= =?UTF-8?q?=E6=83=85=20=E5=85=AC=E5=8F=B8=E8=AF=A6=E6=83=85=20=E5=B2=97?= =?UTF-8?q?=E4=BD=8D=E6=94=B6=E8=97=8F=20=20=E5=85=AC=E5=8F=B8=E6=94=B6?= =?UTF-8?q?=E8=97=8F=20=E6=B5=8F=E8=A7=88=E8=AE=B0=E5=BD=95=20=E9=A2=84?= =?UTF-8?q?=E7=BA=A6=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../renderCompanyCollectionRecord.vue | 157 +++++++++ components/renderCompanys/renderCompanys.vue | 29 +- .../renderCompanysOutData.vue | 142 +++++++++ .../renderDeliveryRecord.vue | 201 ++++++++++++ .../renderJobCollectionRecord.vue | 202 ++++++++++++ .../renderJobViewRecord.vue | 201 ++++++++++++ components/renderJobs/renderJobs.vue | 36 +-- .../renderJobsOutData/renderJobsOutData.vue | 167 ++++++++++ main.js | 12 + .../Intendedposition/Intendedposition.vue | 12 +- packageA/pages/UnitDetails/UnitDetails.vue | 158 +++++++--- packageA/pages/browseJob/browseJob.vue | 8 +- packageA/pages/collection/collection.vue | 12 +- packageA/pages/exhibitors/exhibitors.vue | 70 +++-- packageA/pages/myResume/myResume.vue | 42 +++ packageA/pages/post/post.vue | 297 +++++++++++------- packageA/pages/reservation/reservation.vue | 39 ++- static/icon/close-blue.png | Bin 0 -> 2686 bytes static/icon/close-green.png | Bin 0 -> 2623 bytes static/icon/notice-blue.png | Bin 0 -> 3830 bytes static/icon/notice-green.png | Bin 0 -> 3888 bytes utils/request.js | 1 + 22 files changed, 1544 insertions(+), 242 deletions(-) create mode 100644 components/renderCompanyCollectionRecord/renderCompanyCollectionRecord.vue create mode 100644 components/renderCompanysOutData/renderCompanysOutData.vue create mode 100644 components/renderDeliveryRecord/renderDeliveryRecord.vue create mode 100644 components/renderJobCollectionRecord/renderJobCollectionRecord.vue create mode 100644 components/renderJobViewRecord/renderJobViewRecord.vue create mode 100644 components/renderJobsOutData/renderJobsOutData.vue create mode 100644 static/icon/close-blue.png create mode 100644 static/icon/close-green.png create mode 100644 static/icon/notice-blue.png create mode 100644 static/icon/notice-green.png diff --git a/components/renderCompanyCollectionRecord/renderCompanyCollectionRecord.vue b/components/renderCompanyCollectionRecord/renderCompanyCollectionRecord.vue new file mode 100644 index 0000000..12c768b --- /dev/null +++ b/components/renderCompanyCollectionRecord/renderCompanyCollectionRecord.vue @@ -0,0 +1,157 @@ + + + + + \ No newline at end of file diff --git a/components/renderCompanys/renderCompanys.vue b/components/renderCompanys/renderCompanys.vue index 0310e6f..1234a2d 100644 --- a/components/renderCompanys/renderCompanys.vue +++ b/components/renderCompanys/renderCompanys.vue @@ -2,18 +2,17 @@ - {{ job.gsmc }} + {{ job.name }} - - - - {{job.gsxy}} + + + + - + 在招职位· - {{ job.zzgwsl || '-' }} + {{ job.totalRecruitment || '-' }} @@ -21,14 +20,10 @@ - {{ vacanciesTo(job.vacancies) }} - - {{job.qyxz}} - @@ -56,10 +51,6 @@ const props = defineProps({ type: String, default: '', }, - zphId: { - type: String, - default: '', - }, }); const listData = computed(() => { @@ -67,7 +58,7 @@ const listData = computed(() => { }); function nextDetail(company) { - navTo(`/packageA/pages/UnitDetails/UnitDetails?companyId=${company.gsID}&companyName=${company.gsmc}&zphId=${props.zphId}`); + navTo(`/packageA/pages/UnitDetails/UnitDetails?companyId=${company.companyId}`); } @@ -128,7 +119,7 @@ function nextDetail(company) { } } .card-bottom{ - margin-top: 15rpx + margin-top: 4rpx margin-bottom: 10rpx display: flex justify-content: space-between @@ -139,4 +130,4 @@ function nextDetail(company) { .ris{ font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif; } - + \ No newline at end of file diff --git a/components/renderCompanysOutData/renderCompanysOutData.vue b/components/renderCompanysOutData/renderCompanysOutData.vue new file mode 100644 index 0000000..87f22fa --- /dev/null +++ b/components/renderCompanysOutData/renderCompanysOutData.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/components/renderDeliveryRecord/renderDeliveryRecord.vue b/components/renderDeliveryRecord/renderDeliveryRecord.vue new file mode 100644 index 0000000..07967ef --- /dev/null +++ b/components/renderDeliveryRecord/renderDeliveryRecord.vue @@ -0,0 +1,201 @@ + + + + + \ No newline at end of file diff --git a/components/renderJobCollectionRecord/renderJobCollectionRecord.vue b/components/renderJobCollectionRecord/renderJobCollectionRecord.vue new file mode 100644 index 0000000..c1f6888 --- /dev/null +++ b/components/renderJobCollectionRecord/renderJobCollectionRecord.vue @@ -0,0 +1,202 @@ + + + + + \ No newline at end of file diff --git a/components/renderJobViewRecord/renderJobViewRecord.vue b/components/renderJobViewRecord/renderJobViewRecord.vue new file mode 100644 index 0000000..111a610 --- /dev/null +++ b/components/renderJobViewRecord/renderJobViewRecord.vue @@ -0,0 +1,201 @@ + + + + + \ No newline at end of file diff --git a/components/renderJobs/renderJobs.vue b/components/renderJobs/renderJobs.vue index 1f67ae3..c2d0623 100644 --- a/components/renderJobs/renderJobs.vue +++ b/components/renderJobs/renderJobs.vue @@ -2,33 +2,33 @@ - {{ job.gwmc }} + {{ job.jobTitle }} - {{ job.gsmc }} + {{ job.gwmc }} - {{job.xlyq == '不限' ? '学历不限' : job.xlyq}} + - {{job.gwgzjy == '不限' ? '经验不限' : job.gwgzjy}} + - {{ vacanciesTo(job.zprs) }} + {{ vacanciesTo(job.vacancies) }} - {{ parseDateTime(job.createTime).date }} + {{ job.postingDate }} - + @@ -77,25 +77,7 @@ function nextDetail(job) { const recordData = recommedIndexDb.JobParameter(job); recommedIndexDb.addRecord(recordData); } - navTo(`/packageA/pages/post/post?jobId=${btoa(job.id)}`); -} -function parseDateTime(datetimeStr) { - if (!datetimeStr) return { time: '', date: '' }; - - const dateObj = new Date(datetimeStr); - - if (isNaN(dateObj.getTime())) return { time: '', date: '' }; // 无效时间 - - const year = dateObj.getFullYear(); - const month = String(dateObj.getMonth() + 1).padStart(2, '0'); - const day = String(dateObj.getDate()).padStart(2, '0'); - const hours = String(dateObj.getHours()).padStart(2, '0'); - const minutes = String(dateObj.getMinutes()).padStart(2, '0'); - - return { - time: `${hours}:${minutes}`, - date: `${year}-${month}-${day}`, - }; + navTo(`/packageA/pages/post/post?jobId=${btoa(job.jobId)}&dataType=1`); } diff --git a/components/renderJobsOutData/renderJobsOutData.vue b/components/renderJobsOutData/renderJobsOutData.vue new file mode 100644 index 0000000..ba50080 --- /dev/null +++ b/components/renderJobsOutData/renderJobsOutData.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/main.js b/main.js index 8ae9e2a..5255af7 100644 --- a/main.js +++ b/main.js @@ -12,6 +12,12 @@ import SelectPopup from '@/components/selectPopup/selectPopup.vue' import SelectPopupPlugin from '@/components/selectPopup/selectPopupPlugin'; import RenderJobs from '@/components/renderJobs/renderJobs.vue'; import RenderCompanys from '@/components/renderCompanys/renderCompanys.vue'; +import RenderJobsOutData from '@/components/renderJobsOutData/renderJobsOutData.vue'; +import RenderCompanysOutData from '@/components/renderCompanysOutData/renderCompanysOutData.vue'; +import renderDeliveryRecord from '@/components/renderDeliveryRecord/renderDeliveryRecord.vue'; +import renderJobCollectionRecord from '@/components/renderJobCollectionRecord/renderJobCollectionRecord.vue'; +import renderCompanyCollectionRecord from '@/components/renderCompanyCollectionRecord/renderCompanyCollectionRecord.vue'; +import renderJobViewRecord from '@/components/renderJobViewRecord/renderJobViewRecord.vue'; // import Tabbar from '@/components/tabbar/midell-box.vue' // 自动导入 directives 目录下所有指令 const directives = import.meta.glob('./directives/*.js', { @@ -36,6 +42,12 @@ export function createApp() { app.component('SelectPopup', SelectPopup) app.component('RenderJobs', RenderJobs) app.component('RenderCompanys', RenderCompanys) + app.component('RenderJobsOutData', RenderJobsOutData) //渲染外部岗位数据列表 + app.component('RenderCompanysOutData', RenderCompanysOutData) //渲染外部公司数据列表 + app.component('renderDeliveryRecord', renderDeliveryRecord) //渲染岗位投递记录 + app.component('renderJobCollectionRecord', renderJobCollectionRecord) //渲染岗位收藏记录 + app.component('renderCompanyCollectionRecord', renderCompanyCollectionRecord) //渲染公司收藏记录 + app.component('renderJobViewRecord', renderJobViewRecord) //渲染岗位浏览记录 // app.component('tabbar-custom', Tabbar) for (const path in directives) { diff --git a/packageA/pages/Intendedposition/Intendedposition.vue b/packageA/pages/Intendedposition/Intendedposition.vue index 1ed76e9..edc81c5 100644 --- a/packageA/pages/Intendedposition/Intendedposition.vue +++ b/packageA/pages/Intendedposition/Intendedposition.vue @@ -1,12 +1,12 @@ @@ -41,9 +41,7 @@ onReachBottom(() => { getJobList(); }); -function navToPost(jobId) { - navTo(`/packageA/pages/post/post?jobId=${btoa(jobId)}`); -} + function getJobList(type = 'add') { if (type === 'refresh') { diff --git a/packageA/pages/UnitDetails/UnitDetails.vue b/packageA/pages/UnitDetails/UnitDetails.vue index 1ebea1d..c9a1998 100644 --- a/packageA/pages/UnitDetails/UnitDetails.vue +++ b/packageA/pages/UnitDetails/UnitDetails.vue @@ -21,7 +21,7 @@ - {{ companyInfo?.gsmc }} + {{ dataType === 2 ? companyInfo?.gsmc : companyInfo?.name }}   - {{companyInfo.gsxy}} + {{ companyInfo.gsxy }} 公司介绍 - {{ companyInfo.qyxz }} - + {{ dataType === 2 ? companyInfo.qyxz : companyInfo.description }} {{ isExpanded ? '收起' : '展开' }} @@ -48,12 +46,18 @@ src="@/static/icon/downs.png" > - - + 在招职位 + + { console.log(options); - getCompanyInfo(options.companyId,options.companyName,options.zphId); + dataType.value = options.dataType ? parseInt(options.dataType) : 1; + pageOptions.value = options; + + if (dataType.value === 2) { + // 第三方数据 + getCompanyInfo(options.companyId, options.zphId); + getJobsList('refresh'); + } else { + // 原数据 + getCompanyInfo(options.companyId || options.bussinessId); + } }); function companyCollection() { - const companyId = companyInfo.value.gsID; - if (companyInfo.value.isCollection) { - $api.createRequest(`/app/company/collection/${companyId}`, {}, 'DELETE').then((resData) => { - // getCompanyInfo(companyId); - $api.msg('取消收藏成功'); + if (dataType.value === 2) { + // 第三方数据收藏逻辑 + const id = companyInfo.value.id; + const companyId = companyInfo.value.gsID; + const zphId = companyInfo.value.zphID; + if (companyInfo.value.isCollection) { + $api.createRequest(`/app/company/collection/${id}/2`, {}, 'DELETE').then((resData) => { + getCompanyInfo(companyId, zphId); + $api.msg('取消收藏成功'); + }); + } else { + $api.createRequest(`/app/company/collection/${id}/2`, {}, 'POST').then((resData) => { + getCompanyInfo(companyId, zphId); + $api.msg('收藏成功'); + }); + } + } else { + // 原数据收藏逻辑 + const companyId = companyInfo.value.companyId; + if (companyInfo.value.isCollection) { + $api.createRequest(`/app/company/collection/${companyId}`, {}, 'DELETE').then((resData) => { + getCompanyInfo(companyId); + $api.msg('取消收藏成功'); + }); + } else { + $api.createRequest(`/app/company/collection/${companyId}`, {}, 'POST').then((resData) => { + getCompanyInfo(companyId); + $api.msg('收藏成功'); + }); + } + } +} + +function getCompanyInfo(...args) { + if (dataType.value === 2) { + // 第三方数据接口 + const [companyId, zphId] = args; + $api.createRequest(`/app/internal/companyThirdPart/${companyId}/${zphId}`).then((resData) => { + companyInfo.value = resData.data; }); } else { - $api.createRequest(`/app/company/collection/${companyId}`, {}, 'POST').then((resData) => { - // getCompanyInfo(companyId); - $api.msg('收藏成功'); + // 原数据接口 + const [companyId] = args; + $api.createRequest(`/app/company/${companyId}`).then((resData) => { + companyInfo.value = resData.data; + getJobsList(); }); } } -function getCompanyInfo(companyId,companyName,zphId) { - $api.createRequest(`/app/internal/companyThirdPart/${companyId}/${zphId}`).then((resData) => { - companyInfo.value = resData.data; - getJobsList(companyId,companyName,zphId); +function getJobsList(type = 'add') { + if (dataType.value === 2) { + // 第三方数据职位列表 + getThirdPartyJobsList(type); + } else { + // 原数据职位列表 + getOriginalJobsList(type); + } +} + +function getThirdPartyJobsList(type = 'add') { + const { companyId, companyName, zphId } = pageOptions.value; + + if (type === 'refresh') { + pageState.current = 1; + pageState.maxPage = 1; + } + if (type === 'add' && pageState.current < pageState.maxPage) { + pageState.current += 1; + } + + let params = { + current: pageState.current, + pageSize: pageState.pageSize, + }; + + $api.createRequest(`/app/internal/jobThirdPart?gsID=${companyId}&gsmc=${companyName}&zphID=${zphId}`, params).then((resData) => { + const { rows, total } = resData; + handleJobsListResponse(type, rows, total, 'current'); }); } -function getJobsList(companyId,companyName,zphId,type='add') { +function getOriginalJobsList(type = 'add') { if (type === 'refresh') { pageState.page = 1; pageState.maxPage = 1; @@ -120,26 +198,31 @@ function getJobsList(companyId,companyName,zphId,type='add') { if (type === 'add' && pageState.page < pageState.maxPage) { pageState.page += 1; } + let params = { current: pageState.page, pageSize: pageState.pageSize, }; - $api.createRequest(`/app/internal/jobThirdPart?gsID=${companyId}&gsmc=${companyName}&zphID=${zphId}`, ).then((resData) => { + + $api.createRequest(`/app/company/job/${companyInfo.value.companyId}`, params).then((resData) => { const { rows, total } = resData; - if (type === 'add') { - // const str = pageState.pageSize * (pageState.page - 1); - // const end = pageState.list.length; - // const reslist = rows; - // pageState.list.splice(str, end, ...reslist); - pageState.list = rows - } else { - pageState.list = rows; - } - pageState.total = resData.total; - pageState.maxPage = Math.ceil(pageState.total / pageState.pageSize); + handleJobsListResponse(type, rows, total, 'page'); }); } +function handleJobsListResponse(type, rows, total, pageKey) { + if (type === 'add') { + const str = pageState.pageSize * (pageState[pageKey] - 1); + const end = pageState.list.length; + const reslist = rows; + pageState.list.splice(str, end, ...reslist); + } else { + pageState.list = rows; + } + pageState.total = total; + pageState.maxPage = Math.ceil(pageState.total / pageState.pageSize); +} + function expand() { isExpanded.value = !isExpanded.value; } @@ -177,7 +260,6 @@ image { margin-right: 24rpx } .companyinfo-right{ - .row1{ font-weight: 500; font-size: 32rpx; @@ -213,7 +295,7 @@ image { } } .expanded { - max-height: 1000rpx; // 足够显示完整内容 + max-height: 1000rpx; } .expand{ display: flex @@ -288,7 +370,7 @@ image { } .card-companyName{ font-weight: 400; - font-size: 28rpx; + font-size: 28rpx; color: #6C7282; } .card-tags{ @@ -320,4 +402,4 @@ image { } } } - + \ No newline at end of file diff --git a/packageA/pages/browseJob/browseJob.vue b/packageA/pages/browseJob/browseJob.vue index 3b2f8f0..0f9aa20 100644 --- a/packageA/pages/browseJob/browseJob.vue +++ b/packageA/pages/browseJob/browseJob.vue @@ -25,12 +25,12 @@ - + > @@ -88,9 +88,7 @@ function toSelectDate() { }); } -function navToPost(jobId) { - navTo(`/packageA/pages/post/post?jobId=${btoa(jobId)}`); -} + function searchCollection(e) { const value = e.detail.value; diff --git a/packageA/pages/collection/collection.vue b/packageA/pages/collection/collection.vue index 928dd70..d1204c9 100644 --- a/packageA/pages/collection/collection.vue +++ b/packageA/pages/collection/collection.vue @@ -15,12 +15,12 @@ - + :latitude="latitudeVal"> + @@ -28,12 +28,12 @@ - + > diff --git a/packageA/pages/exhibitors/exhibitors.vue b/packageA/pages/exhibitors/exhibitors.vue index 82a649b..171d0eb 100644 --- a/packageA/pages/exhibitors/exhibitors.vue +++ b/packageA/pages/exhibitors/exhibitors.vue @@ -69,18 +69,18 @@ src="@/static/icon/downs.png" > - + - 参会单位({{ companyList.length }}) + 参会单位({{ pageState.total }}) - + > @@ -111,13 +111,24 @@ const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore()); const isExpanded = ref(false); const fairInfo = ref({}); -const companyList = ref([]); + +const pageState = reactive({ + current: 0, + list: [], + total: 0, + maxPage: 1, + pageSize: 10, +}); const hasnext = ref(true); + const zphId = ref(''); +const pageOptions = ref({}) + onLoad((options) => { zphId.value = options.jobFairId + pageOptions.value = options getJobFairInfo(options.jobFairId, options.jobFairName); - getCompanyInfo(options.jobFairId, options.jobFairName); + getCompanyList('refresh'); }); function getJobFairInfo(id,name) { @@ -126,20 +137,43 @@ function getJobFairInfo(id,name) { hasAppointment(); }); } -function getCompanyInfo(id,name) { - $api.createRequest(`/app/internal/companyThirdPart/?zphID=${id}&zphmc=${name}`).then((resData) => { - companyList.value = resData.rows; +function getCompanyList(type='add') { + const { jobFairId,jobFairName} = pageOptions.value + if (type === 'refresh') { + pageState.current = 1; + pageState.maxPage = 1; + } + if (type === 'add' && pageState.current < pageState.maxPage) { + pageState.current += 1; + } + let params = { + current: pageState.current, + pageSize: pageState.pageSize, + }; + $api.createRequest(`/app/internal/companyThirdPart/?zphID=${jobFairId}&zphmc=${jobFairName}`,params ).then((resData) => { + const { rows, total } = resData; + if (type === 'add') { + const str = pageState.pageSize * (pageState.current - 1); + const end = pageState.list.length; + const reslist = rows; + pageState.list.splice(str, end, ...reslist); + } else { + pageState.list = rows; + } + pageState.total = resData.total; + pageState.maxPage = Math.ceil(pageState.total / pageState.pageSize); }); } const hasAppointment = () => { const isTimePassed = (timeStr) => { + if(!timeStr) return false const targetTime = new Date(timeStr.replace(/-/g, '/')).getTime(); // 兼容格式 const now = Date.now(); return now < targetTime; }; - hasnext.value = isTimePassed(fairInfo.value.startTime); + hasnext.value = isTimePassed(fairInfo.value.zphjbsj); }; function openMap(lat, lng, name = '位置') { @@ -157,16 +191,16 @@ function expand() { // 取消/收藏岗位 function applyExhibitors() { - const fairId = fairInfo.value.jobFairId; + const fairId = fairInfo.value.zphID; if (fairInfo.value.isCollection) { - // $api.createRequest(`/app/fair/collection/${fairId}`, {}, 'DELETE').then((resData) => { - // getCompanyInfo(fairId); - // $api.msg('取消预约成功'); - // }); + $api.createRequest(`/app/fair/collection/${fairId}`, {}, 'DELETE').then((resData) => { + getJobFairInfo(fairId); + $api.msg('取消预约成功'); + }); $api.msg('已预约成功'); } else { $api.createRequest(`/app/fair/collection/${fairId}`, {}, 'POST').then((resData) => { - getCompanyInfo(fairId); + getJobFairInfo(fairId); $api.msg('预约成功'); }); } diff --git a/packageA/pages/myResume/myResume.vue b/packageA/pages/myResume/myResume.vue index 2123cf4..78e47e4 100644 --- a/packageA/pages/myResume/myResume.vue +++ b/packageA/pages/myResume/myResume.vue @@ -5,6 +5,13 @@ + + + + {{userInfo.resumeOcrStatus}} + + + { getUserResume(); }); +function closeNotice() { + showNotice.value=false +} + function chooseResume() { uni.chooseImage({ sizeType: ["original", "compressed"], @@ -254,6 +266,36 @@ function uploadResume(tempFilePath, loading) { text-align: center; } } + +.notice-line + width 100%; + height:60rpx; + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + padding:0 30rpx + margin-bottom: 20rpx + .icon + width:35rpx; + height:35rpx; + .text + flex: 1; + overflow hidden + padding:0 25rpx + .close + width:25rpx; + height:25rpx; + +.notice-line.blue{ + background: #E8F1FF + color: #1677ff +} +.notice-line.green{ + background: #D4FFF1 + color: #38bb8f +} + image{ width: 100%; height: 100% diff --git a/packageA/pages/post/post.vue b/packageA/pages/post/post.vue index d593bae..92f3818 100644 --- a/packageA/pages/post/post.vue +++ b/packageA/pages/post/post.vue @@ -6,45 +6,59 @@ + + + - + - {{ jobInfo.gwmc }} + + + + {{ dataType === 2 ? jobInfo.gwmc : jobInfo.jobTitle }} - - + + {{jobInfo.xlyq == '不限' ? '学历不限' : jobInfo.xlyq}} + + + + + - - + + {{jobInfo.gwgzjy == '不限' ? '经验不限' : jobInfo.gwgzjy}} + + + + 来源  - 青岛人才网 + {{ dataType === 2 ? '青岛人才网' : jobInfo.dataSource }} + + @@ -54,20 +68,24 @@ 点击查看 + + 职位描述 - {{ jobInfo.gwms }} + {{ dataType === 2 ? jobInfo.gwms : jobInfo.description }} + + 公司信息 单位详情 @@ -77,16 +95,20 @@ - {{ jobInfo.gsmc }} + {{ dataType === 2 ? jobInfo.gsmc : jobInfo.company?.name }} -   - - {{jobInfo.qyxz}} +   + + {{jobInfo.qyxz}} 在招 @@ -104,7 +126,9 @@ > - + + + 竞争力分析 @@ -132,11 +156,15 @@ + + @@ -150,8 +178,10 @@ import { reactive, inject, watch, ref, onMounted, computed } from 'vue'; import { onLoad, onShow, onHide } from '@dcloudio/uni-app'; import dictLabel from '@/components/dict-Label/dict-Label.vue'; import RadarMap from './component/radarMap.vue'; + const { $api, navTo, getLenPx, parseQueryParams, navBack, isEmptyObject } = inject('globalFunction'); import config from '@/config.js'; + const matchingDegree = ref(['一般', '良好', '优秀', '极好']); const currentStep = ref(1); const companyCount = ref(0); @@ -162,9 +192,11 @@ const jobIdRef = ref(); const raderData = ref({}); const videoPalyerRef = ref(null); const explainUrlRef = ref(''); +const dataType = ref(1); // 1: 原数据, 2: 第三方数据 onLoad((option) => { if (option.jobId) { + dataType.value = option.dataType ? parseInt(option.dataType) : 1; initLoad(option); } }); @@ -172,6 +204,7 @@ onLoad((option) => { onShow(() => { const option = parseQueryParams(); // 兼容微信内置浏览器 if (option.jobId) { + dataType.value = option.dataType ? parseInt(option.dataType) : 1; initLoad(option); } }); @@ -187,92 +220,165 @@ function initLoad(option) { function seeExplain() { if (jobInfo.value.explainUrl) { videoPalyerRef.value?.open(jobInfo.value.explainUrl); - // console.log(jobInfo.value.explainUrl); - // explainUrlRef.value = jobInfo.value.explainUrl; } } function getDetail(jobId) { - return new Promise((reslove, reject) => { - $api.createRequest(`/app/internal/jobThirdPart/${jobId}`).then((resData) => { - const { gsID, gsmc, zphID} = resData.data; + if (dataType.value === 2) { + // 第三方数据接口 + return new Promise((reslove, reject) => { + $api.createRequest(`/app/internal/jobThirdPart/${jobId}`).then((resData) => { + const { gsID, gsmc, zphID } = resData.data; + jobInfo.value = resData.data; + reslove(resData.data); + getCompanyIsAJobs(gsID, gsmc, zphID); + + if (resData.data.latitude && resData.data.longitude) { + initMapCovers(resData.data.latitude, resData.data.longitude, resData.data.gsmc); + } + }); + }); + } else { + // 原数据接口 + $api.createRequest(`/app/job/${jobId}`).then((resData) => { + const { latitude, longitude, companyName, companyId } = resData.data; jobInfo.value = resData.data; - reslove(resData.data); - getCompanyIsAJobs(gsID, gsmc, zphID); - // getCompetivetuveness(jobId); - return + getCompanyIsAJobs(companyId); + getCompetivetuveness(jobId); + if (latitude && longitude) { - mapCovers.value = [ - { - latitude: latitude, - longitude: longitude, - iconPath: point, - label: { - content: companyName, - textAlign: 'center', - padding: 3, - fontSize: 12, - bgColor: '#FFFFFF', - anchorX: getTextWidth(companyName), // X 轴调整,负数向左 - borderRadius: 5, - }, - width: 34, - }, - ]; + initMapCovers(latitude, longitude, companyName); } }); - }); + } } -function getCompanyIsAJobs(gsID, gsmc, zphID) { - $api.createRequest(`/app/internal/jobThirdPart?gsID=${gsID}&gsmc=${gsmc}&zphID=${zphID}`).then((resData) => { - companyCount.value = resData.total; - }); +function initMapCovers(latitude, longitude, companyName) { + mapCovers.value = [ + { + latitude: latitude, + longitude: longitude, + iconPath: point, + label: { + content: companyName, + textAlign: 'center', + padding: 3, + fontSize: 12, + bgColor: '#FFFFFF', + anchorX: getTextWidth(companyName), + borderRadius: 5, + }, + width: 34, + }, + ]; +} + +function getCompanyIsAJobs(...args) { + if (dataType.value === 2) { + // 第三方数据获取公司职位数量 + const [gsID, gsmc, zphID] = args; + $api.createRequest(`/app/internal/jobThirdPart?gsID=${gsID}&gsmc=${gsmc}&zphID=${zphID}`).then((resData) => { + companyCount.value = resData.total; + }); + } else { + // 原数据获取公司职位数量 + const [companyId] = args; + $api.createRequest(`/app/company/count/${companyId}`).then((resData) => { + companyCount.value = resData.data; + }); + } } function getTextWidth(text, size = 12) { const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); context.font = `${12}px Arial`; - return -(context.measureText(text).width / 2) - 20; // 计算文字中心点 + return -(context.measureText(text).width / 2) - 20; } function getCompetivetuveness(jobId) { - $api.createRequest(`/app/job/competitiveness/${jobId}`, {}, 'GET').then((resData) => { - raderData.value = resData.data; - currentStep.value = resData.data.matchScore * 0.04; - }); + if (dataType.value !== 2) { + $api.createRequest(`/app/job/competitiveness/${jobId}`, {}, 'GET').then((resData) => { + raderData.value = resData.data; + currentStep.value = resData.data.matchScore * 0.04; + }); + } } // 申请岗位 function jobApply() { - const jobId = jobInfo.value.id; - if (jobInfo.value.isApply) { - const jobUrl = jobInfo.value.jobUrl; - return window.open(jobUrl); - } else { - $api.createRequest(`/app/job/apply/${jobId}`, {}, 'GET').then((resData) => { - getDetail(jobId); - $api.msg('申请成功'); + if (dataType.value === 2) { + $api.msg('敬请期待'); + return + // 第三方数据申请逻辑 + const jobId = jobInfo.value.id; + if (jobInfo.value.isApply) { const jobUrl = jobInfo.value.jobUrl; return window.open(jobUrl); - }); + } else { + $api.createRequest(`/app/job/apply/${jobId}`, {}, 'GET').then((resData) => { + getDetail(jobIdRef.value); + $api.msg('投递成功'); + const jobUrl = jobInfo.value.jobUrl; + return window.open(jobUrl); + }); + } + } else { + // 原数据申请逻辑 + const jobId = jobInfo.value.jobId; + if (jobInfo.value.isApply) { + const jobUrl = jobInfo.value.jobUrl; + return window.open(jobUrl); + } else { + $api.createRequest(`/app/job/apply/${jobId}`, {}, 'GET').then((resData) => { + getDetail(jobId); + $api.msg('申请成功'); + const jobUrl = jobInfo.value.jobUrl; + return window.open(jobUrl); + }); + } } } // 取消/收藏岗位 function jobCollection() { - const jobId = jobInfo.value.jobId; - if (jobInfo.value.isCollection) { - $api.createRequest(`/app/job/collection/${jobId}`, {}, 'DELETE').then((resData) => { - getDetail(jobId); - $api.msg('取消收藏成功'); - }); + if (dataType.value === 2) { + // 第三方数据收藏逻辑 + const id = jobInfo.value.id; + if (jobInfo.value.isCollection) { + $api.createRequest(`/app/job/collection/${id}/2`, {}, 'DELETE').then((resData) => { + getDetail(jobIdRef.value); + $api.msg('取消收藏成功'); + }); + } else { + $api.createRequest(`/app/job/collection/${id}/2`, {}, 'POST').then((resData) => { + getDetail(jobIdRef.value); + $api.msg('收藏成功'); + }); + } } else { - $api.createRequest(`/app/job/collection/${jobId}`, {}, 'POST').then((resData) => { - getDetail(jobId); - $api.msg('收藏成功'); - }); + // 原数据收藏逻辑 + const jobId = jobInfo.value.jobId; + if (jobInfo.value.isCollection) { + $api.createRequest(`/app/job/collection/${jobId}`, {}, 'DELETE').then((resData) => { + getDetail(jobId); + $api.msg('取消收藏成功'); + }); + } else { + $api.createRequest(`/app/job/collection/${jobId}`, {}, 'POST').then((resData) => { + getDetail(jobId); + $api.msg('收藏成功'); + }); + } + } +} + +// 处理公司详情跳转 +function handleCompanyDetail() { + if (dataType.value === 2) { + navTo(`/packageA/pages/UnitDetails/UnitDetails?companyId=${jobInfo.value.gsID}&companyName=${jobInfo.value.gsmc}&zphId=${jobInfo.value.zphID}&dataType=2`); + } else { + navTo(`/packageA/pages/UnitDetails/UnitDetails?companyId=${jobInfo.value.company.companyId}`); } } @@ -293,6 +399,7 @@ function getClass(index) { + \ No newline at end of file diff --git a/packageA/pages/reservation/reservation.vue b/packageA/pages/reservation/reservation.vue index 313a73d..89bf7c7 100644 --- a/packageA/pages/reservation/reservation.vue +++ b/packageA/pages/reservation/reservation.vue @@ -15,24 +15,24 @@ - + - + - {{ item.name }} + {{ item.zphmc }} - {{ item.location }} - - {{ item.zphdz }} + + - + 取消预约 @@ -72,6 +72,7 @@ const ranOptions = ref([ ]); function isTimePassed(timeStr) { + if(!timeStr) return false const targetTime = new Date(timeStr.replace(/-/g, '/')).getTime(); // 兼容格式 const now = Date.now(); return now < targetTime; @@ -88,11 +89,22 @@ function chnageRanOption(item) { } function updateCancel(item) { - const fairId = item.jobFairId; - $api.createRequest(`/app/fair/collection/${fairId}`, {}, 'DELETE').then((resData) => { - getList('refresh'); - $api.msg('取消预约成功'); - }); + const fairId = item.zphID; + uni.showModal({ + title: '提示', + content: '确定要取消预约吗?', + showCancel: true, + success: ({ confirm, cancel }) => { + if(confirm){ + $api.createRequest(`/app/fair/collection/${fairId}`, {}, 'DELETE').then((resData) => { + getList('refresh'); + $api.msg('取消预约成功'); + }); + } + } + }) + + } function getList(type = 'add', loading = true) { @@ -166,6 +178,7 @@ function getList(type = 'add', loading = true) { display: flex align-items: center } + } .card-Title{ font-family: 'PingFangSC-Medium', 'PingFang SC', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', sans-serif; diff --git a/static/icon/close-blue.png b/static/icon/close-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..024fd7b22a7435a5fd3ce6deaa15c1b7bc8c9860 GIT binary patch literal 2686 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 literal 0 HcmV?d00001 diff --git a/static/icon/notice-blue.png b/static/icon/notice-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..373531acf0aed991782c24d4a27c48bf70ad0af8 GIT binary patch literal 3830 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 IF+LIhe*yxg;Q#;t literal 0 HcmV?d00001 diff --git a/static/icon/notice-green.png b/static/icon/notice-green.png new file mode 100644 index 0000000000000000000000000000000000000000..d335ce5a8f01cc8fc03cc3245d693ca879dad9b5 GIT binary patch literal 3888 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