| | |
| | | "miniprogram": { |
| | | "list": [ |
| | | { |
| | | "name": "灵工详情", |
| | | "pathName": "subpackages/flexJob/flexJobDetailFromTask/flexJobDetailFromTask", |
| | | "query": "enterpriseEmployeeId=304f7e38-b973-478c-88aa-08ddf02e3176&id=ddecb887-8273-449b-6bcd-08de20009bf4&taskInfoId=ec3f301e-fa95-47a1-b8ee-08de1da3c153", |
| | | "scene": null, |
| | | "launchMode": "default" |
| | | }, |
| | | { |
| | | "name": "待验收-验收详情", |
| | | "pathName": "subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail", |
| | | "query": "id=546401cc-c148-47d0-c647-08de1e75af01&date=2025-11-28&taskInfoId=5a22c18b-0b49-4540-6658-08de1da80d7c", |
| | | "scene": null, |
| | | "launchMode": "default" |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "报名列表", |
| | |
| | | object-fit: cover; |
| | | } |
| | | } |
| | | |
| | | .dialog-form-wrapper { |
| | | width: 600px; |
| | | |
| | | .dialog-form-footer { |
| | | padding: 10px 20px; |
| | | text-align: center; |
| | | |
| | | .nut-button--plain { |
| | | border-width: 1px; |
| | | } |
| | | |
| | | .nut-button { |
| | | min-width: 100px; |
| | | } |
| | | |
| | | .nut-button + .nut-button { |
| | | margin-left: 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | <template> |
| | | <nut-popup v-model:visible="visible"> |
| | | <div class="dialog-form-wrapper"> |
| | | <nut-form :model-value="form" ref="formRef" label-position="top"> |
| | | <nut-form-item |
| | | label="谢绝原因:" |
| | | class="bole-form-item alignTop" |
| | | prop="remark" |
| | | label-width="90px" |
| | | > |
| | | <nut-textarea v-model="form.remark" rows="4" placeholder="请输入谢绝原因"> </nut-textarea> |
| | | </nut-form-item> |
| | | </nut-form> |
| | | <div class="dialog-form-footer"> |
| | | <nut-button @click="visible = false" plain>取消</nut-button> |
| | | <nut-button type="primary" @click="handleConfirm">确认</nut-button> |
| | | </div> |
| | | </div> |
| | | </nut-popup> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | defineOptions({ |
| | | name: 'RefuseDialog', |
| | | }); |
| | | |
| | | type Form = { |
| | | remark: string; |
| | | }; |
| | | |
| | | const form = defineModel<Form>('form'); |
| | | |
| | | const visible = defineModel<boolean>(); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'onConfirm'): void; |
| | | }>(); |
| | | |
| | | const formRef = ref<any>(null); |
| | | |
| | | function handleConfirm() { |
| | | if (!formRef.value) return; |
| | | formRef.value.validate().then(({ valid, errors }: any) => { |
| | | if (valid) { |
| | | emit('onConfirm'); |
| | | } |
| | | }); |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .payroll-form-wrapper { |
| | | width: 600px; |
| | | } |
| | | </style> |
| | |
| | | <PageFooterBtn |
| | | type="primary" |
| | | plain |
| | | @click="setTaskUserHire(EnumTaskUserHireStatus.Refuse)" |
| | | @click="handleAdd()" |
| | | v-if="taskUserHireStatusResult.hireStatus === EnumTaskUserHireStatus.Wait" |
| | | >谢绝</PageFooterBtn |
| | | > |
| | |
| | | > |
| | | </template> |
| | | </JobDetailContent> |
| | | <RefuseDialog v-bind="dialogProps" /> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import * as taskUserServices from '@12333/services/apiV2/taskUser'; |
| | | import { Message } from '@12333/utils'; |
| | | import { useUserResume } from '@12333/hooks'; |
| | | import { useUserResume, useFormDialog } from '@12333/hooks'; |
| | | import { EnumTaskUserHireStatus } from '@12333/constants'; |
| | | import RefuseDialog from '../components/RefuseDialog.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | |
| | | placeholderData: () => ({} as API.GetTaskUserHireStatusQueryResult), |
| | | }); |
| | | |
| | | async function setTaskUserHire(hireStatus: EnumTaskUserHireStatus) { |
| | | const { dialogProps, handleAdd, editForm } = useFormDialog({ |
| | | onConfirm: handleRefuse, |
| | | defaultFormParams: { |
| | | remark: '', |
| | | }, |
| | | }); |
| | | |
| | | async function handleRefuse() { |
| | | setTaskUserHire(EnumTaskUserHireStatus.Refuse, editForm.remark); |
| | | } |
| | | |
| | | async function setTaskUserHire(hireStatus: EnumTaskUserHireStatus, remark?: string) { |
| | | try { |
| | | let params: API.SetTaskUserHireCommand = { |
| | | id: id, |
| | | hireStatus: hireStatus, |
| | | hireRemark: remark, |
| | | }; |
| | | let res = await taskUserServices.setTaskUserHire(params); |
| | | if (res) { |
| | |
| | | "miniprogram": { |
| | | "list": [ |
| | | { |
| | | "name": "任务详情-谢绝", |
| | | "pathName": "subpackages/task/taskDetail/taskDetail", |
| | | "query": "id=bbc3f370-5c4f-417e-1999-08de316fce01&from=sign", |
| | | "scene": null, |
| | | "launchMode": "default" |
| | | }, |
| | | { |
| | | "name": "收入详情", |
| | | "pathName": "subpackages/wallet/incomeDetailInfo/incomeDetailInfo", |
| | | "query": "id=7899c603-f237-4505-949d-08de234155c4", |
| | |
| | | </div> |
| | | </div> |
| | | </Cell> |
| | | <Cell |
| | | title="谢绝原因" |
| | | v-if="detail?.hireRemark && detail.hireStatus === EnumTaskUserHireStatus.Refuse" |
| | | > |
| | | <div class="safe-cell-content">{{ detail?.hireRemark ?? '' }}</div> |
| | | </Cell> |
| | | <Cell :show-title="false"> |
| | | <CellChunk title="福利信息"> |
| | | <div class="taskDetail-welfare-list"> |
| | |
| | | EnumSettlementCycleText, |
| | | EnumTaskReleaseStatus, |
| | | BillingMethodEnumUnit, |
| | | EnumTaskUserHireStatus, |
| | | } from '@12333/constants'; |
| | | import { TaskUtils, toThousand, setOSSLink, Message } from '@12333/utils'; |
| | | import Taro from '@tarojs/taro'; |
| | |
| | | CommonServerSmsUtils = 10, |
| | | /**配置 */ |
| | | CommonServerSettings = 11, |
| | | /**已读 */ |
| | | CommonServerReadRecord = 12, |
| | | /**用户认证 */ |
| | | UserServerAuth = 12, |
| | | UserServerAuth = 13, |
| | | /**用户菜单 */ |
| | | UserServerMenu = 13, |
| | | UserServerMenu = 14, |
| | | /**用户资源 */ |
| | | UserServerResource = 14, |
| | | UserServerResource = 15, |
| | | /**用户角色 */ |
| | | UserServerRole = 15, |
| | | UserServerRole = 16, |
| | | /**用户信息 */ |
| | | UserServerUser = 16, |
| | | UserServerUser = 17, |
| | | /**用户钱包 */ |
| | | UserServerUserWallet = 17, |
| | | UserServerUserWallet = 18, |
| | | /**电子签 */ |
| | | UserServerElectronSign = 18, |
| | | UserServerElectronSign = 19, |
| | | /**用户简历 */ |
| | | UserServerUserResume = 19, |
| | | UserServerUserResume = 20, |
| | | /**企业信息 */ |
| | | UserServerEnterprise = 20, |
| | | UserServerEnterprise = 21, |
| | | /**企业钱包 */ |
| | | UserServerEnterpriseWallet = 21, |
| | | UserServerEnterpriseWallet = 22, |
| | | /**企业合作钱包 */ |
| | | UserServerEnterpriseCooperationWallet = 22, |
| | | UserServerEnterpriseCooperationWallet = 23, |
| | | /**灵工信息 */ |
| | | UserServerEnterpriseEmployee = 23, |
| | | UserServerEnterpriseEmployee = 24, |
| | | /**电子签 */ |
| | | ElectronSignServerElectronSign = 24, |
| | | ElectronSignServerElectronSign = 25, |
| | | /**短信 */ |
| | | ToolServerSms = 25, |
| | | ToolServerSms = 26, |
| | | /**小程序 */ |
| | | ToolServerWxmp = 26, |
| | | ToolServerWxmp = 27, |
| | | } |
| | | |
| | | /** 资源请求方式 */ |
| | |
| | | Pass = 20, |
| | | /**已谢绝 */ |
| | | Refuse = 30, |
| | | /**已取消 */ |
| | | Cancel = 40, |
| | | } |
| | | |
| | | /** 任务用户签约状态 */ |
| | |
| | | VERIFY_FAIL = 1, |
| | | /**验证中,商户可发起提现尝试 */ |
| | | VERIFYING = 2, |
| | | } |
| | | |
| | | /** 微信小程序订阅消息模板 */ |
| | | export enum EnumWxmpSubscribMessageTemplate { |
| | | /**支付成功提醒 结算完成后向承揽端管理员推送 */ |
| | | SettlementCompletedToSupplier = 0, |
| | | /**报酬结算审核结果通知 甲方结算确认后向承揽端管理员推送 */ |
| | | SettlementAuditCompletedToSupplier = 1, |
| | | /**工资发放通知 结算完成后向C端人员通知 */ |
| | | SettlementReceiveCompletedToUser = 2, |
| | | /**报名录用结果通知 被录用后向C端人员通知 */ |
| | | HireCompletedToUser = 3, |
| | | /**排班成功通知 排班后向C端人员通知 */ |
| | | ArrangeCompletedToUser = 4, |
| | | /**测试 */ |
| | | Test = 5, |
| | | } |
| | | |
| | | /** 我的报名分页列表-状态 */ |
| New file |
| | |
| | | import { computed, reactive } from 'vue'; |
| | | import { cloneDeep } from 'lodash'; |
| | | |
| | | type UseDialogOptions = { |
| | | onConfirm?: (...args: any) => Promise<any>; |
| | | closeAfterConfirm?: boolean; |
| | | }; |
| | | |
| | | export function useDialog(options: UseDialogOptions = {}) { |
| | | const { onConfirm, closeAfterConfirm = true } = options; |
| | | |
| | | const dialogState = reactive({ |
| | | dialogVisible: false, |
| | | }); |
| | | |
| | | function onUpdateModelValue(value: boolean) { |
| | | dialogState.dialogVisible = value; |
| | | } |
| | | |
| | | async function handleConfirm(...args: any) { |
| | | await onConfirm?.(...args); |
| | | if (closeAfterConfirm) { |
| | | dialogState.dialogVisible = false; |
| | | } |
| | | } |
| | | |
| | | const dialogProps = computed(() => ({ |
| | | modelValue: dialogState.dialogVisible, |
| | | ['onUpdate:modelValue']: onUpdateModelValue, |
| | | onOnConfirm: handleConfirm, |
| | | })); |
| | | |
| | | return { |
| | | dialogProps, |
| | | dialogState, |
| | | }; |
| | | } |
| | | |
| | | export type FormParams = {}; |
| | | |
| | | type UseFormDialogOptions<TFormParams extends FormParams> = UseDialogOptions & { |
| | | defaultFormParams: TFormParams; |
| | | }; |
| | | |
| | | export function useFormDialog<TFormParams extends FormParams>( |
| | | options: UseFormDialogOptions<TFormParams> |
| | | ) { |
| | | const { onConfirm, closeAfterConfirm = true, defaultFormParams } = options; |
| | | const { dialogProps, dialogState } = useDialog({ onConfirm, closeAfterConfirm }); |
| | | |
| | | const editForm = reactive(cloneDeep(defaultFormParams)); |
| | | |
| | | function handleAdd(extraParams: Partial<TFormParams> = {}) { |
| | | Object.assign(editForm, cloneDeep(defaultFormParams), { |
| | | ...extraParams, |
| | | }); |
| | | dialogState.dialogVisible = true; |
| | | } |
| | | |
| | | function handleEdit(data: Omit<TFormParams, 'title'>) { |
| | | Object.assign(editForm, cloneDeep(defaultFormParams), { |
| | | ...data, |
| | | }); |
| | | dialogState.dialogVisible = true; |
| | | } |
| | | |
| | | function onUpdateForm(value: TFormParams) { |
| | | Object.assign(editForm, value); |
| | | } |
| | | |
| | | const formDialogProps = computed(() => ({ |
| | | ...dialogProps.value, |
| | | form: editForm, |
| | | ['onUpdate:form']: onUpdateForm, |
| | | })); |
| | | |
| | | return { |
| | | dialogProps: formDialogProps, |
| | | dialogState, |
| | | editForm, |
| | | handleAdd, |
| | | handleEdit, |
| | | }; |
| | | } |
| | |
| | | export * from './taskUser'; |
| | | export * from './user'; |
| | | export * from './payrollChange'; |
| | | export * from './dialog'; |
| | |
| | | // @ts-ignore |
| | | import { request } from '@/utils/request'; |
| | | |
| | | /** 同步数据库 POST /api/common/syncDatabase/sendWxmpSubscribMessage */ |
| | | export async function sendWxmpSubscribMessage( |
| | | body: API.SendWxmpSubscribMessageCommand, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<boolean>('/api/common/syncDatabase/sendWxmpSubscribMessage', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json-patch+json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 同步数据库 POST /api/common/syncDatabase/syncDatabase */ |
| | | export async function syncDatabase(body: API.SyncDatabaseCommand, options?: API.RequestConfig) { |
| | | return request<number>('/api/common/syncDatabase/syncDatabase', { |
| | |
| | | CommonServerSmsUtils = 10, |
| | | /**配置 */ |
| | | CommonServerSettings = 11, |
| | | /**已读 */ |
| | | CommonServerReadRecord = 12, |
| | | /**用户认证 */ |
| | | UserServerAuth = 12, |
| | | UserServerAuth = 13, |
| | | /**用户菜单 */ |
| | | UserServerMenu = 13, |
| | | UserServerMenu = 14, |
| | | /**用户资源 */ |
| | | UserServerResource = 14, |
| | | UserServerResource = 15, |
| | | /**用户角色 */ |
| | | UserServerRole = 15, |
| | | UserServerRole = 16, |
| | | /**用户信息 */ |
| | | UserServerUser = 16, |
| | | UserServerUser = 17, |
| | | /**用户钱包 */ |
| | | UserServerUserWallet = 17, |
| | | UserServerUserWallet = 18, |
| | | /**电子签 */ |
| | | UserServerElectronSign = 18, |
| | | UserServerElectronSign = 19, |
| | | /**用户简历 */ |
| | | UserServerUserResume = 19, |
| | | UserServerUserResume = 20, |
| | | /**企业信息 */ |
| | | UserServerEnterprise = 20, |
| | | UserServerEnterprise = 21, |
| | | /**企业钱包 */ |
| | | UserServerEnterpriseWallet = 21, |
| | | UserServerEnterpriseWallet = 22, |
| | | /**企业合作钱包 */ |
| | | UserServerEnterpriseCooperationWallet = 22, |
| | | UserServerEnterpriseCooperationWallet = 23, |
| | | /**灵工信息 */ |
| | | UserServerEnterpriseEmployee = 23, |
| | | UserServerEnterpriseEmployee = 24, |
| | | /**电子签 */ |
| | | ElectronSignServerElectronSign = 24, |
| | | ElectronSignServerElectronSign = 25, |
| | | /**短信 */ |
| | | ToolServerSms = 25, |
| | | ToolServerSms = 26, |
| | | /**小程序 */ |
| | | ToolServerWxmp = 26, |
| | | ToolServerWxmp = 27, |
| | | } |
| | | |
| | | enum EnumResourceMethod { |
| | |
| | | Pass = 20, |
| | | /**已谢绝 */ |
| | | Refuse = 30, |
| | | /**已取消 */ |
| | | Cancel = 40, |
| | | } |
| | | |
| | | enum EnumTaskUserSignContractStatus { |
| | |
| | | VERIFY_FAIL = 1, |
| | | /**验证中,商户可发起提现尝试 */ |
| | | VERIFYING = 2, |
| | | } |
| | | |
| | | enum EnumWxmpSubscribMessageTemplate { |
| | | /**支付成功提醒 结算完成后向承揽端管理员推送 */ |
| | | SettlementCompletedToSupplier = 0, |
| | | /**报酬结算审核结果通知 甲方结算确认后向承揽端管理员推送 */ |
| | | SettlementAuditCompletedToSupplier = 1, |
| | | /**工资发放通知 结算完成后向C端人员通知 */ |
| | | SettlementReceiveCompletedToUser = 2, |
| | | /**报名录用结果通知 被录用后向C端人员通知 */ |
| | | HireCompletedToUser = 3, |
| | | /**排班成功通知 排班后向C端人员通知 */ |
| | | ArrangeCompletedToUser = 4, |
| | | /**测试 */ |
| | | Test = 5, |
| | | } |
| | | |
| | | interface ExportEnterpriseBalanceDetailsCommand { |
| | |
| | | /** 最近验收时间 */ |
| | | lastCheckReceiveTime?: string; |
| | | checkedStatus?: EnumGetCheckReceiveTasksQueryResultItemCheckStatus; |
| | | /** 人员数量 */ |
| | | arrangeUserCount?: number; |
| | | } |
| | | |
| | | interface GetCheckReceiveTaskUserSubmitCheckHistoriesQuery { |
| | |
| | | code?: string; |
| | | /** 任务名称 */ |
| | | taskName?: string; |
| | | /** 任务单号 */ |
| | | taskCode?: string; |
| | | /** 企业名称 */ |
| | | enterpriseName?: string; |
| | | /** 结算日期 */ |
| | |
| | | status?: EnumTaskStatus; |
| | | releaseStatus?: EnumTaskReleaseStatus; |
| | | hireStatus?: EnumTaskUserHireStatus; |
| | | /** 录用备注 */ |
| | | hireRemark?: string; |
| | | /** 灵工Id */ |
| | | enterpriseEmployeeId?: string; |
| | | applyButton?: GetTaskInfoQueryResultApplyButton; |
| | |
| | | phoneNumber: string; |
| | | } |
| | | |
| | | interface SendWxmpSubscribMessageCommand { |
| | | /** 小程序编号 */ |
| | | wxmpCode: string; |
| | | template: EnumWxmpSubscribMessageTemplate; |
| | | /** 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转 */ |
| | | page?: string; |
| | | /** 接收者(用户)的 openid */ |
| | | touser: string; |
| | | /** 模板内容,格式形如{ "phrase3": { "value": "审核通过" }, "name1": { "value": "订阅" }, "date2": { "value": "2019-12-25 09:42" } } */ |
| | | data: any; |
| | | } |
| | | |
| | | interface SetDictionaryDataIsDisabledCommand { |
| | | ids?: string[]; |
| | | /** 是否已禁用 */ |
| | |
| | | /** 任务人员Id */ |
| | | id?: string; |
| | | hireStatus?: EnumTaskUserHireStatus; |
| | | /** 录用备注 */ |
| | | hireRemark?: string; |
| | | } |
| | | |
| | | enum SettlementReceiveStatus { |