zhengyiming
3 天以前 2935cf3629d1495d959381a1550cddaa500a0986
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
1个文件已添加
18个文件已修改
346 ■■■■■ 已修改文件
apps/cMiniApp/.eslintrc-auto-import.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/auto-imports.d.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/project.private.config.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/hooks/user.ts 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/pages/home/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/mine/mineCollectTask/InnerPage.vue 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/TaskCard.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/constants/apiEnum.ts 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/enterpriseEmployee.ts 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/index.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/services/apiV2/typings.d.ts 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/cMiniApp/.eslintrc-auto-import.json
@@ -109,6 +109,7 @@
    "useSwitchTab": true,
    "useTaskList": true,
    "useUser": true,
    "useUserResume": true
    "useUserResume": true,
    "useUpdateResume": true
  }
}
apps/cMiniApp/auto-imports.d.ts
@@ -91,6 +91,7 @@
  const useSlots: typeof import('vue')['useSlots']
  const useSwitchTab: typeof import('./src/hooks/router')['useSwitchTab']
  const useTemplateRef: typeof import('vue')['useTemplateRef']
  const useUpdateResume: typeof import('./src/hooks/user')['useUpdateResume']
  const useUser: typeof import('./src/hooks/user')['useUser']
  const useUserResume: typeof import('./src/hooks/user')['useUserResume']
  const watch: typeof import('vue')['watch']
@@ -203,6 +204,7 @@
    readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
    readonly useSwitchTab: UnwrapRef<typeof import('./src/hooks/router')['useSwitchTab']>
    readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
    readonly useUpdateResume: UnwrapRef<typeof import('./src/hooks/user')['useUpdateResume']>
    readonly useUser: UnwrapRef<typeof import('./src/hooks/user')['useUser']>
    readonly useUserResume: UnwrapRef<typeof import('./src/hooks/user')['useUserResume']>
    readonly watch: UnwrapRef<typeof import('vue')['watch']>
apps/cMiniApp/project.private.config.json
@@ -77,6 +77,13 @@
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                },
                {
                    "name": "",
                    "pathName": "subpackages/mine/mineCollectTask/mineCollectTask",
                    "query": "",
                    "launchMode": "default",
                    "scene": null
                }
            ]
        }
apps/cMiniApp/src/hooks/user.ts
@@ -2,7 +2,7 @@
import Taro from '@tarojs/taro';
import { object2query, LocationUtils } from '@12333/utils';
import { ParkOrHRStatus, UserCertificationFrontStatus } from '@12333/constants';
import { useQuery } from '@tanstack/vue-query';
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import { MaybeRef } from 'vue';
import { useRefeshDidShow } from '@12333/hooks/infiniteLoading';
import * as userResumeServices from '@12333/services/apiV2/userResume';
@@ -117,3 +117,24 @@
    refetch,
  };
}
export function useUpdateResume() {
  const queryClient = useQueryClient();
  const updateUserResumeCredentials = () => {
    return queryClient.invalidateQueries({
      queryKey: ['userResumeServices/getUserResumeCredentials'],
    });
  };
  const updateUserResume = () => {
    return queryClient.invalidateQueries({
      queryKey: ['userResumeServices/getUserResume'],
    });
  };
  return {
    updateUserResumeCredentials,
    updateUserResume,
  };
}
apps/cMiniApp/src/pages/home/index.vue
@@ -57,7 +57,7 @@
      :key="queryState.orderType"
    >
      <template #renderItem="{ item }">
        <TaskCard @click="goTaskDetail(item)" v-bind="item" @apply="goTaskApply(item)" />
        <TaskCard @click="goTaskDetail(item)" v-bind="item" />
      </template>
    </InfiniteLoading>
  </PageLayoutWithBg>
