zhengyiming
22 小时以前 9c2cb0c24dabf68ca5f4703340ed2b1f13ddf969
fix: 灵工管理
14个文件已修改
357 ■■■■ 已修改文件
apps/bMiniApp/project.private.config.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/components/JobDetailContent/JobDetailContent.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/components/JobDetailContent/components/curriculumView.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/components/JobDetailContent/components/experienceView.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/pages/home/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobDetailFromManage/InnerPage.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/FlexJobCard.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/enterpriseEmployee.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/project.private.config.json
@@ -11,7 +11,7 @@
                {
                    "name": "灵工详情",
                    "pathName": "subpackages/flexJob/flexJobDetail/flexJobDetail",
                    "query": "id=700a3a67-5da5-49d2-a65a-08ddd661238b",
                    "query": "enterpriseEmployeeId=700a3a67-5da5-49d2-a65a-08ddd661238b",
                    "launchMode": "default",
                    "scene": null
                },
apps/bMiniApp/src/components/JobDetailContent/JobDetailContent.vue
@@ -37,7 +37,17 @@
    fullHeight
  >
    <ProTabPane :title="`简历`" pane-key="1">
      <curriculumView />
      <curriculumView
        :userExpectJobs="userExpectJobs"
        :freeTime="freeTime"
        :jobSeekingStatus="jobSeekingStatus"
        :userCredentials="userCredentials"
        :workSeniority="workSeniority"
        :workExperience="workExperience"
        :photos="photos"
        :height="height"
        :weight="weight"
      />
    </ProTabPane>
    <ProTabPane :title="`经历`" pane-key="2">
      <experienceView />
@@ -73,6 +83,20 @@
  contactPhoneNumber?: string;
  identity?: string;
  userId?: string;
  userExpectJobs?: API.GetUserResumeQueryResultExpectJob[];
  freeTime?: API.EnumPersonalFreeTime;
  jobSeekingStatus?: API.EnumPersonalJobSeekingStatus;
  userCredentials?: API.GetUserResumeQueryResultCredential[];
  workSeniority?: string;
  workExperience?: string;
  photos?: string[];
  /** 身高 */
  height?: number;
  /** 体重 */
  weight?: number;
  taskInfoUsers?: API.GetUserResumeQueryResultExperience[];
};
const tab = ref('1');
apps/bMiniApp/src/components/JobDetailContent/components/curriculumView.vue
@@ -5,18 +5,22 @@
        <div class="curriculum-list">
          <CurriculumViewItem label="期望岗位:">
            <div class="curriculum-position-list">
              <div class="curriculum-position-list-item">客房服务员</div>
              <div class="curriculum-position-list-item">客房服务员</div>
              <div class="curriculum-position-list-item">客房服务员</div>
              <div class="curriculum-position-list-item">客房服务员</div>
              <div class="curriculum-position-list-item">客房员</div>
              <div class="curriculum-position-list-item">客房服务员</div>
              <div class="curriculum-position-list-item">客房服务员</div>
              <div class="curriculum-position-list-item">客房服务员</div>
              <div
                v-for="userExpectJob in userExpectJobs"
                :key="userExpectJob.expectJobCode"
                class="curriculum-position-list-item"
              >
                {{ userExpectJob.expectJobContent }}
              </div>
            </div>
          </CurriculumViewItem>
          <CurriculumViewItem label="空闲时间:" text="不限"> </CurriculumViewItem>
          <CurriculumViewItem label="求职状态:" text="积极找工作"> </CurriculumViewItem>
          <CurriculumViewItem label="空闲时间:" :text="EnumPersonalFreeTimeText[freeTime]">
          </CurriculumViewItem>
          <CurriculumViewItem
            label="求职状态:"
            :text="EnumPersonalJobSeekingStatusText[jobSeekingStatus]"
          >
          </CurriculumViewItem>
        </div>
      </CellChunk>
      <CellChunk title="资格证书">
