diff --git a/src/views/business/erp/service/service-applications-form.vue b/src/views/business/erp/service/service-applications-form.vue index 3121168..68f9e4b 100644 --- a/src/views/business/erp/service/service-applications-form.vue +++ b/src/views/business/erp/service/service-applications-form.vue @@ -516,6 +516,24 @@ return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; } + // 按活动配置同步服务时长。编辑旧记录时保留已有值,但固定时长记录为空时必须补回配置值。 + function syncActivityDuration(activity, preserveExisting = false) { + if (!activity || activity.timeType !== 'TIME') { + return; + } + const configuredDuration = String(activity.price ?? '').trim(); + const hasExistingDuration = form.serviceDuration !== undefined && form.serviceDuration !== null && form.serviceDuration !== ''; + if (preserveExisting && hasExistingDuration) { + return; + } + if (configuredDuration.includes('-')) { + form.serviceDuration = undefined; + return; + } + const fixedDuration = Number(configuredDuration || 25); + form.serviceDuration = Number.isFinite(fixedDuration) ? fixedDuration : 25; + } + async function show(rowData, isDetail = false) { initializingForm.value = true; Object.assign(form, formDefault); @@ -596,6 +614,7 @@ } // 将timeType放入serviceType字段中传递给后端 form.serviceType = selectedActivity.timeType || ''; + syncActivityDuration(selectedActivity, true); } } } @@ -894,29 +913,22 @@ // 将timeType放入serviceType字段中传递给后端 form.serviceType = selectedActivity.timeType || ''; - // 根据活动类型设置默认服务时长 - // 只有在非编辑模式下(即新建模式)才设置默认服务时长 - if (!form.applicationId) { + // 新增或用户在编辑页切换活动时按新活动配置重置;编辑初始化仅在旧值为空时补固定时长。 + const activityChangedByUser = + !initializingForm.value && + oldActivityNameId != null && + String(activityNameId) !== String(oldActivityNameId); + if (!form.applicationId || activityChangedByUser) { if (selectedActivity.timeType === 'TIME') { - // 检查活动是否有固定小时数(使用price字段) - if (selectedActivity.price) { - // 如果价格包含范围(有-),让用户自己填写 - if (selectedActivity.price.includes('-')) { - form.serviceDuration = undefined; - } else { - // 固定使用活动中的小时数 - form.serviceDuration = parseFloat(selectedActivity.price); - } - } else { - // 默认值 - form.serviceDuration = 25; - } + syncActivityDuration(selectedActivity, false); } else if (['AMOUNT', 'AMOUT'].includes(selectedActivity.timeType)) { form.serviceDuration = undefined; } else if (selectedActivity.timeType === 'DICT') { // DICT类型:清空服务时长,让用户通过选择时间或手动填写 form.serviceDuration = undefined; } + } else { + syncActivityDuration(selectedActivity, true); } } } else { @@ -953,6 +965,9 @@ if (dayjs(value).isAfter(dayjs())) { return Promise.reject('活动结束时间不能晚于当前时间'); } + if (form.serviceStart && !dayjs(value).isAfter(dayjs(form.serviceStart))) { + return Promise.reject('活动结束时间必须晚于开始时间'); + } return Promise.resolve(); }, }, diff --git a/src/views/mobile/service/create.vue b/src/views/mobile/service/create.vue index 8e5c3bf..d07e72f 100644 --- a/src/views/mobile/service/create.vue +++ b/src/views/mobile/service/create.vue @@ -586,6 +586,23 @@ } // 监听活动名称变化,更新活动类型和设置默认服务时长 + function syncActivityDuration(activity, preserveExisting = false) { + if (!activity || activity.timeType !== 'TIME') { + return; + } + const configuredDuration = String(activity.price ?? '').trim(); + const hasExistingDuration = form.serviceDuration !== undefined && form.serviceDuration !== null && form.serviceDuration !== ''; + if (preserveExisting && hasExistingDuration) { + return; + } + if (configuredDuration.includes('-')) { + form.serviceDuration = undefined; + return; + } + const fixedDuration = Number(configuredDuration || 25); + form.serviceDuration = Number.isFinite(fixedDuration) ? fixedDuration : 25; + } + watch( () => form.activityNameId, (activityNameId, oldActivityNameId) => { @@ -623,23 +640,14 @@ console.log('更新后的currentActivityType:', currentActivityType.value); console.log('当前form.serviceDuration:', form.serviceDuration); - // 根据活动类型设置默认服务时长 - // 只有在非编辑模式下(即新建模式)才设置默认服务时长 - if (!isEditMode.value) { + // 新增或用户在编辑页切换活动时按新活动配置重置;编辑初始化仅在旧值为空时补固定时长。 + const activityChangedByUser = + !initializingForm.value && + oldActivityNameId != null && + String(activityNameId) !== String(oldActivityNameId); + if (!isEditMode.value || activityChangedByUser) { if (selectedActivity.timeType === 'TIME') { - // 检查活动是否有固定小时数(使用price字段) - if (selectedActivity.price) { - // 如果价格包含范围(有-),让用户自己填写 - if (selectedActivity.price.includes('-')) { - form.serviceDuration = undefined; - } else { - // 固定使用活动中的小时数 - form.serviceDuration = parseFloat(selectedActivity.price); - } - } else { - // 默认值 - form.serviceDuration = 25; - } + syncActivityDuration(selectedActivity, false); } else if (['AMOUNT', 'AMOUT'].includes(selectedActivity.timeType)) { form.serviceDuration = undefined; } else if (selectedActivity.timeType === 'DICT') { @@ -648,6 +656,7 @@ } console.log('设置后的form.serviceDuration:', form.serviceDuration); } else { + syncActivityDuration(selectedActivity, true); console.log('编辑模式下,保留原有的form.serviceDuration:', form.serviceDuration); } @@ -766,6 +775,11 @@ return; } + if (!dayjs(form.serviceEnd).isAfter(dayjs(form.serviceStart))) { + message.error('服务结束时间必须晚于开始时间'); + return; + } + if (!form.serviceDuration) { message.error('请填写服务时长'); return; @@ -905,6 +919,11 @@ return; } + if (!dayjs(form.serviceEnd).isAfter(dayjs(form.serviceStart))) { + message.error('服务结束时间必须晚于开始时间'); + return; + } + if (!form.serviceDuration) { message.error('请填写服务时长'); return; @@ -1091,6 +1110,7 @@ loadSameFirmLawyers(); } form.serviceType = selectedActivity.timeType || ''; + syncActivityDuration(selectedActivity, true); } else { } } else {