wupengfei
14 小时以前 a686faf1c2132f55e40119df28ce9f6e46206b74
feat: 页面
4个文件已添加
9个文件已修改
659 ■■■■ 已修改文件
.eslintrc-auto-import.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
auto-imports.d.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/task.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/components/AddOrEditEmploymentView.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/components/CheckManageDialog.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/FlexJobManage.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/SignDetailView.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/StaffDetailInfoDialog.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/StaffDetailInfoView.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/StaffResumeView.vue 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeDetail.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeManage.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/components/UploadStatementDialog.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.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,
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']>
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]: '暂时不找任务',
};
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>
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',
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();
src/views/FlexJobManage/components/SignDetailView.vue
New file
@@ -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>
src/views/FlexJobManage/components/StaffDetailInfoDialog.vue
New file
@@ -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>
src/views/FlexJobManage/components/StaffDetailInfoView.vue
New file
@@ -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>
src/views/FlexJobManage/components/StaffResumeView.vue
New file
@@ -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>
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',
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);
}
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('请选择任务名称');
  }
}