@@ -25,31 +29,34 @@
          :column-num="3"
          :border="false"
          :gutter="20"
          v-if="list.length > 0"
          v-if="_userCredentials.length > 0"
          class="pro-img-grid"
        >
          <nut-grid-item v-for="(item, index) in list" :key="item" class="pro-img-grid-item">
          <nut-grid-item
            v-for="(item, index) in _userCredentials"
            :key="item"
            class="pro-img-grid-item"
          >
            <div class="pro-img-grid-img-item">
              <PreviewImage :src="item" class="pro-img-grid-img" :urls="list" />
              <PreviewImage :src="item" class="pro-img-grid-img" :urls="_userCredentials" />
            </div>
          </nut-grid-item>
        </nut-grid>
      </CellChunk>
      <CellChunk title="工作经验">
        <CurriculumViewItem label="工作年限:" text="无工作经验,用户自己填写">
        <CurriculumViewItem label="工作年限:" :text="workSeniority ? `${workSeniority}年` : ''">
        </CurriculumViewItem>
        <CurriculumViewItem label="工作经验:" text="客房服务员,用户自己填写">
        </CurriculumViewItem>
        <CurriculumViewItem label="工作经验:" :text="workExperience"> </CurriculumViewItem>
      </CellChunk>
      <CellChunk title="详细信息">
        <CurriculumViewItem
          label="身高:"
          text="175 cm"
          :text="`${height} cm`"
          :label-width="labelWidth"
        ></CurriculumViewItem>
        <CurriculumViewItem
          label="体重:"
          text="80 kg"
          :text="`${weight} kg`"
          :label-width="labelWidth"
        ></CurriculumViewItem>
        <CurriculumViewItem label="个人照片:">
@@ -58,12 +65,12 @@
            :column-num="2"
            :border="false"
            :gutter="20"
            v-if="list.length > 0"
            v-if="_photos.length > 0"
            class="pro-img-grid"
          >
            <nut-grid-item v-for="(item, index) in list" :key="item" class="pro-img-grid-item">
            <nut-grid-item v-for="(item, index) in _photos" :key="item" class="pro-img-grid-item">
              <div class="pro-img-grid-img-item">
                <PreviewImage :src="item" class="pro-img-grid-img" :urls="list" />
                <PreviewImage :src="item" class="pro-img-grid-img" :urls="_photos" />
              </div>
            </nut-grid-item>
          </nut-grid>
@@ -77,19 +84,37 @@
import CurriculumViewItem from './CurriculumViewItem.vue';
import { PreviewImage } from '@12333/components';
import Taro from '@tarojs/taro';
import { EnumPersonalFreeTimeText, EnumPersonalJobSeekingStatusText } from '@12333/constants';
import { setOSSLink } from '@12333/utils';
defineOptions({
  name: 'curriculumView',
});
const labelWidth = Taro.pxTransform(120);
type Props = {
  userExpectJobs?: API.GetUserResumeQueryResultExpectJob[];
  freeTime?: API.EnumPersonalFreeTime;
  jobSeekingStatus?: API.EnumPersonalJobSeekingStatus;
  userCredentials?: API.GetUserResumeQueryResultCredential[];
  workSeniority?: string;
  workExperience?: string;
  photos?: string[];
  /** 身高 */
  height?: number;
  /** 体重 */
  weight?: number;
};
const list = ref([
  'https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg',
  'https://storage.360buyimg.com/jdc-article/NutUItaro2.jpg',
  'https://storage.360buyimg.com/jdc-article/welcomenutui.jpg',
  'https://storage.360buyimg.com/jdc-article/fristfabu.jpg',
]);
const props = withDefaults(defineProps<Props>(), {
  userExpectJobs: () => [],
  userCredentials: () => [],
  photos: () => [],
});
const _userCredentials = computed(() => props.userCredentials.map((x) => setOSSLink(x.img)));
const _photos = computed(() => props.photos.map((x) => setOSSLink(x)));
const labelWidth = Taro.pxTransform(120);
</script>
<style lang="scss">
apps/bMiniApp/src/components/JobDetailContent/components/experienceView.vue
@@ -1,24 +1,43 @@
<template>
  <ContentScrollView>
    <Cell title="岗位经历">
      <nut-steps direction="vertical" progress-dot :current="3" class="job-detail-content-steps">
        <nut-step title="2024.12.24" content="您的订单已经打包完成,商品已发出"></nut-step>
        <nut-step title="2024.12.24" content="您的订单正在配送途中"></nut-step>
        <nut-step title="2024.12.24">
      <nut-steps
        v-if="taskInfoUsers.length > 0"
        direction="vertical"
        progress-dot
        :current="3"
        class="job-detail-content-steps"
      >
        <nut-step
          v-for="(taskInfoUser, index) in taskInfoUsers"
          :key="index"
          :title="taskInfoUser.signContractTime"
        >
          <template #content>
            <p>收货地址为:</p>
            <p>北京市经济技术开发区科创十一街18号院京东大厦</p>
            <p>在{{ taskInfoUser.enterpriseName }}:</p>
            <p>做过{{ taskInfoUser.name }}</p>
          </template>
        </nut-step>
      </nut-steps>
      <NoData v-else />
    </Cell>
  </ContentScrollView>
