wupengfei
2025-03-13 186234cb3833e620aa0ae46212fe337eb2d6e77d
feat: 接口对接
24个文件已修改
2个文件已添加
714 ■■■■ 已修改文件
apps/bMiniApp/src/constants/task.ts 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/pages/home/HomeQueryMenuView.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/mine/mineContactRecord/InnerPage.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/mine/mineFavorites/InnerPage.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/batchTaskList/InnerPage.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/home/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/mine/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/task/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/user/complaint/complaint.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/FlexJobCard.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/FlexTask.ts 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/User.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/UserResume.ts 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/typings.d.ts 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/constants/task.ts
@@ -129,3 +129,24 @@
  [FlexTaskCheckAcceptStatusEnum.Passed]: '验收通过',
  [FlexTaskCheckAcceptStatusEnum.Refused]: '验收未通过',
};
export enum FlexWorkerEleSignEnum {
  /**
   * 待签约
   */
  WaitSign = 10,
  /**
   * 已签约
   */
  HasSign = 20,
  /**
   * 已解约
   */
  CancelSign = 30,
}
export const FlexWorkerEleSignEnumText = {
  [FlexWorkerEleSignEnum.WaitSign]: '待签约',
  [FlexWorkerEleSignEnum.HasSign]: '已签约',
  [FlexWorkerEleSignEnum.CancelSign]: '已解约',
};
apps/bMiniApp/src/pages/home/HomeQueryMenuView.vue
@@ -5,7 +5,7 @@
        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
      </QueryMenuItem>
      <QueryMenuItem title="身份">
        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
        <ProRadio v-model="query.gender" :value-enum="IdentityList" show-all-btn></ProRadio>
      </QueryMenuItem>
      <QueryMenuItem>
        <template #title>
@@ -23,7 +23,7 @@
        ></nut-range>
      </QueryMenuItem>
      <QueryMenuItem title="资格证书">
        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
        <ProRadio v-model="query.gender" :value-enum="CertificateTypeList" show-all-btn></ProRadio>
      </QueryMenuItem>
    </div>
  </QueryMenuView>