@@ -65,8 +65,6 @@
<script setup lang="ts">
import { useUser } from '@/hooks';
import { useUserStore } from '@/stores/modules/user';
import { RectDown, Location2 } from '@nutui/icons-vue-taro';
import Taro from '@tarojs/taro';
import { setLocationCity } from '@/utils';
import _ from 'lodash';
apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -54,6 +54,8 @@
  name: 'InnerPage',
});
const { updateUserResume } = useUpdateResume();
const eventChannel = useEventChannel();
const { dictionaryDataList: identityList } = useDictionaryDataSelect({
@@ -145,7 +147,7 @@
      Message.success('保存成功', {
        onClosed() {
          goBack();
          eventChannel.emit('updateResume', { content: true });
          updateUserResume();
        },
      });
    }
apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue
@@ -21,18 +21,9 @@
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 {
apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue
@@ -78,7 +78,7 @@
const router = Taro.useRouter();
const id = router.params?.id as string;
const isEdit = computed(() => !!id);
const queryClient = useQueryClient();
const { updateUserResumeCredentials } = useUpdateResume();
const { dictionaryDataList: certificateTypeList } = useDictionaryDataSelect({
  categoryCode: CategoryCode.CertificateType,
@@ -173,7 +173,7 @@
      Message.success(isEdit.value ? '编辑成功' : '添加成功', {
        onClosed() {
          goBack();
          queryClient.invalidateQueries(['userResumeServices/getUserResumeCredentials']);
          updateUserResumeCredentials();
        },
      });
    }
apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
@@ -125,7 +125,6 @@
import IconPhone from '@/assets/mine/icon-phone.png';
import Taro from '@tarojs/taro';
import { setOSSLink } from '@12333/utils';
import { useEvent } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
@@ -140,16 +139,15 @@
function goPage(routeName: string) {
  Taro.navigateTo({
    url: routeName,
    events: {
      updateResume(data: { content: boolean }) {
        console.log('content: ', data.content);
        if (data.content) {
          refetch({
            type: 'inactive',
          });
        }
      },
    },
    // events: {
    //   updateResume(data: { content: boolean }) {
    //     if (data.content) {
    //       refetch({
    //         type: 'inactive',
    //       });
    //     }
    //   },
    // },
  });
}
function goEditMineInfo() {
apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue
@@ -38,7 +38,7 @@
  name: 'InnerPage',
});
const { refetch: userResumeRefetch } = useUserResume();
const { updateUserResume } = useUpdateResume();
const {
  isLoading,
@@ -81,7 +81,7 @@
      Message.success('保存成功', {
        onClosed() {
          goBack();
          userResumeRefetch({ type: 'inactive' });
          updateUserResume();
        },
      });
    }
apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
@@ -48,13 +48,12 @@
import { Message } from '@12333/utils';
import { useQuery } from '@tanstack/vue-query';
import { goBack } from '@/utils';
import { useEventChannel } from 'senin-mini/hooks';
defineOptions({
  name: 'InnerPage',
});
const eventChannel = useEventChannel();
const { updateUserResume } = useUpdateResume();
const { dictionaryDataList: positionList } = useDictionaryDataSelect({
  categoryCode: CategoryCode.Position,
@@ -131,7 +130,7 @@
      Message.success('保存成功', {
        onClosed() {
          goBack();
          eventChannel.emit('updateResume', { content: true });
          updateUserResume();
        },
      });
    }
apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue
@@ -24,7 +24,7 @@
  name: 'InnerPage',
});
const { refetch: userResumeRefetch } = useUserResume();
const { updateUserResume } = useUpdateResume();
const form = reactive({
  workSeniority: '',
@@ -64,7 +64,7 @@
      Message.success('保存成功', {
        onClosed() {
          goBack();
          userResumeRefetch({ type: 'inactive' });
          updateUserResume();
        },
      });
    }
apps/cMiniApp/src/subpackages/mine/mineCollectTask/InnerPage.vue
@@ -1,14 +1,28 @@
<template>
  <div class="my-collect-task">
    <div class="my-collect-task-title">收藏任务列表</div>
    <div class="my-collect-task-btn">清空已失效任务</div>
    <div class="my-collect-task-btn" @click="clearExpiredTask">清空已失效任务</div>
  </div>
  <InfiniteLoading
    scrollViewClassName="common-infinite-scroll-list home-list"
    v-bind="infiniteLoadingProps"
  >
    <template #renderItem="{ item }">
      <TaskCard> </TaskCard>
      <TaskCard
        :name="item.name"
        :address-name="item.addressName"
        :begin-time="item.beginTime"
        :end-time="item.endTime"
        :gender-limit="item.genderLimit"
        :service-fee="item.serviceFee"
        :billing-method="item.billingMethod"
        :settlement-cycle="item.settlementCycle"
        :benefits="item.benefits"
      >
        <template #actions>
          <nut-button @click="goTaskDetail(item)" type="primary">报名</nut-button>
        </template>
      </TaskCard>
    </template>
  </InfiniteLoading>
</template>
@@ -16,34 +30,24 @@
<script setup lang="ts">
import { TaskCard } from '@12333/components';
import { useUserStore } from '@/stores/modules/user';
import { useInfiniteLoading } from '@12333/hooks';
import { OrderInputType } from '@12333/constants';
import * as flexWorkerServices from '@12333/services/api/FlexWorker';
import { useTaskList } from '@12333/hooks';
import Taro from '@tarojs/taro';
defineOptions({
  name: 'InnerPage',
});
const userStore = useUserStore();
const { infiniteLoadingProps } = useTaskList({
  defaultQueryMenuState: {},
});
const { infiniteLoadingProps } = useInfiniteLoading(
  ({ pageParam }) => {
    let params: API.GetFlexTaskListInput = {
      pageModel: {
        rows: 20,
        page: pageParam,
        orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
      },
    };
function goTaskDetail(item: API.GetTaskInfosQueryResultItem) {
  Taro.navigateTo({
    url: `${RouterPath.taskCheckDetail}?id=${item.id}`,
  });
}
    return flexWorkerServices.getFlexTaskByArrange(params, {
      showLoading: false,
    });
  },
  {
    queryKey: ['flexWorkerServices/getFlexTaskByArrange'],
  }
);
function clearExpiredTask() {}
</script>
<style lang="scss">
apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
@@ -6,6 +6,7 @@
          <img
            :src="detail.isCollected ? IconAttentioActive : IconAttention"
            class="taskDetail-attention-icon"
            @click="handleAttention"
          />
        </template>
        <div class="taskDetail-time">
@@ -100,9 +101,17 @@
        :isFlex="false"
        openType="share"
      ></PageFooterAction>
      <PageFooterAction :icon="IconPhone" text="手机" :isFlex="false"></PageFooterAction>
      <PageFooterBtn v-if="detail.releaseStatus === EnumTaskReleaseStatus.InProcess" type="primary"
        >报名({{ detail.applyCount }}人已报名)</PageFooterBtn
      <PageFooterAction
        :icon="IconPhone"
        text="手机"
        :isFlex="false"
        @click="handleCall"
      ></PageFooterAction>
      <PageFooterBtn
        v-if="detail.releaseStatus === EnumTaskReleaseStatus.InProcess"
        type="primary"
        @click="handleApply"
        >{{ `报名(${detail?.applyCount ?? 0}人已报名)` }}</PageFooterBtn
      >
      <PageFooterBtn v-if="detail.releaseStatus === EnumTaskReleaseStatus.Stopped" color="#999999"
        >已停止</PageFooterBtn
@@ -115,6 +124,7 @@
import Taro from '@tarojs/taro';
import { useQuery } from '@tanstack/vue-query';
import * as taskServices from '@12333/services/apiV2/task';
import * as taskUserServices from '@12333/services/apiV2/taskUser';
import { useToggle } from 'senin-mini/hooks';
import { TaskPrice, TaskDetailWelfareItem } from '@12333/components';
import IconAttention from '@/assets/task/icon-attention.png';
@@ -127,7 +137,7 @@
import './taskDetail.scss';
import CompanyDesc from '../components/CompanyDesc.vue';
import dayjs from 'dayjs';
import { TaskUtils, toThousand, setOSSLink } from '@12333/utils';
import { TaskUtils, toThousand, setOSSLink, Message } from '@12333/utils';
import {
  EnumSettlementCycleText,
  BillingMethodEnumUnit,
@@ -182,4 +192,48 @@
    });
  }
});
const handleApply = useAccessLogin(async () => {
  try {
    let params: API.ApplyTaskCommand = {
      ids: [taskId],
    };
    let res = await taskUserServices.applyTask(params);
    if (res) {
      Message.success('报名成功', {
        onClosed() {
          refetch({ type: 'inactive' });
        },
      });
    }
  } catch (error) {}
});
const handleAttention = useAccessLogin(async () => {
  try {
    await Message.confirm({
      message: `确定${detail.value?.isCollected ? '取消收藏' : '收藏'}吗?`,
    });
    let params: API.CollectTaskCommand = {
      ids: [taskId],
      isCollect: !detail.value?.isCollected,
    };
    let res = await taskUserServices.collectTask(params);
    if (res) {
      Message.success('操作成功', {
        onClosed() {
          refetch({ type: 'inactive' });
        },
      });
    }
  } catch (error) {}
});
const handleCall = useAccessLogin(() => {
  if (detail.value.contactPhoneNumber) {
    Taro.makePhoneCall({
      phoneNumber: detail.value.contactPhoneNumber,
    });
  }
});
</script>
packages/components/src/Card/TaskCard.vue
@@ -37,10 +37,7 @@
      </div>
      <div class="task-card-actions" v-if="showActions">
        <slot name="actions">
          <nut-button
            v-if="releaseStatus === EnumTaskReleaseStatus.InProcess"
            type="primary"
            @click.stop="emit('apply', id)"
          <nut-button v-if="releaseStatus === EnumTaskReleaseStatus.InProcess" type="primary"
            >报名</nut-button
          >
        </slot>