</template>
<script setup lang="ts">
import NoData from '../../NoData/NoData.vue';
defineOptions({
  name: 'experienceView',
});
type Props = {
  taskInfoUsers?: API.GetUserResumeQueryResultExperience[];
};
const props = withDefaults(defineProps<Props>(), {
  taskInfoUsers: () => [],
});
</script>
<style lang="scss">
apps/bMiniApp/src/pages/home/index.vue
@@ -175,7 +175,7 @@
function goFlexJobDetail(item: API.GetUserResumesQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.flexJobDetail}?id=${item.id}`,
    url: `${RouterPath.flexJobDetail}?enterpriseEmployeeId=${item.id}`,
  });
}
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue
@@ -13,7 +13,17 @@
        :contactPhoneNumber="userResumeInfo.contactPhoneNumber"
        :identity="userResumeInfo.identity"
        :isCollapse="isCollapse"
        :userId="userId"
        :userId="enterpriseEmployeeId"
        :userExpectJobs="userResumeInfo.userExpectJobs"
        :freeTime="userResumeInfo.freeTime"
        :jobSeekingStatus="userResumeInfo.jobSeekingStatus"
        :userCredentials="userResumeInfo.userCredentials"
        :workSeniority="userResumeInfo.workSeniority"
        :workExperience="userResumeInfo.workExperience"
        :photos="userResumeInfo.photos"
        :height="userResumeInfo.height"
        :weight="userResumeInfo.weight"
        :taskInfoUsers="userResumeInfo.taskInfoUsers"
      >
        <template #footer>
          <PageFooterAction
@@ -23,7 +33,7 @@
            openType="share"
          ></PageFooterAction>
          <PageFooterAction
            :icon="IconAttentionActive"
            :icon="userResumeInfo.isCollected ? IconAttentionActive : IconAttention"
            text="收藏"
            :isFlex="false"
            @click="handleAttention"
@@ -52,10 +62,10 @@
});
const router = Taro.useRouter();
const userId = router.params?.id ?? '';
const enterpriseEmployeeId = router.params?.enterpriseEmployeeId ?? '';
const { isLoading, isError, userResumeInfo, refetch } = useUserResume({
  userId,
  userId: enterpriseEmployeeId,
});
const { isCollapse, toggle } = useToggle();
@@ -63,7 +73,7 @@
const handleContact = useAccessLogin(async () => {
  try {
    if (!isCollapse.value) {
      await userResumeServices.contactUserResume({ id: userId });
      await userResumeServices.contactUserResume({ id: enterpriseEmployeeId });
      toggle();
    }
  } catch (error) {}
@@ -72,17 +82,13 @@
async function handleAttention() {
  try {
    let params: API.CollectUserResumeCommand = {
      id: userId,
      // isCollected: userResumeInfo.value.i,
      id: enterpriseEmployeeId,
      isCollected: !userResumeInfo.value.isCollected,
    };
    let res = await userResumeServices.collectUserResume(params);
    if (res) {
      Message.success('收藏成功');
      refetch({ type: 'inactive' });
    }
  } catch (error) {}
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
@@ -1,9 +1,36 @@
<template>
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
    <JobDetailContent :isCollapse="true">
    <JobDetailContent
      :avatar="userResumeInfo.avatar"
      :name="userResumeInfo.name"
      :age="userResumeInfo.age"
      :isReal="userResumeInfo.isReal"
      :gender="userResumeInfo.gender"
      :personalIdentityContent="userResumeInfo.personalIdentityContent"
      :educationalBackgroundContent="userResumeInfo.educationalBackgroundContent"
      :taskCount="userResumeInfo.taskCount"
      :contactPhoneNumber="userResumeInfo.contactPhoneNumber"
      :identity="userResumeInfo.identity"
      :userId="enterpriseEmployeeId"
      :userExpectJobs="userResumeInfo.userExpectJobs"
      :freeTime="userResumeInfo.freeTime"
      :jobSeekingStatus="userResumeInfo.jobSeekingStatus"
      :userCredentials="userResumeInfo.userCredentials"
      :workSeniority="userResumeInfo.workSeniority"
      :workExperience="userResumeInfo.workExperience"
      :photos="userResumeInfo.photos"
      :height="userResumeInfo.height"
      :weight="userResumeInfo.weight"
      :taskInfoUsers="userResumeInfo.taskInfoUsers"
      :isCollapse="true"
    >
      <template #footer>
        <PageFooterBtn type="primary" plain @click="taskWorkerHireRefuse(10)">谢绝</PageFooterBtn>
        <PageFooterBtn type="primary" @click="taskWorkerHireRefuse(20)">录用</PageFooterBtn>
        <PageFooterBtn type="primary" plain @click="setTaskUserHire(EnumTaskUserHireStatus.Refuse)"
          >谢绝</PageFooterBtn
        >
        <PageFooterBtn type="primary" @click="setTaskUserHire(EnumTaskUserHireStatus.Pass)"
          >录用</PageFooterBtn
        >
      </template>
    </JobDetailContent>
  </LoadingLayout>
@@ -14,33 +41,22 @@
import { useQuery } from '@tanstack/vue-query';
import * as taskUserServices from '@12333/services/apiV2/taskUser';
import { Message } from '@12333/utils';
import { useUserResume } from '@12333/hooks';
import { EnumTaskUserHireStatus } from '@12333/constants';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const enterpriseEmployeeId = router.params?.enterpriseEmployeeId ?? '';
const id = router.params?.id ?? '';
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['taskServices/getTaskInfo', id],
  queryFn: async () => {
    return await taskServices.getTaskInfo(
      { id: id },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.GetTaskInfoQueryResult),
const { isLoading, isError, userResumeInfo, refetch } = useUserResume({
  userId: enterpriseEmployeeId,
});
async function taskWorkerHireRefuse(hireStatus: FlexTaskWorkerHireEnum) {
async function setTaskUserHire(hireStatus: EnumTaskUserHireStatus) {
  try {
    let params: API.SetTaskUserHireCommand = {
      id: id,
@@ -56,7 +72,3 @@
  } catch (error) {}
}
</script>
<style lang="scss">
@import '@/styles/common.scss';
</style>
apps/bMiniApp/src/subpackages/flexJobManage/flexJobDetailFromManage/InnerPage.vue
@@ -1,6 +1,29 @@
<template>
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
    <JobDetailContent :isCollapse="true">
    <JobDetailContent
      :avatar="userResumeInfo.avatar"
      :name="userResumeInfo.name"
      :age="userResumeInfo.age"
      :isReal="userResumeInfo.isReal"
      :gender="userResumeInfo.gender"
      :personalIdentityContent="userResumeInfo.personalIdentityContent"
      :educationalBackgroundContent="userResumeInfo.educationalBackgroundContent"
      :taskCount="userResumeInfo.taskCount"
      :contactPhoneNumber="userResumeInfo.contactPhoneNumber"
      :identity="userResumeInfo.identity"
      :userId="enterpriseEmployeeId"
      :userExpectJobs="userResumeInfo.userExpectJobs"
      :freeTime="userResumeInfo.freeTime"
      :jobSeekingStatus="userResumeInfo.jobSeekingStatus"
      :userCredentials="userResumeInfo.userCredentials"
      :workSeniority="userResumeInfo.workSeniority"
      :workExperience="userResumeInfo.workExperience"
      :photos="userResumeInfo.photos"
      :height="userResumeInfo.height"
      :weight="userResumeInfo.weight"
      :taskInfoUsers="userResumeInfo.taskInfoUsers"
      :isCollapse="true"
    >
      <!-- <template #footer>
        <PageFooterBtn type="primary" plain>解约</PageFooterBtn>
        <PageFooterBtn type="primary">签约</PageFooterBtn>
@@ -12,31 +35,17 @@
<script setup lang="ts">
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { useUserResume } from '@12333/hooks';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const taskId = router.params?.id ?? '';
const enterpriseEmployeeId = router.params?.enterpriseEmployeeId ?? '';
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['flexWorkerServices/getOrdeForDetail', taskId],
  queryFn: async () => {
    return await flexWorkerServices.getOrdeForDetail(
      { id: taskId },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.OrderInfoDto),
const { isLoading, isError, userResumeInfo, refetch } = useUserResume({
  userId: enterpriseEmployeeId,
});
</script>
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -102,7 +102,7 @@
function goDetail(item: API.GetEnterpriseEmployeesQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.flexJobDetailFromManage}?userId=${item.id}`,
    url: `${RouterPath.flexJobDetailFromManage}?enterpriseEmployeeId=${item.id}`,
  });
}
apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue
@@ -22,7 +22,7 @@
          </div>
        </template>
        <template #footerRight>
          <nut-button type="primary" @click="goToJobDetail(item.id)">查看详情</nut-button>
          <nut-button type="primary" @click="goToJobDetail(item)">查看详情</nut-button>
        </template>
      </FlexJobCard>
    </template>
