Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp
| | |
| | | <template> |
| | | <Calendar v-model="queryMenuState.time"></Calendar> |
| | | <ProTabs |
| | | v-model="queryMenuState.status" |
| | | v-model="queryMenuState.checkReceiveStatus" |
| | | name="task-tab" |
| | | :showPaneContent="false" |
| | | class="task-tabs" |
| | |
| | | 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 |
| | |
| | | <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({ |
| | |
| | | |
| | | const { queryMenuState, infiniteLoadingProps } = useTaskList({ |
| | | defaultQueryMenuState: { |
| | | status: EnumTaskStatus.Wait, |
| | | checkReceiveStatus: EnumTaskCheckReceiveStatus.Wait, |
| | | }, |
| | | }); |
| | | |
| | |
| | | "query": "", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "", |
| | | "pathName": "subpackages/curriculum/mineCertificate/mineCertificate", |
| | | "query": "", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | } |
| | | ] |
| | | } |
| | |
| | | <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"> |
| | |
| | | <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> |
| | |
| | | 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(); |
| | |
| | | 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(); |
| | |
| | | <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" |
| | |
| | | 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> |
| | |
| | | <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> |
| | |
| | | </nut-form-item> |
| | | <nut-form-item label="常驻城市:" class="bole-form-item" prop="areaList"> |
| | | <ChooseInputWithAreaPicker |
| | | :columns="completeAreaTree" |
| | | :columns="areaTree" |
| | | v-model="form.areaList" |
| | | placeholder="请选择常驻城市" |
| | | ></ChooseInputWithAreaPicker> |
| | |
| | | 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'; |
| | |
| | | categoryCode: CategoryCode.Education, |
| | | }); |
| | | |
| | | const { completeAreaTree } = useArea(); |
| | | const { areaTree } = useAreaTree(); |
| | | |
| | | const form = reactive({ |
| | | avatar: [], |
| | |
| | | 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, |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | </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', |
| | |
| | | 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 { |
| | |
| | | ); |
| | | }, |
| | | 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() { |
| | |
| | | }); |
| | | } |
| | | |
| | | 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"> |
| | |
| | | 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> |
| | |
| | | <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'; |
| | |
| | | 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' }); |
| | | }, |
| | | }); |
| | | } |
| | |
| | | }, |
| | | }, |
| | | success: function (res) { |
| | | console.log('res: ', res); |
| | | res.eventChannel.emit('updatePosition', { content: form.userExpectJobs }); |
| | | }, |
| | | }); |
| | |
| | | <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> |
| | |
| | | |
| | | <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'; |
| | | |
| | |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const { refetch: userResumeRefetch } = useUserResume(); |
| | | |
| | | const form = reactive({ |
| | | workingSeniority: '', |
| | | workSeniority: '', |
| | | workExperience: '', |
| | | }); |
| | | |
| | |
| | | } = 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); |
| | |
| | | Message.success('保存成功', { |
| | | onClosed() { |
| | | goBack(); |
| | | userResumeRefetch({ type: 'inactive' }); |
| | | }, |
| | | }); |
| | | } |
| | |
| | | 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, |
| | | } |
| | | |
| | | /** 资源请求方式 */ |
| | |
| | | Complete = 20, |
| | | } |
| | | |
| | | /** 任务录用状态 */ |
| | | export enum EnumTaskUserHireStatus { |
| | | /**待录用 */ |
| | | Wait = 10, |
| | | /**已录用 */ |
| | | Pass = 20, |
| | | /**已谢绝 */ |
| | | Refuse = 30, |
| | | } |
| | | |
| | | /** 用户性别 */ |
| | | export enum EnumUserGender { |
| | | /**男 */ |
| | |
| | | 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(); |
| | |
| | | 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); |
| | |
| | | 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, |
| | |
| | | }; |
| | | } |
| | | |
| | | export function useProvinceList() { |
| | | const { provinceList } = useArea(); |
| | | // export function useProvinceList() { |
| | | // const { provinceList } = useArea(); |
| | | |
| | | return { |
| | | provinceList, |
| | | }; |
| | | } |
| | | // return { |
| | | // provinceList, |
| | | // }; |
| | | // } |
| | | |
| | | export const globalEventEmitter = new Taro.Events(); |
| | | |
| | |
| | | import { |
| | | EnumPagedListOrder, |
| | | EnumSettlementCycle, |
| | | EnumTaskCheckReceiveStatus, |
| | | EnumTaskRecommendStatus, |
| | | EnumTaskReleaseStatus, |
| | | EnumTaskStatus, |
| | |
| | | status?: EnumTaskStatus; |
| | | genderLimit?: EnumUserGender; |
| | | settlementCycle?: EnumSettlementCycle; |
| | | checkReceiveStatus?: EnumTaskCheckReceiveStatus; |
| | | benefitCodes?: string; |
| | | enterpriseId?: string; |
| | | time?: Date; |
| | |
| | | benefitCodes: '', |
| | | status: '' as any as EnumTaskStatus, |
| | | releaseStatus: EnumTaskReleaseStatus.InProcess, |
| | | checkReceiveStatus: '' as any as EnumTaskCheckReceiveStatus, |
| | | enterpriseId: '', |
| | | time: '' as any as Date, |
| | | ...defaultQueryMenuState, |
| | |
| | | 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') |
| | |
| | | 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, |
| | |
| | | task, |
| | | enterprise, |
| | | role, |
| | | taskUser, |
| | | menu, |
| | | }; |
New file |
| | |
| | | /* 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 || {}), |
| | | }); |
| | | } |
| | |
| | | request?: GetUserResumeWorkExperienceQuery; |
| | | } |
| | | |
| | | interface ApplyTaskCommand { |
| | | /** 任务Id */ |
| | | ids?: string[]; |
| | | } |
| | | |
| | | interface BindWxmpUserInfoCommand { |
| | | /** 包括敏感数据在内的完整用户信息的加密数据 */ |
| | | encryptedData: string; |
| | |
| | | phoneNumber: string; |
| | | /** 验证码 */ |
| | | verifyCode: string; |
| | | } |
| | | |
| | | interface CollectTaskCommand { |
| | | /** 任务Id */ |
| | | ids?: string[]; |
| | | /** 是否收藏 */ |
| | | isCollect?: boolean; |
| | | } |
| | | |
| | | interface DeleteDictionaryCategoryCommand { |
| | |
| | | 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 { |
| | |
| | | Wait = 10, |
| | | /**已安排 */ |
| | | Complete = 20, |
| | | } |
| | | |
| | | enum EnumTaskUserHireStatus { |
| | | /**待录用 */ |
| | | Wait = 10, |
| | | /**已录用 */ |
| | | Pass = 20, |
| | | /**已谢绝 */ |
| | | Refuse = 30, |
| | | } |
| | | |
| | | enum EnumUserGender { |
| | |
| | | releaseStatus?: EnumTaskReleaseStatus; |
| | | recommendStatus?: EnumTaskRecommendStatus; |
| | | checkReceiveStatus?: EnumTaskCheckReceiveStatus; |
| | | /** 录用状态 */ |
| | | hireStatus?: EnumTaskUserHireStatus[]; |
| | | pageModel?: PagedListQueryPageModel; |
| | | } |
| | | |
| | |
| | | recommendStatus?: EnumTaskRecommendStatus; |
| | | /** 创建时间 */ |
| | | createdTime?: string; |
| | | hireStatus?: EnumTaskUserHireStatus; |
| | | } |
| | | |
| | | interface GetTaskInfosQueryResultObjectData { |
| | |
| | | |
| | | export function formatAreaListToTree( |
| | | areaDataList: API.AreaTreeNode[], |
| | | parentId = '', |
| | | parentId = null, |
| | | maxLayer = AreaType.Area |
| | | ) { |
| | | const treeNodeList: API.AreaTreeNode[] = []; |
| | |
| | | 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); |
| | | } |
| | | }); |