wupengfei
2025-03-21 1bbd7061dac79cacf5513234a04cac8ba0be5c6f
feat: 接口对接
24个文件已修改
1个文件已添加
1 文件已重命名
660 ■■■■ 已修改文件
apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/tsconfig.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/AreaTreeSelect/CategoryPane.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/AreaTreeSelect/PositionSelectView.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Tag/JobTagList.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/task.ts 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/area.ts 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/FlexEnterpriseWoker.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/UserResume.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/index.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/api/typings.d.ts 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/utils/area.ts 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
@@ -21,7 +21,7 @@
import { useQuery } from '@tanstack/vue-query';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { Message } from '@12333/utils';
import { FlexTaskWorkerHireEnum } from '@/constants/task';
import { FlexTaskWorkerHireEnum } from '@12333/constants/task';
defineOptions({
  name: 'InnerPage',
apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -43,7 +43,7 @@
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { FlexWorkerEleSignEnum } from '@/constants/task';
import { FlexWorkerEleSignEnum } from '@12333/constants/task';
import Taro from '@tarojs/taro';
defineOptions({
apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue
@@ -50,7 +50,7 @@
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import IconLocaltion from '@/assets/flexJob/icon-localtion.png';
import { TaskPrice, TaskDetailWelfareItem } from '@12333/components';
import { SalaryTimeTypeEnumUnit, FlexTaskSettleTypeEnumText } from '@/constants/task';
import { SalaryTimeTypeEnumUnit, FlexTaskSettleTypeEnumText } from '@12333/constants/task';
import dayjs from 'dayjs';
import { setOSSLink } from '@12333/utils';
import { RectRight } from '@nutui/icons-vue-taro';
apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue
@@ -21,7 +21,7 @@
<script setup lang="ts">
import { OrderInputType } from '@12333/constants';
import { RouterPath } from '@/constants';
import { FlexTaskWorkerHireEnum } from '@/constants/task';
import { FlexTaskWorkerHireEnum } from '@12333/constants/task';
import { useInfiniteLoading } from '@12333/hooks';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { FlexJobCard } from '@12333/components';
apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue
@@ -56,7 +56,7 @@
  FlexTaskReleaseStatusEnum,
  FlexTaskReleaseStatusEnumText,
  SalaryTimeTypeEnumUnit,
} from '@/constants/task';
} from '@12333/constants/task';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import Taro from '@tarojs/taro';
import { Message } from '@12333/utils';
apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
@@ -26,7 +26,10 @@
<script setup lang="ts">
import TaskCheckPersonalView from './TaskCheckPersonalView.vue';
import { Colors, Gender } from '@12333/constants';
import { FlexTaskCheckAcceptStatusEnum, FlexTaskCheckAcceptStatusEnumText } from '@/constants/task';
import {
  FlexTaskCheckAcceptStatusEnum,
  FlexTaskCheckAcceptStatusEnumText,
} from '@12333/constants/task';
defineOptions({
  name: 'TaskCheckCard',
apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
@@ -122,14 +122,14 @@
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import {
  FlexTaskSettleTypeEnum,
  FlexTaskSettleTypeEnumText,
  FlexTaskFeeTypeEnum,
  FlexTaskFeeTypeEnumText,
  SalaryTimeTypeEnumUnit,
} from '@/constants/task';
import { useUser } from '@/hooks';
} from '@12333/constants';
import {
  ChooseInputWithPicker,
  ChooseInputWithDatePicker,
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
@@ -52,7 +52,7 @@
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType, Colors } from '@12333/constants';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { SalaryTimeTypeEnumUnit } from '@/constants/task';
import { SalaryTimeTypeEnumUnit } from '@12333/constants/task';
defineOptions({
  name: 'InnerPage',
apps/bMiniApp/tsconfig.json
@@ -21,7 +21,8 @@
    "./types/**/*.d.ts",
    "./components.d.ts",
    "./auto-imports.d.ts",
    "../../types/api.d.ts"
    "../../types/api.d.ts",
    "../../packages/constants/task.ts"
  ],
  "exclude": ["node_modules", "dist"],
  "references": [
apps/cMiniApp/project.private.config.json
@@ -56,13 +56,6 @@
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                }
            ]
        }
apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue
@@ -2,10 +2,14 @@
  <QueryMenuView @close="handleReset" @confirm="emit('close')" cancelText="重置">
    <div class="home-query-menu-view">
      <QueryMenuItem title="结算方式">
        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
        <ProRadio
          v-model="query.gender"
          :value-enum="FlexTaskSettleTypeEnumText"
          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="WelfareList" show-all-btn></ProRadio>
      </QueryMenuItem>
      <QueryMenuItem title="性别要求">
        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
@@ -16,7 +20,8 @@
<script setup lang="ts">
import { QueryMenuView, QueryMenuItem, ProRadio } from '@12333/components';
import { GenderText } from '@12333/constants';
import { GenderText, SearchType, FlexTaskSettleTypeEnumText } from '@12333/constants';
import { useSearchSettingType } from '@12333/hooks';
defineOptions({
  name: 'HomeQueryMenuView',
@@ -26,6 +31,10 @@
// const props = withDefaults(defineProps<Props>(), {});
const { searchSettingTypeList: WelfareList } = useSearchSettingType({
  searchType: SearchType.Welfare,
});
const emit = defineEmits<{
  (e: 'reset'): void;
  (e: 'close'): void;
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -7,8 +7,8 @@
      <nut-form-item label="姓名:" class="bole-form-item" prop="name">
        <nut-input v-model.trim="form.name" placeholder="请输入企业名称" />
      </nut-form-item>
      <nut-form-item label="手机号:" class="bole-form-item" prop="phone" required>
        <nut-input v-model.trim="form.phone" placeholder="请输入手机号" type="text" />
      <nut-form-item label="手机号:" class="bole-form-item" prop="phoneNumber" required>
        <nut-input v-model.trim="form.phoneNumber" placeholder="请输入手机号" type="text" />
      </nut-form-item>
      <nut-form-item label="身份:" class="bole-form-item" prop="socialIdentity">
        <ChooseInputWithPicker
@@ -24,12 +24,12 @@
          :value-enum="EducationTypeList"
        />
      </nut-form-item>
      <nut-form-item label="常驻城市:" class="bole-form-item" prop="gender">
        <ChooseInputWithPicker
          v-model="form.gender"
      <nut-form-item label="常驻城市:" class="bole-form-item" prop="areaList">
        <ChooseInputWithAreaPicker
          :columns="cityAreaTree"
          v-model="form.areaList"
          placeholder="请选择常驻城市"
          :value-enum="TaskStatusText"
        />
        ></ChooseInputWithAreaPicker>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
@@ -40,12 +40,14 @@
<script setup lang="ts">
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker } from '@12333/components';
import { TaskStatusText, TaskStatus } from '@/constants';
import { convertApi2FormUrlOnlyOne } from '@12333/utils';
import { useUser } from '@/hooks';
import { useSearchSettingType } from '@12333/hooks';
import { SearchType } from '@12333/constants';
import { ChooseInputWithPicker, ChooseInputWithAreaPicker } from '@12333/components';
import { TaskStatusText } from '@/constants';
import { convertApi2FormUrlOnlyOne, Message, setOSSLink } from '@12333/utils';
import { useAllAreaList, useArea, useSearchSettingType } from '@12333/hooks';
import { Gender, SearchType } from '@12333/constants';
import * as userResumeServices from '@12333/services/api/userResume';
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
@@ -58,18 +60,44 @@
  searchType: SearchType.Identity,
});
const { findAreaNameFromCode, cityAreaTree } = useAllAreaList();
const form = reactive({
  // avatarUrl: convertApi2FormUrlOnlyOne(userDetail.value?.originalAvatarUrl),
  avatarUrl: [],
  name: '',
  phone: '',
  gender: TaskStatus.All,
  phoneNumber: '',
  gender: Gender.Male,
  socialIdentity: '',
  educationalLevel: '',
  areaList: [] as number[],
});
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeBaseInfo'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeBaseInfo({
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.UserResumeBaseInfoOutput),
  onSuccess(data) {
    form.avatarUrl = convertApi2FormUrlOnlyOne(setOSSLink(data.avatarUrl));
    form.name = data.name;
    form.phoneNumber = data.phoneNumber;
    form.gender = data.genderType;
    form.socialIdentity = data.socialIdentity;
    form.educationalLevel = data.educationalLevel;
    form.areaList = [data.residentProvinceCode, data.residentCityCode];
  },
});
const rules = reactive<FormRules>({
  phone: [{ required: true, message: '请输入手机号' }],
  phoneNumber: [{ required: true, message: '请输入手机号' }],
  socialIdentity: [{ required: true, message: '请选择身份' }],
  educationalLevel: [{ required: true, message: '请选择学历' }],
  areaList: [{ required: true, message: '请选择常驻城市' }],
@@ -84,7 +112,34 @@
  });
}
function confirm() {}
async function confirm() {
  try {
    let params: API.SaveUserResumeBaseInfoInput = {
      name: form.name,
      avatarUrl: form.avatarUrl[0]?.path,
      phoneNumber: form.phoneNumber,
      educationalLevel: form.educationalLevel,
      socialIdentity: form.socialIdentity,
      residentProvinceCode: form.areaList[0],
      residentProvinceName: findAreaNameFromCode(form.areaList[0]),
      residentCityCode: form.areaList[1],
      residentCityName: findAreaNameFromCode(form.areaList[1]),
    };
    let res = await userResumeServices.saveUserResumeBaseInfo(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
          Taro.navigateTo({
            url: `${RouterPath.mineCurriculumVitae}`,
            success: function (res) {
              res.eventChannel.emit('updateResume', { content: true });
            },
          });
        },
      });
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue
@@ -4,29 +4,65 @@
  </ContentView>
  <PageFooter>
    <div class="expect-position-page-footer">
      <div class="expect-position-select-wrapper" v-if="positionList.length > 0">
        <div class="expect-position-select-item" v-for="(item, index) in positionList" :key="index">
          <div class="expect-position-select-item-text">{{ item }}</div>
      <div class="expect-position-select-wrapper" v-if="checkdList.length > 0">
        <div class="expect-position-select-item" v-for="(item, index) in checkdList" :key="index">
          <div class="expect-position-select-item-text">{{ item.name }}</div>
          <div class="expect-position-select-item-icon-wrapper">
            <Close :size="8" class="expect-position-select-item-icon" />
            <Close
              :size="8"
              class="expect-position-select-item-icon"
              @click="handleDelete(item.id)"
            />
          </div>
        </div>
      </div>
      <PageFooterBtn type="primary">保存</PageFooterBtn>
      <PageFooterBtn type="primary" @click="handleConfirm">保存</PageFooterBtn>
    </div>
  </PageFooter>
