From 9c2c8534862d5a843b1e8766bd4bf171ac295fb3 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 12 十二月 2025 16:37:07 +0800
Subject: [PATCH] feat: 保险
---
src/views/EmploymentManage/components/AddOrEditEmploymentView.vue | 369 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 357 insertions(+), 12 deletions(-)
diff --git a/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
index c2ea175..98ba258 100644
--- a/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
+++ b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
@@ -2,7 +2,20 @@
<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"
+ @change="supplierEnterpriseChange"
+ ></ProFormSelect>
+ </ProFormItemV2>
<ProFormCol>
<ProFormColItem :span="12">
<ProFormItemV2
@@ -17,6 +30,26 @@
<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>
+ <ProFormCol>
+ <ProFormColItem :span="12">
+ <ProFormItemV2
label="鏈嶅姟璐�:"
prop="billingMethod"
:check-rules="[
@@ -25,7 +58,7 @@
if (!form.billingMethod) {
callback(new Error('璇烽�夋嫨鏈嶅姟璐圭被鍨�'));
}
- if (!form.serviceFee) {
+ if (!form.serviceFee && form.billingMethod !== EnumBillingMethod.Face) {
callback(new Error('璇疯緭鍏ユ湇鍔¤垂'));
}
callback();
@@ -38,18 +71,88 @@
:value-enum="EnumBillingMethodText"
:showExtra="true"
:button-style="false"
+ :disabled="feeCannotEdit"
+ @change="calcTaskTotalServiceFee"
>
<template #extra>
<ProFormInputNumber
+ v-if="form.billingMethod !== EnumBillingMethod.Face"
:controls="false"
v-model="form.serviceFee"
placeholder="璇疯緭鍏�"
:min="0"
:max="999999999999"
:unit="EnumBillingMethodUnitText[form.billingMethod]"
+ :disabled="feeCannotEdit"
+ @change="calcTaskTotalServiceFee"
></ProFormInputNumber>
</template>
</RadioWithExtra>
+ </ProFormItemV2>
+ </ProFormColItem>
+ </ProFormCol>
+ <template v-if="form.billingMethod === EnumBillingMethod.Hour">
+ <ProFormCol>
+ <ProFormColItem :span="12">
+ <ProFormItemV2
+ label="鏍稿畾宸ユ椂:"
+ prop="verifyWorkHours"
+ :check-rules="[{ message: '璇疯緭鍏ユ牳瀹氬伐鏃�' }]"
+ >
+ <span v-if="isDetail && !form.verifyWorkHours"></span>
+ <ProFormInputNumber
+ v-else
+ :controls="false"
+ v-model="form.verifyWorkHours"
+ placeholder="璇疯緭鍏ユ牳瀹氬伐鏃�"
+ :min="0"
+ :max="999999999999"
+ unit="灏忔椂/澶�"
+ :disabled="feeCannotEdit"
+ @change="calcTaskTotalServiceFee"
+ ></ProFormInputNumber>
+ </ProFormItemV2>
+ </ProFormColItem>
+ </ProFormCol>
+ <ProFormCol>
+ <ProFormColItem :span="12">
+ <ProFormItemV2
+ label="瓒呮椂鏈嶅姟璐�:"
+ prop="timeoutServiceFee"
+ :check-rules="[{ message: '璇疯緭鍏ヨ秴鏃舵湇鍔¤垂' }]"
+ >
+ <span v-if="isDetail && !form.timeoutServiceFee"></span>
+ <ProFormInputNumber
+ v-else
+ :controls="false"
+ v-model="form.timeoutServiceFee"
+ placeholder="璇疯緭鍏ヨ秴鏃舵湇鍔¤垂"
+ :min="0"
+ :max="999999999999"
+ unit="鍏�/灏忔椂"
+ :disabled="feeCannotEdit"
+ ></ProFormInputNumber>
+ </ProFormItemV2>
+ </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>
@@ -65,6 +168,7 @@
:value-enum="EnumSettlementCycleText"
:button-style="false"
@change="handleSettlementCycleChange"
+ :disabled="feeCannotEdit"
></ProFormRadio>
</ProFormItemV2>
</ProFormColItem>
@@ -199,12 +303,19 @@
</ProFormCol>
<ProFormCol>
<ProFormColItem :span="12">
- <ProFormItemV2
- label="璇︾粏鍦板潃:"
- prop="addressDetail"
- :check-rules="[{ message: '璇疯緭鍏ヨ缁嗗湴鍧�' }]"
- >
- <ProFormText v-model.trim="form.addressDetail" placeholder="璇疯緭鍏ヨ缁嗗湴鍧�" />
+ <ProFormItemV2 label="鍦扮偣璇存槑:" prop="addressDetail">
+ <ProFormText v-model.trim="form.addressDetail" placeholder="璇疯緭鍏ュ湴鐐硅鏄�" />
+ </ProFormItemV2>
+ </ProFormColItem>
+ </ProFormCol>
+ <ProFormCol>
+ <ProFormColItem :span="12">
+ <ProFormItemV2 label="浠诲姟鎻忚堪:" prop="description">
+ <ProFormTextArea
+ :rows="4"
+ v-model.trim="form.description"
+ placeholder="璇疯緭鍏ヤ换鍔℃弿杩�"
+ />
</ProFormItemV2>
</ProFormColItem>
</ProFormCol>
@@ -213,7 +324,20 @@
<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"
@@ -222,10 +346,74 @@
start-placeholder="寮�濮嬫棩鏈�"
end-placeholder="缁撴潫鏃ユ湡"
:disabled-date="disabledDate"
+ @change="handleTimeChange"
></ProFormDatePicker>
</ProFormItemV2>
</ProFormColItem>
</ProFormCol>
+ <ProFormCol>
+ <ProFormColItem :span="12">
+ <ProFormItemV2
+ label="鎶ュ悕鏃堕棿:"
+ prop="applyTime"
+ :check-rules="[{ message: '璇烽�夋嫨鎶ュ悕鏃堕棿', type: 'array' }]"
+ >
+ <ProFormDatePicker
+ v-model="form.applyTime"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ :disabled-date="disabledapplyDate"
+ ></ProFormDatePicker>
+ </ProFormItemV2>
+ </ProFormColItem>
+ </ProFormCol>
+ <ProFormCol>
+ <ProFormColItem :span="12">
+ <ProFormItemV2
+ label="楠屾敹鏂瑰紡:"
+ prop="checkReceiveMethods"
+ :check-rules="[{ message: '璇烽�夋嫨楠屾敹鏂瑰紡' }]"
+ >
+ <ProFormCheckbox
+ v-model="form.checkReceiveMethods"
+ :value-enum="EnumTaskCheckReceiveMethodText"
+ :disabled="isEdit"
+ ></ProFormCheckbox>
+ </ProFormItemV2>
+ </ProFormColItem>
+ </ProFormCol>
+ <ProFormItemV2
+ label="淇濋櫓浜у搧:"
+ prop="insuranceProductId"
+ :check-rules="[{ message: '璇烽�夋嫨淇濋櫓浜у搧' }]"
+ v-if="
+ form.checkReceiveMethods.includes(EnumTaskCheckReceiveMethod.CheckIn) &&
+ form.isConfiguredInsurance
+ "
+ >
+ <ProFormSelect
+ v-model="form.insuranceProductId"
+ :value-enum="enterpriseInsuranceProductSelect"
+ @change="calcTaskTotalServiceFee"
+ ></ProFormSelect>
+ </ProFormItemV2>
+ <ProFormItemV2 label="棰勮鏈嶅姟璐规�婚:" prop="totalServiceFee">
+ {{ `${toThousand(form.totalServiceFee)}鍏僠 }}
+ </ProFormItemV2>
+ <ProFormItemV2
+ label="缁撶畻鏂瑰紡:"
+ prop="settlementAccess"
+ :check-rules="[{ message: '璇烽�夋嫨缁撶畻鏂瑰紡' }]"
+ >
+ <ProFormSelect
+ v-model="form.settlementAccess"
+ :value-enum="settlementAccessList"
+ :disabled="isEdit"
+ placeholder="璇烽�夋嫨缁撶畻鏂瑰紡"
+ ></ProFormSelect>
+ </ProFormItemV2>
</ProForm>
<template #footer>
<el-button @click="handleBack()">鍏抽棴</el-button>
@@ -250,6 +438,7 @@
ProFormDatePicker,
ProFormCheckbox,
ProFormSelect,
+ ProFormTextArea,
} from '@bole-core/components';
import { FormInstance, ModelValueType } from 'element-plus';
import { Message } from '@bole-core/core';
@@ -258,6 +447,7 @@
import * as taskServices from '@/services/api/task';
import {
EnumUserGenderTextForEdit,
+ EnumBillingMethod,
EnumBillingMethodText,
EnumBillingMethodUnitText,
EnumSettlementCycleText,
@@ -265,8 +455,10 @@
EnumSettlementCycleDateMonthArray,
EnumSettlementCycleDateWeekArray,
EnumSettlementCycle,
+ EnumTaskCheckReceiveMethodText,
+ EnumTaskCheckReceiveMethod,
} from '@/constants';
-import { format, FormValidator } from '@/utils';
+import { format, FormValidator, toThousand } from '@/utils';
import dayjs from 'dayjs';
defineOptions({
@@ -277,12 +469,23 @@
};
defineProps<Props>();
const route = useRoute();
+const router = useRouter();
const id = route.params.id as string;
const isEdit = !!id;
+
+const { supplierEnterpriseSelect } = useGetSupplierEnterpriseSelect();
function disabledDate(time: Date) {
return dayjs(time).isBefore(dayjs(), 'day');
}
+
+function disabledapplyDate(time: Date) {
+ return dayjs(time).isAfter(dayjs(form.time[1]), 'day') || dayjs(time).isBefore(dayjs(), 'day');
+}
+
+const feeCannotEdit = computed(() => {
+ return dayjs().isAfter(form.time[0], 'second') && isEdit;
+});
const eventContext = useGlobalEventContext();
@@ -313,9 +516,12 @@
});
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[],
@@ -326,6 +532,24 @@
time: [] as unknown as ModelValueType,
weMapInfo: {} as WeMapModel,
addressDetail: '',
+ verifyWorkHours: null as number,
+ timeoutServiceFee: null as number,
+ description: '',
+ checkReceiveMethods: [] as any as EnumTaskCheckReceiveMethod[],
+ applyTime: [] as unknown as ModelValueType,
+ settlementAccess: '' as any as EnumEnterpriseWalletAccess,
+ totalServiceFee: 0,
+
+ insuranceProductId: '',
+ isConfiguredInsurance: false,
+});
+
+const { settlementAccessList } = useEnterpriseWalletAccessSelect({
+ supplierEnterpriseId: computed(() => form.supplierEnterpriseId),
+});
+
+const { enterpriseInsuranceProductSelect } = useEnterpriseInsuranceProductSelect({
+ supplierEnterpriseId: computed(() => form.supplierEnterpriseId),
});
const { isLoading } = useQuery({
@@ -340,8 +564,11 @@
},
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;
@@ -354,6 +581,10 @@
format(data.beginTime, 'YYYY-MM-DD 00:00:00'),
format(data.endTime, 'YYYY-MM-DD 23:59:59'),
];
+ form.applyTime = [
+ format(data.applyBeginTime, 'YYYY-MM-DD 00:00:00'),
+ format(data.applyEndTime, 'YYYY-MM-DD 23:59:59'),
+ ];
form.weMapInfo = {
latitude: data.latitude,
longitude: data.longitude,
@@ -364,6 +595,20 @@
addressName: data.addressName,
};
form.addressDetail = data.addressDetail;
+ form.verifyWorkHours = data.verifyWorkHours;
+ form.timeoutServiceFee = data.timeoutServiceFee;
+ form.description = data.description;
+ 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;
+
+ form.insuranceProductId = data.insuranceProductId ?? '';
+
+ supplierEnterpriseChange();
},
enabled: isEdit,
});
@@ -372,11 +617,17 @@
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;
@@ -388,11 +639,75 @@
}
});
}
+
+// 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;
+// }
+// });
+
+function supplierEnterpriseChange() {
+ if (form.supplierEnterpriseId) {
+ form.isConfiguredInsurance = supplierEnterpriseSelect.value?.find(
+ (item) => item.value === form.supplierEnterpriseId
+ )?.data?.isConfiguredInsurance;
+ }
+}
+
+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'),
+ supplierEnterpriseId: form.supplierEnterpriseId,
+ checkReceiveMethods: form.checkReceiveMethods,
+ };
+ if (form.insuranceProductId) {
+ params.insuranceProductId = form.insuranceProductId;
+ }
+ 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,
@@ -409,17 +724,47 @@
latitude: form.weMapInfo.latitude,
beginTime: dayjs(form.time[0]).format('YYYY-MM-DD 00:00:00'),
endTime: dayjs(form.time[1]).format('YYYY-MM-DD 23:59:59'),
+ applyBeginTime: dayjs(form.applyTime[0]).format('YYYY-MM-DD 00:00:00'),
+ applyEndTime: dayjs(form.applyTime[1]).format('YYYY-MM-DD 23:59:59'),
+ verifyWorkHours: form.verifyWorkHours,
+ timeoutServiceFee: form.timeoutServiceFee,
+ description: form.description,
+ checkReceiveMethods: form.checkReceiveMethods,
+ settlementAccess: form.settlementAccess,
+ insuranceProductId: form.insuranceProductId,
};
+ 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) {
--
Gitblit v1.9.1