| | |
| | | import { EnumTaskUserHireStatus, EnumTaskUserSignContractStatus,EnumGetArrangeTaskUsersQueryApplyStatus } from './apiEnum'; |
| | | import { |
| | | EnumTaskUserHireStatus, |
| | | EnumTaskUserSignContractStatus, |
| | | EnumGetArrangeTaskUsersQueryApplyStatus, |
| | | } from './apiEnum'; |
| | | |
| | | export const EnumTaskUserHireStatusText = { |
| | | [EnumTaskUserHireStatus.Wait]: '待录用', |
| | | [EnumTaskUserHireStatus.Pass]: '已录用', |
| | | [EnumTaskUserHireStatus.Refuse]: '已谢绝', |
| | | [EnumTaskUserHireStatus.Cancel]: '已取消', |
| | | }; |
| | | |
| | | export const EnumTaskUserSignContractStatusTextForFilter = { |
| | |
| | | export const EnumGetArrangeTaskUsersQueryApplyStatusText = { |
| | | [EnumGetArrangeTaskUsersQueryApplyStatus.None]: '未报名', |
| | | [EnumGetArrangeTaskUsersQueryApplyStatus.Completed]: '已报名', |
| | | } |
| | | }; |
| | |
| | | AppContainer, |
| | | QueryFilterItem, |
| | | useTable, |
| | | FieldDatePicker, |
| | | FieldRadio, |
| | | defineOperationBtns, |
| | | } from '@bole-core/components'; |
| | | import { EmploymentArrangeColumns } from './constants'; |
| | | import { Message } from '@bole-core/core'; |
| | | import * as taskUserServices from '@/services/api/taskUser'; |
| | | import { |
| | |
| | | arrangeBtn: { |
| | | emits: { |
| | | onClick: (role) => handleArrange(role), |
| | | }, |
| | | extraProps: { |
| | | hide: (row: API.GetArrangeTaskUsersQueryResultItem) => |
| | | row.arrangeStatus === EnumTaskUserArrangeStatus.Complete, |
| | | }, |
| | | }, |
| | | cancelRecruitBtn: { |
| | | emits: { |
| | | onClick: (role) => setTaskUserHire(role, EnumTaskUserHireStatus.Cancel), |
| | | }, |
| | | extraProps: { |
| | | hide: (row: API.GetArrangeTaskUsersQueryResultItem) => |
| | |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | |
| | | async function setTaskUserHire( |
| | | row: API.GetArrangeTaskUsersQueryResultItem, |
| | | hireStatus: EnumTaskUserHireStatus |
| | | ) { |
| | | try { |
| | | await Message.tipMessage(`确认要取消录用吗?`); |
| | | let params: API.SetTaskUserHireCommand = { |
| | | id: row.id, |
| | | hireStatus: hireStatus, |
| | | }; |
| | | let res = await taskUserServices.setTaskUserHire(params); |
| | | if (res) { |
| | | Message.successMessage('操作成功'); |
| | | getList(paginationState.pageIndex); |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | </script> |
| | |
| | | }, |
| | | recruitBtn: { |
| | | emits: { |
| | | onClick: (role) => setTaskUserHire(role.id, EnumTaskUserHireStatus.Pass), |
| | | onClick: (role) => handleRecruit(role.id, EnumTaskUserHireStatus.Pass), |
| | | }, |
| | | extraProps: { |
| | | hide: (row: API.GetTaskUsersQueryResultItem) => |
| | | row.hireStatus === EnumTaskUserHireStatus.Pass, |
| | | }, |
| | | }, |
| | | cancelRecruitBtn: { |
| | | emits: { |
| | | onClick: (role) => handleCancelRecruit(role.id, EnumTaskUserHireStatus.Cancel), |
| | | }, |
| | | extraProps: { |
| | | hide: (row: API.GetTaskUsersQueryResultItem) => |
| | | row.hireStatus !== EnumTaskUserHireStatus.Pass, |
| | | }, |
| | | }, |
| | | refuseBtn: { |
| | |
| | | setTaskUserHire(editForm.id, EnumTaskUserHireStatus.Refuse, editForm.remark); |
| | | } |
| | | |
| | | async function handleRecruit(id: string, hireStatus: EnumTaskUserHireStatus) { |
| | | try { |
| | | await Message.tipMessage(`确认要录用吗?`); |
| | | setTaskUserHire(id, hireStatus); |
| | | } catch (error) {} |
| | | } |
| | | |
| | | async function handleCancelRecruit(id: string, hireStatus: EnumTaskUserHireStatus) { |
| | | try { |
| | | await Message.tipMessage(`确认要取消录用吗?`); |
| | | setTaskUserHire(id, hireStatus); |
| | | } catch (error) {} |
| | | } |
| | | |
| | | async function setTaskUserHire(id: string, hireStatus: EnumTaskUserHireStatus, remark?: string) { |
| | | try { |
| | | if (hireStatus === EnumTaskUserHireStatus.Pass) { |
| | | await Message.tipMessage( |
| | | `确认要${hireStatus === EnumTaskUserHireStatus.Pass ? '录用' : '谢绝'}吗?` |
| | | ); |
| | | } |
| | | let params: API.SetTaskUserHireCommand = { |
| | | id: id, |
| | | hireStatus: hireStatus, |
| New file |
| | |
| | | <template> |
| | | <LoadingLayout :loading="state.loading"> |
| | | <AppContainer> |
| | | <ProTableQueryFilterBar @on-reset="reset"> |
| | | <template #query> |
| | | <QueryFilterItem tip-content="任务状态"> |
| | | <FieldRadio |
| | | v-model="extraParamState.status" |
| | | :value-enum="EnumTaskStatusText" |
| | | buttonStyle |
| | | showAllBtn |
| | | @change="getList()" |
| | | /> |
| | | </QueryFilterItem> |
| | | <QueryFilterItem tip-content="发布状态"> |
| | | <FieldRadio |
| | | v-model="extraParamState.releaseStatus" |
| | | :value-enum="EnumTaskReleaseStatusText" |
| | | buttonStyle |
| | | showAllBtn |
| | | @change="getList()" |
| | | /> |
| | | </QueryFilterItem> |
| | | <QueryFilterItem tip-content="发布时间"> |
| | | <FieldDatePicker |
| | | v-model="extraParamState.time" |
| | | type="daterange" |
| | | range-separator="~" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | clearable |
| | | @change="getList()" |
| | | ></FieldDatePicker> |
| | | </QueryFilterItem> |
| | | <QueryFilterItem> |
| | | <SearchInput |
| | | v-model="extraParamState.keywords" |
| | | style="width: 260px" |
| | | placeholder="任务名称/客户" |
| | | @on-click-search="getList" |
| | | > |
| | | </SearchInput> |
| | | </QueryFilterItem> |
| | | </template> |
| | | <template #btn> |
| | | <el-button |
| | | v-if="checkSubModuleItemShow('pageButton', 'addBtn')" |
| | | @click="goAddOrEdit()" |
| | | type="primary" |
| | | >发布</el-button |
| | | > |
| | | </template> |
| | | </ProTableQueryFilterBar> |
| | | <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns"> |
| | | <template #userCount="{ row }"> |
| | | <el-button v-if="!row.isInternal" link type="primary" @click="goSignList(row)">{{ |
| | | row.userCount || 0 |
| | | }}</el-button> |
| | | <span v-else>/</span> |
| | | </template> |
| | | </ProTableV2> |
| | | </AppContainer> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { |
| | | ProTableQueryFilterBar, |
| | | ProTableV2, |
| | | SearchInput, |
| | | LoadingLayout, |
| | | AppContainer, |
| | | QueryFilterItem, |
| | | useTable, |
| | | FieldDatePicker, |
| | | FieldRadio, |
| | | defineOperationBtns, |
| | | } from '@bole-core/components'; |
| | | import { EnumTaskStatusText, EnumTaskReleaseStatusText } from '@/constants'; |
| | | import { useGlobalEventContext } from '@/hooks'; |
| | | import * as taskServices from '@/services/api/task'; |
| | | import { format, OrderUtils } from '@/utils'; |
| | | import { ModelValueType } from 'element-plus'; |
| | | import { Message } from '@bole-core/core'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskArrange', |
| | | }); |
| | | |
| | | const operationBtnMap: Record<string, OperationBtnType> = { |
| | | // editBtn: { |
| | | // emits: { |
| | | // onClick: (role) => goAddOrEdit(role), |
| | | // }, |
| | | // extraProps: { |
| | | // hide: (row: API.GetTaskInfosQueryResultItem) => |
| | | // row.status === EnumTaskStatus.Complete || !row.isInternal, |
| | | // }, |
| | | // }, |
| | | // detailBtn: { |
| | | // emits: { |
| | | // onClick: (row: API.GetTaskInfosQueryResultItem) => goDetail(row), |
| | | // }, |
| | | // }, |
| | | // publishBtn: { |
| | | // emits: { |
| | | // onClick: (row: API.GetTaskInfosQueryResultItem) => |
| | | // setTaskInfoReleaseStatus(row, EnumTaskReleaseStatus.InProcess), |
| | | // }, |
| | | // extraProps: { |
| | | // hide: (row: API.GetTaskInfosQueryResultItem) => |
| | | // row.releaseStatus === EnumTaskReleaseStatus.InProcess || !row.isInternal, |
| | | // }, |
| | | // }, |
| | | // unPublishBtn: { |
| | | // emits: { |
| | | // onClick: (row: API.GetTaskInfosQueryResultItem) => |
| | | // setTaskInfoReleaseStatus(row, EnumTaskReleaseStatus.Stopped), |
| | | // }, |
| | | // extraProps: { |
| | | // hide: (row: API.GetTaskInfosQueryResultItem) => |
| | | // row.releaseStatus === EnumTaskReleaseStatus.Stopped || !row.isInternal, |
| | | // }, |
| | | // }, |
| | | arrangeBtn: { |
| | | emits: { |
| | | onClick: (row: API.GetTaskInfosQueryResultItem) => handleArrange(row), |
| | | }, |
| | | extraProps: { |
| | | hide: (row: API.GetTaskInfosQueryResultItem) => |
| | | row.releaseStatus === EnumTaskReleaseStatus.Stopped || !row.isInternal, |
| | | }, |
| | | }, |
| | | }; |
| | | |
| | | const { checkSubModuleItemShow, column, operationBtns } = useAccess({ |
| | | operationBtnMap, |
| | | }); |
| | | |
| | | const router = useRouter(); |
| | | |
| | | const BaseState = { |
| | | loading: true, |
| | | }; |
| | | |
| | | const state = reactive({ ...BaseState }); |
| | | |
| | | const eventContext = useGlobalEventContext(); |
| | | |
| | | eventContext.addEvent('taskManage:add', () => { |
| | | getList(); |
| | | }); |
| | | |
| | | eventContext.addEvent('taskManage:edit', () => { |
| | | getList(paginationState.pageIndex); |
| | | }); |
| | | |
| | | onMounted(async () => { |
| | | await getList(); |
| | | state.loading = false; |
| | | }); |
| | | |
| | | const { |
| | | getDataSource: getList, |
| | | proTableProps, |
| | | paginationState, |
| | | extraParamState, |
| | | reset, |
| | | } = useTable( |
| | | async ({ pageIndex, pageSize }, extraParamState) => { |
| | | try { |
| | | let params: API.GetTaskInfosQuery = { |
| | | pageModel: { |
| | | rows: pageSize, |
| | | page: pageIndex, |
| | | orderInput: extraParamState.orderInput, |
| | | }, |
| | | keywords: extraParamState.keywords, |
| | | status: extraParamState.status, |
| | | releaseStatus: extraParamState.releaseStatus, |
| | | beginTime: format(extraParamState.time?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), |
| | | endTime: format(extraParamState.time?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), |
| | | }; |
| | | |
| | | let res = await taskServices.getTaskInfos(params, { |
| | | showLoading: !state.loading, |
| | | }); |
| | | return res; |
| | | } catch (error) { |
| | | console.log('error: ', error); |
| | | } |
| | | }, |
| | | { |
| | | defaultExtraParams: { |
| | | keywords: '', |
| | | status: '' as any as EnumTaskStatus, |
| | | releaseStatus: '' as any as EnumTaskReleaseStatus, |
| | | time: [] as unknown as ModelValueType, |
| | | orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], |
| | | }, |
| | | queryKey: ['taskServices/getTaskInfos'], |
| | | columnsRenderProps: { |
| | | billingMethod: { type: 'enum', valueEnum: EnumBillingMethodText }, |
| | | settlementCycle: { type: 'enum', valueEnum: EnumSettlementCycleText }, |
| | | genderLimit: { type: 'enum', valueEnum: EnumUserGenderText }, |
| | | status: { type: 'enum', valueEnum: EnumTaskStatusText }, |
| | | releaseStatus: { type: 'enum', valueEnum: EnumTaskReleaseStatusText }, |
| | | createdTime: { type: 'date', format: 'YYYY-MM-DD' }, |
| | | beginTime: { type: 'date', format: 'YYYY-MM-DD' }, |
| | | endTime: { type: 'date', format: 'YYYY-MM-DD' }, |
| | | serviceFee: { |
| | | type: 'money', |
| | | formatter: (row: API.GetTaskInfosQueryResultItem) => { |
| | | return OrderUtils.getServiceFeeText(row.serviceFee, row.billingMethod); |
| | | }, |
| | | }, |
| | | applyBeginTime: { type: 'date', format: 'YYYY-MM-DD' }, |
| | | applyEndTime: { type: 'date', format: 'YYYY-MM-DD' }, |
| | | //@ts-ignore |
| | | applyStatus: { |
| | | formatter: (row: API.GetTaskInfosQueryResultItem) => { |
| | | const applyBeginTime = dayjs(row.applyBeginTime); |
| | | const applyEndTime = dayjs(row.applyEndTime); |
| | | const now = dayjs(); |
| | | if (applyEndTime.isBefore(now)) { |
| | | return '已结束'; |
| | | } else if (applyBeginTime.isAfter(now)) { |
| | | return '待开始'; |
| | | } else { |
| | | return '进行中'; |
| | | } |
| | | }, |
| | | }, |
| | | }, |
| | | } |
| | | ); |
| | | |
| | | async function setTaskInfoReleaseStatus( |
| | | row: API.GetTaskInfosQueryResultItem, |
| | | releaseStatus: EnumTaskReleaseStatus |
| | | ) { |
| | | try { |
| | | await Message.tipMessage(`确认要${EnumTaskReleaseStatusTextForTip[releaseStatus]}吗?`); |
| | | let params: API.SetTaskInfoReleaseStatusCommand = { |
| | | ids: [row.id], |
| | | releaseStatus: releaseStatus, |
| | | }; |
| | | let res = await taskServices.setTaskInfoReleaseStatus(params); |
| | | if (res) { |
| | | Message.successMessage('操作成功'); |
| | | getList(paginationState.pageIndex); |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | |
| | | function handleArrange(row: API.GetTaskInfosQueryResultItem) { |
| | | router.push({ |
| | | name: 'EmploymentManageArrange', |
| | | params: { |
| | | id: row?.id ?? '', |
| | | }, |
| | | }); |
| | | } |
| | | function goAddOrEdit(row?: API.GetTaskInfosQueryResultItem) { |
| | | router.push({ |
| | | name: 'AddOrEditEmployment', |
| | | params: { |
| | | id: row?.id ?? '', |
| | | }, |
| | | query: { |
| | | supplierEnterpriseId: row?.supplierEnterpriseId, |
| | | }, |
| | | }); |
| | | } |
| | | function goDetail(row: API.GetTaskInfosQueryResultItem) { |
| | | router.push({ |
| | | name: 'EmploymentManageDetail', |
| | | params: { |
| | | id: row?.id ?? '', |
| | | }, |
| | | }); |
| | | } |
| | | |
| | | function goSignList(row: API.GetTaskInfosQueryResultItem) { |
| | | router.push({ |
| | | name: 'EmploymentSignList', |
| | | params: { |
| | | id: row?.id ?? '', |
| | | }, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <ProDialog title="谢绝" v-model="visible" @close="onDialogClose" destroy-on-close draggable> |
| | | <ProForm :model="form" ref="dialogForm" label-width="110px"> |
| | | <ProFormItemV2 label="谢绝原因:" prop="remark" :check-rules="[{ message: '请输入谢绝原因' }]"> |
| | | <ProFormTextArea placeholder="请输入谢绝原因" v-model="form.remark"></ProFormTextArea> |
| | | <ProFormTextArea |
| | | placeholder="请输入谢绝原因" |
| | | v-model="form.remark" |
| | | show-word-limit |
| | | :maxlength="150" |
| | | ></ProFormTextArea> |
| | | </ProFormItemV2> |
| | | </ProForm> |
| | | <template #footer> |