wupengfei
14 小时以前 4f0a665d8b0078defa95c6557ed46c681ca29fc6
feat: 页面
3个文件已添加
4个文件已修改
563 ■■■■■ 已修改文件
.eslintrc-auto-import.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
auto-imports.d.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/task.ts 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CPersonManage/components/CPersonDetailDialog.vue 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CPersonManage/components/SignDetailView.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CPersonManage/components/StaffDetailInfoView.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CPersonManage/components/StaffResumeView.vue 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.eslintrc-auto-import.json
@@ -56,7 +56,9 @@
    "EnumPagedListOrder": true,
    "EnumPayAccess": true,
    "EnumPersonalFreeTime": true,
    "EnumPersonalFreeTimeText": true,
    "EnumPersonalJobSeekingStatus": true,
    "EnumPersonalJobSeekingStatusText": true,
    "EnumPersonalRealMethod": true,
    "EnumPersonalUserRealStatus": true,
    "EnumRealAccess": true,
auto-imports.d.ts
@@ -58,7 +58,9 @@
  const EnumPagedListOrder: typeof import('./src/constants/apiEnum')['EnumPagedListOrder']
  const EnumPayAccess: typeof import('./src/constants/apiEnum')['EnumPayAccess']
  const EnumPersonalFreeTime: typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']
  const EnumPersonalFreeTimeText: typeof import('./src/constants/task')['EnumPersonalFreeTimeText']
  const EnumPersonalJobSeekingStatus: typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']
  const EnumPersonalJobSeekingStatusText: typeof import('./src/constants/task')['EnumPersonalJobSeekingStatusText']
  const EnumPersonalRealMethod: typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']
  const EnumPersonalUserRealStatus: typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']
  const EnumRealAccess: typeof import('./src/constants/apiEnum')['EnumRealAccess']
@@ -351,7 +353,9 @@
    readonly EnumPagedListOrder: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPagedListOrder']>
    readonly EnumPayAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPayAccess']>
    readonly EnumPersonalFreeTime: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']>
    readonly EnumPersonalFreeTimeText: UnwrapRef<typeof import('./src/constants/task')['EnumPersonalFreeTimeText']>
    readonly EnumPersonalJobSeekingStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']>
    readonly EnumPersonalJobSeekingStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumPersonalJobSeekingStatusText']>
    readonly EnumPersonalRealMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']>
    readonly EnumPersonalUserRealStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']>
    readonly EnumRealAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumRealAccess']>
src/constants/task.ts
@@ -53,3 +53,17 @@
  [EnumTaskCheckReceiveStatus.WaitSubmit]: '待验收',
  [EnumTaskCheckReceiveStatus.Completed]: '已验收',
};
export const EnumPersonalFreeTimeText = {
  [EnumPersonalFreeTime.NoLimit]: '不限',
  [EnumPersonalFreeTime.WinterSummerVacations]: '寒暑假',
  [EnumPersonalFreeTime.FestivalAndHoliday]: '节假日',
  [EnumPersonalFreeTime.Weekend]: '周六日',
  [EnumPersonalFreeTime.Weekday]: '工作日',
};
export const EnumPersonalJobSeekingStatusText = {
  [EnumPersonalJobSeekingStatus.Active]: '积极找任务',
  [EnumPersonalJobSeekingStatus.Whatever]: '随便看看',
  [EnumPersonalJobSeekingStatus.Not]: '暂时不找任务',
};
src/views/CPersonManage/components/CPersonDetailDialog.vue
@@ -2,49 +2,13 @@
  <ProDialog title="申请详情" v-model="visible" width="1200px" destroy-on-close>
    <ProTabs v-model="form.tabType" hasBorder>
      <ProTabPane lazy label="人员详情" name="user">
        <ProForm :model="form" ref="dialogForm" label-width="120px" is-read>
          <ProFormItemV2 label="姓名:" prop="name">
            <ProFormText v-model.trim="form.name" />
          </ProFormItemV2>
          <ProFormItemV2 label="身份证号:" prop="identity">
            <ProFormText v-model.trim="form.identity" />
          </ProFormItemV2>
          <ProFormItemV2 label="手机号:" prop="contactPhoneNumber">
            <ProFormText v-model.trim="form.contactPhoneNumber" />
          </ProFormItemV2>
          <ProFormItemV2 label="性别:" prop="gender">
            <ProFormRadio
              v-model="form.gender"
              :value-enum="EnumUserGenderTextForPerson"
            ></ProFormRadio>
          </ProFormItemV2>
          <ProFormItemV2 label="年龄:" prop="age">
            <ProFormInputNumber v-model="form.age" unit="岁"></ProFormInputNumber>
          </ProFormItemV2>
          <ProFormItemV2 label="身份证正面:" prop="identityImg">
            <ProFormImageUpload v-model:file-url="form.identityImg" />
          </ProFormItemV2>
          <ProFormItemV2 label="身份证反面:" prop="identityBackImg">
            <ProFormImageUpload v-model:file-url="form.identityBackImg" />
          </ProFormItemV2>
        </ProForm>
        <!-- <StaffDetailInfoView :form="form" /> -->
      </ProTabPane>
      <ProTabPane lazy label="人员简历" name="resume">
        <!-- <StaffResumeView :form="form" /> -->
      </ProTabPane>
      <ProTabPane lazy label="签约详情" name="sign">
        <ProDialogTableWrapper :height="400">
          <ProTableV2 v-bind="proTableProps" :columns="column" :show-operation-column="false">
            <template #contractUrl="{ row }">
              <PreviewBtn
                v-if="
                  row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass &&
                  row.contractUrl
                "
                :show-download-btn="false"
                :url="setOSSLink(row.contractUrl)"
              >
              </PreviewBtn>
            </template>
          </ProTableV2>
        </ProDialogTableWrapper>
        <SignDetailView :form="form" />
      </ProTabPane>
    </ProTabs>
    <template #footer>
