| | |
| | | <LoadingLayout :loading="isLoading && isEdit"> |
| | | <AppContainer> |
| | | <PageFormLayout title="基本信息"> |
| | | <ProForm :model="form" ref="productFormRef" label-width="110px" :is-read="isDetail"> |
| | | <ProForm :model="form" ref="productFormRef" label-width="120px" :is-read="isDetail"> |
| | | <ProFormItemV2 |
| | | label="供应商:" |
| | | prop="supplierEnterpriseId" |
| | | :check-rules="[{ message: '请选择供应商' }]" |
| | | > |
| | | <ProFormSelect |
| | | v-model="form.supplierEnterpriseId" |
| | | :value-enum="supplierEnterpriseSelect" |
| | | placeholder="请选择供应商" |
| | | :disabled="isEdit" |
| | | ></ProFormSelect> |
| | | </ProFormItemV2> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | |
| | | :check-rules="[{ message: '请输入任务名称' }]" |
| | | > |
| | | <ProFormText v-model.trim="form.name" placeholder="请输入任务名称" /> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="需求人数:" |
| | | prop="needPeopleNumber" |
| | | :check-rules="[{ message: '请输入需求人数' }]" |
| | | > |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | v-model="form.needPeopleNumber" |
| | | placeholder="请输入需求人数" |
| | | :min="0" |
| | | :max="999999999999" |
| | | :precision="0" |
| | | unit="人" |
| | | @change="calcTaskTotalServiceFee" |
| | | ></ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | |
| | | :showExtra="true" |
| | | :button-style="false" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | > |
| | | <template #extra> |
| | | <ProFormInputNumber |
| | |
| | | :max="999999999999" |
| | | :unit="EnumBillingMethodUnitText[form.billingMethod]" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | ></ProFormInputNumber> |
| | | </template> |
| | | </RadioWithExtra> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <template |
| | | v-if=" |
| | | form.billingMethod === EnumBillingMethod.Hour || |
| | | form.billingMethod === EnumBillingMethod.Day |
| | | " |
| | | > |
| | | <template v-if="form.billingMethod === EnumBillingMethod.Hour"> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | |
| | | prop="verifyWorkHours" |
| | | :check-rules="[{ message: '请输入核定工时' }]" |
| | | > |
| | | <span v-if="isDetail && !form.verifyWorkHours"></span> |
| | | <ProFormInputNumber |
| | | v-else |
| | | :controls="false" |
| | | v-model="form.verifyWorkHours" |
| | | placeholder="请输入核定工时" |
| | |
| | | :max="999999999999" |
| | | unit="小时/天" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | ></ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | |
| | | prop="timeoutServiceFee" |
| | | :check-rules="[{ message: '请输入超时服务费' }]" |
| | | > |
| | | <span v-if="isDetail && !form.timeoutServiceFee"></span> |
| | | <ProFormInputNumber |
| | | v-else |
| | | :controls="false" |
| | | v-model="form.timeoutServiceFee" |
| | | placeholder="请输入超时服务费" |
| | |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | </template> |
| | | |
| | | <ProFormCol v-if="form.billingMethod === EnumBillingMethod.Piece"> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="总件数:" |
| | | prop="totalPieceQuantity" |
| | | :check-rules="[{ message: '请输入总件数' }]" |
| | | > |
| | | <ProFormInputNumber |
| | | :controls="false" |
| | | v-model="form.totalPieceQuantity" |
| | | placeholder="请输入总件数" |
| | | :min="0" |
| | | :max="999999999999" |
| | | unit="件" |
| | | :disabled="feeCannotEdit" |
| | | @change="calcTaskTotalServiceFee" |
| | | ></ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | |
| | | <ProFormItemV2 |
| | | label="任务时间:" |
| | | prop="time" |
| | | :check-rules="[{ message: '请选择任务时间', type: 'array' }]" |
| | | :check-rules="[ |
| | | { message: '请选择任务时间', type: 'array' }, |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (form.billingMethod === EnumBillingMethod.Month) { |
| | | if (dayjs(form.time[1]).diff(dayjs(form.time[0]), 'month') < 1) { |
| | | callback(new Error('月结任务时任务时间需大于一个月')); |
| | | } |
| | | callback(); |
| | | } |
| | | callback(); |
| | | }, |
| | | }, |
| | | ]" |
| | | > |
| | | <ProFormDatePicker |
| | | v-model="form.time" |
| | |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | :disabled-date="disabledDate" |
| | | @change="handleTimeChange" |
| | | ></ProFormDatePicker> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | |
| | | <ProFormColItem :span="12"> |
| | | <ProFormItemV2 |
| | | label="验收方式:" |
| | | prop="checkReceiveMethod" |
| | | prop="checkReceiveMethods" |
| | | :check-rules="[{ message: '请选择验收方式' }]" |
| | | > |
| | | <ProFormRadio |
| | | v-model="form.checkReceiveMethod" |
| | | <ProFormCheckbox |
| | | v-model="form.checkReceiveMethods" |
| | | :value-enum="EnumTaskCheckReceiveMethodText" |
| | | :button-style="false" |
| | | ></ProFormRadio> |
| | | :disabled="isEdit" |
| | | ></ProFormCheckbox> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormItemV2 |
| | | label="保险产品:" |
| | | prop="checkReceiveMethods" |
| | | :check-rules="[{ message: '请选择保险产品' }]" |
| | | > |
| | | <ProFormSelect |
| | | v-model="form.checkReceiveMethods" |
| | | :value-enum="EnumTaskCheckReceiveMethodText" |
| | | ></ProFormSelect> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 label="预计服务费总额:" prop="totalServiceFee"> |
| | | {{ `${toThousand(form.totalServiceFee)}元` }} |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 |
| | | label="结算方式:" |
| | | prop="settlementAccess" |
| | |
| | | EnumTaskCheckReceiveMethodText, |
| | | EnumEnterpriseWalletAccessText, |
| | | } from '@/constants'; |
| | | import { format, FormValidator } from '@/utils'; |
| | | import { format, FormValidator, toThousand } from '@/utils'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | |
| | | }; |
| | | defineProps<Props>(); |
| | | const route = useRoute(); |
| | | const router = useRouter(); |
| | | const id = route.params.id as string; |
| | | const isEdit = !!id; |
| | | |
| | | const { settlementAccessList } = useEnterpriseWalletAccessSelect(); |
| | | const { supplierEnterpriseSelect } = useGetSupplierEnterpriseSelect(); |
| | | |
| | | function disabledDate(time: Date) { |
| | | return dayjs(time).isBefore(dayjs(), 'day'); |
| | | } |
| | | |
| | | function disabledapplyDate(time: Date) { |
| | | return dayjs(time).isBefore(form.time[0], 'day') || dayjs(time).isAfter(form.time[1], 'day'); |
| | | return dayjs(time).isAfter(dayjs(form.time[1]), 'day') || dayjs(time).isBefore(dayjs(), 'day'); |
| | | } |
| | | |
| | | const feeCannotEdit = computed(() => { |
| | |
| | | }); |
| | | |
| | | const form = reactive({ |
| | | supplierEnterpriseId: '', |
| | | name: '', |
| | | needPeopleNumber: null as number, |
| | | billingMethod: EnumBillingMethod.Day, |
| | | serviceFee: null, |
| | | totalPieceQuantity: null as number, |
| | | settlementCycle: EnumSettlementCycle.Day, |
| | | settlementDate: null as number, |
| | | benefits: [] as string[], |
| | |
| | | verifyWorkHours: null as number, |
| | | timeoutServiceFee: null as number, |
| | | description: '', |
| | | checkReceiveMethod: '' as any as EnumTaskCheckReceiveMethod, |
| | | checkReceiveMethods: [] as any as EnumTaskCheckReceiveMethod[], |
| | | applyTime: [] as unknown as ModelValueType, |
| | | settlementAccess: '' as any as EnumEnterpriseWalletAccess, |
| | | totalServiceFee: 0, |
| | | }); |
| | | |
| | | const { settlementAccessList } = useEnterpriseWalletAccessSelect({ |
| | | supplierEnterpriseId: computed(() => form.supplierEnterpriseId), |
| | | }); |
| | | |
| | | const { isLoading } = useQuery({ |
| | |
| | | }, |
| | | placeholderData: () => ({} as API.GetTaskInfoQueryResult), |
| | | onSuccess(data) { |
| | | form.supplierEnterpriseId = data.supplierEnterpriseId; |
| | | form.name = data.name; |
| | | form.needPeopleNumber = data.needPeopleNumber; |
| | | form.billingMethod = data.billingMethod; |
| | | form.totalPieceQuantity = data.totalPieceQuantity; |
| | | form.serviceFee = data.serviceFee; |
| | | form.settlementCycle = data.settlementCycle; |
| | | form.settlementDate = data.settlementDate; |
| | |
| | | form.verifyWorkHours = data.verifyWorkHours; |
| | | form.timeoutServiceFee = data.timeoutServiceFee; |
| | | form.description = data.description; |
| | | form.checkReceiveMethod = data.checkReceiveMethod; |
| | | form.checkReceiveMethods = data.checkReceiveMethods; |
| | | form.applyTime = [ |
| | | format(data.applyBeginTime, 'YYYY-MM-DD 00:00:00'), |
| | | format(data.applyEndTime, 'YYYY-MM-DD 23:59:59'), |
| | | ]; |
| | | form.settlementAccess = data.settlementAccess; |
| | | form.totalServiceFee = data.estimatedServiceFee; |
| | | }, |
| | | enabled: isEdit, |
| | | }); |
| | |
| | | form.settlementDate = null as number; |
| | | } |
| | | |
| | | function handleTimeChange() { |
| | | form.applyTime = [] as unknown as ModelValueType; |
| | | calcTaskTotalServiceFee(); |
| | | } |
| | | |
| | | function handleBack() { |
| | | closeViewPush(route, { |
| | | name: 'TaskManageList', |
| | | }); |
| | | } |
| | | |
| | | const productFormRef = ref<FormInstance>(); |
| | | function handleConfirm() { |
| | | if (!productFormRef.value) return; |
| | |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // function calculateMonthInterval(startDate, endDate) { |
| | | // const diffInDays = dayjs(endDate).diff(startDate, 'day'); |
| | | // const monthInterval = Math.ceil(diffInDays / 30); |
| | | // return monthInterval > 15 ? Math.ceil(monthInterval / 30) : monthInterval; |
| | | // } |
| | | |
| | | // const totalServiceFee = computed(() => { |
| | | // const monthInterval = calculateMonthInterval(form.time[0], form.time[1]); |
| | | // const dayInterval = dayjs(form.time[1]).diff(dayjs(form.time[0]), 'day'); |
| | | // switch (form.billingMethod) { |
| | | // case EnumBillingMethod.Month: |
| | | // return monthInterval * (form.serviceFee ?? 0) * (form.needPeopleNumber ?? 0); |
| | | // case EnumBillingMethod.Day: |
| | | // return dayInterval * (form.serviceFee ?? 0) * (form.needPeopleNumber ?? 0); |
| | | // case EnumBillingMethod.Hour: |
| | | // return ( |
| | | // dayInterval * |
| | | // (form.verifyWorkHours ?? 0) * |
| | | // (form.serviceFee ?? 0) * |
| | | // (form.needPeopleNumber ?? 0) |
| | | // ); |
| | | // case EnumBillingMethod.Piece: |
| | | // return (form.totalPieceQuantity ?? 0) * (form.serviceFee ?? 0); |
| | | // default: |
| | | // return form.totalServiceFee; |
| | | // } |
| | | // }); |
| | | |
| | | async function calcTaskTotalServiceFee() { |
| | | try { |
| | | let params: API.CalcTaskTotalServiceFeeCommand = { |
| | | billingMethod: form.billingMethod, |
| | | serviceFee: form.serviceFee ?? 0, |
| | | verifyWorkHours: form.verifyWorkHours ?? 0, |
| | | totalPieceQuantity: form.totalPieceQuantity, |
| | | needPeopleNumber: form.needPeopleNumber ?? 0, |
| | | beginTime: dayjs(form.time[0]).format('YYYY-MM-DD 00:00:00'), |
| | | endTime: dayjs(form.time[1]).format('YYYY-MM-DD 23:59:59'), |
| | | }; |
| | | let res = await taskServices.calcTaskTotalServiceFee(params); |
| | | if (res) { |
| | | form.totalServiceFee = res.totalServiceFee; |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | |
| | | async function submit() { |
| | | try { |
| | | await calcTaskTotalServiceFee(); |
| | | let params: API.SaveTaskInfoCommand = { |
| | | supplierEnterpriseId: form.supplierEnterpriseId, |
| | | name: form.name, |
| | | needPeopleNumber: form.needPeopleNumber, |
| | | billingMethod: form.billingMethod, |
| | | totalPieceQuantity: form.totalPieceQuantity, |
| | | serviceFee: form.serviceFee, |
| | | settlementCycle: form.settlementCycle, |
| | | settlementDate: form.settlementDate ? form.settlementDate : 0, |
| | |
| | | verifyWorkHours: form.verifyWorkHours, |
| | | timeoutServiceFee: form.timeoutServiceFee, |
| | | description: form.description, |
| | | checkReceiveMethod: form.checkReceiveMethod, |
| | | checkReceiveMethods: form.checkReceiveMethods, |
| | | settlementAccess: form.settlementAccess, |
| | | }; |
| | | if (form.billingMethod !== EnumBillingMethod.Face) { |
| | | params.serviceFee = form.serviceFee; |
| | | } |
| | | if (isEdit) { |
| | | params.id = id; |
| | | } |
| | | let res = await taskServices.saveTaskInfo(params); |
| | | let res = await taskServices.saveTaskInfo(params, { |
| | | skipErrorHandler: true, |
| | | }); |
| | | if (res) { |
| | | Message.successMessage('操作成功'); |
| | | eventContext.emit(isEdit ? 'taskManage:edit' : 'taskManage:add'); |
| | | handleBack(); |
| | | } |
| | | } catch (error) {} |
| | | } catch (error) { |
| | | if (error?.info?.errorCode == 'BalanceNotEnough') { |
| | | Message.tipMessage('您当前账户余额不足,暂时无法发布任务,请充值后操作', { |
| | | confirmButtonText: '立即充值', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | callback: (action) => { |
| | | if (action === 'confirm') { |
| | | router.push({ |
| | | name: 'BalanceManageV2', |
| | | }); |
| | | } |
| | | }, |
| | | }); |
| | | } else { |
| | | Message.errorMessage(error); |
| | | } |
| | | } |
| | | } |
| | | |
| | | function handleCheckBenefitsAllChange(val: boolean) { |