Files
ks-app-employment-service/packageRc/pages/service/components/jobRecommend.vue
2025-11-04 15:16:22 +08:00

630 lines
18 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
* @Date: 2024-10-08 14:29:36
* @LastEditors: shirlwang
* @LastEditTime: 2025-11-04 13:56:42
-->
<template>
<view>
<view class="input-outer-part">
<scroll-view scroll-y="true" :style="{height: edit?'calc(100vh - 200rpx)':'calc(100vh - 194rpx)'}">
<view class="inner">
<view class="part-title" style="display: flex;justify-content: space-between;">服务信息
<view v-if="!edit&&formData.id" class="btn" style="font-weight: normal;display: flex;"
@click="edit=true">编辑<u-icon name="edit-pen" color="#A6A6A6"></u-icon></view>
</view>
<view class="inner-part">
<view class="self-form">
<view class="form-item">
<view class="form-label ">人员姓名<text class="required">*</text></view>
<view style="width: calc(100% - 120rpx);word-break: break-all;" @click="openPersonChooser"
:class="{disabledLine: !edit, noValue: !formData.personName}">
{{ formData.personName || '请选择' }}
</view>
<view class="icon-right" style="width: 40rpx; height: 40rpx;"></view>
</view>
<view class="form-item">
<view class="form-label ">标题<text class="required">*</text></view>
<textarea :disabled="!edit" v-model="formData.recommendTopic"
:class="['form-textarea', { 'form-textarea-disabled': !edit }]"
placeholder="请输入"></textarea>
<view class="icon-right" style="width: 40rpx; height: 40rpx;"></view>
</view>
<view class="form-item">
<view class="form-label ">备注</view>
<textarea :disabled="!edit" v-model="formData.remark"
:class="['form-textarea', { 'form-textarea-disabled': !edit }]"
placeholder="请输入"></textarea>
<view class="icon-right" style="width: 40rpx; height: 40rpx;"></view>
</view>
<view class="form-item">
<view class="form-label ">附件</view>
<ImageUpload :fileList="fileList" @update="changeFile" :maxCount="6" />
</view>
</view>
</view>
</view>
<view class="inner" v-if="showInfo != '1'">
<view class="part-title" style="margin-top: 32rpx;">求职需求信息</view>
<view class="inner-part">
<view class="self-form">
<view class="form-item">
<view class="form-label ">求职工种</view>
<view style="width: calc(100% - 120rpx);word-break: break-all;"
class="disabledLine">
{{ getJobWorkTypeName(activePersonInfo.jobWorkType) }}
</view>
</view>
<view class="form-item">
<view class="form-label ">最低薪酬</view>
<view style="width: calc(100% - 120rpx);word-break: break-all;"
class="disabledLine">
{{ activePersonInfo.minRecruitmentSalary || '--' }}
</view>
</view>
<view class="form-item">
<view class="form-label ">最高薪酬</view>
<view style="width: calc(100% - 120rpx);word-break: break-all;"
class="disabledLine">
{{ activePersonInfo.highRecruitmentSalary || '--' }}
</view>
</view>
</view>
<view class="tuijian-btn" v-if="edit" @click="showPositionChooser">推荐岗位</view>
</view>
</view>
<view class="inner">
<view class="part-title" style="margin-top: 32rpx;">人员推荐记录</view>
<view class="inner-part">
<view v-for="(item, index) in tuijianList" :key="index" class="job-list">
<view>{{ item.postName }}</view>
<view style="color: #8492a6;margin-top: 7rpx;">工种{{item.recruitWorkTypeName}}</view>
<view style="color: #8492a6;margin-top: 7rpx;">单位名称{{item.unitName}}</view>
<view class="del-btn" @click="removeTuijian(item)">删除</view>
</view>
<img v-if="!tuijianList.length" src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/empty.png"
style="width: 100%;display: block;margin: 0 auto;" />
<view v-if="!tuijianList.length" style="text-align: center;color: #8E8E8E;font-size: 24rpx;">暂无数据~
</view>
</view>
</view>
<!-- 办理完成后 需求说明 -->
<req-comp :form="{
actualSolveDate: formData.actualSolveDate,
actualSolvePeople: formData.actualSolvePeople,
solveDesc: formData.solveDesc,
fileUrl: formData.fileUrl
}" />
</scroll-view>
<choose-person style="width: 100%;position: relative;z-index: 2;" :choiceType="3" ref="personChooser" @confirm="personNameConfirm" />
<positionChooser ref="positionChooser" @confirm="jobListConfirm" />
<!-- <u-datetime-picker :show="show.actualSolveDate" v-model="dates.actualSolveDate" mode="date"
@confirm="confirmDate('actualSolveDate', $event)"
@cancel="cancelPicker('hopeSolveDate')"></u-datetime-picker> -->
<!-- <uni-popup ref="openDeal" style="position: relative;z-index: 2;">
<u--form class="self-form popup" labelPosition="top" :model="formData" :rules="rules" ref="uForm"
labelWidth="300" style="width: calc(100% - 64rpx);margin: 0 auto;">
<u-form-item label="实际办理时间" prop="actualSolveDate" required>
<view class="bordered" style="width: 100%;" @click="showPicker('actualSolveDate')"
:class="{noValue: !formData.actualSolveDate}">{{ formData.actualSolveDate||'请选择' }}</view>
<u-icon slot="right" name="arrow-down" color="#A6A6A6"></u-icon>
</u-form-item>
<u-form-item label="办理说明" prop="solveDesc" required>
<u-textarea v-model="formData.solveDesc" placeholder="请输入"></u-textarea>
</u-form-item>
</u--form>
<view class="button-area" style="width: 100%;margin-left: 0;box-shadow: 0 0 10rpx rgba(0, 0, 0, 0.1);">
<view class="btn" @click="closeDeal">取消</view>
<view class="btn reset" @click="form.actualSolveDate = '';formData.solveDesc = ''">重置</view>
</view>
</uni-popup> -->
</view>
<view class="button-area" v-if="edit">
<view class="btn" @click="cancelPage">取消</view>
<!-- <view class="btn save" @click="finishJobRecommend">办结</view> -->
<view class="btn save" @click="formData.currentStatus='2';saveInfo()">保存</view>
</view>
</view>
</template>
<script>
import {
deptTreeSelect
} from "@/apiRc/person";
import {
addJobRecommend,
updateJobRecommend,
getJobRecommend,
getAddedJobs,
saveJobRecommend
} from "@/apiRc/service/jobRecommend";
import {
getPersonDemand
} from "@/apiRc/needs/personDemand";
import { listJobType } from "@/apiRc/jobType/index";
import ImageUpload from '@/packageRc/components/ImageUpload'
import ChoosePerson from './choosePerson.vue';
import positionChooser from './positionChooser.vue';
import dayjs from "dayjs";
export default {
components: {
ChoosePerson,
positionChooser,
ImageUpload
},
props: {
showInfo: {
type: String,
default: '0'
}
},
data() {
return {
fileList: [],
jobTypeList:[],
edit: true,
originalDept: [],
personBase: {},
dates: {},
formData: {
recommendTopic: '',
personName: '',
},
rules: {
personName: [{
required: true,
message: '请填写姓名',
trigger: ['blur', 'change'],
}, ],
recommendTopic: [{
required: true,
message: '请填写服务需求标题',
trigger: ['blur', 'change'],
}, ],
},
dict: {},
show: {},
loading: false,
workParams: {},
activePersonInfo: {},
tuijianList: [],
openDeal: false,
}
},
onReady() {
this.$refs.uForm.setRules(this.rules)
},
created() {
this.loading = true;
this.$getDict('qcjy_zgzpgz').then(res => {
this.dict.salary = res.data
})
this.workTypeRemoteMethod()
},
methods: {
closeDeal() {
this.$refs.openDeal.close()
},
// saveDeal() {
// if (!this.formData.actualSolveDate) {
// uni.showToast({
// title: '请填写实际解决时间!',
// icon: 'none'
// })
// return;
// }
// if (!this.formData.solveDesc) {
// uni.showToast({
// title: '请填写办理说明!',
// icon: 'none'
// })
// return;
// }
// this.formData.currentStatus = '3'
// this.$refs.openDeal.close();
// this.saveInfo()
// },
// finishJobRecommend() {
// this.$refs.uForm.validate().then(res => {
// this.$refs.openDeal.open()
// }).catch(() => {
// uni.showToast({
// title: '请检查必填项填写',
// icon: 'none'
// })
// })
// },
cancelPage() {
if (this.formData.id) {
this.edit = false;
this.getDetail(this.formData.id)
} else {
uni.navigateBack()
}
},
removeTuijian({
id
}) {
if (!this.edit) return
this.tuijianList = this.tuijianList.filter(t => t.id !== id);
},
openPersonChooser() {
if (this.edit) {
console.log("this",this.activePersonInfo)
this.$refs.personChooser.open();
}
},
showPositionChooser() {
if (this.edit) {
console.log("this.params",this.workParams)
this.workParams.latitude=this.activePersonInfo.latitude
this.workParams.longitude=this.activePersonInfo.longitude
this.$refs.positionChooser.open(this.workParams);
}
},
personNameConfirm(event) {
this.formData.personName = event.personName
this.formData.personId = event.personId
this.formData.jobDemandInfoId = event.id
// this.form.personStatus = event.currentStatus;
this.activePersonInfo = event;
console.log("event",event)
this.formNameChange(event);
this.$forceUpdate();
},
jobListConfirm(event) {
this.tuijianList = event;
},
// changeFile(e) {
// if (e.length) {
// let data = e[0];
// this.formData.fileUrl = data.data ? data.data.url : data.url
// } else {
// this.formData.fileUrl = ''
// }
// },
changeFile(e) {
// 清空当前的 fileUrl 数组
this.formData.fileUrl = [];
// 如果 e 有长度(即用户选择了文件)
if (e.length) {
// 遍历每个文件对象并获取其 url
for (let data of e) {
const url = data.data ? data.data.url : data.url;
this.formData.fileUrl.push(url);
}
}
this.formData.fileUrl = this.$arrayToString(this.formData.fileUrl)
},
addOne() {
this.formData = {}
this.edit = true
},
addForPerson({
jobDemandInfoId
}) {
if (!jobDemandInfoId) return
getPersonDemand(jobDemandInfoId).then(res => {
this.activePersonInfo = res.data
this.formNameChange(this.activePersonInfo)
})
},
// 单独设置 人员姓名 和 id
setPersonName(data){
this.formData.personName = data.personName
this.formData.personId = data.personId
this.formData.jobDemandInfoId = data.jobDemandInfoId
this.addForPerson(data)
},
getDetail(id) {
// 查询角色详情
getJobRecommend(id).then(res => {
this.formData = res.data;
this.fileList = this.$processFileUrl(this.formData.fileUrl)
// 获取详情的时候 调用方法 拿到求职需求详情
this.addForPerson(res.data)
this.edit = false
this.getAddedJobsList(res.data)
})
},
// 获取推荐人员列表
getAddedJobsList({
postIdList
}) {
getAddedJobs({
postIdList,
pageNum: 1,
pageSize: 10000
}).then((res) => {
this.tuijianList = res.rows;
});
},
confirmDate(type, e) {
this.show[type] = false;
let date = new Date(e.value)
this.formData[type] =
`${date.getFullYear()}-${(date.getMonth()+1)>9?(date.getMonth()+1):('0'+(date.getMonth()+1))}-${date.getDate()>9?date.getDate():('0'+date.getDate())}`
this.$forceUpdate();
},
goBack() {
uni.navigateBack();
},
cancelPicker(type) {
this.show[type] = false
this.$forceUpdate();
},
getDictLabel(value, list) {
if (list) {
let arr = list.filter(ele => ele.dictValue == value)
if (arr.length) {
return arr[0].dictLabel
} else {
return '请选择'
}
}
},
workTypeRemoteMethod(key) {
listJobType({
workTypeName: key,
pageNum: 1,
pageSize: 50,
}).then((res) => {
this.jobTypeList = res.rows;
});
},
getJobWorkTypeName(data){
if (data) {
let arr = this.jobTypeList.filter((ele) => ele.id == data);
if(arr.length){
return arr[0].workTypeName;
}else{
return '--'
}
}
},
pickerConfirm(type, event) {
this.show[type] = false
this.formData[type] = event.value[0].dictValue
this.$forceUpdate();
},
// showPicker(type) {
// if (this.edit) {
// this.show[type] = true
// this.$forceUpdate()
// }
// },
formNameChange(e) {
let date = new Date()
// let day =
// `${date.getFullYear()}-${(date.getMonth()+1) + 1 > 9 ? (date.getMonth()+1) + 1: '0'+((date.getMonth()+1) + 1)}-${date.getDate() > 9 ? date.getDate(): '0'+date.getDate()}`
const dayNew = dayjs(date).format("YYYY-MM-DD");
this.formData.recommendTopic =
`${this.$store.state.user.nick}_于${dayNew}对人员_${this.formData.personName}_进行_${this.getJobWorkTypeName(e.jobWorkType)}岗位推荐`;
this.$set(this.workParams, "recruitWorkType", e.jobWorkType);
this.$set(this.workParams, "workLocation", e.hopeWorkLocation);
this.$set(this.workParams, "minRecruitmentSalary", e.minRecruitmentSalary);
this.$set(this.workParams, "highRecruitmentSalary", e.highRecruitmentSalary);
this.$set(this.workParams, "longitude", e.longitude);
this.$set(this.workParams, "latitude", e.latitude);
// this.$set(this.workParams, "userId", e.userId);
},
async saveInfo() {
uni.showLoading();
try {
// 验证表单
let isValid = true
// = await this.$refs.uForm.validate();
for(let prop in this.rules){
this.rules[prop].forEach(ele => {
if(ele.required = false && !this.formData[prop]){
isValid = false
}
})
}
if (!isValid) {
uni.showToast({
title: '请检查必填项填写',
icon: 'none'
})
// throw new Error('请检查必填项填写');
}
// 显示全局加载
// 更新 formData 中的 postIdList
this.formData.postIdList = this.tuijianList.map((ele) => ele.id);
this.formData.id = this.formData.jobDemandInfoId;
// 保存职位推荐
const response = await saveJobRecommend(this.formData);
// 检查响应码是否为200
if (response.code === 200) {
uni.showToast({title: '提交成功', icon: 'none'});
}
// 延迟1秒后返回上一页
setTimeout(() => {
uni.navigateBack();
}, 1000);
} catch (error) {
uni.showToast({title: '错误详情:' + error, icon: 'none'});
} finally {
// 确保加载页总是会被隐藏
uni.hideLoading();
}
},
// saveInfo() {
// this.$refs.uForm.validate().then(res => {
// this.formData.postIdList = this.tuijianList.map((ele) => ele.id)
// saveJobRecommend(this.formData).then(response => {
// if (response.code == 200) {
// uni.showToast({
// title: '提交成功'
// })
// }
// uni.navigateBack();
// });
// if(this.formData.id){
// updateJobRecommend(this.formData).then(res => {
// if(res.code == 200) {
// uni.showToast({
// title: '修改成功'
// })
// this.edit = false;
// }
// })
// }else{
// addJobRecommend(this.formData).then(res => {
// if(res.code == 200) {
// uni.showToast({
// title: '保存成功'
// })
// uni.navigateBack();
// }
// })
// }
// }).catch((e) => {
// uni.showToast({
// title: '请检查必填项填写',
// icon: 'none'
// })
// })
// }
}
}
</script>
<style lang="scss">
.noValue {
color: rgb(192, 196, 204);
}
.disabledLine {
background: rgb(245, 247, 250);
cursor: not-allowed;
width: 100%;
}
// 改进选择器样式
.picker-view {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 28rpx 36rpx;
background: #ffffff;
border: 2rpx solid #e5e5e5;
border-radius: 12rpx;
min-height: 88rpx;
box-sizing: border-box;
transition: all 0.3s ease;
position: relative;
&:active {
background: #f8f9fa;
border-color: #007aff;
transform: scale(0.98);
}
&::after {
content: '';
position: absolute;
right: 36rpx;
top: 50%;
transform: translateY(-50%);
width: 0;
height: 0;
border-left: 12rpx solid transparent;
border-right: 12rpx solid transparent;
border-top: 12rpx solid #999999;
}
.picker-text {
color: #333333;
font-size: 28rpx;
flex: 1;
}
.picker-placeholder {
color: #999999;
font-size: 28rpx;
}
}
// 选中状态的样式
.picker-view.selected {
border-color: #1D64CF;
background: #f0f8ff;
&::after {
border-top-color: #1D64CF;
}
}
.tuijian-btn {
background: #197cd2;
line-height: 60rpx;
width: 176rpx;
margin-right: 16rpx;
margin-top: 24rpx;
font-size: 28rpx;
color: #fff;
text-align: center;
border-radius: 8rpx;
margin: 0 auto;
}
.job-list {
padding: 24rpx 32rpx;
border-radius: 8rpx;
box-sizing: border-box;
border: 1px solid #e4e4e4;
margin-bottom: 24rpx;
position: relative;
&.active {
border: 1px solid #1890ff;
}
.del-btn {
background: #E95A49;
line-height: 48rpx;
width: 120rpx;
margin-right: 0;
margin-top: 0rpx;
margin-left: auto;
font-size: 24rpx;
color: #fff;
text-align: center;
border-radius: 8rpx;
}
}
.self-form.popup {
padding-top: 32rpx;
.bordered {
border: 1rpx solid #dadbde;
padding: 9px;
border-radius: 4px;
}
}
.form-label{
width: 120rpx;
}
</style>