Skip to content

Commit 1b92417

Browse files
committed
feat: 笔试可以提交文件/问卷链接 and no-permisson页面更新
1 parent 9fbc96b commit 1b92417

7 files changed

Lines changed: 109 additions & 11 deletions

File tree

src/api/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export {
1111
createRecruitment,
1212
updateRecruitment,
1313
uploadTest,
14+
uploadTestUrl,
1415
SetStressTestTime,
1516
getTest,
1617
} from './recruitment';

src/api/recruitment/index.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import {
1515
UpdateRecruitmentResponse,
1616
UploadTestRequest,
1717
UploadTestResponse,
18+
UploadTestUrlResponse,
19+
SetWrittenTestTypeResponse,
20+
GetWrittenTestTypeResponse,
1821
} from '@/constants/httpMsg/recruitment/updateRecruitmentMsg';
1922
import { Group, Step } from '@/constants/team';
2023
import request from '../_request';
@@ -86,6 +89,43 @@ export async function uploadTest(
8689
return res;
8790
}
8891

92+
export async function uploadTestUrl(
93+
rid: string,
94+
group: Group,
95+
url: string,
96+
): Promise<UploadTestUrlResponse> {
97+
const res: UploadTestUrlResponse = await request({
98+
url: `/recruitments/${rid}/written-test-url/${group}`, // 注意末尾的斜杠,后端写的
99+
method: 'PUT',
100+
data: { questionnaire_url: url },
101+
});
102+
return res;
103+
}
104+
105+
export async function setWrittenTestType(
106+
rid: string,
107+
group: Group,
108+
type: number,
109+
): Promise<SetWrittenTestTypeResponse> {
110+
const res: SetWrittenTestTypeResponse = await request({
111+
url: `/recruitments/${rid}/written-test-type/${group}`,
112+
method: 'POST',
113+
data: { group_written_test_type: type },
114+
});
115+
return res;
116+
}
117+
118+
export async function getWrittenTestType(
119+
rid: string,
120+
group: Group,
121+
): Promise<GetWrittenTestTypeResponse> {
122+
const res: GetWrittenTestTypeResponse = await request({
123+
url: `/recruitments/${rid}/written-test-type/${group}`,
124+
method: 'GET',
125+
});
126+
return res;
127+
}
128+
89129
export async function SetStressTestTime(
90130
rid: string,
91131
data: SetStressTestTimeRequest,

src/constants/httpMsg/recruitment/updateRecruitmentMsg.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,11 @@ export type SetStressTestTimeResponse = HttpRes<object>;
1616
export type UploadTestRequest = File;
1717

1818
export type UploadTestResponse = HttpRes<object>;
19+
20+
export type UploadTestUrlResponse = HttpRes<object>;
21+
22+
export type SetWrittenTestTypeResponse = HttpRes<object>;
23+
24+
export type GetWrittenTestTypeResponse = HttpRes<{
25+
group_written_test_type: number;
26+
}>;

src/locale/zh-CN/common.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ export default {
1818
'common.operation.comfirmDeleteDate': '确认删除该日程?',
1919
'common.operation.returnInterviewManagement': '返回面试管理',
2020
'common.operation.uploadTest': '上传笔试/问卷',
21+
'common.operation.uploadFileOrUrl': '可上传文件或在线问卷链接(二选一)',
2122
'common.operation.uploadFile': '上传文件',
22-
'common.operation.uploadFileFirst': '请先上传文件',
23+
'common.operation.uploadUrl': '上传链接',
24+
'common.operation.uploadFileOrUrlFirst': '请先上传文件或链接',
25+
'common.operation.uploadFileOrUrlOnly': '请勿同时上传文件和链接',
2326
'common.operation.setStressTestTime': '设置熬测时间',
2427
'common.operation.sendNotification': '发送通知',
2528
'common.operation.notify': '通知',
@@ -28,6 +31,7 @@ export default {
2831
'common.operation.confirmTerminate': '确认终止投递?',
2932
'common.operation.confirmDeleteComment': '确认删除该评论?',
3033
'common.operation.editContent': '编辑内容',
34+
'common.operation.currentTestFileOrUrl': '当前笔试文件/链接',
3135
'common.operation.searchByName': '搜索成员姓名',
3236
'common.operation.operate': '操作',
3337
'common.operation.refresh': '刷新',
@@ -48,7 +52,7 @@ export default {
4852
'common.result.switchStageSuccess': '转移阶段成功',
4953
'common.result.terminateSuccess': '终止投递成功',
5054
'common.result.commentNotNull': '评论与评价不能同时为空',
51-
'common.result.uploadFileSuccess': '上传文件成功',
55+
'common.result.uploadFileSuccess': '上传文件/链接成功',
5256
'common.result.setStressTestTimeSuccess': '设置熬测时间成功',
5357
'common.result.remainingSchedules': '剩余{count}个日程',
5458
'common.result.allowcateTimeSuccess': '分配时间成功',

src/store/modules/recruitment/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import {
66
createRecruitment,
77
updateRecruitment,
88
uploadTest,
9+
uploadTestUrl,
910
SetStressTestTime,
1011
getTest,
1112
deleteInterview,
1213
createInterview,
1314
} from '@/api';
15+
import { set } from 'lodash';
16+
import { getWrittenTestType, setWrittenTestType } from '@/api/recruitment';
1417
import {
1518
RecruitmentState,
1619
UpdateParams,
@@ -66,7 +69,14 @@ const useRecruitmentStore = defineStore('recruitment', {
6669
}
6770
this.getAllRecruitments();
6871
},
69-
async uploadTest(rid: string, group: Group, data: File) {
72+
async uploadTest(rid: string, group: Group, data: File | string) {
73+
if (typeof data === 'string') {
74+
await setWrittenTestType(rid, group, 2);
75+
console.log('上传测试链接', await getWrittenTestType(rid, group));
76+
const res = await uploadTestUrl(rid, group, data);
77+
return res;
78+
}
79+
await setWrittenTestType(rid, group, 1);
7080
const res = await uploadTest(rid, group, data);
7181
return res;
7282
},

src/views/noPermission/index.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,21 @@
77
<template #icon>
88
<NoPermissionSVG class="max-w-[min(404px,90%)]" />
99
</template>
10+
<template #extra>
11+
<a-space>
12+
<a-button type="primary" @click="handleRelogin"> 重新登录 </a-button>
13+
</a-space>
14+
</template>
1015
</a-result>
1116
</template>
1217

1318
<script setup lang="ts">
1419
import NoPermissionSVG from '@/assets/svg/no-permission.svg';
20+
import { SSO_DOMAIN, HR_DOMAIN_FE, HR_BASE_URL } from '@/constants';
21+
22+
function handleRelogin() {
23+
window.location.href = `//${SSO_DOMAIN}/login?from=${HR_DOMAIN_FE}`;
24+
}
1525
</script>
1626

1727
<style scoped lang="less">

src/views/overview/candidate/components/candidate-info.vue

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@
103103
</a-select>
104104
</a-form-item>
105105
<a-form-item field="data">
106+
<!-- 使用 label 插槽自定义标题 -->
107+
<template #label>
108+
{{ $t('common.operation.uploadFile') }}
109+
<a-tooltip :content="$t('common.operation.uploadFileOrUrl')">
110+
<icon-info-circle
111+
style="margin-left: 4px; color: var(--color-text-3); cursor: help"
112+
/>
113+
</a-tooltip>
114+
</template>
115+
106116
<a-upload
107117
v-model:file-list="uploadData.data"
108118
draggable
@@ -111,13 +121,19 @@
111121
:limit="1"
112122
>
113123
<template #upload-button>
114-
<a-button class="w-full"
115-
>{{ $t('common.operation.uploadFile') }}
116-
<template #icon><icon-upload /> </template>
124+
<a-button class="w-full">
125+
<template #icon><icon-upload /></template>
126+
{{ $t('common.operation.uploadFile') }}
117127
</a-button>
118128
</template>
119129
</a-upload>
120130
</a-form-item>
131+
<a-form-item field="url" :label="$t('common.operation.uploadUrl')">
132+
<a-input
133+
v-model="uploadData.url"
134+
placeholder="https://example.com/test.pdf"
135+
/>
136+
</a-form-item>
121137
</a-form>
122138
</a-modal>
123139
<a-modal
@@ -153,7 +169,7 @@ import { debounce } from 'lodash';
153169
import { Group, Step, recruitSteps } from '@/constants/team';
154170
import useRecruitmentStore from '@/store/modules/recruitment';
155171
import TeamGroupRadio from '@/views/components/team-group-radio.vue';
156-
import { FileItem, Message } from '@arco-design/web-vue';
172+
import { FileItem, Message, Tooltip } from '@arco-design/web-vue';
157173
import { useI18n } from 'vue-i18n';
158174
import useWindowResize from '@/hooks/resize';
159175
import candidateInfoCard from './candidate-info-card.vue';
@@ -322,22 +338,27 @@ const handleClearSelected = () => {
322338
323339
watch([curStep, currentGroup, recStore], handleClearSelected);
324340
325-
const uploadData = ref<{ group: Ref<Group>; data: FileItem[] }>({
341+
const uploadData = ref<{ group: Ref<Group>; data: FileItem[]; url: string }>({
326342
group: currentGroup,
327343
data: [],
344+
url: '',
328345
});
329346
330347
const showUploadModal = ref(false);
331348
332349
const handleUpload = async (): Promise<boolean> => {
333-
if (!uploadData.value.data[0]?.file) {
334-
Message.warning(t('common.operation.uploadFileFirst'));
350+
if (!uploadData.value.data[0]?.file && !uploadData.value.url) {
351+
Message.warning(t('common.operation.uploadFileOrUrlFirst'));
352+
return false;
353+
}
354+
if (uploadData.value.data[0]?.file && uploadData.value.url) {
355+
Message.warning(t('common.operation.uploadFileOrUrlOnly'));
335356
return false;
336357
}
337358
const res = await recStore.uploadTest(
338359
recStore.currentRid,
339360
uploadData.value.group,
340-
uploadData.value.data[0].file,
361+
uploadData.value.data[0]?.file || uploadData.value.url,
341362
);
342363
if (!res) return false;
343364
Message.success(t('common.result.uploadFileSuccess'));
@@ -371,6 +392,10 @@ const handleSetStressTime = async (): Promise<boolean> => {
371392
Message.success(t('common.result.setStressTestTimeSuccess'));
372393
return true;
373394
};
395+
396+
// 预览链接
397+
const preUrl =
398+
'blob:http://localhost:5111/33cb0d31-e85c-4d11-90df-70328f58f268';
374399
</script>
375400

376401
<style scoped lang="less">

0 commit comments

Comments
 (0)