Commit 95b762d1 authored by 李明环(东信)'s avatar 李明环(东信)

完善推荐页面

parent fcbe0593
...@@ -9,3 +9,5 @@ export const getTreeListApi = params => instance.postForm("/dict/dictProvinceCit ...@@ -9,3 +9,5 @@ export const getTreeListApi = params => instance.postForm("/dict/dictProvinceCit
export const dictJobTypeApi = params => instance.post("/dict/dictJobType/getTree", params); export const dictJobTypeApi = params => instance.post("/dict/dictJobType/getTree", params);
// 获取岗位列表类型(1职位,2政策,3动态) // 获取岗位列表类型(1职位,2政策,3动态)
export const getBannerListApi = type => instance.post(`/banner/list/${type}`); export const getBannerListApi = type => instance.post(`/banner/list/${type}`);
//更具code码获取城市名称
export const getCityNameByCodeApi = code => instance.post(`/dict/dictProvinceCityDistrict/find/city/${code}`);
...@@ -9,26 +9,38 @@ export const updateJobApi = params => instance.post("/b/position/update", params ...@@ -9,26 +9,38 @@ export const updateJobApi = params => instance.post("/b/position/update", params
// 职位列表 // 职位列表
export const getJobListApi = params => instance.post("/company/job/list", params); export const getJobListApi = params => instance.post("/company/job/list", params);
// 获取简历推荐列表 // 获取推荐简历列表
export const getResumeRecommendListApi = params => instance.post("/company/job/getResumeRecommendList", params); export const getRecommendedResumeListApi = params => instance.post("/position/resume/recommend/list", params);
// 已投递简历列表
export const getResumeByUserId = userId => instance.post(`/position/resume/detail/${userId}`);
// 更具用户id查询简历
export const getApplicationListApi = params => instance.post("/position/application/list", params);
// 查询职位信息 // 查询职位信息
export const getJobByIdApi = id => instance.post(`/b/position/${id}`); export const getJobByIdApi = id => instance.post(`/b/position/${id}`);
// 统计职位投递信息 // 统计职位投递信息
export const getListStatisticsApi = params => instance.post("/b/position/statistics", params); export const getListStatisticsApi = params => instance.post("/b/position/statistics", params);
// 职位列表统计
export const getPositionListApi = params => instance.post("/b/position/list", params);
//获取投递信息通过id //获取投递信息通过id
export const getApplicationByIdApi = id => instance.post(`/company/job/getApplication/${id}`); export const getApplicationByIdApi = id => instance.post(`/position/application/${id}`);
//邀请面试 //邀请面试
export const inviteInterviewApi = params => instance.post(`/company/job/inviteInterview`, params); export const inviteInterviewApi = params => instance.post(`/position/application/interview`, params);
//获取投递列表/ //获取投递列表/
export const getApplicationListApi = params => instance.post("/company/job/getApplicationList", params); // export const getApplicationListApi = params => instance.post("/company/job/getApplicationList", params);
//获取投递列表 //获取投递列表
export const getUserResumeApi = params => instance.post(`/company/job/getUserResume`, params); // export const getUserResumeApi = params => instance.post(`/company/job/getUserResume`, params);
export const getUserResumeApi = id => instance.post(`/position/resume/detail/${id}`);
// 获取职位详情
export const getUserResumeByApplicationIdApi = id => instance.post(`/position/application/resume/${id}`);
// 职位发布(上线) // 职位发布(上线)
export const jobReleaseApi = id => instance.post(`/b/position/release/${id}`); export const jobReleaseApi = id => instance.post(`/b/position/release/${id}`);
...@@ -41,4 +53,7 @@ export const jobOfftopApi = id => instance.post(`/b/position/top/${id}`); ...@@ -41,4 +53,7 @@ export const jobOfftopApi = id => instance.post(`/b/position/top/${id}`);
export const jobOffuntopApi = id => instance.post(`/b/position/untop/${id}`); export const jobOffuntopApi = id => instance.post(`/b/position/untop/${id}`);
// 拒绝申请 // 拒绝申请
export const rejectApplicationApi = id => instance.post(`/company/job/rejectApplication/${id}`); export const rejectApplicationApi = id => instance.post(`/position/application/reject/${id}`);
// 拒绝推荐
export const resumeInappropriateApi = params => instance.post(`/position/resume/inappropriate`, params);
<template> <template>
<div class="filter"> <div class="filter" id="filter">
<div class="menu"> <div class="menu">
<p v-for="v in menuList" :class="{ active: v.active }" :key="v.name" @click="onClickMenu(v)">{{ v.name }}</p> <p v-for="v in menuList" :class="{ active: v.active }" :key="v.name" @click="onClickMenu(v)">{{ v.name }}</p>
</div> </div>
...@@ -90,7 +90,7 @@ const menuList = ref([]); ...@@ -90,7 +90,7 @@ const menuList = ref([]);
const onClickMenu = data => { const onClickMenu = data => {
menuList.value.forEach(v => (v.active = false)); menuList.value.forEach(v => (v.active = false));
data.active = true; data.active = true;
document.querySelector(".filter").querySelector(`.${data.className}`).scrollIntoView(); document.querySelector("#filter").querySelector(`.${data.className}`).scrollIntoView();
}; };
// 学历 // 学历
const educationList = ref([]); const educationList = ref([]);
...@@ -184,19 +184,18 @@ const onCancel = () => { ...@@ -184,19 +184,18 @@ const onCancel = () => {
}; };
// 1. 确认 接收数据 // 1. 确认 接收数据
const onConfirm = () => { const onConfirm = () => {
console.log( const [minAge, maxAge] = age.value;
educationList.value.find(v => v.active), const { min: minWorkYear, max: maxWorkYear } = workYearList.value.find(v => v.active) || { min: 0, max: 100 };
genderList.value.find(v => v.active), const education = educationList.value.find(v => v.active)?.code;
workYearList.value.find(v => v.active), const jobType = dictJobTypeList.value.find(v => v.active)?.id;
dictJobTypeList.value.find(v => v.active) const sex = genderList.value.find(v => v.active)?.code;
); emit("confirm", { minAge, maxAge, minWorkYear, maxWorkYear, education, jobType, sex });
emit("confirm");
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.filter { .filter {
position: absolute; position: fixed;
inset: 0; inset: 0;
z-index: 66666666; z-index: 66666666;
display: flex; display: flex;
...@@ -290,6 +289,7 @@ const onConfirm = () => { ...@@ -290,6 +289,7 @@ const onConfirm = () => {
width: 100%; width: 100%;
padding: 16rpx 64rpx; padding: 16rpx 64rpx;
background-color: #ffffff; background-color: #ffffff;
border-top: 1px solid #dae4e7;
button { button {
display: flex; display: flex;
align-items: center; align-items: center;
......
<template> <template>
<div> <div>
<view bind:tap="jumpResumeDetail" @click="jumpResumeDetail"> <view @click="jumpResumeDetail">
<view class="info felx-between"> <view class="info felx-between">
<view class="text-wrap"> <view class="text-wrap">
<view class="name"> {{ data.realName }} <text>· 今日活跃</text> </view> <view class="name">
<view class="other"> {{ data.workExperience }}年 | {{ educationLevelText }}{{ data.salary }} </view> {{ data.name || "名字" }}
<!-- <text>· 今日活跃</text> -->
</view>
<view class="other">
{{ data.workAge }}年 | {{ educationLevelText }}{{ data.minSalary + "~" + data.maxSalary }}
</view> </view>
<image v-if="data.avatarPath" :src="evn.APP_IMAGE_BASE_API + data.avatarPath" mode="" />
<image v-else src="@/static/image/user/default-avatar.png" mode="" />
</view> </view>
<view class="education" v-if="educationExperience"> <image v-if="data.avatar" :src="evn.APP_IMAGE_BASE_API + data.avatar" mode="" />
{{ educationExperience ? educationExperience.schoolName : null }}·{{ <image v-else src="@/static/image/user/default-avatar.png" mode="" />
educationExperience ? educationExperience.major : null
}}
</view> </view>
<view class="education"> {{ data.schoolName || "无" }}·{{ data.major || "无" }} </view>
<view class="introduce"> <view class="introduce">
{{ data.personalAdvantage }} {{ data.personalAdvantages }}
</view> </view>
</view> </view>
</div> </div>
...@@ -26,40 +27,23 @@ import { defineProps, computed } from "vue"; ...@@ -26,40 +27,23 @@ import { defineProps, computed } from "vue";
import evn from "@/utils/config"; import evn from "@/utils/config";
import { getEnumText } from "@/utils/utils"; import { getEnumText } from "@/utils/utils";
import { useAsync } from "@/hooks/useAsync"; import { useAsync } from "@/hooks/useAsync";
let { data, jobId, type } = defineProps({ let { data, type } = defineProps({
data: { data: {
type: Object, type: Object,
default: () => ({}) default: () => ({})
}, },
jobId: {
type: String,
default: () => ""
},
type: { type: {
type: String, type: String,
default: () => "recommend" default: () => "recommend"
} }
}); });
const { data: educationLevelText } = useAsync(getEnumText("EnumEducation", data.educationLevel)); console.log(data);
console.log("data", data); const { data: educationLevelText } = useAsync(getEnumText("EnumEducation", data.education));
const educationExperience = computed(() => {
if (data.educationLevel) {
return JSON.parse(data?.educationExperience)[0] || {};
} else {
return null;
}
});
const jumpResumeDetail = () => { const jumpResumeDetail = () => {
console.log("data", data); console.log("data.positionId", data.positionId);
if (type == "recommend") {
jobId = data.jobId;
}
uni.navigateTo({ uni.navigateTo({
url: `/pages/user/resume/index?jobId=${jobId}&userId=${data.userId}&applicationId=${data.applicationId}&type=${type}` url: `/pages/user/resume/index?jobId=${data.positionId}&userId=${data.userId}&applicationId=${data.id}&type=${type}`
}); });
}; };
</script> </script>
......
...@@ -78,6 +78,7 @@ const list = ref([]); ...@@ -78,6 +78,7 @@ const list = ref([]);
let flag = true; let flag = true;
const getApplicationList = () => { const getApplicationList = () => {
if (!flag) return; if (!flag) return;
uni.showLoading({ title: "加载中..." });
getApplicationListApi(apiParams).then(res => { getApplicationListApi(apiParams).then(res => {
if (res.data?.length && flag) { if (res.data?.length && flag) {
list.value.push(...res.data); list.value.push(...res.data);
...@@ -85,6 +86,7 @@ const getApplicationList = () => { ...@@ -85,6 +86,7 @@ const getApplicationList = () => {
} else { } else {
flag = false; flag = false;
} }
uni.hideLoading();
}); });
}; };
</script> </script>
...@@ -122,10 +124,10 @@ scroll-view { ...@@ -122,10 +124,10 @@ scroll-view {
flex-grow: 1; flex-grow: 1;
height: 100%; height: 100%;
.item { .item {
padding: 16rpx 32rpx;
margin-top: 16rpx; margin-top: 16rpx;
background: #fff; background: #ffffff;
border-bottom: 16rpx solid #f3f4f8; border-bottom: 16rpx solid #f3f4f8;
padding: 16rpx 32rpx;
} }
} }
</style> </style>
<template> <template>
<div class="page"> <div class="page">
<NavBar :showIcon="false" :showTitle="true" title="推荐"></NavBar> <NavBar :showIcon="false" :showTitle="true" title="推荐"></NavBar>
<view class="tabs" :style="{ position: sticky, top: contentHeight }"> <view class="tabs" :style="{ top: contentHeight }">
<text @tap="changeActiveTab('求职推荐')" :class="activeTab == '求职推荐' ? 'active' : ''">求职推荐</text> <text @tap="changeActiveTab('求职推荐')" :class="activeTab == '求职推荐' ? 'active' : ''">求职推荐</text>
<text @tap="changeActiveTab('职位管理')" :class="activeTab == '职位管理' ? 'active' : ''">职位管理</text> <text @tap="changeActiveTab('个人投递')" :class="activeTab == '个人投递' ? 'active' : ''">个人投递</text>
</view> </view>
<view class="wrap"> <view class="wrap">
<view class="recommend" v-if="activeTab == '求职推荐'"> <view class="recommend">
<view class="filter flex-between"> <!-- 筛选 -->
<view class="filter flex-between" v-show="activeTab == '求职推荐'">
<view class="filter-opstion"> <view class="filter-opstion">
<view class="t1">按以下职位推荐</view> <view class="t1">按以下职位推荐</view>
<wd-picker <wd-picker
:columns="jobListColumns" :columns="jobListColumns"
label="单列选项" value-key="id"
value-key="jobType" label-key="name"
label-key="jobTypeText" v-model="getResumeRecommendListParams.positionId"
v-model="getApplicationListParams.jobType" @confirm="positionConfirm"
@confirm="handleConfirm"
use-default-slot use-default-slot
> >
<view class="t2">{{ jobTypeText || "全部" }}</view> <view class="t2">{{ jobTypeText || "全部" }}</view>
...@@ -48,112 +48,17 @@ ...@@ -48,112 +48,17 @@
scroll-y="true" scroll-y="true"
@scrolltolower="getResumeRecommendList" @scrolltolower="getResumeRecommendList"
> >
<div class="other-view" v-if="showOtherFilter" @click="showOtherFilter = false"> <view class="item" v-for="(v, i) in applicationList" :key="v.userId + v.positionId + v.id">
<div class="wrapper" @click.stop> <jobSeekersCard :data="v" :type="'application'" />
<div class="other-view-item">
<p class="label">工作年限</p>
<wd-slider v-model="workExperienceValue" />
</div>
<div class="other-view-item">
<p class="label">学历要求</p>
<div class="select-list">
<p
class="select-item"
:class="{ active: v.code == activeEducation }"
@click="changeType(v)"
v-for="v in EnumEducationRequirement"
:key="v.code"
>
{{ v.text }}
</p>
</div>
</div>
<div class="other-view-item">
<p class="label">年龄要求</p>
<wd-slider v-model="ageValue" />
</div>
<div class="other-view-item button-wrap">
<div class="reset" @click="resetFilter">重置</div>
<div class="confirm" @click="confirmFilter">完成</div>
</div>
</div>
</div>
<view class="item" v-for="v in applicationList" :key="v.applicationId">
<jobSeekersCard :data="v" :jobId="myJobId" :type="'application'" />
</view> </view>
<wd-status-tip v-if="!applicationList || !applicationList.length" image="content" tip="暂无内容" /> <wd-status-tip v-if="!applicationList || !applicationList.length" image="content" tip="暂无内容" />
</scroll-view> </scroll-view>
</view> </view>
<view class="management" v-if="activeTab == '职位管理'">
<view class="filter flex-between">
<!-- <view class="item" :class="{ active: activeTopFilter == '' }" @click="filterJobList('')">全部职位</view> -->
<view
class="item"
:class="{ active: activeTopFilter === v.code }"
v-for="v in topFilter"
:key="v.code"
@click="filterJobList(v.code)"
>{{ v.text }}</view
>
</view>
<scroll-view class="management-list" :scroll-y="true">
<view class="item" v-for="(v, i) in jobList" :key="i">
<view class="flex-between">
<view class="info">
<view class="name">{{ v.jobName }}</view>
<view class="other"> {{ v.cityName }}{{ v.workModeText }}{{ v.jobTypeText }} </view>
</view>
<view class="state" :class="`style${v.status}`"> {{ v.statusText }} </view>
</view>
<view class="data flex-between">
<view bind:tap="jumpDeliveryManagement" @click="jumpDeliveryManagement(v.id, '0')">
<view class="t1">{{ v.pendingNum || 0 }}</view>
<view class="t2">新投递</view>
</view>
<view bind:tap="jumpDeliveryManagement" @click="jumpDeliveryManagement(v.id, '2')">
<view class="t1">{{ v.interviewNum || 0 }}</view>
<view class="t2">待面试</view>
</view>
<view bind:tap="jumpDeliveryManagement" @click="jumpDeliveryManagement(v.id, '')">
<view class="t1">{{ v.totalNum || 0 }}</view>
<view class="t2">总投递</view>
</view>
</view>
<view class="btn-list flex-between">
<view class="flex-center" @click="jobOffuntopApiFn(v)" v-if="v.top == 1">
<image src="@/static/image/icon/cancelUpload.png" mode="" />
取消置顶
</view>
<view class="flex-center" @click="jobOfftopApiFn(v)" v-else>
<image class="top" src="@/static/image/icon/top.png" mode="" />
置顶
</view>
<view class="flex-center" @click="getJobList(activeTopFilter)">
<image src="@/static/image/icon/refresh.png" mode="" />
刷新
</view>
<view class="flex-center" @click="switchJobStatus(v)">
<image :class="{ rotate: v.status != 3 }" src="@/static/image/icon/download.png" mode="" />
{{ v.status == 3 ? "下线" : "上线" }}
</view>
<view class="flex-center" @click="editJob(v)">
<image src="@/static/image/icon/edit.png" mode="" />
编辑
</view>
</view>
</view>
<wd-status-tip v-if="!jobList.length" image="content" tip="暂无内容" />
</scroll-view>
</view>
<view class="release-postion" @tap="releasePostion"> 发布 </view>
<!-- <wd-fab :draggable="true">
</wd-fab> -->
</view> </view>
<!-- 筛选弹窗 -->
<Filter v-show="showOtherFilter" @confirm="filterConfirm" @cancel="showOtherFilter = false" />
</div> </div>
</template> </template>
<script setup> <script setup>
/*"code": "0", /*"code": "0",
"text": "待审核", "text": "待审核",
...@@ -167,85 +72,48 @@ ...@@ -167,85 +72,48 @@
"text": "下线", */ "text": "下线", */
import { ref } from "vue"; import { ref } from "vue";
import jobSeekersCard from "@/components/jobSeekersCard/index.vue"; import jobSeekersCard from "@/components/jobSeekersCard/index.vue";
import { import { getJobListApi, getApplicationListApi, getRecommendedResumeListApi, getPositionListApi } from "@/api/postion";
getJobListApi,
getResumeRecommendListApi,
getListStatisticsApi,
jobReleaseApi,
jobOfflineApi,
getJobByIdApi,
jobOfftopApi,
jobOffuntopApi
} from "@/api/postion";
import { getTreeListApi } from "@/api/common"; import { getTreeListApi } from "@/api/common";
import { getEumData, getEnumText } from "@/utils/utils"; import { getEumData, getEnumText } from "@/utils/utils";
import { useAsync } from "@/hooks/useAsync"; import { useAsync } from "@/hooks/useAsync";
import _ from "lodash"; import _ from "lodash";
import { useReleasePostionStore } from "./releasePostion/store"; import Filter from "@/components/filter/index.vue";
/* tab */ /* tab */
const contentHeight = ref("100rpx"); const contentHeight = ref("100rpx");
const pinias = useReleasePostionStore();
const activeTab = ref("求职推荐"); const activeTab = ref("求职推荐");
const changeActiveTab = tab => { const changeActiveTab = tab => {
activeTab.value = tab; activeTab.value = tab;
getTopFilter(); resetParams();
getJobList(activeTopFilter.value); getResumeRecommendList();
getJobListApiFn(); /* getTopFilter();
getJobListApiFn(); */
}; };
let refresherEnabled = ref(true); let refresherEnabled = ref(true);
/* 获取职位列表 */ /* 获取职位列表 */
const jobListColumns = ref([]); const jobListColumns = ref([]);
const jobTypeText = ref(""); const positionConfirm = ({ selectedItems }) => {
const handleConfirm = ({ selectedItems, value }) => { jobTypeText.value = selectedItems.name;
myJobId.value = selectedItems.id; resetPageParams();
jobTypeText.value = selectedItems.jobTypeText;
refresh().then(() => {
getResumeRecommendList(); getResumeRecommendList();
});
}; };
const myJobId = ref("");
function changeType(v) {
activeEducation.value = v.code;
myJobId.value = v.id;
getResumeRecommendList();
}
function fresherrefresh() {
refresherEnabled.value = true;
refresh().then(() => {
getResumeRecommendList();
});
}
function getJobListApiFn() { function getJobListApiFn() {
getJobListApi().then(res => { getPositionListApi({ status: 3 }).then(res => {
if (res.code == 200) { if (res.code == 200) {
jobListColumns.value = res.data; jobListColumns.value = res.data;
console.log(res.data[0].jobType);
// 初始化选择器
getApplicationListParams.value.jobType = res.data[0].jobType;
jobTypeText.value = res.data[0].jobTypeText;
// 获取推荐列表
getResumeRecommendList();
} }
}); });
} }
function jobOfftopApiFn(v) { getJobListApiFn();
jobOfftopApi(v.id).then(res => { const jobTypeText = ref("");
if (res.code == 200) { function fresherrefresh() {
getJobList(activeTopFilter.value); refresherEnabled.value = true;
} refresh().then(() => {
}); getResumeRecommendList();
}
function jobOffuntopApiFn(v) {
jobOffuntopApi(v.id).then(res => {
if (res.code == 200) {
getJobList(activeTopFilter.value);
}
}); });
} }
/* 获取推荐 */ // 数据列表
const applicationList = ref([]); const applicationList = ref([]);
/* 投递接口参数 */
const getApplicationListParams = ref({ const getApplicationListParams = ref({
jobType: "", jobType: "",
provinceCode: "", provinceCode: "",
...@@ -255,23 +123,76 @@ const getApplicationListParams = ref({ ...@@ -255,23 +123,76 @@ const getApplicationListParams = ref({
maxWorkYear: "", maxWorkYear: "",
education: "", education: "",
minAge: "", minAge: "",
isEnd: false,
maxAge: "", maxAge: "",
pageNo: 1, pageNo: 1,
pageSize: 10 pageSize: 10
}); });
const careerList = ref([]); /* 获取推荐简历列表接口参数 */
const getResumeRecommendListParams = ref({
recommend: true,
positionId: "",
sex: "",
jobType: "",
provinceCode: "",
cityCode: "",
districtCode: "",
education: "",
minAge: "",
maxAge: "",
minWorkAge: "",
maxWorkAge: "",
pageNo: 1,
pageSize: 10
});
const isEnd = ref(false);
const refresh = () => { const resetParams = () => {
return new Promise((resolve, reject) => {
applicationList.value = []; applicationList.value = [];
getApplicationListParams.value = {
jobType: "",
provinceCode: "",
cityCode: "",
districtCode: "",
minWorkYear: "",
maxWorkYear: "",
education: "",
minAge: "",
maxAge: "",
pageNo: 1,
pageSize: 10
};
getResumeRecommendListParams.value = {
recommend: true,
positionId: "",
sex: "",
jobType: "",
provinceCode: "",
cityCode: "",
districtCode: "",
education: "",
minAge: "",
maxAge: "",
minWorkAge: "",
maxWorkAge: "",
pageNo: 1,
pageSize: 10
};
};
const resetPageParams = () => {
applicationList.value = [];
isEnd.value = false;
getResumeRecommendListParams.value.pageNo = 1;
getApplicationListParams.value.pageNo = 1; getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.isEnd = false; };
const refresh = () => {
return new Promise((resolve, reject) => {
resetPageParams();
resolve(); resolve();
}); });
}; };
// 获取数据
const getResumeRecommendList = () => { const getResumeRecommendList = () => {
if (getApplicationListParams.value.isEnd === true) if (isEnd.value === true)
return new Promise(resolve => { return new Promise(resolve => {
resolve(); resolve();
}); });
...@@ -279,20 +200,42 @@ const getResumeRecommendList = () => { ...@@ -279,20 +200,42 @@ const getResumeRecommendList = () => {
title: "加载中...", title: "加载中...",
mask: true mask: true
}); });
return getResumeRecommendListApi(getApplicationListParams.value).then(res => { // 获取推荐简历
if (activeTab.value === "求职推荐") {
return getRecommendedResumeListApi(getResumeRecommendListParams.value).then(res => {
xma.hideLoading();
refresherEnabled.value = false;
if (!res.data) {
res.data = [];
}
if (res.data.length < getResumeRecommendListParams.value.pageSize) {
isEnd.value = true;
}
getResumeRecommendListParams.value.pageNo += 1;
applicationList.value = applicationList.value.concat(res.data);
// applicationList.value = res.data || [];
});
} else {
// 获取已投递
return getApplicationListApi(getApplicationListParams.value).then(res => {
xma.hideLoading(); xma.hideLoading();
refresherEnabled.value = false; refresherEnabled.value = false;
if (!res.data) { if (!res.data) {
res.data = []; res.data = [];
} }
if (res.data.length < getApplicationListParams.value.pageSize) { if (res.data.length < getApplicationListParams.value.pageSize) {
getApplicationListParams.value.isEnd = true; isEnd.value = true;
} }
getApplicationListParams.value.pageNo += 1; getApplicationListParams.value.pageNo += 1;
applicationList.value = applicationList.value.concat(res.data); applicationList.value = applicationList.value.concat(res.data);
}); });
}
}; };
onShow(() => {
resetPageParams();
getResumeRecommendList();
});
// 城市筛选 // 城市筛选
const valueCity = ref([]); const valueCity = ref([]);
const cityText = ref("全部"); const cityText = ref("全部");
...@@ -338,92 +281,32 @@ const handleConfirmCity = ({ value, selectedItems }) => { ...@@ -338,92 +281,32 @@ const handleConfirmCity = ({ value, selectedItems }) => {
cityText.value = selectedItems[textIndex].name; cityText.value = selectedItems[textIndex].name;
} }
const [provinceCode, cityCode, districtCode] = value; const [provinceCode, cityCode, districtCode] = value;
getApplicationListParams.value.provinceCode = provinceCode || ""; getApplicationListParams.value.provinceCode = provinceCode || "";
getApplicationListParams.value.cityCode = cityCode || ""; getApplicationListParams.value.cityCode = cityCode || "";
getApplicationListParams.value.districtCode = districtCode || ""; getApplicationListParams.value.districtCode = districtCode || "";
getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.pageSize = 10; getResumeRecommendListParams.value.recommend = false;
getResumeRecommendListParams.value.provinceCode = provinceCode || "";
getResumeRecommendListParams.value.cityCode = cityCode || "";
getResumeRecommendListParams.value.districtCode = districtCode || "";
resetPageParams();
getResumeRecommendList(); getResumeRecommendList();
}; };
// 显示其他筛选 // 显示其他筛选
const showOtherFilter = ref(false); const showOtherFilter = ref(false);
// 年龄 const filterConfirm = data => {
const ageValue = ref([0, 100]); Object.keys(data).forEach(key => {
// 年龄 getResumeRecommendListParams.value[key] = data[key];
const workExperienceValue = ref([0, 100]);
// 学历
const EnumEducationRequirement = ref([]);
const activeEducation = ref("0");
const getEnumEducationRequirement = async () => {
EnumEducationRequirement.value = await getEumData("EnumEducationRequirement");
};
getEnumEducationRequirement();
// 重置筛选
const resetFilter = () => {
ageValue.value = [0, 100];
workExperienceValue.value = [0, 100];
activeEducation.value = "0";
};
//完成筛选
const confirmFilter = () => {
getApplicationListParams.value.minAge = ageValue.value[0];
getApplicationListParams.value.maxAge = ageValue.value[1];
getApplicationListParams.value.maxWorkYear = workExperienceValue.value[0];
getApplicationListParams.value.minWorkYear = workExperienceValue.value[1];
getApplicationListParams.value.education = activeEducation.value;
getApplicationListParams.value.pageNo = 1;
getApplicationListParams.value.pageSize = 10;
// 获取推荐列表
refresh().then(() => {
getResumeRecommendList();
}); });
showOtherFilter.value = false;
};
/* 跳转到发布职位 */
const releasePostion = () => {
console.log("useReleasePostionStore", useReleasePostionStore);
uni.navigateTo({ getResumeRecommendListParams.value.recommend = false;
url: "/pages/recommend/releasePostion/step1" showOtherFilter.value = false;
}); resetPageParams();
getResumeRecommendList();
}; };
/* 获取职位管理 */
const topFilter = ref([]);
const activeTopFilter = ref("");
const jobList = ref([]);
const filterJobList = code => {
activeTopFilter.value = code;
getJobList(code);
};
const getTopFilter = async () => {
const data = await getEumData("EnumJobStatus");
data.unshift({
code: "",
text: "全部"
});
topFilter.value = data;
};
const getJobList = (status = "") => {
xma.showLoading({
title: "加载中..."
});
getListStatisticsApi({ status }).then(res => {
xma.hideLoading();
res.data.forEach(v => {
const { data: workModeText } = useAsync(getEnumText("EnumWorkMode", v.workMode));
const { data: statusText } = useAsync(getEnumText("EnumJobStatus", v.status));
v.workModeText = workModeText;
v.statusText = statusText;
});
jobList.value = [...res.data];
if (!status) {
myJobId.value = jobList.value[0].id;
}
});
};
onLoad(() => { onLoad(() => {
xma.xh.getSystemInfo({ xma.xh.getSystemInfo({
success(res) { success(res) {
...@@ -436,118 +319,6 @@ onLoad(() => { ...@@ -436,118 +319,6 @@ onLoad(() => {
} }
}); });
}); });
onShow(() => {
getTopFilter();
getJobListApiFn();
getJobList();
});
/* 职位上下线 */
const switchJobStatus = async v => {
let res = null;
if (v.status == 3) {
res = await jobOfflineApi(v.id);
v.status = 4;
} else if (v.status == 4 || v.status == 1) {
res = await jobReleaseApi(v.id);
v.status = 3;
} else {
uni.showToast({
title: "该状态不能操作",
icon: "none"
});
}
if (res && res.code === 200) {
uni.showToast({
title: "操作成功",
icon: "none"
});
getJobList();
} else {
uni.showToast({
title: res.message,
icon: "none"
});
}
};
/* 跳转职位管理 */
const jumpDeliveryManagement = (jobId, status) => {
uni.navigateTo({
url: `/pages/recommend/deliveryManagement/index?jobId=${jobId}&status=${status}`
});
};
/* 编辑职位 */
const editJob = ({ id, status }) => {
if (status == 3) {
uni.showToast({
title: "该职位已上线,不能编辑",
icon: "none"
});
return;
}
getJobByIdApi(id).then(res => {
const {
workMode,
jobName,
jobType,
jobTypeText,
jobDesc,
negotiableSalary,
settlementType,
minSalary,
maxSalary,
benefits,
identityRequirement,
educationRequirement,
minAgeRequirement,
maxAgeRequirement,
recruitmentNumber,
accommodation,
provinceCode,
cityCode,
districtCode,
town,
street,
address,
locationLongitude,
locationLatitude,
contactPerson,
contactPhone
} = res.data;
pinias.setForm({
workMode,
jobName,
jobType,
jobTypeText,
jobDesc,
negotiableSalary,
settlementType,
minSalary,
maxSalary,
benefits,
identityRequirement,
educationRequirement,
minAgeRequirement,
maxAgeRequirement,
recruitmentNumber,
accommodation,
provinceCode,
cityCode,
districtCode,
town,
street,
address,
locationLongitude,
locationLatitude,
contactPerson,
contactPhone
});
pinias.setFormDataKey("id", id);
uni.navigateTo({
url: `/pages/recommend/releasePostion/step1?id=${id}`
});
});
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -584,30 +355,6 @@ const editJob = ({ id, status }) => { ...@@ -584,30 +355,6 @@ const editJob = ({ id, status }) => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex-grow: 1; flex-grow: 1;
.release-postion {
position: fixed;
right: 22rpx;
bottom: 150rpx;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 112rpx;
height: 112rpx;
font-size: 24rpx;
font-weight: 500;
line-height: 28rpx;
color: #eaf4ff;
background: linear-gradient(180deg, #3570ff -3%, #29a5ff 100%);
border-radius: 50%;
opacity: 1;
image {
width: 32rpx;
height: 36rpx;
margin-bottom: 6rpx;
}
}
.recommend { .recommend {
position: relative; position: relative;
display: flex; display: flex;
...@@ -760,128 +507,5 @@ const editJob = ({ id, status }) => { ...@@ -760,128 +507,5 @@ const editJob = ({ id, status }) => {
} }
} }
} }
.management {
position: relative;
display: flex;
flex-direction: column;
flex-grow: 1;
.filter {
padding: 20rpx 32rpx;
font-size: 28rpx;
line-height: 44rpx;
color: #77818f;
text-align: center;
border-bottom: 16rpx solid #f3f4f8;
.item.active {
position: relative;
font-weight: 500;
color: #1f86ff;
&::after {
position: absolute;
bottom: -20rpx;
left: 50%;
display: block;
width: 48rpx;
height: 4rpx;
content: "";
background-color: #1f86ff;
transform: translateX(-50%);
}
}
}
.management-list {
flex-grow: 1;
height: 200rpx;
.item {
padding: 32rpx;
padding-bottom: 0;
border-bottom: 16rpx solid #f3f4f8;
.info {
.name {
font-size: 32rpx;
font-weight: 500;
color: #1b2026;
}
.other {
font-size: 24rpx;
font-weight: normal;
line-height: 36rpx;
color: #77818f;
}
}
.state {
padding: 8rpx 16rpx;
font-size: 20rpx;
font-weight: 500;
line-height: 28rpx;
color: #1f86ff;
background: rgb(31 134 255 / 10%);
border-radius: 4rpx;
&.style1 {
color: #18c69c;
background: rgb(31 255 80 / 10%);
}
&.style2 {
color: #f05a25;
background: rgb(240 90 37 / 10%);
}
}
.data {
padding: 16rpx 0;
border-bottom: 2rpx solid rgb(31 35 41 / 15%);
& > view {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 214rpx;
height: 120rpx;
text-align: center;
background: #1f86ff10;
border-radius: 8rpx;
.t1 {
font-size: 48rpx;
font-weight: bold;
line-height: 36rpx;
color: #1f86ff;
}
.t2 {
font-size: 24rpx;
line-height: 36rpx;
color: #77818f;
}
}
}
.btn-list {
margin: 12rpx 0;
.rotate {
transform: rotateZ(180deg);
}
image {
width: 28rpx;
height: 28rpx;
}
.top {
width: 20rpx;
height: 20rpx;
margin-right: 3rpx;
}
view {
flex: 1;
font-size: 24rpx;
font-weight: normal;
line-height: 36rpx;
color: #77818f;
&:not(:first-child) {
border-left: 2rpx solid #77818f;
}
}
}
}
.wd-status-tip {
padding-top: 280rpx;
}
}
}
} }
</style> </style>
...@@ -12,26 +12,42 @@ ...@@ -12,26 +12,42 @@
<view class="card"> <view class="card">
<image src="@/static/image/user/default-avatar.png" mode="" /> <image src="@/static/image/user/default-avatar.png" mode="" />
<view class="name">{{ data.realName || "无" }}</view> <view class="name">{{ userInfo.name || "无" }}</view>
<view class="school">贵州大学·心理学</view> <view class="school">{{ userInfo.schoolName || "无" }}·{{ userInfo.major || "无" }}</view>
<view class="info-list"> <view class="info-list">
<view class="info flex-between"> <view class="info flex-between">
<veiw class="label">面试时间</veiw> <veiw class="label">面试时间</veiw>
<wd-datetime-picker <wd-datetime-picker
v-model="date" v-model="date"
style="z-index: 999 !important"
:min-date="new Date(new Date().setHours(0, 0, 0, 0)).getTime()" :min-date="new Date(new Date().setHours(0, 0, 0, 0)).getTime()"
use-default-slot use-default-slot
label="日期选择"
@confirm="dateConfirm" @confirm="dateConfirm"
> >
<view class="data">{{ date ? dayjs(date).format("YYYY-MM-DD HH:mm") : "选择面试时间" }}</view> <view :class="{ data: 1, placeholder: !date }">{{
date ? dayjs(date).format("YYYY-MM-DD HH:mm") : "选择面试时间"
}}</view>
</wd-datetime-picker> </wd-datetime-picker>
<view class="arrow"></view> <view class="arrow"></view>
</view> </view>
<view class="info flex-between"> <view class="info flex-between">
<veiw class="label">面试职位</veiw> <veiw class="label">面试职位</veiw>
<view class="data">{{ data.jobName }}{{ data.salary }}</view> <!-- <view class="data">{{ data.positionName }}{{ data.salary }}</view> -->
<!-- 需要选择岗位 -->
<template v-if="jobIdTemp">
<view class="data">{{ data.positionName }}{{ data.salary }}</view>
</template>
<template v-else>
<wd-picker
:columns="jobListColumns"
value-key="id"
label-key="name"
@confirm="positionConfirm"
use-default-slot
>
<view class="data" v-if="data.positionName">{{ data.positionName }}{{ data.salary }}</view>
<view class="t2" v-else>请选择职位</view>
</wd-picker>
</template>
<view class="arrow"></view> <view class="arrow"></view>
</view> </view>
<view class="info flex-between"> <view class="info flex-between">
...@@ -46,11 +62,9 @@ ...@@ -46,11 +62,9 @@
</view> </view>
<view class="info flex-between"> <view class="info flex-between">
<veiw class="label">面试地址</veiw> <veiw class="label">面试地址</veiw>
<view class="data">{{ data.address }}</view> <view class="data">{{ data.interviewLocation }}</view>
<view class="arrow"></view> <view class="arrow"></view>
</view> </view>
<map id="mapId" class="map" :latitude="mapCenter.latitude" :longitude="mapCenter.longitude" :markers="markers">
</map>
</view> </view>
</view> </view>
...@@ -62,45 +76,79 @@ ...@@ -62,45 +76,79 @@
<script setup> <script setup>
import dayjs from "dayjs"; import dayjs from "dayjs";
import { getApplicationByIdApi, inviteInterviewApi } from "@/api/postion"; import { getApplicationByIdApi, inviteInterviewApi, getJobByIdApi, getPositionListApi, getResumeByUserId } from "@/api/postion";
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
const date = ref(""); const date = ref("");
const dateConfirm = e => { const dateConfirm = e => {
console.log(e); console.log(e);
}; };
const jobIdTemp = ref("");
let userIdTemp = "";
const data = ref({}); const data = ref({});
onLoad(({ id }) => { /* 获取职位列表 */
const jobListColumns = ref([]);
function getJobListApiFn() {
getPositionListApi({ status: 3 }).then(res => {
if (res.code == 200) {
jobListColumns.value = res.data;
}
});
}
getJobListApiFn();
const positionConfirm = ({ selectedItems }) => {
console.log(selectedItems);
data.value = selectedItems;
data.value.interviewLocation = selectedItems.address;
data.value.salary = selectedItems.minSalary + "~" + selectedItems.maxSalary;
data.value.positionName = selectedItems.name;
jobIdTemp.value = selectedItems.id;
};
onLoad(({ id, jobId, userId }) => {
userIdTemp = userId;
// 投递获取
if (Number(id)) {
getApplicationByIdApi(id).then(res => { getApplicationByIdApi(id).then(res => {
data.value = res.data; data.value = res.data;
data.value.applicationId = id;
}); });
} else if (Number(jobId)) {
getJobById(jobId);
}
console.log(1111);
// 查询用户信息
getUserinfo();
}); });
// 查询用户信息
const userInfo = reactive({
name: "",
schoolName: "",
major: ""
});
const getUserinfo = () => {
getResumeByUserId(userIdTemp).then(res => {
console.log(res);
userInfo.name = res.data.userInfo.name;
const educationExperience = JSON.parse(res.data.userResume.educationExperience || [{}])[0];
userInfo.schoolName = educationExperience.schoolName;
userInfo.major = educationExperience.major;
});
};
const getJobById = jobId => {
// 数据凭借
getJobByIdApi(jobId).then(res => {
res.data.salary = res.data.minSalary + "~" + res.data.maxSalary;
res.data.positionName = res.data.name;
res.data.interviewLocation = res.data.address;
jobIdTemp.value = jobId;
data.value = res.data;
console.log(res);
});
};
const back = () => { const back = () => {
uni.navigateBack(); uni.navigateBack();
}; };
let mapCenter = reactive({
latitude: 26.63,
longitude: 106.67
});
// 地图点
let markers = reactive([
{
id: 1,
latitude: 26.63,
longitude: 106.67,
width: 16,
height: 20,
iconPath: new URL("@/static/image/icon/markers.png", import.meta.url).href,
callout: {
content: "观山湖区高新区产业技术发展研究院",
borderRadius: 2,
padding: 7,
display: "ALWAYS",
textAlign: "center",
bgColor: "#fff",
color: "#000"
}
}
]);
const submit = () => { const submit = () => {
if (!date.value) { if (!date.value) {
...@@ -110,17 +158,27 @@ const submit = () => { ...@@ -110,17 +158,27 @@ const submit = () => {
}); });
return; return;
} }
if (!data.value.applicationId && !jobIdTemp.value) {
uni.showToast({
title: "请选择面试岗位",
icon: "none"
});
return;
}
inviteInterviewApi({ inviteInterviewApi({
...data.value, ...data.value,
interviewTime: date.value interviewTime: date.value,
userId: userIdTemp,
positionId: jobIdTemp.value
}).then(res => { }).then(res => {
console.log(res);
if (res.code === 200) { if (res.code === 200) {
uni.showToast({ uni.showToast({
title: "邀请成功", title: "邀请成功",
icon: "none" icon: "none"
}); });
uni.navigateBack(); uni.switchTab({
url: "/pages/recommend/index"
});
} }
}); });
}; };
...@@ -154,7 +212,7 @@ const submit = () => { ...@@ -154,7 +212,7 @@ const submit = () => {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
width: 686rpx; width: 686rpx;
height: 878rpx; height: 678rpx;
padding-top: 112rpx; padding-top: 112rpx;
margin: 100rpx auto 0; margin: 100rpx auto 0;
background: #ffffff; background: #ffffff;
...@@ -208,16 +266,14 @@ const submit = () => { ...@@ -208,16 +266,14 @@ const submit = () => {
line-height: 36rpx; line-height: 36rpx;
color: #1b2026; color: #1b2026;
} }
.placeholder {
color: #bfcacf;
}
.arrow { .arrow {
border-color: #77818f; border-color: #77818f;
} }
} }
} }
map {
width: 620rpx;
height: 176rpx;
border-radius: 12rpx;
}
} }
.btn-wrap { .btn-wrap {
position: fixed; position: fixed;
......
...@@ -10,7 +10,13 @@ ...@@ -10,7 +10,13 @@
>{{ v.text }}</view >{{ v.text }}</view
> >
</view> </view>
<scroll-view class="management-list" :scroll-y="true"> <scroll-view
class="management-list"
:scroll-y="true"
:refresher-triggered="refresherEnabled"
@refresherrefresh="onRefresherrefresh"
refresher-enabled
>
<view class="item" v-for="(v, i) in jobList" :key="i"> <view class="item" v-for="(v, i) in jobList" :key="i">
<view class="flex-between"> <view class="flex-between">
<view class="info"> <view class="info">
...@@ -94,6 +100,7 @@ const getJobList = (status = "") => { ...@@ -94,6 +100,7 @@ const getJobList = (status = "") => {
v.statusText = statusText; v.statusText = statusText;
}); });
jobList.value = [...res.data]; jobList.value = [...res.data];
refresherEnabled.value = false;
}); });
}; };
onLoad(() => { onLoad(() => {
...@@ -112,6 +119,7 @@ onShow(() => { ...@@ -112,6 +119,7 @@ onShow(() => {
getTopFilter(); getTopFilter();
getJobList(); getJobList();
}); });
/* 职位上下线 */ /* 职位上下线 */
const switchJobStatus = async v => { const switchJobStatus = async v => {
let res = null; let res = null;
...@@ -128,6 +136,7 @@ const switchJobStatus = async v => { ...@@ -128,6 +136,7 @@ const switchJobStatus = async v => {
}); });
} }
if (res && res.code === 200) { if (res && res.code === 200) {
v.statusText = await getEnumText("EnumJobStatus", v.status);
uni.showToast({ uni.showToast({
title: "操作成功", title: "操作成功",
icon: "none" icon: "none"
...@@ -235,6 +244,14 @@ function jobOffuntopApiFn(v) { ...@@ -235,6 +244,14 @@ function jobOffuntopApiFn(v) {
} }
}); });
} }
/* 下拉刷新 */
const refresherEnabled = ref(false);
const onRefresherrefresh = e => {
console.log(e);
refresherEnabled.value = true;
getJobList(activeTopFilter.value);
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
<template>
<view class="item">
<view class="label">学校名称</view>
<input v-model="params.schoolName" placeholder="请输入用户名" border="{{ false }}" />
</view>
<view class="item">
<view class="label">专业名称</view>
<input v-model="params.major" placeholder="请输入用户名" border="{{ false }}" />
</view>
<view class="item">
<view class="label">开始时间</view>
<wd-datetime-picker
:default-value="new Date().getTime()"
:maxDate="new Date().getTime()"
:minDate="new Date('1960/01/01').getTime()"
type="year-month"
v-model="params.startDate"
use-default-slot
class="my-datetime-picker"
>
<view :class="`inner ${params.startDate ? '' : 'placeholder'}`">
{{ format(params.startDate) || "选择开始时间" }}
</view>
</wd-datetime-picker>
</view>
<view class="item">
<view class="label">结束时间</view>
<wd-datetime-picker
:default-value="new Date().getTime()"
:minDate="params.startDate"
:maxDate="new Date().getTime()"
type="year-month"
v-model="params.endDate"
use-default-slot
class="my-datetime-picker"
>
<view :class="`inner ${params.endDate ? '' : 'placeholder'}`">
{{ format(params.endDate) || "结束时间" }}
</view>
</wd-datetime-picker>
</view>
<view class="btn-wrap">
<button @click="submit">保存</button>
</view>
</template>
<script setup>
import { saveEducationExperienceApi } from "@/api/user";
import dayjs from "dayjs";
import { reactive } from "vue";
const params = reactive({ schoolName: "", startDate: 0, endDate: 0, major: "" });
const format = date => date && dayjs(date).format("YYYY-MM-DD");
const submit = () => {
saveEducationExperienceApi(JSON.stringify([params])).then(res => {
if (res.code === 200) {
uni.showToast({
title: "保存成功",
icon: "none"
});
setTimeout(() => {
uni.navigateBack();
}, 1000);
}
});
};
</script>
<style lang="scss" scoped>
.item {
display: flex;
align-items: center;
margin: 0 32rpx;
border-bottom: 2rpx solid #f3f4f8;
.label {
flex: 0 0 160rpx;
padding: 32rpx 0;
font-size: 24rpx;
font-weight: 500;
line-height: 24rpx;
color: #77818f;
}
.placeholder {
color: #77818f;
}
.inner {
height: 88rpx;
padding: 0 32rpx;
font-size: 28rpx;
line-height: 88rpx;
}
textarea {
box-sizing: border-box;
width: 100%;
height: 272rpx;
padding: 32rpx;
margin: 10rpx auto 32rpx;
background: #f2f5fb;
border-radius: 8rpx;
}
}
.btn-wrap {
position: fixed;
bottom: 0;
box-sizing: border-box;
width: 100%;
padding: 16rpx 64rpx;
border-top: 2rpx solid rgb(31 35 41 / 15%);
button {
font-size: 30rpx;
font-weight: 600;
color: #ffffff;
background: #1f86ff;
border-radius: 12rpx;
}
}
</style>
...@@ -119,12 +119,24 @@ ...@@ -119,12 +119,24 @@
<script setup> <script setup>
import { reactive, computed } from "vue"; import { reactive, computed } from "vue";
import { getUserResumeApi, rejectApplicationApi, getApplicationByIdApi } from "@/api/postion"; import {
getUserResumeApi,
rejectApplicationApi,
resumeInappropriateApi,
getApplicationByIdApi,
getUserResumeByApplicationIdApi
} from "@/api/postion";
import { getCityNameByCodeApi } from "@/api/common";
import { getEnumText, getEumData } from "@/utils/utils.js"; import { getEnumText, getEumData } from "@/utils/utils.js";
import evn from "@/utils/config.js"; import evn from "@/utils/config.js";
import { useMessage } from "wot-design-uni"; import { useMessage } from "wot-design-uni";
// 投递id
let id = null; let id = null;
//工作id
let jobIdTemp = null;
//用户id
let userIdTemp = null;
const resumeData = reactive({ const resumeData = reactive({
preferredCityName: "", preferredCityName: "",
personalAdvantage: "", personalAdvantage: "",
...@@ -149,46 +161,64 @@ const resumeData = reactive({ ...@@ -149,46 +161,64 @@ const resumeData = reactive({
}); });
const applicationData = ref({}); const applicationData = ref({});
// 数据回显 // 数据回显
const getUserResume = ({ userId, jobId }) => { const getUserResume = ({ userId, jobId, applicationId }) => {
console.log("jobId", jobId); // console.log("jobId", jobId);=
// jobId = !jobId || jobId == "undefined" ? null : jobId;
// getUserResumeApi({ userId, jobId }).then(async res => {
let apiFn;
jobId = !jobId || jobId == "undefined" ? null : jobId; if (Number(applicationId)) {
getUserResumeApi({ userId, jobId }).then(async res => { apiFn = getUserResumeByApplicationIdApi(applicationId);
} else {
apiFn = getUserResumeApi(userId);
}
apiFn.then(async res => {
console.log(res);
const { const {
personalAdvantage, personalAdvantages,
preferredPosition,
maxSalary, maxSalary,
minSalary, minSalary,
preferredCityName,
workExperience, workExperience,
educationExperience positionNames,
} = res.data.resume; educationExperience,
operator,
cityCode
} = res.data.userResume;
const { workAge, education, avatarPath, phone } = res.data.userInfo;
applicationData.value = res.data.jobApplication; resumeData.personalAdvantage = personalAdvantages; //个人优势
const { realName, workExperience: workExperienceYear, educationLevel, avatarPath } = res.data.user; resumeData.maxSalary = maxSalary && maxSalary / 1000 + "k"; //薪水
resumeData.preferredCityName = preferredCityName;
resumeData.personalAdvantage = personalAdvantage; // 求职状态回
// resumeData.preferredPosition = preferredPosition.split(",").join("|");
const educationLevelText = await getEnumText("EnumEducation", educationLevel);
resumeData.realName = realName;
resumeData.avatarPath = avatarPath;
resumeData.educationLevel = educationLevelText;
resumeData.workExperienceYear = workExperienceYear;
resumeData.maxSalary = maxSalary && maxSalary / 1000 + "k";
resumeData.minSalary = minSalary && minSalary / 1000 + "k"; resumeData.minSalary = minSalary && minSalary / 1000 + "k";
const educationExperienceJson = JSON.parse(educationExperience || "[]"); resumeData.preferredPosition = positionNames;
console.log(educationExperienceJson); resumeData.preferredCityName = (await getCityNameByCodeApi(cityCode)).data.cityName;
resumeData.schoolName = educationExperienceJson[0]?.schoolName; resumeData.realName = operator;
resumeData.major = educationExperienceJson[0]?.major; const educationExperienceJson = JSON.parse(educationExperience || "[]"); //教育精力
resumeData.workExperience = JSON.parse(workExperience || "[]");
resumeData.educationExperience = educationExperienceJson; resumeData.educationExperience = educationExperienceJson;
resumeData.workExperienceYear = workAge; //工作年限
const educationLevelText = await getEnumText("EnumEducation", education);
resumeData.educationLevel = educationLevelText;
resumeData.avatarPath = avatarPath;
resumeData.schoolName = educationExperienceJson[0]?.schoolName; //学校
resumeData.major = educationExperienceJson[0]?.major; //专业
resumeData.workExperience = JSON.parse(workExperience || "[]"); //工作经历
applicationData.value = res.data.application || { status: 0 };
applicationData.value.userPhone = phone;
/*
const { realName, workExperience: workExperienceYear, educationLevel, avatarPath } = res.data.user;
console.log(educationExperienceJson);
*/
}); });
}; };
const pageType = ref(null); const pageType = ref(null);
onLoad(({ userId, jobId, applicationId, type }) => { onLoad(({ userId, jobId, applicationId, type }) => {
pageType.value = type; pageType.value = type;
id = applicationId; id = applicationId;
getUserResume({ userId, jobId }); jobIdTemp = jobId;
userIdTemp = userId;
getUserResume({ userId, jobId, applicationId });
}); });
function navigateTo(url) { function navigateTo(url) {
...@@ -255,16 +285,20 @@ const refuse = () => { ...@@ -255,16 +285,20 @@ const refuse = () => {
title: "拒绝" title: "拒绝"
}) })
.then(() => { .then(() => {
console.log("点击了确定按钮"); console.log(id);
rejectApplicationApi(id).then(res => { const result = id ? rejectApplicationApi(id) : resumeInappropriateApi({ userId: userIdTemp, positionId: jobIdTemp });
result.then(res => {
if (res.code === 200) { if (res.code === 200) {
uni.showToast({ uni.showToast({
title: "已拒绝", title: "已拒绝",
icon: "none" icon: "none"
}); });
status.value = 4; status.value = 4;
applicationData.value.status = 4;
} }
}); });
// resumeInappropriateApi
}) })
.catch(() => {}); .catch(() => {});
}; };
...@@ -274,7 +308,7 @@ const invitation = () => { ...@@ -274,7 +308,7 @@ const invitation = () => {
id = applicationData.value.id; id = applicationData.value.id;
} }
uni.navigateTo({ uni.navigateTo({
url: "/pages/recommend/invitation/index?id=" + id url: `/pages/recommend/invitation/index?id=${id}&jobId=${jobIdTemp}&userId=${userIdTemp}`
}); });
}; };
</script> </script>
...@@ -383,17 +417,17 @@ const invitation = () => { ...@@ -383,17 +417,17 @@ const invitation = () => {
position: fixed; position: fixed;
bottom: 0; bottom: 0;
left: 0; left: 0;
z-index: 99;
gap: 32rpx; gap: 32rpx;
width: 100%; width: 100%;
border-top: 2rpx solid #1f23290f; border-top: 2rpx solid #1f23290f;
z-index: 99;
.f-btn-box { .f-btn-box {
z-index: 99;
display: flex; display: flex;
justify-content: space-around;
align-items: center; align-items: center;
background: #fff; justify-content: space-around;
z-index: 99;
padding: 16rpx 0; padding: 16rpx 0;
background: #ffffff;
} }
button { button {
width: 294rpx; width: 294rpx;
......
<template>
<view class="container">
<view class="header">
<view class="title"> 工作/实习经历 </view>
<view class="desc mt20"> 从最近的一份工作/实习经历填写哦 </view>
</view>
<view class="form">
<!-- 公司名称 -->
<view class="form-item">
<view class="form-info">
<view class="label">公司名称</view>
<input type="text" v-model="params.companyName" placeholder="请输入" />
</view>
</view>
<!-- 在职时间 -->
<view class="form-item" bindtap="goToSelectJobType">
<view class="form-info">
<view class="label">在职时间</view>
<view class="time-wrapper flex-r-c mt20">
<wd-datetime-picker
:default-value="new Date().getTime()"
:maxDate="new Date().getTime()"
:minDate="new Date('1960/01/01').getTime()"
type="year-month"
v-model="params.startDate"
class="my-datetime-picker"
/>
<view class="line"></view>
<wd-datetime-picker
:default-value="new Date().getTime()"
:minDate="params.startDate"
:maxDate="new Date().getTime()"
type="year-month"
v-model="params.endDate"
/>
</view>
</view>
</view>
<!-- 职位类型 -->
<wd-col-picker
label="期望职位"
v-model="postionValue"
:columns="postionOpstion"
value-key="name"
label-key="name"
:column-change="columnChangePostion"
@confirm="handleConfirmPostion"
use-default-slot
>
<view class="form-item">
<view class="form-info">
<view class="label">职位类型</view>
<view :class="['cont', 'mt20', !jobTypeText ? 'placeholder-style' : '']">{{
jobTypeText || "请选择"
}}</view>
</view>
<view class="arrow"></view>
</view>
</wd-col-picker>
<!-- 工作内容 -->
<view class="form-item">
<view class="form-info">
<view class="label">工作内容</view>
<textarea v-model="params.content" placeholder="请输入" />
</view>
</view>
</view>
<!-- <view class="btn-wrapper" wx:if="{{isEdit && leng > 1}}">
<button class="del-btn ml32" bindtap="delWorkExperience">删除</button>
<button class="save-btn save-btn-samll" bindtap="save">保存</button>
</view> -->
<view class="btn-wrapper">
<button class="save-btn" @tap="save">保存</button>
</view>
</view>
</template>
<script setup>
import { ref } from "vue";
import { dictJobTypeApi } from "@/api/common";
import { saveWorkExperienceApi } from "@/api/user";
import _ from "lodash";
const jobTypeText = ref("");
const params = reactive({
companyName: "",
startDate: 0,
endDate: 0,
position: "",
content: ""
});
const postionValue = ref([]);
const postionOpstion = ref([]);
dictJobTypeApi({}).then(res => {
postionOpstion.value.push(res.data);
});
const columnChangePostion = ({ selectedItem, resolve, finish }) => {
if (selectedItem.children) {
resolve(selectedItem.children);
} else {
finish();
}
};
const handleConfirmPostion = ({ selectedItems }) => {
console.log(selectedItems);
jobTypeText.value = _.last(selectedItems).name;
};
const save = () => {
params.position = jobTypeText.value;
console.log(params);
saveWorkExperienceApi(JSON.stringify([params])).then(res => {
console.log(res);
if (res.code == 200) {
uni.showToast({
title: "保存成功",
icon: "success"
});
}
});
};
</script>
<style lang="scss" scoped>
.container {
min-height: 100vh;
padding: 0 32rpx;
background-color: #ffffff;
}
.container .header {
padding: 30rpx 0;
}
.container .header .title {
font-size: 32rpx;
font-weight: 600;
color: #213452;
}
.container .header .desc {
font-size: 24rpx;
color: #5c7396;
}
.form-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 36rpx 0;
border-bottom: 1rpx solid #e9e9e9;
}
.form-item .form-info {
width: 92%;
}
.form-item .form-info .label {
font-size: 24rpx;
color: #616c7a;
}
.form-item .form-info .cont {
font-size: 28rpx;
font-weight: 600;
color: #213452;
}
/* 保存按钮 */
.btn-wrapper {
position: fixed;
right: 0;
bottom: 0;
left: 0;
display: flex;
justify-content: center;
width: 100%;
padding: 12rpx 0;
border-top: 1rpx solid #ebebeb;
}
.btn-wrapper .save-btn {
width: 600rpx;
height: 72rpx;
font-size: 32rpx;
line-height: 72rpx;
color: #ffffff;
background: #1892ff;
border-radius: 8rpx;
}
.mt20 {
margin-top: 20rpx;
}
.ml32 {
margin-left: 32rpx;
}
.right-icon {
width: 48rpx;
height: 48rpx;
}
.color-grey {
font-size: 28rpx;
color: #a0afc3;
}
.placeholder-style {
font-size: 28rpx !important;
color: #a0afc3 !important;
}
.flex-r-c {
display: flex;
align-items: center;
justify-content: space-between;
}
.line {
width: 40rpx;
height: 2rpx;
margin: 0 80rpx;
background-color: #8693a3;
}
.overflow-ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.btn-wrapper .del-btn {
width: 276rpx;
height: 72rpx;
font-size: 32rpx;
line-height: 72rpx;
color: #1892ff;
background: #ffffff;
border: 2rpx solid #1892ff;
border-radius: 8rpx;
}
.btn-wrapper .save-btn-samll {
width: 380rpx;
height: 72rpx;
}
:deep(.my-datetime-picker) {
.wd-icon-arrow-right {
display: none;
}
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment