From 4f0a665d8b0078defa95c6557ed46c681ca29fc6 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期四, 11 九月 2025 17:38:04 +0800 Subject: [PATCH] feat: 页面 --- src/views/CPersonManage/components/CPersonDetailDialog.vue | 180 ----------------- src/views/CPersonManage/components/SignDetailView.vue | 127 ++++++++++++ src/constants/task.ts | 14 + .eslintrc-auto-import.json | 2 auto-imports.d.ts | 4 src/views/CPersonManage/components/StaffResumeView.vue | 124 ++++++++++++ src/views/CPersonManage/components/StaffDetailInfoView.vue | 112 +++++++++++ 7 files changed, 392 insertions(+), 171 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 8db6b7f..74eb8be 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -56,7 +56,9 @@ "EnumPagedListOrder": true, "EnumPayAccess": true, "EnumPersonalFreeTime": true, + "EnumPersonalFreeTimeText": true, "EnumPersonalJobSeekingStatus": true, + "EnumPersonalJobSeekingStatusText": true, "EnumPersonalRealMethod": true, "EnumPersonalUserRealStatus": true, "EnumRealAccess": true, diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 7318f0d..69e51a1 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -58,7 +58,9 @@ const EnumPagedListOrder: typeof import('./src/constants/apiEnum')['EnumPagedListOrder'] const EnumPayAccess: typeof import('./src/constants/apiEnum')['EnumPayAccess'] const EnumPersonalFreeTime: typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime'] + const EnumPersonalFreeTimeText: typeof import('./src/constants/task')['EnumPersonalFreeTimeText'] const EnumPersonalJobSeekingStatus: typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus'] + const EnumPersonalJobSeekingStatusText: typeof import('./src/constants/task')['EnumPersonalJobSeekingStatusText'] const EnumPersonalRealMethod: typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod'] const EnumPersonalUserRealStatus: typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus'] const EnumRealAccess: typeof import('./src/constants/apiEnum')['EnumRealAccess'] @@ -351,7 +353,9 @@ readonly EnumPagedListOrder: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPagedListOrder']> readonly EnumPayAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPayAccess']> readonly EnumPersonalFreeTime: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']> + readonly EnumPersonalFreeTimeText: UnwrapRef<typeof import('./src/constants/task')['EnumPersonalFreeTimeText']> readonly EnumPersonalJobSeekingStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']> + readonly EnumPersonalJobSeekingStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumPersonalJobSeekingStatusText']> readonly EnumPersonalRealMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']> readonly EnumPersonalUserRealStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']> readonly EnumRealAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumRealAccess']> diff --git a/src/constants/task.ts b/src/constants/task.ts index c5bad05..1025579 100644 --- a/src/constants/task.ts +++ b/src/constants/task.ts @@ -53,3 +53,17 @@ [EnumTaskCheckReceiveStatus.WaitSubmit]: '寰呴獙鏀�', [EnumTaskCheckReceiveStatus.Completed]: '宸查獙鏀�', }; + +export const EnumPersonalFreeTimeText = { + [EnumPersonalFreeTime.NoLimit]: '涓嶉檺', + [EnumPersonalFreeTime.WinterSummerVacations]: '瀵掓殤鍋�', + [EnumPersonalFreeTime.FestivalAndHoliday]: '鑺傚亣鏃�', + [EnumPersonalFreeTime.Weekend]: '鍛ㄥ叚鏃�', + [EnumPersonalFreeTime.Weekday]: '宸ヤ綔鏃�', +}; + +export const EnumPersonalJobSeekingStatusText = { + [EnumPersonalJobSeekingStatus.Active]: '绉瀬鎵句换鍔�', + [EnumPersonalJobSeekingStatus.Whatever]: '闅忎究鐪嬬湅', + [EnumPersonalJobSeekingStatus.Not]: '鏆傛椂涓嶆壘浠诲姟', +}; diff --git a/src/views/CPersonManage/components/CPersonDetailDialog.vue b/src/views/CPersonManage/components/CPersonDetailDialog.vue index cd5cb06..9c2baf9 100644 --- a/src/views/CPersonManage/components/CPersonDetailDialog.vue +++ b/src/views/CPersonManage/components/CPersonDetailDialog.vue @@ -2,49 +2,13 @@ <ProDialog title="鐢宠璇︽儏" v-model="visible" width="1200px" destroy-on-close> <ProTabs v-model="form.tabType" hasBorder> <ProTabPane lazy label="浜哄憳璇︽儏" name="user"> - <ProForm :model="form" ref="dialogForm" label-width="120px" is-read> - <ProFormItemV2 label="濮撳悕:" prop="name"> - <ProFormText v-model.trim="form.name" /> - </ProFormItemV2> - <ProFormItemV2 label="韬唤璇佸彿:" prop="identity"> - <ProFormText v-model.trim="form.identity" /> - </ProFormItemV2> - <ProFormItemV2 label="鎵嬫満鍙�:" prop="contactPhoneNumber"> - <ProFormText v-model.trim="form.contactPhoneNumber" /> - </ProFormItemV2> - <ProFormItemV2 label="鎬у埆:" prop="gender"> - <ProFormRadio - v-model="form.gender" - :value-enum="EnumUserGenderTextForPerson" - ></ProFormRadio> - </ProFormItemV2> - <ProFormItemV2 label="骞撮緞:" prop="age"> - <ProFormInputNumber v-model="form.age" unit="宀�"></ProFormInputNumber> - </ProFormItemV2> - <ProFormItemV2 label="韬唤璇佹闈�:" prop="identityImg"> - <ProFormImageUpload v-model:file-url="form.identityImg" /> - </ProFormItemV2> - <ProFormItemV2 label="韬唤璇佸弽闈�:" prop="identityBackImg"> - <ProFormImageUpload v-model:file-url="form.identityBackImg" /> - </ProFormItemV2> - </ProForm> + <!-- <StaffDetailInfoView :form="form" /> --> + </ProTabPane> + <ProTabPane lazy label="浜哄憳绠�鍘�" name="resume"> + <!-- <StaffResumeView :form="form" /> --> </ProTabPane> <ProTabPane lazy label="绛剧害璇︽儏" name="sign"> - <ProDialogTableWrapper :height="400"> - <ProTableV2 v-bind="proTableProps" :columns="column" :show-operation-column="false"> - <template #contractUrl="{ row }"> - <PreviewBtn - v-if=" - row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass && - row.contractUrl - " - :show-download-btn="false" - :url="setOSSLink(row.contractUrl)" - > - </PreviewBtn> - </template> - </ProTableV2> - </ProDialogTableWrapper> + <SignDetailView :form="form" /> </ProTabPane> </ProTabs> <template #footer> @@ -56,33 +20,11 @@ </template> <script setup lang="ts"> -import { - ProDialog, - ProTableV2, - ProDialogTableWrapper, - ProTabs, - ProTabPane, - useTable, - ProForm, - ProFormItemV2, - ProFormText, - UploadUserFile, - ProFormImageUpload, - ProFormRadio, - ProFormInputNumber, - defineColumns, - PreviewBtn, -} from '@bole-core/components'; +import { ProDialog, ProTabs, ProTabPane } from '@bole-core/components'; import _ from 'lodash'; -import * as userServices from '@/services/api/user'; -import { - EnumUserGender, - EnumUserGenderTextForPerson, - EnumTaskUserHireStatusText, - EnumTaskUserSignContractStatusText, - EnumTaskUserSignContractStatus, -} from '@/constants'; -import { setOSSLink } from '@/utils'; +import StaffDetailInfoView from './StaffDetailInfoView.vue'; +import StaffResumeView from './StaffResumeView.vue'; +import SignDetailView from './SignDetailView.vue'; defineOptions({ name: 'CPersonDetailDialog', @@ -91,13 +33,6 @@ type Form = { tabType: string; id: string; - name: string; - identity: string; - contactPhoneNumber: string; - age: number; - gender: EnumUserGender; - identityImg: UploadUserFile[]; - identityBackImg: UploadUserFile[]; }; const form = defineModel<Form>('form'); @@ -106,103 +41,6 @@ const emit = defineEmits<{ (e: 'onCancel'): void; }>(); - -const column = defineColumns([ - { - id: '1', - enCode: 'enterpriseName', - name: '鎵�灞炲鎴�', - }, - { - id: '2', - enCode: 'applyTime', - name: '鎶ュ悕鏃堕棿', - }, - { - id: '3', - enCode: 'hireStatus', - name: '褰曠敤鐘舵��', - }, - { - id: '4', - enCode: 'hireTime', - name: '褰曠敤鏃堕棿', - }, - { - id: '5', - enCode: 'userSignContractStatus', - name: '绛剧害鐘舵��', - }, - { - id: '6', - enCode: 'enterpriseSignContractStatus', - name: '浼佷笟绛剧害鐘舵��', - }, - { - id: '7', - enCode: 'enterpriseSignContractTime', - name: '浼佷笟绛剧害鏃堕棿', - }, - { - id: '8', - enCode: 'contractUrl', - name: '鐢靛瓙鍚堝悓', - }, -]); - -watch( - visible, - (val) => { - console.log('val: ', val); - if (val) { - getList(); - } - }, - { - immediate: true, - } -); - -const { - getDataSource: getList, - proTableProps, - paginationState, - extraParamState, -} = useTable( - async ({ pageIndex, pageSize }, extraParamState) => { - try { - let params: API.GetPersonalUserInfoSignContractsQuery = { - pageModel: { - rows: pageSize, - page: pageIndex, - orderInput: extraParamState.orderInput, - }, - id: form.value.id, - }; - let res = await userServices.getPersonalUserInfoSignContracts(params); - return res; - } catch (error) {} - }, - { - defaultExtraParams: { - orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], - }, - columnsRenderProps: { - applyTime: { type: 'date' }, - hireTime: { type: 'date' }, - enterpriseSignContractTime: { type: 'date' }, - hireStatus: { type: 'enum', valueEnum: EnumTaskUserHireStatusText }, - userSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText }, - enterpriseSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText }, - // contractUrl: { - // type: 'url', - // showDownloadBtn: false, - // formatter: (row: API.GetPersonalUserInfoSignContractsQueryResultItem) => - // setOSSLink(row.contractUrl), - // }, - }, - } -); </script> <style lang="scss" scoped> diff --git a/src/views/CPersonManage/components/SignDetailView.vue b/src/views/CPersonManage/components/SignDetailView.vue new file mode 100644 index 0000000..a4d2ddd --- /dev/null +++ b/src/views/CPersonManage/components/SignDetailView.vue @@ -0,0 +1,127 @@ +<template> + <ProTableV2 + v-bind="proTableProps" + :columns="column" + :show-operation-column="false" + :auto-height="false" + :table-props="{ + height: '400px', + }" + > + <template #contractUrl="{ row }"> + <PreviewBtn + v-if="row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass && row.contractUrl" + :show-download-btn="false" + :url="setOSSLink(row.contractUrl)" + > + </PreviewBtn> + </template> + </ProTableV2> +</template> + +<script setup lang="ts"> +import { useTable, ProTableV2, defineColumns } from '@bole-core/components'; +import { setOSSLink } from '@/utils'; +import { + EnumTaskUserSignContractStatus, + EnumTaskUserHireStatusText, + EnumTaskUserSignContractStatusText, +} from '@/constants'; +import * as userServices from '@/services/api/user'; + +defineOptions({ + name: 'SignDetailView', +}); + +type Form = { + id: string; +}; + +const form = defineModel<Form>('form'); + +const isLoading = ref(false); + +const column = defineColumns([ + { + id: '1', + enCode: 'enterpriseName', + name: '鎵�灞炲鎴�', + }, + { + id: '2', + enCode: 'applyTime', + name: '鎶ュ悕鏃堕棿', + }, + { + id: '3', + enCode: 'hireStatus', + name: '褰曠敤鐘舵��', + }, + { + id: '4', + enCode: 'hireTime', + name: '褰曠敤鏃堕棿', + }, + { + id: '5', + enCode: 'userSignContractStatus', + name: '绛剧害鐘舵��', + }, + { + id: '6', + enCode: 'enterpriseSignContractStatus', + name: '浼佷笟绛剧害鐘舵��', + }, + { + id: '7', + enCode: 'enterpriseSignContractTime', + name: '浼佷笟绛剧害鏃堕棿', + }, + { + id: '8', + enCode: 'contractUrl', + name: '鐢靛瓙鍚堝悓', + }, +]); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetPersonalUserInfoSignContractsQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + id: form.value.id, + }; + let res = await userServices.getPersonalUserInfoSignContracts(params); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], + }, + columnsRenderProps: { + applyTime: { type: 'date' }, + hireTime: { type: 'date' }, + enterpriseSignContractTime: { type: 'date' }, + hireStatus: { type: 'enum', valueEnum: EnumTaskUserHireStatusText }, + userSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText }, + enterpriseSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText }, + }, + } +); + +onMounted(async () => { + isLoading.value = true; + await getList(); + isLoading.value = false; +}); +</script> diff --git a/src/views/CPersonManage/components/StaffDetailInfoView.vue b/src/views/CPersonManage/components/StaffDetailInfoView.vue new file mode 100644 index 0000000..5dbe708 --- /dev/null +++ b/src/views/CPersonManage/components/StaffDetailInfoView.vue @@ -0,0 +1,112 @@ +<template> + <ProForm :model="detail" ref="dialogForm" label-width="120px" is-read> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="濮撳悕锛�" prop="name"> + <ProFormText v-model.trim="detail.name"></ProFormText> + </ProFormItemV2> + </ProFormColItem> + <ProFormColItem :span="12"> + <ProFormItemV2 label="瀹炲悕鏃堕棿锛�" prop="userRealTime"> + <div>{{ format(detail.userRealTime, 'YYYY-MM-DD HH:mm') }}</div> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="韬唤璇佸彿锛�" prop="identity"> + <ProFormText v-model.trim="detail.identity"></ProFormText> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="鎵嬫満鍙凤細" prop="contactPhoneNumber"> + <ProFormText v-model.trim="detail.contactPhoneNumber"></ProFormText> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="鎬у埆锛�" prop="gender"> + <ProFormRadio + v-model="detail.gender" + :value-enum="EnumUserGenderTextForPerson" + ></ProFormRadio> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="骞撮緞锛�" prop="age"> + <ProFormInputNumber v-model="detail.age"> </ProFormInputNumber> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormItemV2 label="韬唤璇佹闈細" prop="identityImg"> + <ProFormImageUpload v-model:file-url="detail.identityImg"> </ProFormImageUpload> + </ProFormItemV2> + <ProFormItemV2 label="韬唤璇佸弽闈細" prop="identityBackImg"> + <ProFormImageUpload v-model:file-url="detail.identityBackImg"> </ProFormImageUpload> + </ProFormItemV2> + </ProForm> +</template> + +<script setup lang="ts"> +import { + ProForm, + ProFormCol, + ProFormColItem, + ProFormItemV2, + ProFormText, + ProFormInputNumber, + ProFormImageUpload, + ProFormRadio, + UploadUserFile, +} from '@bole-core/components'; +import { convertApi2FormUrlOnlyOne, format } from '@/utils'; +import { useQuery } from '@tanstack/vue-query'; +import { EnumUserGender, EnumUserGenderTextForPerson } from '@/constants'; +import * as enterpriseEmployeeServices from '@/services/api/enterpriseEmployee'; + +defineOptions({ + name: 'StaffDetailInfoView', +}); + +type Form = { + id: string; +}; + +const form = defineModel<Form>('form'); + +const detail = reactive({ + name: '', + identity: '', + contactPhoneNumber: '', + gender: EnumUserGender.Male, + age: 0, + identityImg: [] as UploadUserFile[], + identityBackImg: [] as UploadUserFile[], + userRealTime: '', +}); + +const { isLoading } = useQuery({ + queryKey: ['enterpriseEmployeeServices/getEnterpriseEmployee', form.value.id], + queryFn: async () => { + return await enterpriseEmployeeServices.getEnterpriseEmployee({ id: form.value.id }); + }, + onSuccess(data) { + detail.name = data.name; + detail.identity = data.identity; + detail.contactPhoneNumber = data.contactPhoneNumber; + detail.gender = data.gender; + detail.age = data.age ?? 0; + detail.identityImg = data.identityImg ? convertApi2FormUrlOnlyOne(data.identityImg) : []; + detail.identityBackImg = data.identityBackImg + ? convertApi2FormUrlOnlyOne(data.identityBackImg) + : []; + detail.userRealTime = data.userRealTime ?? ''; + }, + enabled: computed(() => !!form.value.id), +}); +</script> diff --git a/src/views/CPersonManage/components/StaffResumeView.vue b/src/views/CPersonManage/components/StaffResumeView.vue new file mode 100644 index 0000000..e5658c3 --- /dev/null +++ b/src/views/CPersonManage/components/StaffResumeView.vue @@ -0,0 +1,124 @@ +<template> + <ProForm :model="detail" ref="dialogForm" label-width="120px" is-read> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="鏈熸湜宀椾綅锛�" prop="name"> + <div>{{ detail.userExpectJobs }}</div> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="绌洪棽鏃堕棿锛�" prop="freeTime"> + <ProFormRadio + v-model="detail.freeTime" + :value-enum="EnumPersonalFreeTimeText" + ></ProFormRadio> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="姹傝亴鐘舵�侊細" prop="jobSeekingStatus"> + <ProFormRadio + v-model="detail.jobSeekingStatus" + :value-enum="EnumPersonalJobSeekingStatusText" + ></ProFormRadio> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="宸ヤ綔骞撮檺锛�" prop="workSeniority"> + <ProFormText v-model="detail.workSeniority"></ProFormText> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="宸ヤ綔缁忛獙锛�" prop="workExperience"> + <ProFormText v-model="detail.workExperience"></ProFormText> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="韬珮锛�" prop="height"> + <ProFormInputNumber v-model="detail.height"></ProFormInputNumber> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="浣撻噸锛�" prop="weight"> + <ProFormInputNumber v-model="detail.weight"></ProFormInputNumber> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormItemV2 label="涓汉鐓х墖锛�" prop="photos"> + <ProFormImageUpload v-model:file-url="detail.photos"> </ProFormImageUpload> + </ProFormItemV2> + </ProForm> +</template> + +<script setup lang="ts"> +import { + ProForm, + ProFormCol, + ProFormColItem, + ProFormItemV2, + ProFormText, + ProFormInputNumber, + ProFormRadio, + UploadUserFile, + ProFormImageUpload, +} from '@bole-core/components'; +import { EnumPersonalFreeTimeText, EnumPersonalJobSeekingStatusText } from '@/constants'; +import { useQuery } from '@tanstack/vue-query'; +import * as userResumeServices from '@/services/api/userResume'; +import { convertApi2FormUrl } from '@/utils'; + +defineOptions({ + name: 'StaffResumeView', +}); + +type Form = { + id: string; +}; + +const form = defineModel<Form>('form'); + +const detail = reactive({ + userExpectJobs: '', + freeTime: '' as any as EnumPersonalFreeTime, + jobSeekingStatus: '' as any as EnumPersonalJobSeekingStatus, + workSeniority: '', + workExperience: '', + height: 0, + weight: 0, + photos: [] as UploadUserFile[], +}); + +const { isLoading } = useQuery({ + queryKey: ['userResumeServices/getUserResume', form.value.id], + queryFn: async () => { + return await userResumeServices.getUserResume({ enterpriseEmployeeId: form.value.id }); + }, + onSuccess(data) { + detail.userExpectJobs = + data.userExpectJobs?.length > 0 + ? data.userExpectJobs.map((x) => x.expectJobContent).join(',') + : ''; + detail.freeTime = data.freeTime; + detail.jobSeekingStatus = data.jobSeekingStatus; + detail.workSeniority = data.workSeniority; + detail.workExperience = data.workExperience; + detail.height = data.height ?? 0; + detail.weight = data.weight ?? 0; + detail.photos = data.photos + ? data.photos.map((x) => convertApi2FormUrl(x)) + : ([] as UploadUserFile[]); + }, + enabled: computed(() => !!form.value.id), +}); +</script> -- Gitblit v1.9.1