zhengyiming
4 天以前 b617603a5e9a4f86e47bb3df67e1cd0c9beb2ba1
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
1个文件已添加
16个文件已修改
463 ■■■■■ 已修改文件
apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/mine/index.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/task/InnerPage.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/area.ts 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/hooks/task.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/taskUser.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/utils/area.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
@@ -1,7 +1,7 @@
<template>
  <Calendar v-model="queryMenuState.time"></Calendar>
  <ProTabs
    v-model="queryMenuState.status"
    v-model="queryMenuState.checkReceiveStatus"
    name="task-tab"
    :showPaneContent="false"
    class="task-tabs"
@@ -9,14 +9,14 @@
    title-gutter="8"
    title-scroll
  >
    <ProTabPane title="待提交" pane-key="10"></ProTabPane>
    <ProTabPane title="待验收" pane-key="10"></ProTabPane>
    <ProTabPane title="已验收" pane-key="20"></ProTabPane>
    <ProTabPane :title="`待提交`" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
    <ProTabPane :title="`待验收`" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
    <ProTabPane :title="`已验收`" :pane-key="EnumTaskCheckReceiveStatus.Completed"></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list"
    v-bind="infiniteLoadingProps"
    :key="queryMenuState.status"
    :key="queryMenuState.checkReceiveStatus"
  >
    <template #renderItem="{ item }">
      <MyTaskCard
@@ -33,6 +33,7 @@
<script setup lang="ts">
import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components';
import Taro from '@tarojs/taro';
import { EnumTaskCheckReceiveStatus } from '@12333/constants';
import { useTaskList } from '@12333/hooks';
defineOptions({
@@ -41,7 +42,7 @@
const { queryMenuState, infiniteLoadingProps } = useTaskList({
  defaultQueryMenuState: {
    status: EnumTaskStatus.Wait,
    checkReceiveStatus: EnumTaskCheckReceiveStatus.Wait,
  },
});
apps/cMiniApp/project.private.config.json
@@ -77,13 +77,6 @@
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "subpackages/curriculum/mineCertificate/mineCertificate",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                }
            ]
        }
apps/cMiniApp/src/pages/mine/index.vue
@@ -16,7 +16,7 @@
          <div class="mine-avatar-wrapper" @click="goLogin">
            <UserAvatar :size="52" class="mine-avatar" />
            <div class="user-info" v-if="isLogin">
              <div class="user-info-item">{{ userDetail?.userName ?? '' }}</div>
              <div class="user-info-item">{{ detail?.name ?? '' }}</div>
              <!-- <div class="user-info-auth">
                <div class="user-info-auth-item">
                  <div class="user-info-unCertified" v-if="isCertified">
@@ -64,15 +64,30 @@
          <img :src="IconArrow" class="mine-order-list-title-icon" />
        </div>
        <div class="mine-order-list-content">
          <nut-badge class="mine-order-list-item" top="8" :value="8" @click="goMineSign">
          <nut-badge
            class="mine-order-list-item"
            top="8"
            :value="detail?.taskCount ?? 0"
            @click="goMineSign"
          >
            <img :src="IconOrderSign" class="mine-order-list-icon" />
            <div class="mine-order-list-text">我的报名</div>
          </nut-badge>
          <nut-badge class="mine-order-list-item" top="8" :value="8" @click="goMineHire">
          <nut-badge
            class="mine-order-list-item"
            top="8"
            :value="detail?.hirePassTaskCount ?? 0"
            @click="goMineHire"
          >
            <img :src="IconOrderHire" class="mine-order-list-icon" />
            <div class="mine-order-list-text">已录用</div>
          </nut-badge>
          <nut-badge class="mine-order-list-item" top="8" :value="8" @click="goMineCancel">
          <nut-badge
            class="mine-order-list-item"
            top="8"
            :value="detail?.hireRefuseTaskCount ?? 0"
            @click="goMineCancel"
          >
            <img :src="IconOrderCancel" class="mine-order-list-icon" />
            <div class="mine-order-list-text">已取消</div>
          </nut-badge>