</template>
<script setup lang="ts">
import { PositionSelectView } from '@12333/components';
import { SearchType } from '@12333/constants';
import { useSearchSettingType } from '@12333/hooks';
import { Close } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro';
import { size } from 'lodash';
import { useEvent, useEventChannel } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
});
const eventChannel = useEventChannel();
useEvent('updatePosition', function (data: { content: string[] }) {
  if (data.content.length) {
    positionList.value = [...data.content];
  }
});
const positionList = ref([]);
const { searchSettingTypeList: position } = useSearchSettingType({
  searchType: SearchType.Position,
});
const checkdList = computed(() => {
  if (!positionList.value.length) return [];
  return position.value.filter((x) => positionList.value.includes(x.id));
});
function handleDelete(id: string) {
  positionList.value = positionList.value.filter((x) => x !== id);
}
function handleConfirm() {
  eventChannel.emit('addPosition', {
    content: positionList.value,
  });
  Taro.navigateBack({ delta: 1 });
}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
@@ -8,16 +8,24 @@
      class="mine-curriculum-noticebar"
    />
    <div class="mine-curriculum-info-wrapper">
      <UserAvatar :size="60" class="mine-curriculum-avatar" />
      <Avatar
        :size="60"
        class="mine-curriculum-avatar"
        :src="setOSSLink(detail?.resumeBaseInfo?.avatarUrl ?? '')"
      ></Avatar>
      <div class="mine-curriculum-info-content">
        <div class="mine-curriculum-info-item">
          <div class="mine-curriculum-info-item-left">
            <div class="mine-curriculum-info-item-name">
              {{ userStore.userDetail?.userName ?? '' }}
              {{ detail?.resumeBaseInfo?.name ?? '' }}
            </div>
            <div class="mine-curriculum-info-item-gender">
              <div class="mine-curriculum-info-item-gender-dot">·</div>
              <img v-if="1" :src="IconMale" class="mine-curriculum-info-item-gender-icon" />
              <img
                v-if="detail?.resumeBaseInfo?.genderType === Gender.Male"
                :src="IconMale"
                class="mine-curriculum-info-item-gender-icon"
              />
              <img v-else :src="IconFemale" class="mine-curriculum-info-item-gender-icon" />
            </div>
          </div>