@@ -52,9 +52,9 @@
  id: id,
});
function goToJobDetail(id: string) {
function goToJobDetail(item: API.GetTaskUsersQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.flexJobDetailFromTask}?id=${id}`,
    url: `${RouterPath.flexJobDetailFromTask}?enterpriseEmployeeId=${item.enterpriseEmployeeId}&id=${item.id}`,
  });
}
</script>
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
@@ -78,11 +78,12 @@
  return infiniteLoadingProps.value?.listData?.pages?.[0]?.objectData?.waitAssignCount ?? 0;
});
function goSubmitTaskDetail(item: API.GetTaskInfosQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.flexJobDetail}?taskId=${item.id}`,
  });
}
//有问题
// function goSubmitTaskDetail(item: API.GetTaskInfosQueryResultItem) {
//   Taro.navigateTo({
//     url: `${RouterPath.taskManage}?taskId=${item.id}`,
//   });
// }
function goBatchTaskList(item: API.GetTaskInfosQueryResultItem, status: EnumTaskUserArrangeStatus) {
  Taro.navigateTo({
packages/components/src/Card/FlexJobCard.vue
@@ -14,9 +14,7 @@
      {{ workExperience }}
    </div>
    <div class="flexJob-card-done-detail" v-if="showDoneDetail">
      <div class="flexJob-card-done-detail-item">
        {{ workSeniority }}
      </div>
      <div class="flexJob-card-done-detail-item">{{ workSeniority }}年</div>
      <!-- <div class="flexJob-card-done-detail-item">{{ '在「宁波雷迪森酒店」,做过客房服务员' }}</div> -->
    </div>
    <div class="flexJob-card-footer">
packages/services/apiV2/enterpriseEmployee.ts
@@ -2,6 +2,21 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 编辑灵工信息 POST /api/user/enterpriseEmployee/editEnterpriseEmployee */
export async function editEnterpriseEmployee(
  body: API.EditEnterpriseEmployeeCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/enterpriseEmployee/editEnterpriseEmployee', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 查询灵工详情 GET /api/user/enterpriseEmployee/getEnterpriseEmployee */
export async function getEnterpriseEmployee(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
@@ -37,3 +52,18 @@
    }
  );
}
/** 导入灵工信息 POST /api/user/enterpriseEmployee/importEnterpriseEmployees */
export async function importEnterpriseEmployees(
  body: API.ImportEnterpriseEmployeesCommand,
  options?: API.RequestConfig
) {
  return request<number>('/api/user/enterpriseEmployee/importEnterpriseEmployees', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
packages/services/apiV2/typings.d.ts
@@ -243,6 +243,24 @@
    ids: string[];
  }
  interface EditEnterpriseEmployeeCommand {
    /** 灵工Id */
    id?: string;
    /** 姓名 */
    name?: string;
    /** 身份证号 */
    identity?: string;
    /** 手机号 */
    contactPhoneNumber?: string;
    gender?: EnumUserGender;
    /** 年龄 */
    age?: number;
    /** 身份证人像面 */
    identityImg?: string;
    /** 身份证国徽面 */
    identityBackImg?: string;
  }
  enum EnumBillingMethod {
    /**按月 */
    Month = 10,
@@ -2672,6 +2690,8 @@
    photos?: string[];
    /** 经历 */
    taskInfoUsers?: GetUserResumeQueryResultExperience[];
    /** 是否已收藏 */
    isCollected?: boolean;
  }
  interface GetUserResumeQueryResultCredential {
@@ -2785,6 +2805,11 @@
    workExperience?: string;
  }
  interface ImportEnterpriseEmployeesCommand {
    /** Excel地址 */
    excelUrl?: string;
  }
  interface LoginCommandCallback {
    /** 用户Id */
    id?: string;