packages/constants/apiEnum.ts
@@ -107,6 +107,8 @@
  UserResume = 8,
  /**企业信息 */
  Enterprise = 9,
  /**灵工信息 */
  EnterpriseEmployee = 10,
}
/** 资源请求方式 */
@@ -188,14 +190,6 @@
/** 任务安排状态 */
export enum EnumTaskStatus {
  /**待安排 */
  Wait = 10,
  /**已安排 */
  Complete = 20,
}
/** 任务用户安排状态 */
export enum EnumTaskUserArrangeStatus {
  /**未安排 */
  Wait = 10,
  /**已安排 */
  Complete = 20,
packages/services/apiV2/enterpriseEmployee.ts
New file
@@ -0,0 +1,21 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 查询灵工分页列表数据 POST /api/user/enterpriseEmployee/getEnterpriseEmployees */
export async function getEnterpriseEmployees(
  body: API.GetEnterpriseEmployeesQuery,
  options?: API.RequestConfig
) {
  return request<API.GetEnterpriseEmployeesQueryResult>(
    '/api/user/enterpriseEmployee/getEnterpriseEmployees',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json-patch+json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
packages/services/apiV2/index.ts
@@ -4,6 +4,7 @@
// API 唯一标识:
import * as userResume from './userResume';
import * as resource from './resource';
import * as enterpriseEmployee from './enterpriseEmployee';
import * as user from './user';
import * as dictionary from './dictionary';
import * as auth from './auth';
@@ -15,6 +16,7 @@
export default {
  userResume,
  resource,
  enterpriseEmployee,
  user,
  dictionary,
  auth,
packages/services/apiV2/typings.d.ts
@@ -299,6 +299,8 @@
    UserResume = 8,
    /**企业信息 */
    Enterprise = 9,
    /**灵工信息 */
    EnterpriseEmployee = 10,
  }
  enum EnumResourceMethod {
@@ -371,13 +373,6 @@
  enum EnumTaskStatus {
    /**待安排 */
    Wait = 10,
    /**已安排 */
    Complete = 20,
  }
  enum EnumTaskUserArrangeStatus {
    /**未安排 */
    Wait = 10,
    /**已安排 */
    Complete = 20,
@@ -478,6 +473,24 @@
    /** 错误码 */
    errorCode?: string;
    data?: GetEnterpriseElectronSignSettingQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetEnterpriseEmployeesQueryResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetEnterpriseEmployeesQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -1208,6 +1221,58 @@
    mergeSignCost?: number;
  }
  interface GetEnterpriseEmployeesQuery {
    /** 关键字(姓名/手机/身份证号) */
    keywords?: string;
    /** 登记时间-最早时间 */
    createdTimeStart?: string;
    /** 登记时间-最晚时间 */
    createdTimeEnd?: string;
    /** 签约时间-最早时间 */
    signContractTimeStart?: string;
    /** 签约时间-最晚时间 */
    signContractTimeEnd?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 是否实名 */
    isReal?: boolean;
    userSignContractStatus?: EnumTaskUserSignContractStatus;
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetEnterpriseEmployeesQueryResult {
    pageModel?: PagedListQueryResultPageModel;
    /** 数据 */
    data?: GetEnterpriseEmployeesQueryResultItem[];
  }
  interface GetEnterpriseEmployeesQueryResultItem {
    /** 灵工Id */
    id?: string;
    /** 姓名 */
    name?: string;
    /** 身份证号 */
    identity?: string;
    gender?: EnumUserGender;
    /** 年龄 */
    age?: number;
    /** 手机号 */
    phoneNumber?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 实名状态 */
    userIsReal?: boolean;
    userSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 录用时间 */
    hireTime?: string;
    /** 实名时间 */
    userRealTime?: string;
    /** 签约时间 */
    userSignContractTime?: string;
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 企业签约时间 */
    enterpriseSignContractTime?: string;
  }
  interface GetEnterpriseQueryResult {
    /** Id */
    id?: string;
@@ -1860,22 +1925,6 @@
    photos?: string[];
    /** 经历 */
    taskInfoUsers?: GetUserResumeQueryResultExperience[];
    /** 报名时间 */
    createdTime?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 录用时间 */
    hireTime?: string;
    arrangeStatus?: EnumTaskUserArrangeStatus;
    /** 安排状态 */
    arrangeTime?: string;
    userSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 灵工签约时间 */
    userSignContractTime?: string;
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 企业签约时间 */
    enterpriseSignContractTime?: string;
    /** 电子合同 */
    contractUrl?: string;
  }
  interface GetUserResumeQueryResultCredential {
@@ -1972,18 +2021,6 @@
    workSeniority?: string;
    /** 工作经验 */
    workExperience?: string;
    hireStatus?: EnumTaskUserHireStatus;
    /** 录用时间 */
    hireTime?: string;
    arrangeStatus?: EnumTaskUserArrangeStatus;
    /** 安排状态 */
    arrangeTime?: string;
    userSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 灵工签约时间 */
    userSignContractTime?: string;
    enterpriseSignContractStatus?: EnumTaskUserSignContractStatus;
    /** 企业签约时间 */
    enterpriseSignContractTime?: string;
  }
  type GetUserResumeWorkExperienceQuery = Record<string, any>;