@@ -27,11 +35,13 @@
          <div class="mine-curriculum-info-item-left">
            <img :src="IconPhone" class="mine-curriculum-info-item-phone-icon" />
            <div class="mine-curriculum-info-item-phone">
              {{ userStore.userDetail?.phoneNumber ?? '' }}
              {{ detail?.resumeBaseInfo?.phoneNumber ?? '' }}
            </div>
          </div>
          <div class="mine-curriculum-info-item-detail">
            {{ '26岁 | 非学生 | 本科' }}
            {{
              `${detail?.resumeBaseInfo?.age}岁 | ${detail?.resumeBaseInfo?.socialIdentityName} | ${detail?.resumeBaseInfo?.educationalLevelName}`
            }}
          </div>
        </div>
      </div>
@@ -47,17 +57,23 @@
        </div>
        <MineAgreementSignDetailItem label="期望岗位" class="mine-curriculum-intention-job">
          <template #detail>
            <JobTagList />
            <JobTagList :jobTagList="jobTag" />
          </template>
        </MineAgreementSignDetailItem>
        <MineAgreementSignDetailItem label="空闲时间">
          <template #detail>
            <div class="mine-curriculum-intention-bold">不限</div>
            <div class="mine-curriculum-intention-bold">
              {{ UserResumeFreeTimeEnumText[detail?.resumeExpectationJob?.freeTime] }}
            </div>
          </template>
        </MineAgreementSignDetailItem>
        <MineAgreementSignDetailItem label="求职状态">
          <template #detail>
            <div class="mine-curriculum-intention-bold">积极找工作</div>
            <div class="mine-curriculum-intention-bold">
              {{
                UserResumeJobSeekingStatusEnumText[detail?.resumeExpectationJob?.jobSeekingStatus]
              }}
            </div>
          </template>
        </MineAgreementSignDetailItem>
      </div>
