From a686faf1c2132f55e40119df28ce9f6e46206b74 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期四, 11 九月 2025 17:40:38 +0800 Subject: [PATCH] feat: 页面 --- src/views/ServiceChargeManage/ServiceChargeDetail.vue | 64 ++-- src/constants/task.ts | 19 + .eslintrc-auto-import.json | 3 src/views/ServiceChargeManage/ServiceChargeManage.vue | 72 +++-- src/views/FlexJobManage/FlexJobManage.vue | 16 + src/views/FlexJobManage/components/StaffDetailInfoView.vue | 112 ++++++++++ src/views/FlexJobManage/components/SignDetailView.vue | 127 +++++++++++ src/views/FlexJobManage/components/StaffResumeView.vue | 124 +++++++++++ src/views/EmploymentManage/components/CheckManageDialog.vue | 2 src/views/FlexJobManage/components/StaffDetailInfoDialog.vue | 61 +++++ auto-imports.d.ts | 6 src/views/EmploymentManage/components/AddOrEditEmploymentView.vue | 35 +++ src/views/ServiceChargeManage/components/UploadStatementDialog.vue | 18 13 files changed, 586 insertions(+), 73 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 4d85d94..0d2cd9f 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -42,7 +42,9 @@ "EnumPagedListOrder": true, "EnumPayAccess": true, "EnumPersonalFreeTime": true, + "EnumPersonalFreeTimeText": true, "EnumPersonalJobSeekingStatus": true, + "EnumPersonalJobSeekingStatusText": true, "EnumPersonalRealMethod": true, "EnumPersonalUserRealStatus": true, "EnumRealAccess": true, @@ -52,6 +54,7 @@ "EnumRoleWebApiDataPowerText": true, "EnumRoleWebApiDataPowerTextForFilter": true, "EnumSettlementCycle": true, + "EnumSettlementCycleDateText": true, "EnumSettlementCycleText": true, "EnumSmsAccess": true, "EnumTaskCheckReceiveStatus": true, diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 4d9adb0..3eab8bc 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -47,7 +47,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'] @@ -57,6 +59,7 @@ const EnumRoleWebApiDataPowerText: typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerText'] const EnumRoleWebApiDataPowerTextForFilter: typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerTextForFilter'] const EnumSettlementCycle: typeof import('./src/constants/apiEnum')['EnumSettlementCycle'] + const EnumSettlementCycleDateText: typeof import('./src/constants/task')['EnumSettlementCycleDateText'] const EnumSettlementCycleText: typeof import('./src/constants/task')['EnumSettlementCycleText'] const EnumSmsAccess: typeof import('./src/constants/apiEnum')['EnumSmsAccess'] const EnumSmsTemplateType: typeof import('./src/constants/apiEnum')['EnumSmsTemplateType'] @@ -311,7 +314,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']> @@ -321,6 +326,7 @@ readonly EnumRoleWebApiDataPowerText: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerText']> readonly EnumRoleWebApiDataPowerTextForFilter: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerTextForFilter']> readonly EnumSettlementCycle: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSettlementCycle']> + readonly EnumSettlementCycleDateText: UnwrapRef<typeof import('./src/constants/task')['EnumSettlementCycleDateText']> readonly EnumSettlementCycleText: UnwrapRef<typeof import('./src/constants/task')['EnumSettlementCycleText']> readonly EnumSmsAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsAccess']> readonly EnumTaskCheckReceiveStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus']> diff --git a/src/constants/task.ts b/src/constants/task.ts index 6cf4a5e..ef00be6 100644 --- a/src/constants/task.ts +++ b/src/constants/task.ts @@ -11,6 +11,11 @@ [EnumSettlementCycle.Day]: '鏃ョ粨', }; +export const EnumSettlementCycleDateText = { + [EnumSettlementCycle.Month]: '姣忔湀', + [EnumSettlementCycle.Week]: '姣忓懆', +}; + export const EnumTaskReleaseStatusText = { [EnumTaskReleaseStatus.InProcess]: '鍙戝竷涓�', [EnumTaskReleaseStatus.Stopped]: '宸插仠姝�', @@ -84,3 +89,17 @@ [EnumTaskSettlementStatus.InProcess]: '缁撶畻涓�', [EnumTaskSettlementStatus.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/EmploymentManage/components/AddOrEditEmploymentView.vue b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue index b08731a..f251903 100644 --- a/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue +++ b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue @@ -68,6 +68,24 @@ </ProFormCol> <ProFormCol> <ProFormColItem :span="12"> + <ProFormItemV2 + label="缁撶畻鏃ユ湡:" + prop="settlementCycle" + :check-rules="[{ message: '璇烽�夋嫨缁撶畻鏃ユ湡' }]" + class="settlement-cycle-date-form-item" + > + {{ EnumSettlementCycleDateText[form.settlementCycle] }} + <ProFormSelect + v-model="form.settlementCycle" + :value-enum="[]" + :button-style="false" + ></ProFormSelect> + {{ '鏃ョ粨绠�' }} + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> <ProFormItemV2 label="绂忓埄:" prop="benefits"> <el-checkbox v-if="!isDetail" @@ -227,6 +245,7 @@ ProFormRadio, ProFormDatePicker, ProFormCheckbox, + ProFormSelect, } from '@bole-core/components'; import { FormInstance, ModelValueType } from 'element-plus'; import { Message } from '@bole-core/core'; @@ -238,6 +257,7 @@ EnumBillingMethodText, EnumBillingMethodUnitText, EnumSettlementCycleText, + EnumSettlementCycleDateText, } from '@/constants'; import { format, FormValidator } from '@/utils'; import dayjs from 'dayjs'; @@ -423,5 +443,20 @@ width: auto; } } + + .settlement-cycle-date-form-item { + color: inherit; + + .el-form-item__content { + flex-wrap: nowrap; + + .el-select { + margin: 0 20px; + width: auto; + min-width: 0; + flex: 1; + } + } + } } </style> diff --git a/src/views/EmploymentManage/components/CheckManageDialog.vue b/src/views/EmploymentManage/components/CheckManageDialog.vue index 592ff5c..6c82f86 100644 --- a/src/views/EmploymentManage/components/CheckManageDialog.vue +++ b/src/views/EmploymentManage/components/CheckManageDialog.vue @@ -161,7 +161,7 @@ columnsRenderProps: { createdTime: { type: 'date' }, checkReceiveTime: { type: 'date' }, - date: { type: 'date' }, + date: { type: 'date', format: 'YYYY-MM-DD' }, checkReceiveStatus: { type: 'enum', valueEnum: EnumTaskUserSubmitCheckReceiveStatusText }, files: { type: 'url', diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue index c12699f..ca81eac 100644 --- a/src/views/FlexJobManage/FlexJobManage.vue +++ b/src/views/FlexJobManage/FlexJobManage.vue @@ -99,6 +99,7 @@ </ProTableV2> </AppContainer> <StaffInfoDialog v-bind="dialogStaffInfoProps" /> + <StaffDetailInfoDialog v-bind="dialogStaffDetailProps" /> <BatchImportDialog v-bind="dialogBatchImportProps" @onDownloadTemplate="handleDownloadTemplate" @@ -133,6 +134,7 @@ import StaffInfoDialog from './components/StaffInfoDialog.vue'; import BatchImportDialog from './components/BatchImportDialog.vue'; import SendShotMessageDialog from './components/SendShotMessageDialog.vue'; +import StaffDetailInfoDialog from './components/StaffDetailInfoDialog.vue'; import SignDialog from './components/SignDialog.vue'; import * as enterpriseEmployeeServices from '@/services/api/enterpriseEmployee'; import { ModelValueType } from 'element-plus'; @@ -157,7 +159,8 @@ name: '璇︽儏', }, emits: { - onClick: (role) => openDialog(role, true), + onClick: (role: API.GetEnterpriseEmployeesQueryResultItem) => + handleStaffDetailEdit({ id: role.id, tabType: 'info' }), }, }, { @@ -563,6 +566,17 @@ } catch (error) {} } +const { + dialogProps: dialogStaffDetailProps, + handleEdit: handleStaffDetailEdit, + editForm: staffDetailEditForm, +} = useFormDialog({ + defaultFormParams: { + id: '', + tabType: 'info', + }, +}); + async function handleDelete(row: API.GetEnterpriseEmployeesQueryResultItem) { try { await Message.deleteMessage(); diff --git a/src/views/FlexJobManage/components/SignDetailView.vue b/src/views/FlexJobManage/components/SignDetailView.vue new file mode 100644 index 0000000..a4d2ddd --- /dev/null +++ b/src/views/FlexJobManage/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/FlexJobManage/components/StaffDetailInfoDialog.vue b/src/views/FlexJobManage/components/StaffDetailInfoDialog.vue new file mode 100644 index 0000000..debbb56 --- /dev/null +++ b/src/views/FlexJobManage/components/StaffDetailInfoDialog.vue @@ -0,0 +1,61 @@ +<template> + <ProDialog + title="浜哄憳璇︽儏" + v-model="visible" + @close="onDialogClose" + destroy-on-close + draggable + :width="900" + > + <ProTabs v-model="form.tabType" hasBorder> + <ProTabPane lazy label="浜哄憳淇℃伅" name="info"> + <StaffDetailInfoView :form="form" /> + </ProTabPane> + <ProTabPane lazy label="浜哄憳绠�鍘�" name="resume"> + <StaffResumeView :form="form" /> + </ProTabPane> + <ProTabPane lazy label="绛剧害璇︽儏" name="sign"> + <SignDetailView :form="form" /> + </ProTabPane> + </ProTabs> + + <template #footer> + <span class="dialog-footer"> + <el-button @click="emit('onCancel')">鍏抽棴</el-button> + </span> + </template> + </ProDialog> +</template> + +<script setup lang="ts"> +import { FormInstance } from 'element-plus'; +import { ProDialog, ProTabs, ProTabPane } from '@bole-core/components'; +import StaffDetailInfoView from './StaffDetailInfoView.vue'; +import StaffResumeView from './StaffResumeView.vue'; +import SignDetailView from './SignDetailView.vue'; + +defineOptions({ + name: 'StaffDetailInfoDialog', +}); + +type Form = { + title?: string; + tabType: string; + id: string; +}; + +const visible = defineModel<boolean>('modelValue'); +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +const dialogForm = ref<FormInstance>(); + +function onDialogClose() { + if (!dialogForm.value) return; + dialogForm.value.resetFields(); +} +</script> diff --git a/src/views/FlexJobManage/components/StaffDetailInfoView.vue b/src/views/FlexJobManage/components/StaffDetailInfoView.vue new file mode 100644 index 0000000..5dbe708 --- /dev/null +++ b/src/views/FlexJobManage/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/FlexJobManage/components/StaffResumeView.vue b/src/views/FlexJobManage/components/StaffResumeView.vue new file mode 100644 index 0000000..e5658c3 --- /dev/null +++ b/src/views/FlexJobManage/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> diff --git a/src/views/ServiceChargeManage/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue index de7d1ff..508adec 100644 --- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue +++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue @@ -15,7 +15,7 @@ </ProFormItemV2> </ProFormColItem> </ProFormCol> - <ProFormCol> + <!-- <ProFormCol> <ProFormColItem :span="8"> <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="settlementOrderName"> <ProFormText v-model="form.settlementOrderName"> </ProFormText> @@ -30,7 +30,7 @@ ></ProFormDatePicker> </ProFormItemV2> </ProFormColItem> - </ProFormCol> + </ProFormCol> --> <ProFormCol> <ProFormColItem :span="8"> <ProFormItemV2 label="缁撶畻閲戦:" prop="settlementAmount"> @@ -82,6 +82,22 @@ </SearchInput> </QueryFilterItem> </template> + <template #btn> + <BlFileUpload + v-model:file-url="form.settlementUrl" + ref="uploadRef" + :showTip="false" + :show-file-list="false" + class="pro-table-operation-btn upload-style-btn" + :on-success="(event) => handleUploadSuccess(event)" + :limitFileSize="null" + :limit="1" + accept="xlsx,xls" + > + <el-button text type="primary" class="pro-table-operation-btn">涓婁紶</el-button> + </BlFileUpload> + <el-button type="primary" link @click="handleAdd()">瀵煎嚭</el-button> + </template> </ProTableQueryFilterBar> <ProTableV2 v-bind="proTableProps" @@ -97,11 +113,11 @@ <div class="chuck-add-or-edit-actions"> <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷</el-button> <el-button - v-if="!isDetail" + v-if="isSettlement" class="chuck-add-or-edit-actions" type="primary" @click="handleSubmit" - >纭</el-button + >缁撶畻</el-button > </div> </ChunkCell> @@ -113,7 +129,6 @@ import { LoadingLayout, AppContainer, - AppScrollContainer, ChunkCell, ProForm, ProFormItemV2, @@ -130,6 +145,8 @@ ProTableQueryFilterBar, useFormDialog, XLSXUtils, + BlFileUpload, + UploadUserFile, } from '@bole-core/components'; import { SettlementListColumns } from './constants'; import { useQuery } from '@tanstack/vue-query'; @@ -160,8 +177,9 @@ const route = useRoute(); const id = (route.params.id as string) ?? ''; const url = (route.query.url as string) ?? ''; +const settlement = (route.query.settlement as string) ?? ''; -const isDetail = computed(() => !url); +const isSettlement = computed(() => !!url || !!settlement); const form = reactive({ name: '', @@ -171,6 +189,8 @@ settlementOrderName: '', settlementOrderTime: '', settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[], + + settlementUrl: [] as UploadUserFile[], }); const BaseState = { @@ -179,32 +199,6 @@ const state = reactive({ ...BaseState }); -// onMounted(async () => { -// await getList(); -// state.loading = false; -// }); - -// const { isLoading } = useQuery({ -// queryKey: ['taskServices/getSettlementTask', id], -// queryFn: async () => { -// return await taskServices.getSettlementTask( -// { id: id }, -// { -// showLoading: false, -// } -// ); -// }, -// placeholderData: () => ({} as API.GetSettlementTaskQueryResult), -// onSuccess(data) { -// form.name = data.name; -// form.settlementAmount = data.settlementAmount ?? 0; -// form.actualSettlementAmount = data.actualSettlementAmount ?? 0; -// form.code = data.code; -// form.settlementOrderName = setOssFileName(data.settlementOrderName); -// form.settlementOrderTime = data.settlementOrderTime ?? ''; -// }, -// enabled: !!id, -// }); const { isLoading } = useQuery({ queryKey: ['taskUserServices/getSettlementTaskUsers', id, url], queryFn: async () => { @@ -336,6 +330,12 @@ } catch (error) {} } +function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) { + if (response.path) { + // + } +} + function handleBack() { closeViewPush(route, { name: 'ServiceChargeManageList', diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue index 8cbbe76..e72ac87 100644 --- a/src/views/ServiceChargeManage/ServiceChargeManage.vue +++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue @@ -55,7 +55,7 @@ :columns="ServiceChargeManageColumns" :operationBtns="operationBtns" > - <template #operationBtn-uploadBtn="{ row }"> + <!-- <template #operationBtn-uploadBtn="{ row }"> <BlFileUpload v-model:file-url="editForm.settlementUrl" ref="uploadRef" @@ -84,7 +84,7 @@ > <el-button text type="primary" class="pro-table-operation-btn">閲嶆柊涓婁紶</el-button> </BlFileUpload> - </template> + </template> --> </ProTableV2> </AppContainer> <UploadStatementDialog v-bind="dialogProps" /> @@ -127,36 +127,36 @@ }); const operationBtns = defineOperationBtns([ - { - data: { - enCode: 'uploadBtn', - name: '涓婁紶', - }, - extraProps: { - hide: (row: API.GetSettlementTasksQueryResultItem) => - row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait, - }, - }, - { - data: { - enCode: 'reUploadBtn', - name: '閲嶆柊涓婁紶', - }, - extraProps: { - hide: (row: API.GetSettlementTasksQueryResultItem) => - !( - row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed && - row.settlementStatus === EnumTaskSettlementStatus.Wait - ), - }, - }, + // { + // data: { + // enCode: 'uploadBtn', + // name: '涓婁紶', + // }, + // extraProps: { + // hide: (row: API.GetSettlementTasksQueryResultItem) => + // row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait, + // }, + // }, + // { + // data: { + // enCode: 'reUploadBtn', + // name: '閲嶆柊涓婁紶', + // }, + // extraProps: { + // hide: (row: API.GetSettlementTasksQueryResultItem) => + // !( + // row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed && + // row.settlementStatus === EnumTaskSettlementStatus.Wait + // ), + // }, + // }, { data: { enCode: 'settleBtn', name: '缁撶畻', }, emits: { - onClick: (role: API.GetSettlementTasksQueryResultItem) => openSettleDialog(role), + onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role, 'settlement'), }, extraProps: { hide: (role: API.GetSettlementTasksQueryResultItem) => @@ -185,7 +185,7 @@ name: '璇︽儏', }, emits: { - onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id), + onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role), }, extraProps: { hide: (role: API.GetSettlementTasksQueryResultItem) => @@ -288,7 +288,7 @@ }); async function handleAddOrEdit() { - goDetail(editForm.id, editForm.settlementUrl[0]?.path); + goSettlementDetail(editForm.id, editForm.settlementUrl[0]?.path); } const { @@ -348,11 +348,11 @@ row: API.GetSettlementTasksQueryResultItem ) { if (response.path) { - goDetail(row.id, response.path); + goSettlementDetail(row.id, response.path); } } -async function goDetail(id: string, url?: string) { +async function goSettlementDetail(id: string, url?: string) { await router.push({ name: 'ServiceChargeDetail', params: { @@ -365,6 +365,18 @@ editForm.settlementUrl = [] as UploadUserFile[]; } +function goDetail(row: API.GetSettlementTasksQueryResultItem, settlement?: string) { + router.push({ + name: 'ServiceChargeDetail', + params: { + id: row?.id ?? '', + }, + query: { + settlement: settlement ? settlement : '', + }, + }); +} + function handleExport(val) { console.log('val: ', val); } diff --git a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue index 46e8393..1bba11e 100644 --- a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue +++ b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue @@ -8,24 +8,24 @@ :width="700" > <ProForm :model="form" ref="dialogForm" label-width="120px"> - <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="code" :check-rules="[{ message: '璇烽�夋嫨浠诲姟鍗曞彿' }]"> + <ProFormItemV2 label="浠诲姟鍚嶇О锛�" prop="name" :check-rules="[{ message: '璇烽�夋嫨浠诲姟鍗曞彿' }]"> <ProFormSelect - v-model="form.code" + v-model="form.name" :valueEnum="taskSelect" - placeholder="璇烽�夋嫨浠诲姟鍗曞彿" + placeholder="璇烽�夋嫨浠诲姟鍚嶇О" enum-value-key="id" - enum-label-key="code" + enum-label-key="name" filterable clearable @change="handleCodeChange" > </ProFormSelect> </ProFormItemV2> - <ProFormItemV2 label="浠诲姟鍚嶇О锛�" prop="name" :check-rules="[{ message: '璇疯緭鍏ヤ换鍔″悕绉�' }]"> + <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="code" :check-rules="[{ message: '璇疯緭鍏ヤ换鍔″崟鍙�' }]"> <ProFormText style="width: 50%" - placeholder="璇疯緭鍏ヤ换鍔″悕绉�" - v-model.trim="form.name" + placeholder="璇疯緭鍏ヤ换鍔″崟鍙�" + v-model.trim="form.code" disabled ></ProFormText> </ProFormItemV2> @@ -91,10 +91,10 @@ function handleCodeChange(value: string) { if (value) { - form.value.name = taskSelect.value?.find((item) => item.id === value)?.name ?? ''; + form.value.code = taskSelect.value?.find((item) => item.id === value)?.code ?? ''; form.value.id = value; } else { - Message.errorMessage('璇烽�夋嫨浠诲姟鍗曞彿'); + Message.errorMessage('璇烽�夋嫨浠诲姟鍚嶇О'); } } -- Gitblit v1.9.1