@@ -56,33 +20,11 @@
</template>
<script setup lang="ts">
import {
  ProDialog,
  ProTableV2,
  ProDialogTableWrapper,
  ProTabs,
  ProTabPane,
  useTable,
  ProForm,
  ProFormItemV2,
  ProFormText,
  UploadUserFile,
  ProFormImageUpload,
  ProFormRadio,
  ProFormInputNumber,
  defineColumns,
  PreviewBtn,
} from '@bole-core/components';
import { ProDialog, ProTabs, ProTabPane } from '@bole-core/components';
import _ from 'lodash';
import * as userServices from '@/services/api/user';
import {
  EnumUserGender,
  EnumUserGenderTextForPerson,
  EnumTaskUserHireStatusText,
  EnumTaskUserSignContractStatusText,
  EnumTaskUserSignContractStatus,
} from '@/constants';
import { setOSSLink } from '@/utils';
import StaffDetailInfoView from './StaffDetailInfoView.vue';
import StaffResumeView from './StaffResumeView.vue';
import SignDetailView from './SignDetailView.vue';
defineOptions({
  name: 'CPersonDetailDialog',
@@ -91,13 +33,6 @@
type Form = {
  tabType: string;
  id: string;
  name: string;
  identity: string;
  contactPhoneNumber: string;
  age: number;
  gender: EnumUserGender;
  identityImg: UploadUserFile[];
  identityBackImg: UploadUserFile[];
};
const form = defineModel<Form>('form');
@@ -106,103 +41,6 @@
const emit = defineEmits<{
  (e: 'onCancel'): void;
}>();
const column = defineColumns([
  {
    id: '1',
    enCode: 'enterpriseName',
    name: '所属客户',
  },
  {
    id: '2',
    enCode: 'applyTime',
    name: '报名时间',
  },
  {
    id: '3',
    enCode: 'hireStatus',
    name: '录用状态',
  },
  {
    id: '4',
    enCode: 'hireTime',
    name: '录用时间',
  },
  {
    id: '5',
    enCode: 'userSignContractStatus',
    name: '签约状态',
  },
  {
    id: '6',
    enCode: 'enterpriseSignContractStatus',
    name: '企业签约状态',
  },
  {
    id: '7',
    enCode: 'enterpriseSignContractTime',
    name: '企业签约时间',
  },
  {
    id: '8',
    enCode: 'contractUrl',
    name: '电子合同',
  },
]);
watch(
  visible,
  (val) => {
    console.log('val: ', val);
    if (val) {
      getList();
    }
  },
  {
    immediate: true,
  }
);
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetPersonalUserInfoSignContractsQuery = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        id: form.value.id,
      };
      let res = await userServices.getPersonalUserInfoSignContracts(params);
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
    },
    columnsRenderProps: {
      applyTime: { type: 'date' },
      hireTime: { type: 'date' },
      enterpriseSignContractTime: { type: 'date' },
      hireStatus: { type: 'enum', valueEnum: EnumTaskUserHireStatusText },
      userSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText },
      enterpriseSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText },
      // contractUrl: {
      //   type: 'url',
      //   showDownloadBtn: false,
      //   formatter: (row: API.GetPersonalUserInfoSignContractsQueryResultItem) =>
      //     setOSSLink(row.contractUrl),
      // },
    },
  }
);
</script>
<style lang="scss" scoped>
src/views/CPersonManage/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/CPersonManage/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/CPersonManage/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>