| | |
| | | "EnumPagedListOrder": true, |
| | | "EnumPayAccess": true, |
| | | "EnumPersonalFreeTime": true, |
| | | "EnumPersonalFreeTimeText": true, |
| | | "EnumPersonalJobSeekingStatus": true, |
| | | "EnumPersonalJobSeekingStatusText": true, |
| | | "EnumPersonalRealMethod": true, |
| | | "EnumPersonalUserRealStatus": true, |
| | | "EnumRealAccess": true, |
| | |
| | | "EnumRoleWebApiDataPowerText": true, |
| | | "EnumRoleWebApiDataPowerTextForFilter": true, |
| | | "EnumSettlementCycle": true, |
| | | "EnumSettlementCycleDateText": true, |
| | | "EnumSettlementCycleText": true, |
| | | "EnumSmsAccess": true, |
| | | "EnumTaskCheckReceiveStatus": true, |
| | |
| | | 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'] |
| | |
| | | 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'] |
| | |
| | | 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']> |
| | |
| | | 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']> |
| | |
| | | [EnumSettlementCycle.Day]: '日结', |
| | | }; |
| | | |
| | | export const EnumSettlementCycleDateText = { |
| | | [EnumSettlementCycle.Month]: '每月', |
| | | [EnumSettlementCycle.Week]: '每周', |
| | | }; |
| | | |
| | | export const EnumTaskReleaseStatusText = { |
| | | [EnumTaskReleaseStatus.InProcess]: '发布中', |
| | | [EnumTaskReleaseStatus.Stopped]: '已停止', |
| | |
| | | [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]: '暂时不找任务', |
| | | }; |
| | |
| | | </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" |
| | |
| | | ProFormRadio, |
| | | ProFormDatePicker, |
| | | ProFormCheckbox, |
| | | ProFormSelect, |
| | | } from '@bole-core/components'; |
| | | import { FormInstance, ModelValueType } from 'element-plus'; |
| | | import { Message } from '@bole-core/core'; |
| | |
| | | EnumBillingMethodText, |
| | | EnumBillingMethodUnitText, |
| | | EnumSettlementCycleText, |
| | | EnumSettlementCycleDateText, |
| | | } from '@/constants'; |
| | | import { format, FormValidator } from '@/utils'; |
| | | import dayjs from 'dayjs'; |
| | |
| | | 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> |
| | |
| | | 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', |
| | |
| | | </ProTableV2> |
| | | </AppContainer> |
| | | <StaffInfoDialog v-bind="dialogStaffInfoProps" /> |
| | | <StaffDetailInfoDialog v-bind="dialogStaffDetailProps" /> |
| | | <BatchImportDialog |
| | | v-bind="dialogBatchImportProps" |
| | | @onDownloadTemplate="handleDownloadTemplate" |
| | |
| | | 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'; |
| | |
| | | name: '详情', |
| | | }, |
| | | emits: { |
| | | onClick: (role) => openDialog(role, true), |
| | | onClick: (role: API.GetEnterpriseEmployeesQueryResultItem) => |
| | | handleStaffDetailEdit({ id: role.id, tabType: 'info' }), |
| | | }, |
| | | }, |
| | | { |
| | |
| | | } catch (error) {} |
| | | } |
| | | |
| | | const { |
| | | dialogProps: dialogStaffDetailProps, |
| | | handleEdit: handleStaffDetailEdit, |
| | | editForm: staffDetailEditForm, |
| | | } = useFormDialog({ |
| | | defaultFormParams: { |
| | | id: '', |
| | | tabType: 'info', |
| | | }, |
| | | }); |
| | | |
| | | async function handleDelete(row: API.GetEnterpriseEmployeesQueryResultItem) { |
| | | try { |
| | | await Message.deleteMessage(); |
New file |
| | |
| | | <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> |
New file |
| | |
| | | <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> |
New file |
| | |
| | | <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> |
New file |
| | |
| | | <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> |
| | |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <!-- <ProFormCol> |
| | | <ProFormColItem :span="8"> |
| | | <ProFormItemV2 label="结算单名称:" prop="settlementOrderName"> |
| | | <ProFormText v-model="form.settlementOrderName"> </ProFormText> |
| | |
| | | ></ProFormDatePicker> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | </ProFormCol> --> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="8"> |
| | | <ProFormItemV2 label="结算金额:" prop="settlementAmount"> |
| | |
| | | </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" |
| | |
| | | <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> |
| | |
| | | import { |
| | | LoadingLayout, |
| | | AppContainer, |
| | | AppScrollContainer, |
| | | ChunkCell, |
| | | ProForm, |
| | | ProFormItemV2, |
| | |
| | | ProTableQueryFilterBar, |
| | | useFormDialog, |
| | | XLSXUtils, |
| | | BlFileUpload, |
| | | UploadUserFile, |
| | | } from '@bole-core/components'; |
| | | import { SettlementListColumns } from './constants'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | |
| | | 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: '', |
| | |
| | | settlementOrderName: '', |
| | | settlementOrderTime: '', |
| | | settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[], |
| | | |
| | | settlementUrl: [] as UploadUserFile[], |
| | | }); |
| | | |
| | | const BaseState = { |
| | |
| | | |
| | | 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 () => { |
| | |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) { |
| | | if (response.path) { |
| | | // |
| | | } |
| | | } |
| | | |
| | | function handleBack() { |
| | | closeViewPush(route, { |
| | | name: 'ServiceChargeManageList', |
| | |
| | | :columns="ServiceChargeManageColumns" |
| | | :operationBtns="operationBtns" |
| | | > |
| | | <template #operationBtn-uploadBtn="{ row }"> |
| | | <!-- <template #operationBtn-uploadBtn="{ row }"> |
| | | <BlFileUpload |
| | | v-model:file-url="editForm.settlementUrl" |
| | | ref="uploadRef" |
| | |
| | | > |
| | | <el-button text type="primary" class="pro-table-operation-btn">重新上传</el-button> |
| | | </BlFileUpload> |
| | | </template> |
| | | </template> --> |
| | | </ProTableV2> |
| | | </AppContainer> |
| | | <UploadStatementDialog v-bind="dialogProps" /> |
| | |
| | | }); |
| | | |
| | | 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) => |
| | |
| | | name: '详情', |
| | | }, |
| | | emits: { |
| | | onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id), |
| | | onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role), |
| | | }, |
| | | extraProps: { |
| | | hide: (role: API.GetSettlementTasksQueryResultItem) => |
| | |
| | | }); |
| | | |
| | | async function handleAddOrEdit() { |
| | | goDetail(editForm.id, editForm.settlementUrl[0]?.path); |
| | | goSettlementDetail(editForm.id, editForm.settlementUrl[0]?.path); |
| | | } |
| | | |
| | | const { |
| | |
| | | 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: { |
| | |
| | | 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); |
| | | } |
| | |
| | | :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> |
| | |
| | | |
| | | 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('请选择任务名称'); |
| | | } |
| | | } |
| | | |