@@ -89,7 +105,12 @@
import { useUserStore } from '@/stores/modules/user';
import { useIsLogin } from '@/hooks';
import MineAgreementSignDetailItem from '../../mine/mineAgreementSignDetail/MineAgreementSignDetailItem.vue';
import { List, ListItem, JobTagList } from '@12333/components';
import { List, ListItem, JobTagList, Avatar } from '@12333/components';
import {
  Gender,
  UserResumeFreeTimeEnumText,
  UserResumeJobSeekingStatusEnumText,
} from '@12333/constants';
import { RouterPath } from '@/constants';
import * as userResumeServices from '@12333/services/api/userResume';
import IconArrow from '@/assets/setting/icon-arrow.png';
@@ -99,6 +120,8 @@
import IconPhone from '@/assets/mine/icon-phone.png';
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
import { setOSSLink } from '@12333/utils';
import { useEvent, useEventChannel } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
@@ -110,6 +133,20 @@
const taskId = router.params?.taskId;
const eventChannel = useEventChannel();
useEvent('updateResume', function (data: { content: boolean }) {
  if (data.content) {
    refetch({
      type: 'inactive',
    });
  }
});
const jobTag = computed(
  () => detail?.value?.resumeExpectationJob?.jobIdList?.map((x) => x.name) ?? []
);
const {
  isLoading,
  isError,
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
@@ -1,28 +1,23 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="期望岗位:" class="bole-form-item" prop="job" label-position="top">
        <!-- <ChooseInputWithPicker
          v-model="form.job"
          placeholder="请选择期望岗位"
          :value-enum="TaskStatusText"
        /> -->
      <nut-form-item label="期望岗位:" class="bole-form-item" prop="jobIdList" label-position="top">
        <CommonInputField class="job-common-input-field" @click="goExpectPosition">
          <JobTagList />
          <JobTagList :jobTagList="jobTagList" />
        </CommonInputField>
      </nut-form-item>
      <nut-form-item label="空闲时间:" class="bole-form-item" prop="job">
      <nut-form-item label="空闲时间:" class="bole-form-item" prop="freeTime">
        <ChooseInputWithPicker
          v-model="form.job"
          v-model="form.freeTime"
          placeholder="请选择空闲时间"
          :value-enum="TaskStatusText"
          :value-enum="UserResumeFreeTimeEnumText"
        />
      </nut-form-item>
      <nut-form-item label="求职状态:" class="bole-form-item" prop="job">
      <nut-form-item label="求职状态:" class="bole-form-item" prop="jobSeekingStatus">
        <ChooseInputWithPicker
          v-model="form.job"
          v-model="form.jobSeekingStatus"
          placeholder="请选择求职状态"
          :value-enum="TaskStatusText"
          :value-enum="UserResumeJobSeekingStatusEnumText"
        />
      </nut-form-item>
    </nut-form>
@@ -35,22 +30,70 @@
<script setup lang="ts">
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker, JobTagList, CommonInputField } from '@12333/components';
import { TaskStatusText, TaskStatus } from '@/constants';
import { useUser } from '@/hooks';
import {
  UserResumeFreeTimeEnumText,
  UserResumeJobSeekingStatusEnumText,
  UserResumeFreeTimeEnum,
  UserResumeJobSeekingStatusEnum,
  SearchType,
} from '@12333/constants';
import Taro from '@tarojs/taro';
import * as userResumeServices from '@12333/services/api/userResume';
import { useSearchSettingType } from '@12333/hooks';
import { Message } from '@12333/utils';
import { goBack } from '@/utils';
import { useQuery } from '@tanstack/vue-query';
defineOptions({
  name: 'InnerPage',
});
const { userDetail } = useUser();
const { searchSettingTypeList: positionList } = useSearchSettingType({
  searchType: SearchType.Position,
});
const jobTagList = computed(() => {
  return positionList.value?.filter((x) => form.jobIdList.includes(x.id)).map((x) => x.name) || [];
});
const form = reactive({
  job: TaskStatus.All,
  jobIdList: [] as string[],
  freeTime: UserResumeFreeTimeEnum.NoLimit,
  jobSeekingStatus: UserResumeJobSeekingStatusEnum.Activing,
});
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getResumeExpectationJob'],
  queryFn: async () => {
    return await userResumeServices.getResumeExpectationJob({
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.UserResumeExpectationJobOutput),
  onSuccess(data) {
    form.jobIdList = data.jobIdList.map((x) => x.id);
    form.freeTime = data.freeTime;
    form.jobSeekingStatus = data.jobSeekingStatus;
  },
});
const rules = reactive<FormRules>({
  job: [{ required: true, message: '请选择' }],
  jobIdList: [
    {
      required: true,
      validator() {
        if (form.jobIdList.length) return Promise.resolve(true);
        return Promise.reject('请选择期望岗位');
      },
    },
  ],
  freeTime: [{ required: true, message: '请选择空闲时间' }],
  jobSeekingStatus: [{ required: true, message: '请选择求职状态' }],
});
const formRef = ref<any>(null);
function handleConfirm() {
@@ -62,11 +105,40 @@
  });
}
function confirm() {}
async function confirm() {
  try {
    let params: API.SaveUserResumeExpectationJobInput = {
      jobIdList: form.jobIdList,
      freeTime: form.freeTime,
      jobSeekingStatus: form.jobSeekingStatus,
    };
    let res = await userResumeServices.saveUserResumeExpectationJob(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
          Taro.navigateTo({
            url: `${RouterPath.mineCurriculumVitae}`,
            success: function (res) {
              res.eventChannel.emit('updateResume', { content: true });
            },
          });
        },
      });
    }
  } catch (error) {}
}
function goExpectPosition() {
  Taro.navigateTo({
    url: `${RouterPath.expectPosition}`,
    events: {
      addPosition: function (data: { content: string[] }) {
        form.jobIdList = data.content?.length ? data.content : [];
      },
    },
    success: function (res) {
      res.eventChannel.emit('updatePosition', { content: form.jobIdList });
    },
  });
}
</script>
packages/components/src/AreaTreeSelect/CategoryPane.vue
@@ -3,10 +3,10 @@
    <div class="nut-category-pane__cateListRight">
      <div v-for="(item, index) in categoryChild" :key="index">
        <div class="nut-category-pane__childItemList">
          <div class="bole-category-pane__childItem" @click="onChange(item.value)">
          <div class="bole-category-pane__childItem" @click="onChange(item.id)">
            <div
              class="bole-category-pane-item-wrapper"
              :class="{ active: modelValue.includes(item.value) }"
              :class="{ active: modelValue.includes(item.id) }"
            >
              <div class="bole-category-pane-item-name">{{ item.name }}</div>
              <Check :size="16" class="bole-category-pane-item-icon" />