@@ -106,6 +121,8 @@
import { useSystemStore } from '@/stores/modules/system';
import PageLayoutWithBg from '@/components/Layout/PageLayoutWithBg.vue';
import { toThousand } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
import * as authServices from '@12333/services/apiV2/auth';
const { userDetail, isCertified } = useUser();
const isLogin = useIsLogin();
@@ -114,6 +131,24 @@
const { goLoginFn } = useGoLogin();
const bgHeight = computed(() => 133 + systemStore.navHeight);
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['authServices/getPersonalLoginInfo'],
  queryFn: async () => {
    return await authServices.getPersonalLoginInfo(
      {},
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.GetPersonalLoginInfoQueryResult),
});
function goLogin() {
  if (!isLogin.value) {
    goLoginFn();
apps/cMiniApp/src/pages/task/InnerPage.vue
@@ -1,7 +1,7 @@
<template>
  <Calendar v-model="queryState.date"></Calendar>
  <Calendar v-model="queryMenuState.time"></Calendar>
  <ProTabs
    v-model="queryState.status"
    v-model="queryMenuState.checkReceiveStatus"
    name="task-tab"
    :showPaneContent="false"
    class="task-tabs"
@@ -9,16 +9,23 @@
    title-gutter="8"
    title-scroll
  >
    <ProTabPane :title="`待提交`" :pane-key="10"></ProTabPane>
    <ProTabPane :title="`待验收`" :pane-key="20"></ProTabPane>
    <ProTabPane :title="`待提交`" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
    <ProTabPane :title="`待验收`" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
    <ProTabPane :title="`已验收`" :pane-key="EnumTaskCheckReceiveStatus.Completed"></ProTabPane>
  </ProTabs>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list task-list"
    v-bind="infiniteLoadingProps"
    :key="queryState.status"
    :key="queryMenuState.checkReceiveStatus"
  >
    <template #renderItem="{ item }">
      <MyTaskCard @click="goSubmitTaskDetail(item)" />
      <MyTaskCard
        :name="item.name"
        :addressName="item.addressName"
        :begin-time="item.beginTime"
        :end-time="item.endTime"
        @click="goSubmitTaskDetail(item)"
      />
    </template>
  </InfiniteLoading>
</template>
@@ -26,44 +33,22 @@
<script setup lang="ts">
import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components';
import Taro from '@tarojs/taro';
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { useTaskList } from '@12333/hooks';
import { EnumTaskCheckReceiveStatus } from '@12333/constants';
defineOptions({
  name: 'InnerPage',
});
const queryState = reactive({
  status: 10,
  date: new Date(),
const { queryMenuState, infiniteLoadingProps } = useTaskList({
  defaultQueryMenuState: {
    checkReceiveStatus: EnumTaskCheckReceiveStatus.Wait,
  },
});
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetFlexTaskListInput = {
      pageModel: {
        rows: 20,
        page: pageParam,
        orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }],
      },
    };
    return flexWorkerServices.getFlexTaskByArrange(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskByArrange', queryState],
  }
);
function goSubmitTaskDetail(item: API.GetFlexTaskListOutput) {
  //   Taro.navigateTo({
  //     url: `${RouterPath.taskSubmitCheck}?id=${item.id}`,
  //   });
function goSubmitTaskDetail(item: API.GetTaskInfosQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskCheckDetail}?id=${item.taskId}`,
    url: `${RouterPath.taskCheckDetail}?id=${item.id}`,
  });
}
</script>
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -26,7 +26,7 @@
      </nut-form-item>
      <nut-form-item label="常驻城市:" class="bole-form-item" prop="areaList">
        <ChooseInputWithAreaPicker
          :columns="completeAreaTree"
          :columns="areaTree"
          v-model="form.areaList"
          placeholder="请选择常驻城市"
        ></ChooseInputWithAreaPicker>
@@ -42,7 +42,7 @@
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { ChooseInputWithPicker, ChooseInputWithAreaPicker } from '@12333/components';
import { convertApi2FormUrlOnlyOne, Message, setOSSLink } from '@12333/utils';
import { useArea, useDictionaryDataSelect } from '@12333/hooks';
import { useAreaTree, useDictionaryDataSelect } from '@12333/hooks';
import { CategoryCode } from '@12333/constants';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import Taro from '@tarojs/taro';
@@ -60,7 +60,7 @@
  categoryCode: CategoryCode.Education,
});
const { completeAreaTree } = useArea();
const { areaTree } = useAreaTree();
const form = reactive({
  avatar: [],
apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue
@@ -21,11 +21,20 @@
import { RouterPath } from '@/constants';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import { useQuery } from '@tanstack/vue-query';
import { useEvent } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
});
useEvent('updateResume', function (data: { content: boolean }) {
  if (data.content) {
    refetch({
      type: 'inactive',
    });
  }
});
const {
  isLoading,
  isError,
apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue
@@ -1,22 +1,22 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef" :rules="rules">
      <nut-form-item label="证书类型:" class="bole-form-item" prop="type">
      <nut-form-item label="证书类型:" class="bole-form-item" prop="typeCode">
        <ChooseInputWithPicker
          v-model="form.type"
          v-model="form.typeCode"
          placeholder="请选择证书类型"
          :value-enum="TaskStatusText"
          :value-enum="certificateTypeList"
        />
      </nut-form-item>
      <nut-form-item label="证书编号:" class="bole-form-item" prop="certificateNumber">
        <nut-input v-model="form.certificateNumber" type="number" placeholder="请输入"> </nut-input>
      <nut-form-item label="证书编号:" class="bole-form-item" prop="code">
        <nut-input v-model="form.code" type="number" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <nut-form-item
        label="永久证书:"
        class="bole-form-item permanent-certificate"
        prop="isPermanentCertificate"
        prop="isForever"
      >
        <nut-switch v-model="form.isPermanentCertificate" />
        <nut-switch v-model="form.isForever" />
      </nut-form-item>
      <nut-form-item label="开始日期:" class="bole-form-item" prop="startDate">
        <ChooseInputWithDatePicker v-model="form.startDate"></ChooseInputWithDatePicker>
@@ -24,26 +24,26 @@
      <nut-form-item label="结束日期:" class="bole-form-item" prop="endDate">
        <ChooseInputWithDatePicker v-model="form.endDate"></ChooseInputWithDatePicker>
      </nut-form-item>
      <nut-form-item label="发证单位:" class="bole-form-item" prop="certificateNumber">
        <nut-input v-model="form.certificateNumber" placeholder="请输入"> </nut-input>
      <nut-form-item label="发证单位:" class="bole-form-item" prop="issueUnit">
        <nut-input v-model="form.issueUnit" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <div class="certificate-upload">
        <div class="certificate-upload-title">上传证书</div>
        <nut-form-item
          label="证书正面照片(请确保证书号、头像照片等清晰可见)"
          class="bole-form-item"
          prop="photo"
          prop="img"
          label-position="top"
        >
          <Uploader v-model:file-list="form.photo" :maximum="1" class="bole-uploader"> </Uploader>
          <Uploader v-model:file-list="form.img" :maximum="1" class="bole-uploader"> </Uploader>
        </nut-form-item>
        <nut-form-item
          label="证书反面照片(或其他有内容页)"
          class="bole-form-item"
          prop="photo"
          prop="backImg"
          label-position="top"
        >
          <Uploader v-model:file-list="form.photo" :maximum="1" class="bole-uploader"> </Uploader>
          <Uploader v-model:file-list="form.backImg" :maximum="1" class="bole-uploader"> </Uploader>
        </nut-form-item>
      </div>
    </nut-form>
@@ -54,13 +54,16 @@
</template>
<script setup lang="ts">
import { useUser } from '@/hooks';
import { ChooseInputWithPicker, ChooseInputWithDatePicker } from '@12333/components';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import { TaskStatusText, TaskStatus } from '@/constants';
import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
import { useQuery } from '@tanstack/vue-query';
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import Taro from '@tarojs/taro';
import { useDictionaryDataSelect } from '@12333/hooks';
import { CategoryCode } from '@12333/constants';
import { convertApi2FormUrlOnlyOne, Message, setOSSLink, FormValidator } from '@12333/utils';
import dayjs from 'dayjs';
import { goBack } from '@/utils';
defineOptions({
  name: 'InnerPage',
@@ -69,14 +72,21 @@
const router = Taro.useRouter();
const id = router.params?.id as string;
const isEdit = computed(() => !!id);
const queryClient = useQueryClient();
const { dictionaryDataList: certificateTypeList } = useDictionaryDataSelect({
  categoryCode: CategoryCode.CertificateType,
});
const form = reactive({
  type: TaskStatus.All,
  certificateNumber: '',
  typeCode: '',
  code: '',
  startDate: '',
  endDate: '',
  isPermanentCertificate: false,
  photo: [],
  issueUnit: '',
  isForever: false,
  img: [],
  backImg: [],
});
const {
@@ -95,14 +105,37 @@
    );
  },
  placeholderData: () => ({} as API.GetUserResumeCredentialQueryResult),
  enabled: isEdit.value,
  enabled: computed(() => isEdit.value),
  onSuccess(data) {
    form.typeCode = data.typeCode;
    form.code = data.code;
    form.startDate = dayjs(data.startDate).format('YYYY-MM-DD 00:00:00');
    form.endDate = dayjs(data.endDate).format('YYYY-MM-DD 23:59:59');
    form.issueUnit = data.issueUnit;
    form.isForever = data.isForever;
    form.img = convertApi2FormUrlOnlyOne(setOSSLink(data.img));
    form.backImg = convertApi2FormUrlOnlyOne(setOSSLink(data.backImg));
  },
});
const rules = reactive<FormRules>({
  type: [{ required: true, message: '请输入手机号' }],
  typeCode: [{ required: true, message: '请选择证书类型' }],
  startDate: [{ required: true, message: '请选择开始日期' }],
  endDate: [{ required: true, message: '请选择结束日期' }],
  photo: [{ required: true, message: '请上传证书正面照' }],
  endDate: [
    {
      required: true,
      message: '请选择结束日期',
      validator(value) {
        if (!value) return Promise.reject('请选择结束日期');
        if (value <= form.startDate) return Promise.reject('结束日期不能小于开始日期');
        return Promise.resolve(true);
      },
    },
  ],
  img: [{ required: true, message: '请上传证书正面照', validator: FormValidator.validatorArray }],
  backImg: [
    { required: true, message: '请上传证书反面照', validator: FormValidator.validatorArray },
  ],
});
const formRef = ref<any>(null);
function handleConfirm() {
@@ -114,7 +147,32 @@
  });
}
function confirm() {}
async function confirm() {
  try {
    let params: API.SaveUserResumeCredentialCommand = {
      typeCode: form.typeCode,
      code: form.code,
      isForever: form.isForever,
      startDate: dayjs(form.startDate).format('YYYY-MM-DD 00:00:00'),
      endDate: dayjs(form.endDate).format('YYYY-MM-DD 23:59:59'),
      issueUnit: form.issueUnit,
      img: form.img[0]?.path,
      backImg: form.backImg[0]?.path,
    };
    if (isEdit.value) {
      params.id = id;
    }
    let res = await userResumeServices.saveUserResumeCredential(params);
    if (res) {
      Message.success(isEdit ? '编辑成功' : '添加成功', {
        onClosed() {
          goBack();
          queryClient.invalidateQueries(['userResumeServices/getUserResumeCredentials']);
        },
      });
    }
  } catch (error) {}
}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue
@@ -17,8 +17,7 @@
        prop="photo"
        label-position="top"
      >
        <Uploader v-model:file-list="form.lifeCircleImgUrlList" :maximum="6" class="bole-uploader">
        </Uploader>
        <Uploader v-model:file-list="form.photos" :maximum="6" class="bole-uploader"> </Uploader>
      </nut-form-item>
    </nut-form>
  </ContentScrollView>
@@ -30,7 +29,7 @@
<script setup lang="ts">
import { goBack } from '@/utils';
import { NumberInput } from '@12333/components';
import * as userResumeServices from '@12333/services/api/userResume';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import { convertApiPath2Url, Message } from '@12333/utils';
import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
import { useQuery } from '@tanstack/vue-query';
@@ -39,48 +38,50 @@
  name: 'InnerPage',
});
const { refetch: userResumeRefetch } = useUserResume();
const {
  isLoading,
  isError,
  data: detail,
  refetch,
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeDetailInfo'],
  queryKey: ['userResumeServices/getUserResumeDetail'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeDetailInfo({
      showLoading: false,
    });
    return await userResumeServices.getUserResumeDetail(
      {},
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.UserResumeDetailInfoOutput),
  placeholderData: () => ({} as API.GetUserResumeDetailQueryResult),
  onSuccess(data) {
    form.height = data.height;
    form.weight = data.weight;
    form.lifeCircleImgUrlList = data.lifeCircleImgUrlList?.length
      ? data.lifeCircleImgUrlList.map((x) => convertApiPath2Url(x))
      : [];
    form.photos = data.photos?.length ? data.photos.map((x) => convertApiPath2Url(x)) : [];
  },
});
const form = reactive({
  height: '',
  weight: '',
  lifeCircleImgUrlList: [] as FileItem[],
  height: 0,
  weight: 0,
  photos: [] as FileItem[],
});
async function handleConfirm() {
  try {
    let params: API.SaveUserResumeDetailInfoInput = {
    let params: API.SaveUserResumeDetailCommand = {
      weight: form.weight,
      height: form.weight,
      lifeCircleImgUrlList: form.lifeCircleImgUrlList?.length
        ? form.lifeCircleImgUrlList.map((x) => x.url)
        : [],
      photos: form.photos?.length ? form.photos.map((x) => x.path) : [],
    };
    let res = await userResumeServices.saveUserResumeDetailInfo(params);
    let res = await userResumeServices.saveUserResumeDetail(params);
    if (res) {
      Message.success('保存成功', {
        onClosed() {
          goBack();
          userResumeRefetch({ type: 'inactive' });
        },
      });
    }
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
@@ -147,7 +147,6 @@
      },
    },
    success: function (res) {
      console.log('res: ', res);
      res.eventChannel.emit('updatePosition', { content: form.userExpectJobs });
    },
  });
apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue
@@ -1,8 +1,8 @@
<template>
  <ContentScrollView :paddingH="false">
    <nut-form :model-value="form" ref="formRef">
      <nut-form-item label="工作年限:" class="bole-form-item" prop="workingSeniority">
        <nut-input v-model="form.workingSeniority" placeholder="请输入"> </nut-input>
      <nut-form-item label="工作年限:" class="bole-form-item" prop="workSeniority">
        <nut-input v-model="form.workSeniority" placeholder="请输入"> </nut-input>
      </nut-form-item>
      <nut-form-item label="工作经验:" class="bole-form-item" prop="workExperience">
        <nut-input v-model="form.workExperience" type="textarea" placeholder="请输入"> </nut-input>
@@ -16,7 +16,7 @@
<script setup lang="ts">
import { goBack } from '@/utils';
import * as userResumeServices from '@12333/services/api/userResume';
import * as userResumeServices from '@12333/services/apiV2/userResume';
import { Message } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
@@ -24,8 +24,10 @@
  name: 'InnerPage',
});
const { refetch: userResumeRefetch } = useUserResume();
const form = reactive({
  workingSeniority: '',
  workSeniority: '',
  workExperience: '',
});
@@ -37,21 +39,24 @@
} = useQuery({
  queryKey: ['userResumeServices/getUserResumeWorkExperience'],
  queryFn: async () => {
    return await userResumeServices.getUserResumeWorkExperience({
      showLoading: false,
    });
    return await userResumeServices.getUserResumeWorkExperience(
      {},
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.UserResumeWorkExperienceOutput),
  placeholderData: () => ({} as API.GetUserResumeWorkExperienceQueryResult),
  onSuccess(data) {
    form.workingSeniority = data.workingSeniority;
    form.workSeniority = data.workSeniority;
    form.workExperience = data.workExperience;
  },
});
async function handleConfirm() {
  try {
    let params: API.SaveUserResumeWorkExperienceInput = {
      workingSeniority: form.workingSeniority,
    let params: API.SaveUserResumeWorkExperienceCommand = {
      workSeniority: form.workSeniority,
      workExperience: form.workExperience,
    };
    let res = await userResumeServices.saveUserResumeWorkExperience(params);
@@ -59,6 +64,7 @@
      Message.success('保存成功', {
        onClosed() {
          goBack();
          userResumeRefetch({ type: 'inactive' });
        },
      });
    }
packages/constants/apiEnum.ts
@@ -91,20 +91,22 @@
  Dictionary = 0,
  /**任务 */
  Task = 1,
  /**任务雇佣 */
  TaskUser = 2,
  /**用户认证 */
  Auth = 2,
  Auth = 3,
  /**用户菜单 */
  Menu = 3,
  Menu = 4,
  /**用户资源 */
  Resource = 4,
  Resource = 5,
  /**用户角色 */
  Role = 5,
  Role = 6,
  /**用户信息 */
  User = 6,
  User = 7,
  /**用户简历 */
  UserResume = 7,
  UserResume = 8,
  /**企业信息 */
  Enterprise = 8,
  Enterprise = 9,
}
/** 资源请求方式 */
@@ -191,6 +193,16 @@
  Complete = 20,
}
/** 任务录用状态 */
export enum EnumTaskUserHireStatus {
  /**待录用 */
  Wait = 10,
  /**已录用 */
  Pass = 20,
  /**已谢绝 */
  Refuse = 30,
}
/** 用户性别 */
export enum EnumUserGender {
  /**男 */
packages/hooks/area.ts
@@ -4,6 +4,7 @@
import { AreaType, CategoryCode } from '@12333/constants';
import Taro, { EventChannel } from '@tarojs/taro';
import { useDictionaryDataSelect } from './dic';
import axios from 'axios';
export function useArea() {
  const queryClient = useQueryClient();
@@ -12,13 +13,12 @@
    categoryCode: CategoryCode.Area,
    staleTime: Infinity,
    all: true,
    maxDeep: AreaType.City,
    maxDeep: AreaType.Area,
  });
  const areaList = computed(() => dictionaryDataList.value.map(convertDictionaryToAreaTreeNode));
  console.log('areaList: ', areaList);
  const areaTree = computed(() => formatAreaListToTree(areaList.value));
  // const areaTree = computed(() => formatAreaListToTree(areaList.value));
  function getAreaFromCompleteAreaList(areaCode: string) {
    return areaList.value.find((x) => x.areaCode === areaCode);
@@ -31,20 +31,41 @@
  return {
    completeAreaList: areaList,
    areaList,
    completeAreaTree: areaTree,
    provinceList: computed(() => areaList.value.filter((x) => x.layer === AreaType.Province)),
    // completeAreaTree: areaTree,
    // provinceList: computed(() => areaList.value.filter((x) => x.layer === AreaType.Province)),
    getAreaFromCompleteAreaList,
    getAreaByAreaCode,
  };
}
export function useAreaTree() {
  axios.get('https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/area.txt').then((res) => {
    console.log(res);
  });
  const { data } = useQuery({
    queryKey: ['area.txt'],
    queryFn() {
      return axios
        .get<API.AreaTreeNode[]>(
          'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/area.txt'
        )
        .then((res) => res.data);
    },
    placeholderData: () => [] as API.AreaTreeNode[],
  });
  const areaTree = computed(() => formatAreaListToTree(data.value));
  return { areaTree: areaTree };
}
function convertDictionaryToAreaTreeNode(
  item: API.SelectOptionStringGetDictionaryDataSelectQueryResultOption
) {
  return {
    children: [],
    areaCode: item.data?.code,
    parentCode: item.data?.field1,
    parentCode: item.data?.parentCode,
    areaName: item.label,
    layer: Number(item.data?.field4),
    quickQuery: item.data?.field2,
@@ -79,13 +100,13 @@
  };
}
export function useProvinceList() {
  const { provinceList } = useArea();
// export function useProvinceList() {
//   const { provinceList } = useArea();
  return {
    provinceList,
  };
}
//   return {
//     provinceList,
//   };
// }
export const globalEventEmitter = new Taro.Events();
packages/hooks/task.ts
@@ -2,6 +2,7 @@
import {
  EnumPagedListOrder,
  EnumSettlementCycle,
  EnumTaskCheckReceiveStatus,
  EnumTaskRecommendStatus,
  EnumTaskReleaseStatus,
  EnumTaskStatus,
@@ -27,6 +28,7 @@
    status?: EnumTaskStatus;
    genderLimit?: EnumUserGender;
    settlementCycle?: EnumSettlementCycle;
    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
    benefitCodes?: string;
    enterpriseId?: string;
    time?: Date;
@@ -44,6 +46,7 @@
    benefitCodes: '',
    status: '' as any as EnumTaskStatus,
    releaseStatus: EnumTaskReleaseStatus.InProcess,
    checkReceiveStatus: '' as any as EnumTaskCheckReceiveStatus,
    enterpriseId: '',
    time: '' as any as Date,
    ...defaultQueryMenuState,
@@ -77,6 +80,7 @@
        genderLimit: queryMenuState.genderLimit,
        status: queryMenuState.status,
        releaseStatus: queryMenuState.releaseStatus,
        checkReceiveStatus: queryMenuState.checkReceiveStatus,
        enterpriseId: queryMenuState.enterpriseId,
        beginTime: queryMenuState.time
          ? dayjs(queryMenuState.time).format('YYYY-MM-DD 00:00:00')
packages/services/apiV2/index.ts
@@ -10,6 +10,7 @@
import * as task from './task';
import * as enterprise from './enterprise';
import * as role from './role';
import * as taskUser from './taskUser';
import * as menu from './menu';
export default {
  userResume,
@@ -20,5 +21,6 @@
  task,
  enterprise,
  role,
  taskUser,
  menu,
};
packages/services/apiV2/taskUser.ts
New file
@@ -0,0 +1,27 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 报名任务 POST /api/flexjob/taskUser/applyTask */
export async function applyTask(body: API.ApplyTaskCommand, options?: API.RequestConfig) {
  return request<number>('/api/flexjob/taskUser/applyTask', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 收藏任务 POST /api/flexjob/taskUser/collectTask */
export async function collectTask(body: API.CollectTaskCommand, options?: API.RequestConfig) {
  return request<number>('/api/flexjob/taskUser/collectTask', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
packages/services/apiV2/typings.d.ts
@@ -145,6 +145,11 @@
    request?: GetUserResumeWorkExperienceQuery;
  }
  interface ApplyTaskCommand {
    /** 任务Id */
    ids?: string[];
  }
  interface BindWxmpUserInfoCommand {
    /** 包括敏感数据在内的完整用户信息的加密数据 */
    encryptedData: string;
@@ -159,6 +164,13 @@
    phoneNumber: string;
    /** 验证码 */
    verifyCode: string;
  }
  interface CollectTaskCommand {
    /** 任务Id */
    ids?: string[];
    /** 是否收藏 */
    isCollect?: boolean;
  }
  interface DeleteDictionaryCategoryCommand {
@@ -262,20 +274,22 @@
    Dictionary = 0,
    /**任务 */
    Task = 1,
    /**任务雇佣 */
    TaskUser = 2,
    /**用户认证 */
    Auth = 2,
    Auth = 3,
    /**用户菜单 */
    Menu = 3,
    Menu = 4,
    /**用户资源 */
    Resource = 4,
    Resource = 5,
    /**用户角色 */
    Role = 5,
    Role = 6,
    /**用户信息 */
    User = 6,
    User = 7,
    /**用户简历 */
    UserResume = 7,
    UserResume = 8,
    /**企业信息 */
    Enterprise = 8,
    Enterprise = 9,
  }
  enum EnumResourceMethod {
@@ -351,6 +365,15 @@
    Wait = 10,
    /**已安排 */
    Complete = 20,
  }
  enum EnumTaskUserHireStatus {
    /**待录用 */
    Wait = 10,
    /**已录用 */
    Pass = 20,
    /**已谢绝 */
    Refuse = 30,
  }
  enum EnumUserGender {
@@ -1481,6 +1504,8 @@
    releaseStatus?: EnumTaskReleaseStatus;
    recommendStatus?: EnumTaskRecommendStatus;
    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
    /** 录用状态 */
    hireStatus?: EnumTaskUserHireStatus[];
    pageModel?: PagedListQueryPageModel;
  }
@@ -1536,6 +1561,7 @@
    recommendStatus?: EnumTaskRecommendStatus;
    /** 创建时间 */
    createdTime?: string;
    hireStatus?: EnumTaskUserHireStatus;
  }
  interface GetTaskInfosQueryResultObjectData {
packages/utils/area.ts
@@ -2,7 +2,7 @@
export function formatAreaListToTree(
  areaDataList: API.AreaTreeNode[],
  parentId = '',
  parentId = null,
  maxLayer = AreaType.Area
) {
  const treeNodeList: API.AreaTreeNode[] = [];
@@ -11,7 +11,9 @@
      const areaTreeNode: API.AreaTreeNode = { ...areaData };
      if (areaData.parentCode === parentId && areaData.layer <= maxLayer) {
        const children = formatAreaListToTree(areaDataList, areaData.areaCode, maxLayer);
        areaTreeNode.children = children;
        if (children.length > 0) {
          areaTreeNode.children = children;
        }
        treeNodeList.push(areaTreeNode);
      }
    });