@@ -31,7 +31,8 @@
<script setup lang="ts">
import { QueryMenuView, QueryMenuItem, ProRadio } from '@12333/components';
import { GenderText } from '@12333/constants';
import { GenderText, SearchType } from '@12333/constants';
import { useSearchSettingType } from '@12333/hooks';
defineOptions({
  name: 'HomeQueryMenuView',
@@ -41,6 +42,13 @@
// const props = withDefaults(defineProps<Props>(), {});
const { searchSettingTypeList: CertificateTypeList } = useSearchSettingType({
  searchType: SearchType.CertificateType,
});
const { searchSettingTypeList: IdentityList } = useSearchSettingType({
  searchType: SearchType.Identity,
});
const emit = defineEmits<{
  (e: 'reset'): void;
  (e: 'close'): void;
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue
@@ -13,6 +13,7 @@
            :icon="IconAttentionActive"
            text="收藏"
            :isFlex="false"
            @click="handleAttention"
          ></PageFooterAction>
          <PageFooterBtn type="primary" @click="toggle">立即联系</PageFooterBtn>
        </template>
@@ -29,6 +30,7 @@
import IconAttention from '@/assets/flexJob/icon-attention-lg.png';
import IconAttentionActive from '@/assets/flexJob/icon-attention-lg-active.png';
import { useToggle } from 'senin-mini/hooks';
import { Message } from '@12333/utils';
defineOptions({
  name: 'flexJobDetail',
@@ -56,6 +58,19 @@
});
const { isCollapse, toggle } = useToggle();
async function handleAttention() {
  try {
    let params: API.CollectFlexWorkerResumeInput = {
      flexWorkerId: detail.value?.flexWorkerId,
      userResumeId: detail.value?.userResumeId,
    };
    let res = await flexWorkerServices.collectFlexWorkerResume(params);
    if (res) {
      Message.success('收藏成功');
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -8,18 +8,19 @@
    title-gutter="12"
    title-scroll
  >
    <ProTabPane :title="`已签约`" :pane-key="TaskStatus.All"></ProTabPane>
    <ProTabPane :title="`待签约`" :pane-key="TaskStatus.WaitSign"></ProTabPane>
    <ProTabPane :title="`已解约`" :pane-key="TaskStatus.Effect"></ProTabPane>
    <ProTabPane :title="`已签约`" :pane-key="FlexWorkerEleSignEnum.HasSign"></ProTabPane>
    <ProTabPane :title="`待签约`" :pane-key="FlexWorkerEleSignEnum.WaitSign"></ProTabPane>
    <ProTabPane :title="`已解约`" :pane-key="FlexWorkerEleSignEnum.CancelSign"></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
    v-bind="infiniteLoadingProps"
    :key="queryState.mineHireType"
  >
    <template #renderItem="{ item }">
      <FlexJobCard :show-done-detail="false" :show-footer-left="false" @click="goDetail(item)">
        <template #footerRight>
          <template v-if="Number(queryState.mineHireType) === TaskStatus.All">
          <template v-if="queryState.mineHireType === FlexWorkerEleSignEnum.HasSign">
            <nut-button
              class="flexJobManage-card-plain-button"
              type="default"
@@ -42,7 +43,7 @@
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { TaskStatus } from '@/constants/task';
import { FlexWorkerEleSignEnum } from '@/constants/task';
import Taro from '@tarojs/taro';
defineOptions({
@@ -50,12 +51,13 @@
});
const queryState = reactive({
  mineHireType: TaskStatus.All,
  mineHireType: FlexWorkerEleSignEnum.HasSign,
});
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetFlexTaskListInput = {
    let params: API.GetFlexSignWorkerListInput = {
      signStatus: queryState.mineHireType,
      pageModel: {
        rows: 20,
        page: pageParam,
@@ -63,24 +65,24 @@
      },
    };
    return flexWorkerServices.getFlexTaskByArrange(params, {
    return flexWorkerServices.getFlexSignWorkerList(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskByArrange'],
    queryKey: ['flexWorkerServices/getFlexSignWorkerList', queryState],
  }
);
function goDetail(item: API.GetFlexTaskListOutput) {
function goDetail(item: API.GetNewestWorkerListOutput) {
  Taro.navigateTo({
    url: `${RouterPath.flexJobDetailFromManage}?id=${item.taskId}`,
    url: `${RouterPath.flexJobDetailFromManage}?userId=${item.userId}`,
  });
}
function checkContract() {}
function handleUnContract() {}
function goSignContract(item: API.GetFlexTaskListOutput) {
function goSignContract(item: API.GetNewestWorkerListOutput) {
  Taro.navigateTo({
    url: `${RouterPath.flexJobSign}`,
  });
apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue
@@ -34,7 +34,7 @@
            <TaskDetailWelfareItem
              v-for="item in detail.taskWeals"
              :key="item.id"
              :icon="setOSSLink(item.name)"
              :icon="setOSSLink(item.imageUrl)"
              :text="item.name"
            />
          </div>
@@ -53,6 +53,7 @@
import { SalaryTimeTypeEnumUnit, FlexTaskSettleTypeEnumText } from '@/constants/task';
import dayjs from 'dayjs';
import { setOSSLink } from '@12333/utils';
import { RectRight } from '@nutui/icons-vue-taro';
defineOptions({
  name: 'JobDetail',
apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue
@@ -7,7 +7,6 @@
    isTransparent
    title-gutter="12"
    title-scroll
    @change="invalidateQueries"
  >
    <ProTabPane
      :title="`${
@@ -86,7 +85,7 @@
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskList'],
    queryKey: ['flexWorkerServices/getFlexTaskList', queryState],
  }
);
apps/bMiniApp/src/subpackages/mine/mineContactRecord/InnerPage.vue
@@ -4,7 +4,18 @@
    v-bind="infiniteLoadingProps"
  >
    <template #renderItem="{ item }">
      <FlexJobCard :show-footer-left="false"> </FlexJobCard>
      <FlexJobCard
        :show-footer-left="false"
        :name="item.name"
        :age="item.age"
        :genderType="item.genderType"
        :workExperience="item.workExperience"
        :isRealName="item.isRealName"
        :arrangeCount="item.arrangeCount"
        :educationalLevel="item.educationalLevel"
        @contact="handleContact"
      >
      </FlexJobCard>
    </template>
  </InfiniteLoading>
</template>
@@ -24,7 +35,7 @@
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetFlexTaskListInput = {
    let params: API.PageInput = {
      pageModel: {
        rows: 20,
        page: pageParam,
@@ -32,14 +43,16 @@
      },
    };
    return flexWorkerServices.getFlexTaskByArrange(params, {
    return flexWorkerServices.getUserContractRecordList(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskByArrange'],
    queryKey: ['flexWorkerServices/getUserContractRecordList'],
  }
);
function handleContact() {}
</script>
<style lang="scss">
apps/bMiniApp/src/subpackages/mine/mineFavorites/InnerPage.vue
@@ -4,7 +4,18 @@
    v-bind="infiniteLoadingProps"
  >
    <template #renderItem="{ item }">
      <FlexJobCard> </FlexJobCard>
      <FlexJobCard
        :name="item.name"
        :age="item.age"
        :genderType="item.genderType"
        :workExperience="item.workExperience"
        :isRealName="item.isRealName"
        :arrangeCount="item.arrangeCount"
        :educationalLevel="item.educationalLevel"
        @contact="handleContact"
        @cancel-collection="handleCancelCollection(item)"
      >
      </FlexJobCard>
    </template>
  </InfiniteLoading>
</template>
@@ -15,6 +26,7 @@
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { Message } from '@12333/utils';
defineOptions({
  name: 'InnerPage',
@@ -22,9 +34,9 @@
const userStore = useUserStore();
const { infiniteLoadingProps } = useInfiniteLoading(
const { infiniteLoadingProps, invalidateQueries } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetFlexTaskListInput = {
    let params: API.PageInput = {
      pageModel: {
        rows: 20,
        page: pageParam,
@@ -32,14 +44,28 @@
      },
    };
    return flexWorkerServices.getFlexTaskByArrange(params, {
    return flexWorkerServices.getWorkerResumeCollectList(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskByArrange'],
    queryKey: ['flexWorkerServices/getWorkerResumeCollectList'],
  }
);
function handleContact() {}
async function handleCancelCollection(item: API.GetNewestWorkerListOutput) {
  try {
    let params: API.APIcancelUserResumeCollectParams = {
      flexWorkerId: item.userId,
    };
    let res = await flexWorkerServices.cancelUserResumeCollect(params);
    if (res) {
      Message.success('操作成功');
      invalidateQueries();
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/bMiniApp/src/subpackages/task/batchTaskList/InnerPage.vue
@@ -1,5 +1,5 @@
<template>
  <div class="searchbar-container">
  <div class="searchbar-container" v-if="showQueryState">
    <BlSearchbar
      v-model.trim="searchValue"
      placeholder="搜索姓名/身份证号"
@@ -18,8 +18,10 @@
        :showFooterLeft="false"
      >
        <template #footerRight>
          <nut-button type="primary" @click="handleArrange(item)">安排</nut-button>
          <!-- <div class="batch-task-card-status">已安排</div> -->
          <nut-button v-if="showQueryState" type="primary" @click="handleArrange(item)"
            >安排</nut-button
          >
          <div v-else class="batch-task-card-status">已安排</div>
        </template>
      </FlexJobCard>
    </template>
@@ -42,10 +44,15 @@
const searchValue = ref('');
const router = Taro.useRouter();
const taskId = router.params?.taskId ?? '';
const status = router.params?.status ?? '';
const queryState = reactive({
  searchValueTrim: '',
});
const showQueryState = computed(() => {
  return status === 'arrange';
});
const handleSearch = _.debounce(function () {
  queryState.searchValueTrim = trim(searchValue.value);
}, 300);
apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -93,7 +93,7 @@
function goHandleTaskDetail(item: API.GetNewestWorkerListOutput) {
  Taro.navigateTo({
    url: `${RouterPath.taskHandleCheckDetail}?userId=${item.userId}`,
    url: `${RouterPath.taskHandleCheckDetail}?userId=${item.userId}&taskId=${taskId}`,
  });
}
</script>
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
@@ -2,12 +2,19 @@
  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
    <ContentScrollView style="background-color: #fff">
      <div class="personal-info-wrapper">
        <TaskCheckPersonalView />
        <TaskCheckPersonalView
          :avatarUrl="setOSSLink(detail.avatarUrl)"
          :name="detail.name"
          :isRealName="detail.isRealName"
          :contactPhone="detail.contactPhone"
        />
      </div>
      <div class="taskCheckDetail-status-wrapper">
        <div class="taskCheckDetail-status-title">验收照片</div>
      </div>
      <div class="taskCheckDetail-time">2024.11.14 9:28:39</div>
      <div class="taskCheckDetail-time">
        {{ dayjs(detail.appleCheckTime).format('YYYY.MM.DD HH:mm:ss') }}
      </div>
      <nut-grid
        square
        :column-num="3"
@@ -16,7 +23,11 @@
        v-if="list.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 detail.checkImageUrl"
          :key="index"
          class="pro-img-grid-item"
        >
          <div class="pro-img-grid-img-item">
            <PreviewImage :src="item" class="pro-img-grid-img" :urls="list" />
          </div>
@@ -37,13 +48,16 @@
import TaskCheckPersonalView from '../components/TaskCheckPersonalView.vue';
import { PreviewImage } from '@12333/components';
import { Colors } from '@12333/constants';
import { setOSSLink } from '@12333/utils';
import dayjs from 'dayjs';
defineOptions({
  name: 'InnerPage',
});
const router = Taro.useRouter();
const taskId = router.params?.id ?? '';
const taskId = router.params?.taskId ?? '';
const userId = router.params?.userId ?? '';
const {
  isLoading,
@@ -53,14 +67,14 @@
} = useQuery({
  queryKey: ['flexWorkerServices/getOrdeForDetail', taskId],
  queryFn: async () => {
    return await flexWorkerServices.getOrdeForDetail(
      { id: taskId },
    return await flexWorkerServices.getFlexTaskWorkerCheckContentDto(
      { flexTaskId: taskId, flexWorkerId: userId },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.OrderInfoDto),
  placeholderData: () => ({} as API.GetTaskWorkerCheckContentOutput),
});
const list = ref([
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
@@ -34,10 +34,12 @@
            type="primary"
            :color="Colors.Info"
            class="dark-btn"
            @click="goSubmitTaskDetail(item)"
            @click.stop="goBatchTaskList(item, 'detail')"
            >详情</nut-button
          >
          <nut-button type="primary" v-else @click="goBatchTaskList(item)">人员安排</nut-button>
          <nut-button type="primary" v-else @click.stop="goBatchTaskList(item, 'arrange')"
            >人员安排</nut-button
          >
        </template>
      </JobApplicationCard>
    </template>
@@ -93,9 +95,9 @@
  });
}
function goBatchTaskList(item: API.GetFlexTaskListOutput) {
function goBatchTaskList(item: API.GetFlexTaskListOutput, status: string) {
  Taro.navigateTo({
    url: `${RouterPath.batchTaskList}?taskId=${item.taskId}`,
    url: `${RouterPath.batchTaskList}?taskId=${item.taskId}&detail=${status}`,
  });
}
</script>
apps/cMiniApp/src/pages/home/index.vue
@@ -110,7 +110,7 @@
function goTaskDetail(item: API.GetFlexTaskListOutput) {
  Taro.navigateTo({
    url: `${RouterPath.taskDetail}?id=${item.id}`,
    url: `${RouterPath.taskDetail}?id=${item.taskId}`,
  });
}
</script>
apps/cMiniApp/src/pages/mine/index.vue
@@ -136,9 +136,9 @@
Taro.useShareAppMessage((res) => {
  return {
    title: `${userDetail.value?.contacter}名片`,
    // title: `${userDetail.value?.contacter}名片`,
    // path: `${RouterPath.userHomePage}?userId=${userDetail.value?.userId}`,
    imageUrl: userDetail.value?.avatarUrl,
    // imageUrl: userDetail.value?.avatarUrl,
  };
});
apps/cMiniApp/src/pages/task/InnerPage.vue
@@ -63,7 +63,7 @@
  //     url: `${RouterPath.taskSubmitCheck}?id=${item.id}`,
  //   });
  Taro.navigateTo({
    url: `${RouterPath.taskCheckDetail}?id=${item.id}`,
    url: `${RouterPath.taskCheckDetail}?id=${item.taskId}`,
  });
}
</script>
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -10,18 +10,18 @@
      <nut-form-item label="手机号:" class="bole-form-item" prop="phone" required>
        <nut-input v-model.trim="form.phone" placeholder="请输入手机号" type="text" />
      </nut-form-item>
      <nut-form-item label="身份:" class="bole-form-item" prop="gender">
      <nut-form-item label="身份:" class="bole-form-item" prop="socialIdentity">
        <ChooseInputWithPicker
          v-model="form.gender"
          v-model="form.socialIdentity"
          placeholder="请选择身份"
          :value-enum="TaskStatusText"
          :value-enum="IdentityTypeList"
        />
      </nut-form-item>
      <nut-form-item label="学历:" class="bole-form-item" prop="gender">
      <nut-form-item label="学历:" class="bole-form-item" prop="educationalLevel">
        <ChooseInputWithPicker
          v-model="form.gender"
          v-model="form.educationalLevel"
          placeholder="请选择学历"
          :value-enum="TaskStatusText"
          :value-enum="EducationTypeList"
        />
      </nut-form-item>
      <nut-form-item label="常驻城市:" class="bole-form-item" prop="gender">
@@ -44,22 +44,35 @@
import { TaskStatusText, TaskStatus } from '@/constants';
import { convertApi2FormUrlOnlyOne } from '@12333/utils';
import { useUser } from '@/hooks';
import { useSearchSettingType } from '@12333/hooks';
import { SearchType } from '@12333/constants';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const { searchSettingTypeList: EducationTypeList } = useSearchSettingType({
  searchType: SearchType.Education,
});
const { searchSettingTypeList: IdentityTypeList } = useSearchSettingType({
  searchType: SearchType.Identity,
});
const form = reactive({
  avatarUrl: convertApi2FormUrlOnlyOne(userDetail.value?.originalAvatarUrl),
  // avatarUrl: convertApi2FormUrlOnlyOne(userDetail.value?.originalAvatarUrl),
  name: '',
  phone: '',
  gender: TaskStatus.All,
  socialIdentity: '',
  educationalLevel: '',
  areaList: [] as number[],
});
const rules = reactive<FormRules>({
  phone: [{ required: true, message: '请输入手机号' }],
  socialIdentity: [{ required: true, message: '请选择身份' }],
  educationalLevel: [{ required: true, message: '请选择学历' }],
  areaList: [{ required: true, message: '请选择常驻城市' }],
});
const formRef = ref<any>(null);
function handleConfirm() {
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
@@ -91,12 +91,14 @@
import MineAgreementSignDetailItem from '../../mine/mineAgreementSignDetail/MineAgreementSignDetailItem.vue';
import { List, ListItem, JobTagList } from '@12333/components';
import { RouterPath } from '@/constants';
import * as userResumeServices from '@12333/services/api/userResume';
import IconArrow from '@/assets/setting/icon-arrow.png';
import IconAuth from '@/assets/mine/icon-auth.png';
import IconMale from '@/assets/mine/icon-male.png';
import IconFemale from '@/assets/mine/icon-female.png';
import IconPhone from '@/assets/mine/icon-phone.png';
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
@@ -104,6 +106,25 @@
const userStore = useUserStore();
const isLogin = useIsLogin();
const router = Taro.useRouter();
const taskId = router.params?.taskId;
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResume', taskId],
  queryFn: async () => {
    return await userResumeServices.getUserResume({
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.MyResumeOutput),
  onSuccess(data) {},
});
function goPage(routeName: string) {
  Taro.navigateTo({
apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue
@@ -17,7 +17,8 @@
        prop="photo"
        label-position="top"
      >
        <Uploader v-model:file-list="form.photo" :maximum="6" class="bole-uploader"> </Uploader>
        <Uploader v-model:file-list="form.lifeCircleImgUrlList" :maximum="6" class="bole-uploader">
        </Uploader>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
@@ -27,22 +28,64 @@
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import { goBack } from '@/utils';
import { NumberInput } from '@12333/components';
import * as userResumeServices from '@12333/services/api/userResume';
import { convertApiPath2Url, Message } from '@12333/utils';
import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeDetailInfo'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeDetailInfo({
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.UserResumeDetailInfoOutput),
  onSuccess(data) {
    form.height = data.height;
    form.weight = data.weight;
    form.lifeCircleImgUrlList = data.lifeCircleImgUrlList?.length
      ? data.lifeCircleImgUrlList.map((x) => convertApiPath2Url(x))
      : [];
  },
});
const form = reactive({
  height: '',
  weight: '',
  photo: [],
  lifeCircleImgUrlList: [] as FileItem[],
});
function handleConfirm() {}
async function handleConfirm() {
  try {
    let params: API.SaveUserResumeDetailInfoInput = {
      weight: form.weight,
      height: form.weight,
      lifeCircleImgUrlList: form.lifeCircleImgUrlList?.length
        ? form.lifeCircleImgUrlList.map((x) => x.url)
        : [],
    };
    let res = await userResumeServices.saveUserResumeDetailInfo(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
          goBack();
        },
      });
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue
@@ -1,11 +1,11 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef">
      <nut-form-item label="工作年限:" class="bole-form-item" prop="workYear">
        <nut-input v-model="form.workYear" placeholder="请输入"> </nut-input>
      <nut-form-item label="工作年限:" class="bole-form-item" prop="workingSeniority">
        <nut-input v-model="form.workingSeniority" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <nut-form-item label="工作经验:" class="bole-form-item" prop="workYear">
        <nut-input v-model="form.workYear" type="textarea" placeholder="请输入"> </nut-input>
      <nut-form-item label="工作经验:" class="bole-form-item" prop="workExperience">
        <nut-input v-model="form.workExperience" type="textarea" placeholder="请输入"> </nut-input>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
@@ -15,19 +15,55 @@
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import { goBack } from '@/utils';
import * as userResumeServices from '@12333/services/api/userResume';
import { Message } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const form = reactive({
  workYear: '',
  workingSeniority: '',
  workExperience: '',
});
function handleConfirm() {}
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeWorkExperience'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeWorkExperience({
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.UserResumeWorkExperienceOutput),
  onSuccess(data) {
    form.workingSeniority = data.workingSeniority;
    form.workExperience = data.workExperience;
  },
});
async function handleConfirm() {
  try {
    let params: API.SaveUserResumeWorkExperienceInput = {
      workingSeniority: form.workingSeniority,
      workExperience: form.workExperience,
    };
    let res = await userResumeServices.saveUserResumeWorkExperience(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
          goBack();
        },
      });
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/user/complaint/complaint.vue
@@ -52,7 +52,7 @@
<script setup lang="ts">
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import * as cooperationApplyServices from '@12333/services/api/CooperationApply';
// import * as cooperationApplyServices from '@12333/services/api/CooperationApply';
import { CooperateTypeText, CooperateApplyTypeEnum } from '@12333/constants';
import { FormValidator, Message } from '@12333/utils';
import Taro from '@tarojs/taro';
@@ -94,23 +94,23 @@
async function createPlatformCooperationApply() {
  try {
    let params: API.CreatePlatformCooperationApplyInput = {
      title: CooperateTypeText.Complaint,
      contact: form.contact,
      contactPhone: form.contactPhone,
      applyDescription: form.remark,
      companyName: form.companyName,
      applyType: CooperateApplyTypeEnum.Complaint,
    };
    let res = await cooperationApplyServices.createPlatformCooperationApply(params);
    if (res) {
      await Message.confirm({
        message: '信息已提交,请耐心等待工作人员的联系',
      });
      Taro.navigateBack({
        delta: 1,
      });
    }
    // let params: API.CreatePlatformCooperationApplyInput = {
    //   title: CooperateTypeText.Complaint,
    //   contact: form.contact,
    //   contactPhone: form.contactPhone,
    //   applyDescription: form.remark,
    //   companyName: form.companyName,
    //   applyType: CooperateApplyTypeEnum.Complaint,
    // };
    // let res = await cooperationApplyServices.createPlatformCooperationApply(params);
    // if (res) {
    //   await Message.confirm({
    //     message: '信息已提交,请耐心等待工作人员的联系',
    //   });
    //   Taro.navigateBack({
    //     delta: 1,
    //   });
    // }
  } catch (error) {}
}
</script>
packages/components/src/Card/FlexJobCard.vue
@@ -1,6 +1,13 @@
<template>
  <div class="flexJob-card-wrapper">
    <FlexJobTopView :name="name" :age="age" :genderType="genderType" />
    <FlexJobTopView
      :name="name"
      :age="age"
      :genderType="genderType"
      :isRealName="isRealName"
      :arrangeCount="arrangeCount"
      :educationalLevel="educationalLevel"
    />
    <div class="flexJob-card-done-list">
      {{ workExperience }}
    </div>
@@ -14,14 +21,16 @@
      <div class="flexJob-card-footer-left-wrapper">
        <div class="flexJob-card-footer-left" v-if="showFooterLeft">
          <slot name="footerLeft">
            <div class="flexJob-card-footer-text">取消收藏</div>
            <div class="flexJob-card-footer-text" @click.stop="emit('cancelCollection')">
              取消收藏
            </div>
          </slot>
        </div>
      </div>
      <div class="flexJob-card-footer-right" v-if="showFooterRight">
        <slot name="footerRight">
          <nut-button type="primary">立即联系</nut-button>
          <nut-button type="primary" @click.stop="emit('contact')">立即联系</nut-button>
        </slot>
      </div>
    </div>
@@ -29,8 +38,6 @@
</template>
<script setup lang="ts">
import IconMale from '@/assets/mine/icon-male.png';
import IconFemale from '@/assets/mine/icon-female.png';
import { CommonTaskCardProps } from './card';
import FlexJobTopView from './FlexJobTopView.vue';
import { Gender } from '@12333/constants';
@@ -47,6 +54,7 @@
  name?: string;
  genderType?: Gender;
  age?: number;
  isRealName?: boolean;
  educationalLevel?: string;
  workExperience?: string;
  arrangeCount?: number;
@@ -57,6 +65,11 @@
  showFooterRight: true,
  showDoneDetail: true,
});
const emit = defineEmits<{
  (e: 'cancelCollection'): void;
  (e: 'contact'): void;
}>();
</script>
<style lang="scss">
packages/services/api/FlexTask.ts
New file
@@ -0,0 +1,63 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 获取任务详情 GET /api/FlexTask/GetFlexTaskDetail */
export async function getFlexTaskDetail(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetFlexTaskDetailParams,
  options?: API.RequestConfig
) {
  return request<API.GetFlexTaskDetailForBackOutput>('/api/FlexTask/GetFlexTaskDetail', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 获取运营端任务管理列表 POST /api/FlexTask/GetFlexTaskList */
export async function getFlexTaskList(
  body: API.GetFlexTaskForBackInput,
  options?: API.RequestConfig
) {
  return request<API.FlexTaskListOutputPageOutput>('/api/FlexTask/GetFlexTaskList', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 获取报名详情 POST /api/FlexTask/GetFlexTaskWorkerList */
export async function getFlexTaskWorkerList(
  body: API.GetFlexTaskWorkerListInput,
  options?: API.RequestConfig
) {
  return request<API.GetWorkerListForBackOutputPageOutput>('/api/FlexTask/GetFlexTaskWorkerList', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 设置任务推荐状态 POST /api/FlexTask/SetFlexTaskReRecommendStatus */
export async function setFlexTaskReRecommendStatus(
  body: API.SetRecommendInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/FlexTask/SetFlexTaskReRecommendStatus', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
packages/services/api/User.ts
New file
@@ -0,0 +1,11 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 获取个人信息详情 GET /api/User/GetUserInfo */
export async function getUserInfo(options?: API.RequestConfig) {
  return request<API.UserDto>('/api/User/GetUserInfo', {
    method: 'GET',
    ...(options || {}),
  });
}
packages/services/api/UserResume.ts
@@ -2,7 +2,7 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 此处后端没有提供注释 GET /api/UserResume/GetUserResume */
/** 根据用户获取简历 GET /api/UserResume/GetUserResume */
export async function getUserResume(options?: API.RequestConfig) {
  return request<API.MyResumeOutput>('/api/UserResume/GetUserResume', {
    method: 'GET',
@@ -10,7 +10,7 @@
  });
}
/** 此处后端没有提供注释 GET /api/UserResume/GetUserResumeCertificateDetailById */
/** 根据认证id获取认证详情 GET /api/UserResume/GetUserResumeCertificateDetailById */
export async function getUserResumeCertificateDetailById(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetUserResumeCertificateDetailByIdParams,
@@ -28,7 +28,7 @@
  );
}
/** 此处后端没有提供注释 GET /api/UserResume/GetUserResumeCertificateList */
/** 根据用户ID获取用户认证信息 GET /api/UserResume/GetUserResumeCertificateList */
export async function getUserResumeCertificateList(options?: API.RequestConfig) {
  return request<API.UserResumeCertificateListOutput[]>(
    '/api/UserResume/GetUserResumeCertificateList',
@@ -39,7 +39,7 @@
  );
}
/** 此处后端没有提供注释 GET /api/UserResume/GetUserResumeDetailInfo */
/** 获取用户简历详情 GET /api/UserResume/GetUserResumeDetailInfo */
export async function getUserResumeDetailInfo(options?: API.RequestConfig) {
  return request<API.UserResumeDetailInfoOutput>('/api/UserResume/GetUserResumeDetailInfo', {
    method: 'GET',
@@ -47,7 +47,7 @@
  });
}
/** 此处后端没有提供注释 GET /api/UserResume/GetUserResumeWorkExperience */
/** 根据用户id获取用户工作经历 GET /api/UserResume/GetUserResumeWorkExperience */
export async function getUserResumeWorkExperience(options?: API.RequestConfig) {
  return request<API.UserResumeWorkExperienceOutput>(
    '/api/UserResume/GetUserResumeWorkExperience',
@@ -58,12 +58,12 @@
  );
}
/** 此处后端没有提供注释 POST /api/UserResume/SaveUserResumeBaseInfo */
/** 保存简历的基础信息 POST /api/UserResume/SaveUserResumeBaseInfo */
export async function saveUserResumeBaseInfo(
  body: API.SaveUserResumeBaseInfoInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/UserResume/SaveUserResumeBaseInfo', {
  return request<number>('/api/UserResume/SaveUserResumeBaseInfo', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
@@ -73,12 +73,12 @@
  });
}
/** 此处后端没有提供注释 POST /api/UserResume/SaveUserResumeCertificate */
/** 保存用户的简历认证信息 POST /api/UserResume/SaveUserResumeCertificate */
export async function saveUserResumeCertificate(
  body: API.SaveUserResumeCertificateInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/UserResume/SaveUserResumeCertificate', {
  return request<number>('/api/UserResume/SaveUserResumeCertificate', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
@@ -88,12 +88,12 @@
  });
}
/** 此处后端没有提供注释 POST /api/UserResume/SaveUserResumeDetailInfo */
/** 保存简历详情 POST /api/UserResume/SaveUserResumeDetailInfo */
export async function saveUserResumeDetailInfo(
  body: API.SaveUserResumeDetailInfoInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/UserResume/SaveUserResumeDetailInfo', {
  return request<number>('/api/UserResume/SaveUserResumeDetailInfo', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
@@ -103,12 +103,12 @@
  });
}
/** 此处后端没有提供注释 POST /api/UserResume/SaveUserResumeExpectationJob */
/** 保存用户期望的岗位信息 POST /api/UserResume/SaveUserResumeExpectationJob */
export async function saveUserResumeExpectationJob(
  body: API.SaveUserResumeExpectationJobInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/UserResume/SaveUserResumeExpectationJob', {
  return request<number>('/api/UserResume/SaveUserResumeExpectationJob', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
@@ -118,12 +118,12 @@
  });
}
/** 此处后端没有提供注释 POST /api/UserResume/SaveUserResumeWorkExperience */
/** 保存用户工作经历 POST /api/UserResume/SaveUserResumeWorkExperience */
export async function saveUserResumeWorkExperience(
  body: API.SaveUserResumeWorkExperienceInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/UserResume/SaveUserResumeWorkExperience', {
  return request<number>('/api/UserResume/SaveUserResumeWorkExperience', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
packages/services/api/index.ts
@@ -9,6 +9,7 @@
import * as Common from './Common';
import * as Features from './Features';
import * as FlexEnterprise from './FlexEnterprise';
import * as FlexTask from './FlexTask';
import * as FlexWorker from './FlexWorker';
import * as IdentityRole from './IdentityRole';
import * as IdentityUser from './IdentityUser';
@@ -18,6 +19,7 @@
import * as Profile from './Profile';
import * as SearchSetting from './SearchSetting';
import * as Tenant from './Tenant';
import * as User from './User';
import * as UserResume from './UserResume';
import * as Version from './Version';
export default {
@@ -28,6 +30,7 @@
  Common,
  Features,
  FlexEnterprise,
  FlexTask,
  FlexWorker,
  IdentityRole,
  IdentityUser,
@@ -37,6 +40,7 @@
  Profile,
  SearchSetting,
  Tenant,
  User,
  UserResume,
  Version,
};
packages/services/api/typings.d.ts
@@ -184,6 +184,10 @@
    moduleId?: string;
  }
  interface APIgetFlexTaskDetailParams {
    id?: string;
  }
  interface APIgetFlexTaskDtoParams {
    id?: string;
  }
@@ -799,6 +803,7 @@
    id?: string;
    aideType?: FlexTaskAideEnum;
    name?: string;
    imageUrl?: string;
  }
  type FlexTaskAideEnum = 10 | 20;
@@ -806,6 +811,38 @@
  type FlexTaskCheckAcceptStatusEnum = 10 | 20 | 30;
  type FlexTaskFeeTypeEnum = 10 | 20 | 30 | 40;
  interface FlexTaskListOutput {
    taskId?: string;
    /** 任务名称 */
    taskName?: string;
    releaseStatus?: FlexTaskReleaseStatusEnum;
    /** 安排状态 */
    arrangeStatus?: boolean;
    /** 发布日期 */
    startDate?: string;
    /** 结束日期 */
    endDate?: string;
    feeType?: FlexTaskFeeTypeEnum;
    settleType?: FlexTaskSettleTypeEnum;
    settleStatus?: SettleStatusEnum;
    /** 是否推荐 */
    isRecommend?: boolean;
    /** 结算方式 */
    fee?: number;
    /** 报名人数 */
    applyWorkerCount?: number;
    /** 是否已完成验收 */
    isOverCheck?: boolean;
    overCheckStatus?: OverCheckStatusEnum;
    creationTime?: string;
  }
  interface FlexTaskListOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: FlexTaskListOutput[];
  }
  type FlexTaskReleaseStatusEnum = 10 | 20;
@@ -869,6 +906,44 @@
    signStatus?: FlexWorkerEleSignEnum;
  }
  interface GetFlexTaskDetailForBackOutput {
    /** 任务Id */
    taskId?: string;
    /** 任务名称 */
    taskName?: string;
    isArrange?: boolean;
    startDate?: string;
    endDate?: string;
    feeType?: FlexTaskFeeTypeEnum;
    feeTypeName?: string;
    settleType?: FlexTaskSettleTypeEnum;
    /** 结算方式 */
    settleTypeName?: string;
    /** 福利 */
    taskWeals?: FlexTaskAideDto[];
    /** 证书 */
    taskCerts?: FlexTaskAideDto[];
    /** 服务费 */
    fee?: number;
    provinceId?: number;
    cityId?: number;
    areaId?: number;
    /** 省 */
    provinceName?: string;
    /** 市 */
    cityName?: string;
    /** 区域 */
    areaName?: string;
    /** 任务地点 */
    address?: string;
    creationDate?: string;
    /** 最小年龄 */
    minAge?: number;
    /** 最大年龄 */
    maxAge?: number;
    sexType?: GenderTypeEnum;
  }
  interface GetFlexTaskDtoOutput {
    taskId?: string;
    taskName?: string;
@@ -893,6 +968,19 @@
    minAge?: number;
    maxAge?: number;
    sexType?: GenderTypeEnum;
  }
  interface GetFlexTaskForBackInput {
    pageModel?: Pagination;
    /** 任务名称 */
    taskName?: string;
    /** 发布开始日期 */
    startBeginDate?: string;
    /** 发布结束日期 */
    startEndDate?: string;
    releaseStatus?: FlexTaskReleaseStatusEnum;
    /** 是否推荐 */
    isRecommend?: boolean;
  }
  interface GetFlexTaskListByStatusInput {
@@ -961,6 +1049,11 @@
    /** 任务Id */
    flexTaskId?: string;
    checkAcceptStatus?: FlexTaskCheckAcceptStatusEnum;
  }
  interface GetFlexTaskWorkerListInput {
    pageModel?: Pagination;
    flexTaskId?: string;
  }
  interface GetFlexWorkerRecordOutput {
@@ -1102,6 +1195,27 @@
  interface GetTypeSearchSettingListInput {
    searchType: number;
    belongType?: number;
  }
  interface GetWorkerListForBackOutput {
    userId?: string;
    /** 姓名 */
    name?: string;
    /** 身份证号码 */
    idNumber?: string;
    /** 电话号码 */
    contactPhone?: string;
    /** 年龄 */
    age?: number;
    genderType?: GenderTypeEnum;
    eduLevelName?: string;
    hireStatus?: FlexTaskWorkerHireEnum;
  }
  interface GetWorkerListForBackOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetWorkerListForBackOutput[];
  }
  interface IanaTimeZone {
@@ -1393,6 +1507,7 @@
    resumeCertifiDetail?: UserResumeCertificateDetailOutput;
    resumeDetailInfo?: UserResumeDetailInfoOutput;
    resumeWorkExperience?: UserResumeWorkExperienceOutput;
    /** 工作记录 */
    resumeWorkRecordList?: UserResumeWorkerRecordOutput[];
  }
@@ -1441,6 +1556,8 @@
    securityToken?: string;
    requestId?: string;
  }
  type OverCheckStatusEnum = 10 | 20 | -10;
  interface PageInput {
    pageModel?: Pagination;
@@ -1597,6 +1714,13 @@
    typeSimple?: string;
  }
  interface RoleDto {
    /** 角色Id */
    id?: string;
    /** 角色名 */
    name?: string;
  }
  interface SaveUserResumeBaseInfoInput {
    name?: string;
    socialIdentity?: string;
@@ -1693,10 +1817,18 @@
    preViewData?: string;
  }
  interface SetRecommendInput {
    id?: string;
    /** 是否推荐 */
    isRecommend?: boolean;
  }
  interface SetRoleUserInput {
    userId?: string[];
    roleId?: string;
  }
  type SettleStatusEnum = 10 | 20 | -10;
  interface SetUserRoleInput {
    userId?: string;
@@ -1828,51 +1960,102 @@
    items?: UserData[];
  }
  interface UserResumeBaseInfoOutput {
  interface UserDto {
    /** 用户Id */
    id?: string;
    /** 登录用户名(账号) */
    userName?: string;
    /** 名称 */
    name?: string;
    /** 用户手机号 */
    phoneNumber?: string;
    /** 账户是否锁住(是否禁用) */
    isLocked?: boolean;
    /** 角色信息 */
    roles?: RoleDto[];
    /** 备注 */
    remark?: string;
    /** 组织架构公司id */
    companyOrgId?: string;
    /** 组织架构部门id */
    departmentOrgId?: string;
  }
  interface UserResumeBaseInfoOutput {
    /** 姓名 */
    name?: string;
    /** 电话号码 */
    phoneNumber?: string;
    /** 头像 */
    avatarUrl?: string;
    genderType?: GenderTypeEnum;
    /** 年龄 */
    age?: number;
    /** 上岗次数 */
    arrangeCount?: number;
    /** 身份证号码 */
    idNumber?: string;
    /** 身份 */
    socialIdentity?: string;
    /** 身份名称 */
    socialIdentityName?: string;
    /** 学历 */
    educationalLevel?: string;
    /** 学历名称 */
    educationalLevelName?: string;
    /** 常驻省份Code */
    residentProvinceCode?: number;
    /** 常驻城市code */
    residentCityCode?: number;
    /** 常驻省份名称 */
    residentProvinceName?: string;
    /** 常驻城市名称 */
    residentCityName?: string;
  }
  interface UserResumeCertificateDetailOutput {
    /** 简历认证详情Id */
    id?: string;
    /** 用户简历Id */
    userResumeId?: string;
    /** 认证类别Id */
    certificateTypeId?: string;
    /** 认证证件号默认身份证 */
    certificateNo?: string;
    /** 证件开始时间 */
    beginTime?: string;
    /** 证件结束时间 */
    endTime?: string;
    /** 是否永久 */
    isPermanent?: boolean;
    certificateUnit?: string;
    /** 身份证正面 */
    certificateFrontImgUrl?: string;
    /** 身份证反面 */
    certificateBackImgUrl?: string;
  }
  interface UserResumeCertificateListOutput {
    id?: string;
    /** 证书Id */
    certificateTypeId?: string;
    /** 证书名称 */
    certificateTypeName?: string;
    /** 工作简历Id */
    userResumeId?: string;
  }
  interface UserResumeDetailInfoOutput {
    /** 身高 */
    height?: string;
    /** 体重 */
    weight?: string;
    /** 个人生活照 */
    lifeCircleImgUrlList?: string[];
  }
  interface UserResumeExpectationJobOutput {
    /** 期望岗位列表 */
    jobIdList?: IdNameOutput[];
    freeTime?: UserResumeFreeTimeEnum;
    jobSeekingStatus?: UserResumeJobSeekingStatusEnum;
@@ -1883,13 +2066,18 @@
  type UserResumeJobSeekingStatusEnum = 1 | 2 | 3;
  interface UserResumeWorkerRecordOutput {
    /** 工作时间 */
    workTime?: string;
    /** 工作地点 */
    workAddress?: string;
    /** 工作名称 */
    workName?: string;
  }
  interface UserResumeWorkExperienceOutput {
    /** 工作年限 */
    workingSeniority?: string;
    /** 工作经验 */
    workExperience?: string;
  }