|
|
@@ -35,7 +35,7 @@
|
|
|
<td><strong>候选人基本信息</strong></td>
|
|
|
<td class="content-cell">
|
|
|
<div class="form-row"><span class="label">姓名:</span><el-input v-model="form.candidateName" disabled class="noline-input" /></div>
|
|
|
- <div class="form-row"><span class="label">应聘职位:</span><el-input v-model="form.applyPosition" class="noline-input" /></div>
|
|
|
+ <div class="form-row"><span class="label">应聘职位:</span><el-input v-model="form.applyPosition" disabled class="noline-input" /></div>
|
|
|
<div class="form-row"><span class="label">调查时间:</span><el-date-picker v-model="form.checkTime" type="date" class="noline-input" /></div>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
@@ -50,11 +50,13 @@
|
|
|
<div class="form-row"><span class="label">学信网核实:</span><el-input v-model="form.eduVerifyStatus" class="noline-input" /></div>
|
|
|
</td>
|
|
|
<td class="center-cell">
|
|
|
- <el-radio-group v-model="form.eduVerifyResult" class="vertical-radio">
|
|
|
- <el-radio label="属实">属实</el-radio>
|
|
|
- <el-radio label="不属实">不属实</el-radio>
|
|
|
- <el-radio label="无法核实">无法核实</el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ <el-form-item prop="eduVerifyResult" style="margin-bottom:0">
|
|
|
+ <el-radio-group v-model="form.eduVerifyResult" class="vertical-radio">
|
|
|
+ <el-radio label="属实">属实</el-radio>
|
|
|
+ <el-radio label="不属实">不属实</el-radio>
|
|
|
+ <el-radio label="无法核实">无法核实</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
</td>
|
|
|
<td></td>
|
|
|
</tr>
|
|
|
@@ -69,12 +71,13 @@
|
|
|
<div class="form-row"><span class="label">离职原因:</span><el-input v-model="form.leaveReasonVerify" type="textarea" autosize class="noline-input flex-1" /></div>
|
|
|
</td>
|
|
|
<td class="center-cell">
|
|
|
- <!-- No specific property mapped originally, keep it for completeness of visual or bind if exist. -->
|
|
|
- <el-radio-group v-model="form.companyVerifyResult" class="vertical-radio">
|
|
|
- <el-radio label="属实">属实</el-radio>
|
|
|
- <el-radio label="部分属实">部分属实</el-radio>
|
|
|
- <el-radio label="不属实">不属实</el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ <el-form-item prop="companyVerifyResult" style="margin-bottom:0">
|
|
|
+ <el-radio-group v-model="form.companyVerifyResult" class="vertical-radio">
|
|
|
+ <el-radio label="属实">属实</el-radio>
|
|
|
+ <el-radio label="部分属实">部分属实</el-radio>
|
|
|
+ <el-radio label="不属实">不属实</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
</td>
|
|
|
<td class="content-cell">
|
|
|
<div></div>
|
|
|
@@ -100,11 +103,13 @@
|
|
|
<div class="form-row"><span class="label">离职交接情况:</span><el-input v-model="form.hrEvalTransfer" class="noline-input" /></div>
|
|
|
</td>
|
|
|
<td class="center-cell">
|
|
|
- <el-radio-group v-model="form.evalResult" class="vertical-radio">
|
|
|
- <el-radio label="良好">良好</el-radio>
|
|
|
- <el-radio label="一般">一般</el-radio>
|
|
|
- <el-radio label="需关注">需关注</el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ <el-form-item prop="evalResult" style="margin-bottom:0">
|
|
|
+ <el-radio-group v-model="form.evalResult" class="vertical-radio">
|
|
|
+ <el-radio label="良好">良好</el-radio>
|
|
|
+ <el-radio label="一般">一般</el-radio>
|
|
|
+ <el-radio label="需关注">需关注</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
</td>
|
|
|
<td class="content-cell">
|
|
|
<div></div>
|
|
|
@@ -199,7 +204,7 @@
|
|
|
<div class="interview-meta">
|
|
|
<span>调查表(一)</span>
|
|
|
<span class="meta-item">姓名:<el-input v-model="form.interviewSupervisor.name" class="inline-input" /></span>
|
|
|
- <span class="meta-item">关系:<el-input v-model="form.interviewSupervisor.relationship" class="inline-input" placeholder="输入关系或不填则为上级" /></span>
|
|
|
+ <span class="meta-item">关系:<el-input v-model="form.interviewSupervisor.relationship" class="inline-input" placeholder="不填则为上级" /></span>
|
|
|
<span class="meta-item">联系方式:<el-input v-model="form.interviewSupervisor.contact" class="inline-input" /></span>
|
|
|
</div>
|
|
|
<table class="report-table" border="1" cellspacing="0" cellpadding="0">
|
|
|
@@ -227,7 +232,7 @@
|
|
|
<div class="interview-meta">
|
|
|
<span>调查表(二)</span>
|
|
|
<span class="meta-item">姓名:<el-input v-model="form.interviewHR.name" class="inline-input" /></span>
|
|
|
- <span class="meta-item">关系:<el-input v-model="form.interviewHR.relationship" class="inline-input" placeholder="输入关系或不填则为HR" /></span>
|
|
|
+ <span class="meta-item">关系:<el-input v-model="form.interviewHR.relationship" class="inline-input" placeholder="不填则为HR" /></span>
|
|
|
<span class="meta-item">联系方式:<el-input v-model="form.interviewHR.contact" class="inline-input" /></span>
|
|
|
</div>
|
|
|
<table class="report-table" border="1" cellspacing="0" cellpadding="0">
|
|
|
@@ -255,7 +260,7 @@
|
|
|
<div class="interview-meta">
|
|
|
<span>调查表(三)</span>
|
|
|
<span class="meta-item">姓名:<el-input v-model="form.interviewColleague.name" class="inline-input" /></span>
|
|
|
- <span class="meta-item">关系:<el-input v-model="form.interviewColleague.relationship" class="inline-input" placeholder="输入关系或不填则为同事" /></span>
|
|
|
+ <span class="meta-item">关系:<el-input v-model="form.interviewColleague.relationship" class="inline-input" placeholder="不填则为同事" /></span>
|
|
|
<span class="meta-item">联系方式:<el-input v-model="form.interviewColleague.contact" class="inline-input" /></span>
|
|
|
</div>
|
|
|
<table class="report-table" border="1" cellspacing="0" cellpadding="0">
|
|
|
@@ -278,10 +283,20 @@
|
|
|
</table>
|
|
|
</div>
|
|
|
|
|
|
- <div class="form-actions">
|
|
|
- <el-button type="primary" size="large" class="submit-btn" :loading="submitting" @click="handleSubmit">
|
|
|
- 确认并提交背调反馈
|
|
|
- </el-button>
|
|
|
+ <div class="form-actions" v-if="!props.recordId || currentReportStatus < 2">
|
|
|
+ <template v-if="props.recordId">
|
|
|
+ <el-button type="primary" size="large" class="submit-btn" :loading="submitting" @click="handleSubmit(2)">
|
|
|
+ 审核通过
|
|
|
+ </el-button>
|
|
|
+ <el-button type="danger" size="large" class="submit-btn" :loading="submitting" @click="handleSubmit(3)">
|
|
|
+ 审核不通过
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <el-button type="primary" size="large" class="submit-btn" :loading="submitting" @click="handleSubmit()">
|
|
|
+ 确认并提交背调反馈
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
</el-form>
|
|
|
</div>
|
|
|
@@ -291,22 +306,42 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
|
-import { ref, onMounted } from 'vue';
|
|
|
+import { ref, computed, onMounted } from 'vue';
|
|
|
import { useRoute } from 'vue-router';
|
|
|
import { ElMessage } from 'element-plus';
|
|
|
-import { User, Collection, OfficeBuilding, TrendCharts, Warning, Stamp, ChatDotRound, CircleCheckFilled, Loading } from '@element-plus/icons-vue';
|
|
|
-import request from '../api/request';
|
|
|
+import { CircleCheckFilled, Loading } from '@element-plus/icons-vue';
|
|
|
+import request from '@/utils/request';
|
|
|
+import { getBackCheckReport, submitBackCheckReport } from '@/api/system/backRecord';
|
|
|
+import type { BackCheckReportVO, InterviewVO } from '@/api/system/backRecord/types';
|
|
|
+
|
|
|
+const props = defineProps<{
|
|
|
+ recordId?: string | number;
|
|
|
+ reportStatus?: number;
|
|
|
+}>();
|
|
|
+
|
|
|
+const emit = defineEmits<{
|
|
|
+ submitted: [status: number];
|
|
|
+}>();
|
|
|
|
|
|
const route = useRoute();
|
|
|
const formRef = ref();
|
|
|
const submitting = ref(false);
|
|
|
const submitted = ref(false);
|
|
|
const loading = ref(true);
|
|
|
+const formReportStatus = ref<number>(0);
|
|
|
+
|
|
|
+/** 当前报告状态:优先用 props,其次用内部值 */
|
|
|
+const currentReportStatus = computed(() => {
|
|
|
+ if (props.reportStatus !== undefined && props.reportStatus !== null) {
|
|
|
+ return props.reportStatus;
|
|
|
+ }
|
|
|
+ return formReportStatus.value;
|
|
|
+});
|
|
|
|
|
|
const form = ref({
|
|
|
candidateName: '',
|
|
|
applyPosition: '',
|
|
|
- checkTime: new Date(),
|
|
|
+ checkTime: '' as any,
|
|
|
gradSchool: '',
|
|
|
eduCertNo: '',
|
|
|
eduVerifyStatus: '',
|
|
|
@@ -314,7 +349,7 @@ const form = ref({
|
|
|
companyVerifyResult: '',
|
|
|
evalResult: '',
|
|
|
companyName: '',
|
|
|
- workPeriod: [],
|
|
|
+ workPeriod: [] as string[],
|
|
|
position: '',
|
|
|
lastSalary: '',
|
|
|
leaveReasonVerify: '',
|
|
|
@@ -341,67 +376,220 @@ const form = ref({
|
|
|
conclusion: '',
|
|
|
conclusionReason: '',
|
|
|
investigatorName: '',
|
|
|
- investigatorDate: new Date()
|
|
|
+ investigatorDate: '' as any
|
|
|
});
|
|
|
|
|
|
const rules = {
|
|
|
candidateName: [{ required: true, message: '无法获取候选人信息', trigger: 'blur' }],
|
|
|
investigatorName: [{ required: true, message: '请输入调查人姓名', trigger: 'blur' }],
|
|
|
investigatorDate: [{ required: true, message: '请选择调查日期', trigger: 'change' }],
|
|
|
- conclusion: [{ required: true, message: '请选择最终推荐结论', trigger: 'change' }]
|
|
|
+ conclusion: [{ required: true, message: '请选择最终推荐结论', trigger: 'change' }],
|
|
|
+ eduVerifyResult: [{ required: true, message: '请选择学历核实结果', trigger: 'change' }],
|
|
|
+ companyVerifyResult: [{ required: true, message: '请选择工作单位核实结果', trigger: 'change' }],
|
|
|
+ evalResult: [{ required: true, message: '请选择表现核实结果', trigger: 'change' }]
|
|
|
+};
|
|
|
+
|
|
|
+/** 将后端访谈记录映射到表单结构 */
|
|
|
+const mapInterviewToForm = (interviews?: InterviewVO[]) => {
|
|
|
+ const defaultInterview = { name: '', relationship: '', contact: '', q1: '', q2: '', q3: '', q4: '', q5: '' };
|
|
|
+ if (!interviews || interviews.length === 0) {
|
|
|
+ return {
|
|
|
+ interviewSupervisor: { ...defaultInterview },
|
|
|
+ interviewHR: { ...defaultInterview },
|
|
|
+ interviewColleague: { ...defaultInterview }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ const mapOne = (iv?: InterviewVO) => iv ? {
|
|
|
+ name: iv.intervieweeName || '',
|
|
|
+ relationship: iv.intervieweeRelation || '',
|
|
|
+ contact: iv.intervieweeContact || '',
|
|
|
+ q1: iv.qa1 || '', q2: iv.qa2 || '', q3: iv.qa3 || '', q4: iv.qa4 || '', q5: iv.qa5 || ''
|
|
|
+ } : { ...defaultInterview };
|
|
|
+
|
|
|
+ return {
|
|
|
+ interviewSupervisor: mapOne(interviews[0]),
|
|
|
+ interviewHR: mapOne(interviews[1]),
|
|
|
+ interviewColleague: mapOne(interviews[2])
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+/** 从后端报告数据回填表单 */
|
|
|
+const fillForm = (data: BackCheckReportVO) => {
|
|
|
+ const f = form.value;
|
|
|
+ f.candidateName = data.candidateName || '';
|
|
|
+ f.applyPosition = data.applyPosition || '';
|
|
|
+ f.checkTime = data.checkTime || '';
|
|
|
+ f.gradSchool = data.gradSchool || '';
|
|
|
+ f.eduCertNo = data.eduCertNo || '';
|
|
|
+ f.eduVerifyStatus = data.eduVerifyStatus || '';
|
|
|
+ f.eduVerifyResult = data.eduCheckResult || '';
|
|
|
+ f.companyVerifyResult = data.companyCheckResult || '';
|
|
|
+ f.evalResult = data.performCheckResult || '';
|
|
|
+ f.companyName = data.companyName || '';
|
|
|
+ f.position = data.jobTitle || '';
|
|
|
+ f.lastSalary = data.lastSalary || '';
|
|
|
+ f.leaveReasonVerify = data.leaveReasonVerify || '';
|
|
|
+ f.attachment1Remark = data.companyCheckRemark || '';
|
|
|
+ f.leaderEvalAdvantage = data.leaderEvalAdvantage || '';
|
|
|
+ f.leaderEvalImprove = data.leaderEvalImprove || '';
|
|
|
+ f.leaderEvalProf = data.leaderEvalProf || '';
|
|
|
+ f.leaderEvalAttitude = data.leaderEvalAttitude || '';
|
|
|
+ f.leaderEvalTeam = data.leaderEvalTeam || '';
|
|
|
+ f.leaderEvalMorals = data.leaderEvalMorals || '';
|
|
|
+ f.colleagueEvalTeamwork = data.colleagueEvalTeamwork || '';
|
|
|
+ f.colleagueEvalProf = data.colleagueEvalProf || '';
|
|
|
+ f.hrEvalDispute = data.hrEvalDispute || '';
|
|
|
+ f.hrEvalTransfer = data.hrEvalTransfer || '';
|
|
|
+ f.attachment2Remark = data.performCheckRemark || '';
|
|
|
+ f.hasNonCompete = data.hasNonCompete === 1;
|
|
|
+ f.hasNda = data.hasNda === 1;
|
|
|
+ f.agreementRemark = data.agreementRemark || '';
|
|
|
+ f.hasDisputeStatus = data.hasDispute === 1;
|
|
|
+ f.disputeRemark = data.disputeRemark || '';
|
|
|
+ f.conclusion = data.conclusion || '';
|
|
|
+ f.conclusionReason = data.conclusionReason || '';
|
|
|
+ f.investigatorName = data.investigatorName || '';
|
|
|
+ f.investigatorDate = data.investigatorDate || '';
|
|
|
+
|
|
|
+ // 任职时间(后端存 workStartTime / workEndTime)
|
|
|
+ if (data.workStartTime || data.workEndTime) {
|
|
|
+ f.workPeriod = [data.workStartTime || '', data.workEndTime || ''];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 访谈记录
|
|
|
+ const interviewMap = mapInterviewToForm(data.interviews);
|
|
|
+ f.interviewSupervisor = interviewMap.interviewSupervisor;
|
|
|
+ f.interviewHR = interviewMap.interviewHR;
|
|
|
+ f.interviewColleague = interviewMap.interviewColleague;
|
|
|
+
|
|
|
+ // 报告状态
|
|
|
+ if (data.reportStatus !== undefined && data.reportStatus !== null) {
|
|
|
+ formReportStatus.value = data.reportStatus;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
onMounted(async () => {
|
|
|
- const recordId = route.query.recordId;
|
|
|
- if (recordId) {
|
|
|
+ const rid = props.recordId || route.query.recordId;
|
|
|
+
|
|
|
+ // 如果有 recordId,先尝试从管理端接口获取报告数据回显
|
|
|
+ if (rid) {
|
|
|
+ try {
|
|
|
+ const res = await getBackCheckReport(rid as string);
|
|
|
+ if (res.data) {
|
|
|
+ fillForm(res.data);
|
|
|
+ loading.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ // 管理端接口查询失败,回退到门户接口
|
|
|
+ }
|
|
|
+
|
|
|
+ // 回退:门户端查询表单提交状态
|
|
|
try {
|
|
|
- const res = await request.get('/portal/check/bgform/status', {
|
|
|
- params: { recordId },
|
|
|
+ const statusRes = await request.get('/portal/check/bgform/status', {
|
|
|
+ params: { recordId: rid },
|
|
|
skipAuth: true
|
|
|
} as any);
|
|
|
- if (res?.submitted) {
|
|
|
+ if (statusRes?.submitted) {
|
|
|
submitted.value = true;
|
|
|
loading.value = false;
|
|
|
return;
|
|
|
}
|
|
|
- if (res?.candidateName) {
|
|
|
- form.value.candidateName = res.candidateName;
|
|
|
+ if (statusRes?.candidateName) {
|
|
|
+ form.value.candidateName = statusRes.candidateName;
|
|
|
}
|
|
|
} catch (e) {
|
|
|
// 查询失败不影响表单填写
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
if (route.query.candidateName) {
|
|
|
form.value.candidateName = route.query.candidateName as string;
|
|
|
}
|
|
|
loading.value = false;
|
|
|
});
|
|
|
|
|
|
-const handleSubmit = () => {
|
|
|
+const handleSubmit = (reportStatus?: number) => {
|
|
|
formRef.value?.validate(async (valid: boolean) => {
|
|
|
if (!valid) {
|
|
|
ElMessage.error('请完善必填信息!');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const recordId = route.query.recordId;
|
|
|
- if (!recordId) {
|
|
|
+ const rid = props.recordId || route.query.recordId;
|
|
|
+ if (!rid) {
|
|
|
ElMessage.error('缺少背调记录ID,无法提交');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
submitting.value = true;
|
|
|
try {
|
|
|
- await request.post('/portal/check/bgform/submit', {
|
|
|
- recordId: recordId,
|
|
|
- ...form.value
|
|
|
- }, { skipAuth: true } as any);
|
|
|
- submitted.value = true;
|
|
|
- ElMessage.success('提交成功!感谢您的真实填写与支持。');
|
|
|
- // 先尝试关闭窗口(仅对 window.open 打开的窗口有效)
|
|
|
- setTimeout(() => {
|
|
|
- window.close();
|
|
|
- }, 1500);
|
|
|
+ if (props.recordId) {
|
|
|
+ // 管理端提交:使用新接口,带登录校验,含三个核实结果 + reportStatus
|
|
|
+ const f = form.value;
|
|
|
+ const mapInterview = (iv: typeof f.interviewSupervisor) => ({
|
|
|
+ name: iv.name,
|
|
|
+ relationship: iv.relationship,
|
|
|
+ contact: iv.contact,
|
|
|
+ q1: iv.q1, q2: iv.q2, q3: iv.q3, q4: iv.q4, q5: iv.q5
|
|
|
+ });
|
|
|
+ const submitData = {
|
|
|
+ reportStatus: reportStatus || 2,
|
|
|
+ candidateName: f.candidateName,
|
|
|
+ applyPosition: f.applyPosition,
|
|
|
+ checkTime: f.checkTime,
|
|
|
+ gradSchool: f.gradSchool,
|
|
|
+ eduCertNo: f.eduCertNo,
|
|
|
+ eduVerifyStatus: f.eduVerifyStatus,
|
|
|
+ eduCheckResult: f.eduVerifyResult,
|
|
|
+ companyName: f.companyName,
|
|
|
+ workPeriod: f.workPeriod?.length === 2 ? f.workPeriod : [],
|
|
|
+ position: f.position,
|
|
|
+ lastSalary: f.lastSalary,
|
|
|
+ leaveReasonVerify: f.leaveReasonVerify,
|
|
|
+ companyCheckRemark: f.attachment1Remark,
|
|
|
+ companyCheckResult: f.companyVerifyResult,
|
|
|
+ leaderEvalAdvantage: f.leaderEvalAdvantage,
|
|
|
+ leaderEvalImprove: f.leaderEvalImprove,
|
|
|
+ leaderEvalProf: f.leaderEvalProf,
|
|
|
+ leaderEvalAttitude: f.leaderEvalAttitude,
|
|
|
+ leaderEvalTeam: f.leaderEvalTeam,
|
|
|
+ leaderEvalMorals: f.leaderEvalMorals,
|
|
|
+ colleagueEvalTeamwork: f.colleagueEvalTeamwork,
|
|
|
+ colleagueEvalProf: f.colleagueEvalProf,
|
|
|
+ hrEvalDispute: f.hrEvalDispute,
|
|
|
+ hrEvalTransfer: f.hrEvalTransfer,
|
|
|
+ performCheckRemark: f.attachment2Remark,
|
|
|
+ performCheckResult: f.evalResult,
|
|
|
+ hasNonCompete: f.hasNonCompete,
|
|
|
+ hasNda: f.hasNda,
|
|
|
+ agreementRemark: f.agreementRemark,
|
|
|
+ hasDisputeStatus: f.hasDisputeStatus,
|
|
|
+ disputeRemark: f.disputeRemark,
|
|
|
+ conclusion: f.conclusion,
|
|
|
+ conclusionReason: f.conclusionReason,
|
|
|
+ investigatorName: f.investigatorName,
|
|
|
+ investigatorDate: f.investigatorDate,
|
|
|
+ interviewSupervisor: mapInterview(f.interviewSupervisor),
|
|
|
+ interviewHR: mapInterview(f.interviewHR),
|
|
|
+ interviewColleague: mapInterview(f.interviewColleague)
|
|
|
+ };
|
|
|
+ await submitBackCheckReport(rid, submitData);
|
|
|
+ ElMessage.success(reportStatus === 3 ? '已标记为审核不通过' : '审核通过');
|
|
|
+ formReportStatus.value = reportStatus || 2;
|
|
|
+ emit('submitted', reportStatus || 2);
|
|
|
+ } else {
|
|
|
+ // 门户端提交:使用原接口(免登录)
|
|
|
+ await request.post('/portal/check/bgform/submit', {
|
|
|
+ recordId: rid,
|
|
|
+ ...form.value
|
|
|
+ }, { skipAuth: true } as any);
|
|
|
+ submitted.value = true;
|
|
|
+ ElMessage.success('提交成功!感谢您的真实填写与支持。');
|
|
|
+ setTimeout(() => {
|
|
|
+ window.close();
|
|
|
+ }, 1500);
|
|
|
+ }
|
|
|
} catch (e: any) {
|
|
|
// error already handled by request interceptor
|
|
|
} finally {
|
|
|
@@ -409,13 +597,11 @@ const handleSubmit = () => {
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
-
|
|
|
</script>
|
|
|
<style scoped>
|
|
|
.bg-check-container {
|
|
|
- min-height: 100vh;
|
|
|
background-color: #fff;
|
|
|
- padding: 40px 20px;
|
|
|
+ padding: 16px 20px;
|
|
|
font-family: SimSun, "宋体", serif;
|
|
|
}
|
|
|
|