@@ -29,7 +29,7 @@
type ChildType = {
  name?: string;
  value?: string | number;
  id?: string | number;
  [key: string]: any;
};
packages/components/src/AreaTreeSelect/PositionSelectView.vue
@@ -1,15 +1,16 @@
<template>
  <Category :category="provinceList" @change="change" class="position-select-view">
  <Category :category="industryList" @change="change" class="position-select-view">
    <CategoryPane :max="max" :categoryChild="categoryChild" :multiple="multiple" v-model="model">
    </CategoryPane>
  </Category>
</template>
<script setup lang="ts">
import { useAllAreaList } from '@12333/hooks';
import { useAllSearchSettingList, useSearchSettingType } from '@12333/hooks';
import Category from './Category.vue';
import CategoryPane from './CategoryPane.vue';
import { reactive, computed, watch } from 'vue';
import { SearchType } from '@12333/constants';
defineOptions({
  name: 'PositionSelectView',
@@ -24,25 +25,26 @@
  multiple: true,
});
const model = defineModel<number[]>();
const model = defineModel<string[]>();
const state = reactive({
  provinceIndex: 0,
});
const { areaTreeList } = useAllAreaList();
const provinceList = computed(() => areaTreeList.value.map((x) => ({ ...x, name: x.areaName })));
const { allSearchSettingList: positionList } = useAllSearchSettingList({
  searchType: SearchType.Position,
});
const { searchSettingTypeList: industryList } = useSearchSettingType({
  searchType: SearchType.IndustryCategory,
});
const categoryChild = computed(() => {
  if (!provinceList.value.length) {
  if (!industryList.value.length) {
    return [];
  }
  return provinceList.value[state.provinceIndex].children.map((x) => ({
    ...x,
    name: x.areaName,
    value: x.areaCode,
  }));
  return positionList.value?.filter(
    (x) => x.parentName === industryList.value[state.provinceIndex].name
  );
});
const change = (index: number) => {
packages/components/src/Tag/JobTagList.vue
@@ -1,13 +1,8 @@
<template>
  <div class="mine-curriculum-intention-job-content">
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div class="mine-curriculum-intention-job-item">客房服务员</div>
    <div v-for="item in jobTagList" :key="item" class="mine-curriculum-intention-job-item">
      {{ item }}
    </div>
  </div>
</template>
@@ -16,9 +11,11 @@
  name: 'JobTagList',
});
// type Props = {};
type Props = {
  jobTagList?: string[];
};
// const props = withDefaults(defineProps<Props>(), {});
const props = withDefaults(defineProps<Props>(), {});
</script>
<style lang="scss">
packages/constants/index.ts
@@ -11,3 +11,4 @@
export * from './oss';
export * from './authenticationV2';
export * from './parkOrHR';
export * from './task';
packages/constants/task.ts
File was renamed from apps/bMiniApp/src/constants/task.ts
@@ -150,3 +150,55 @@
  [FlexWorkerEleSignEnum.HasSign]: '已签约',
  [FlexWorkerEleSignEnum.CancelSign]: '已解约',
};
export enum UserResumeFreeTimeEnum {
  /**
   * 不限
   */
  NoLimit = 1,
  /**
   * 寒暑假
   */
  WinterAndSummerVacation = 2,
  /**
   * 节假日
   */
  Holiday = 3,
  /**
   * 周六日
   */
  Weekend = 4,
  /**
   * 工作日
   */
  Weekday = 5,
}
export const UserResumeFreeTimeEnumText = {
  [UserResumeFreeTimeEnum.NoLimit]: '不限',
  [UserResumeFreeTimeEnum.WinterAndSummerVacation]: '寒暑假',
  [UserResumeFreeTimeEnum.Holiday]: '节假日',
  [UserResumeFreeTimeEnum.Weekend]: '周六日',
  [UserResumeFreeTimeEnum.Weekday]: '工作日',
};
export enum UserResumeJobSeekingStatusEnum {
  /**
   * 积极找工作
   */
  Activing = 1,
  /**
   * 随便看看
   */
  JustLook = 2,
  /**
   * 暂时不找工作
   */
  NotLook = 3,
}
export const UserResumeJobSeekingStatusEnumText = {
  [UserResumeJobSeekingStatusEnum.Activing]: '积极找工作',
  [UserResumeJobSeekingStatusEnum.JustLook]: '随便看看',
  [UserResumeJobSeekingStatusEnum.NotLook]: '暂时不找工作',
};
packages/hooks/area.ts
@@ -63,7 +63,15 @@
  return {
    completeAreaList: computed(() => areaStore.value.completeAreaList),
    completeAreaTree: computed(() => areaStore.value.completeAreaTree),
    // cityAreaTree: computed(() => areaStore.value.cityAreaTree),
    cityAreaTree: computed(() =>
      areaStore.value.completeAreaTree.map((x) => ({
        ...x,
        children: x.children.map((y) => ({
          ...y,
          children: undefined,
        })),
      }))
    ),
    provinceList: computed(() => areaStore.value.provinceList),
    areaItemMap: computed(() => areaStore.value.areaItemMap),
    getAreaFromCompleteAreaList,
@@ -72,7 +80,7 @@
}
export function useAllAreaList() {
  const { completeAreaTree, provinceList, completeAreaList } = useArea();
  const { completeAreaTree, provinceList, completeAreaList, cityAreaTree } = useArea();
  const findAreaCodeFromName = (areaName: string) => {
    const areaItem = completeAreaList.value.find((x) => x.areaName === areaName);
@@ -95,6 +103,7 @@
    findAreaItemFromCode,
    areaTreeList: completeAreaTree,
    provinceList,
    cityAreaTree,
  };
}
packages/services/api/FlexEnterpriseWoker.ts
New file
@@ -0,0 +1,54 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** C端人员管理列表 POST /api/FlexEnterpriseWoker/GetUserClientList */
export async function getUserClientList(
  body: API.GetUserClientForBackInput,
  options?: API.RequestConfig
) {
  return request<API.GetUserClientForBackOutputPageOutput>(
    '/api/FlexEnterpriseWoker/GetUserClientList',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** C端人员管理--签约详情 POST /api/FlexEnterpriseWoker/GetUserClientSignList */
export async function getUserClientSignList(
  body: API.GetUserClientSignListInput,
  options?: API.RequestConfig
) {
  return request<API.UserClientSignListOutputPageOutput>(
    '/api/FlexEnterpriseWoker/GetUserClientSignList',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** C端人员管理--获取人员详情 GET /api/FlexEnterpriseWoker/GetUserDetailForBack */
export async function getUserDetailForBack(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetUserDetailForBackParams,
  options?: API.RequestConfig
) {
  return request<API.GetUserDetailForBackOutput>('/api/FlexEnterpriseWoker/GetUserDetailForBack', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
packages/services/api/UserResume.ts
@@ -2,6 +2,14 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 根据用户获取期待的工作 GET /api/UserResume/GetResumeExpectationJob */
export async function getResumeExpectationJob(options?: API.RequestConfig) {
  return request<API.UserResumeExpectationJobOutput>('/api/UserResume/GetResumeExpectationJob', {
    method: 'GET',
    ...(options || {}),
  });
}
/** 根据用户获取简历 GET /api/UserResume/GetUserResume */
export async function getUserResume(options?: API.RequestConfig) {
  return request<API.MyResumeOutput>('/api/UserResume/GetUserResume', {
@@ -10,6 +18,14 @@
  });
}
/** 根据用户获取简历基础信息 GET /api/UserResume/GetUserResumeBaseInfo */
export async function getUserResumeBaseInfo(options?: API.RequestConfig) {
  return request<API.UserResumeBaseInfoOutput>('/api/UserResume/GetUserResumeBaseInfo', {
    method: 'GET',
    ...(options || {}),
  });
}
/** 根据认证id获取认证详情 GET /api/UserResume/GetUserResumeCertificateDetailById */
export async function getUserResumeCertificateDetailById(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
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 FlexEnterpriseWoker from './FlexEnterpriseWoker';
import * as FlexTask from './FlexTask';
import * as FlexWorker from './FlexWorker';
import * as IdentityRole from './IdentityRole';
@@ -30,6 +31,7 @@
  Common,
  Features,
  FlexEnterprise,
  FlexEnterpriseWoker,
  FlexTask,
  FlexWorker,
  IdentityRole,
packages/services/api/typings.d.ts
@@ -242,6 +242,10 @@
    id: string;
  }
  interface APIgetUserDetailForBackParams {
    userId?: string;
  }
  interface APIgetUserListByPhoneNumberParams {
    phoneNumber?: string;
    clientId?: string;
@@ -1197,6 +1201,77 @@
    belongType?: number;
  }
  interface GetUserClientForBackInput {
    pageModel?: Pagination;
    /** 姓名/手机/身份证号/客户 */
    searchKeys?: string;
    /** 最近录用时间--开始 */
    nearlyHireDateTimeBegin?: string;
    /** 最近录用时间--结束 */
    nearlyHireDateTimeEnd?: string;
    /** 最近签约时间--开始 */
    nearlySignDateTimeBegin?: string;
    /** 最近签约时间--结束 */
    nearlySignDateTimeEnd?: string;
    /** 实名状态 */
    realVerifyStatus?: boolean;
  }
  interface GetUserClientForBackOutput {
    userId?: string;
    userResumeId?: string;
    /** 姓名 */
    name?: string;
    /** 身份证号 */
    idNumber?: string;
    /** 手机号 */
    contactPhone?: string;
    /** 年龄 */
    age?: number;
    genderType?: GenderTypeEnum;
    /** 常驻省份Code */
    residentProvinceCode?: number;
    /** 常驻城市code */
    residentCityCode?: number;
    /** 常驻省份名称 */
    residentProvinceName?: string;
    /** 常驻城市名称 */
    residentCityName?: string;
    /** 实名状态 */
    realVerifyStatus?: boolean;
    /** 实名时间 */
    realVerifyTime?: string;
    nearlyWorkRecord?: NearlyFlexWorkerRecord;
  }
  interface GetUserClientForBackOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetUserClientForBackOutput[];
  }
  interface GetUserClientSignListInput {
    pageModel?: Pagination;
    userId?: string;
  }
  interface GetUserDetailForBackOutput {
    userId?: string;
    userResumeId?: string;
    /** 姓名 */
    name?: string;
    /** 身份证号 */
    idNumber?: string;
    /** 手机号 */
    contactPhone?: string;
    /** 年龄 */
    age?: number;
    /** 身份证正面 */
    certificateFrontImgUrl?: string;
    /** 身份证反面 */
    certificateBackImgUrl?: string;
  }
  interface GetWorkerListForBackOutput {
    userId?: string;
    /** 姓名 */
@@ -1537,6 +1612,16 @@
    value?: string;
  }
  interface NearlyFlexWorkerRecord {
    taskId?: string;
    /** 最近录用时间 */
    nearlyHireDateTime?: string;
    /** 最近签约时间 */
    nearlySignDateTime?: string;
    /** 所属商户 */
    enterpirseName?: string;
  }
  interface ObjectExtensionsDto {
    modules?: Record<string, any>;
    enums?: Record<string, any>;
@@ -1729,6 +1814,10 @@
    residentCityCode?: number;
    residentProvinceName?: string;
    residentCityName?: string;
    /** 联系电话 */
    phoneNumber?: string;
    /** 头像 */
    avatarUrl?: string;
  }
  interface SaveUserResumeCertificateInput {
@@ -1938,6 +2027,30 @@
    releaseStatus?: FlexTaskReleaseStatusEnum;
  }
  interface UserClientSignListOutput {
    /** 所属商户 */
    enterpirseName?: string;
    /** 报名时间 */
    applyTime?: string;
    enterSignStatus?: FlexWorkerEleSignEnum;
    /** 企业签约时间 */
    enterSignTime?: string;
    hireStatus?: FlexTaskWorkerHireEnum;
    /** 录用时间 */
    hireDateTime?: string;
    userSignStatus?: FlexWorkerEleSignEnum;
    /** 灵工签约时间 */
    userSignTime?: string;
    /** 电子合同 */
    contractUrl?: string;
  }
  interface UserClientSignListOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: UserClientSignListOutput[];
  }
  interface UserData {
    id?: string;
    tenantId?: string;
@@ -2017,7 +2130,7 @@
    /** 简历认证详情Id */
    id?: string;
    /** 用户简历Id */
    userResumeId?: string;
    userId?: string;
    /** 认证类别Id */
    certificateTypeId?: string;
    /** 认证证件号默认身份证 */
packages/utils/area.ts
@@ -1,11 +1,11 @@
import { AreaType } from '@12333/constants';
export interface AreaTreeNode extends API.AreaInfo {
export interface AreaTreeNode extends API.AreaDto {
  children?: AreaTreeNode[];
}
export function formatAreaListToTree(
  areaDataList: API.AreaInfo[],
  areaDataList: API.AreaDto[],
  parentId: number,
  maxLayer = AreaType.Area
) {
@@ -23,11 +23,11 @@
  return treeNodeList;
}
export function flattenAreaTree(tree: API.AreaInfo[]) {
  let result = [] as API.AreaInfo[];
export function flattenAreaTree(tree: API.AreaDto[]) {
  let result = [] as API.AreaDto[];
  // 递归函数,用于遍历子节点
  function flatten(node: API.AreaInfo) {
  function flatten(node: API.AreaDto) {
    result.push(node);
    if (node.children && node.children.length > 0) {