diff --git a/src/views/assets/asset/component/editAsset.vue b/src/views/assets/asset/component/editAsset.vue index 770f2ce..2497ebf 100644 --- a/src/views/assets/asset/component/editAsset.vue +++ b/src/views/assets/asset/component/editAsset.vue @@ -45,6 +45,7 @@ format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" class="w100" + @change="onOnlineTimeChange" /> @@ -57,6 +58,7 @@ format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" class="w100" + :disabled-date="disabledOfflineDate" /> @@ -139,19 +141,11 @@ - - 资产描述 - -
- -
-
- 图片信息 - + + + + 资产描述 + +
+ +
+
+ + @@ -361,6 +365,7 @@ interface RuleForm { }; }; metadata: Record; + mainImage?: string; } const emit = defineEmits(['getAssetList']); @@ -450,6 +455,7 @@ const getInitialForm = (): RuleForm => ({ }, }, metadata: {}, + mainImage: '', }); const ruleForm = reactive(getInitialForm()); @@ -462,11 +468,42 @@ const validateOfflineTime = (_rule: any, value: string, callback: Function) => { } }; +const disabledOfflineDate = (time: Date) => { + if (!ruleForm.onlineTime) return false; + return time.getTime() < new Date(ruleForm.onlineTime).setHours(0, 0, 0, 0); +}; + +const validateTimeSlots = (_rule: any, value: TimeSlot[], callback: Function) => { + if (!value || value.length === 0) { + callback(new Error('请至少添加一个服务时间段')); + return; + } + for (let i = 0; i < value.length; i++) { + const slot = value[i]; + if (!slot.dayOfWeek || !slot.startTime || !slot.endTime || !slot.capacity) { + callback(new Error(`第 ${i + 1} 行服务时间配置不完整`)); + return; + } + } + callback(); +}; + +const onOnlineTimeChange = () => { + if (ruleForm.offlineTime) { + formRef.value?.validateField('offlineTime'); + } +}; + const rules: FormRules = { name: [{ required: true, message: '资产名称不能为空', trigger: 'blur' }], type: [{ required: true, message: '请选择资产类型', trigger: 'change' }], categoryId: [{ required: true, message: '请选择资产分类', trigger: 'change' }], offlineTime: [{ validator: validateOfflineTime, trigger: 'change' }], + mainImage: [{ required: true, message: '请上传主图', trigger: 'change' }], + 'serviceAssetConfig.booking.minAdvance': [{ required: true, message: '请输入最小提前时间', trigger: 'blur' }], + 'serviceAssetConfig.booking.minDuration': [{ required: true, message: '请输入最小时长', trigger: 'blur' }], + 'serviceAssetConfig.booking.cancelWindow': [{ required: true, message: '请输入取消提前时间', trigger: 'blur' }], + 'serviceAssetConfig.schedule.timeSlots': [{ validator: validateTimeSlots, trigger: 'change' }], }; // 主图上传处理 @@ -474,6 +511,8 @@ const handleMainImageChange = (file: UploadFile) => { if (file.raw) { mainImageFile.value = file.raw; mainImagePreview.value = URL.createObjectURL(file.raw); + ruleForm.mainImage = 'set'; // 标记已上传 + formRef.value?.validateField('mainImage'); } }; @@ -495,20 +534,34 @@ const handleRemove = (file: UploadFile) => { // 时间段操作 const addTimeSlot = () => { + if (!ruleForm.serviceAssetConfig.schedule) { + ruleForm.serviceAssetConfig.schedule = { timeSlots: [], exceptions: [] }; + } + if (!ruleForm.serviceAssetConfig.schedule.timeSlots) { + ruleForm.serviceAssetConfig.schedule.timeSlots = []; + } ruleForm.serviceAssetConfig.schedule.timeSlots.push({ dayOfWeek: '1', startTime: '09:00', endTime: '18:00', capacity: 100, }); + formRef.value?.validateField('serviceAssetConfig.schedule.timeSlots'); }; const removeTimeSlot = (index: number) => { ruleForm.serviceAssetConfig.schedule.timeSlots.splice(index, 1); + formRef.value?.validateField('serviceAssetConfig.schedule.timeSlots'); }; // 例外日期操作 const addException = () => { + if (!ruleForm.serviceAssetConfig.schedule) { + ruleForm.serviceAssetConfig.schedule = { timeSlots: [], exceptions: [] }; + } + if (!ruleForm.serviceAssetConfig.schedule.exceptions) { + ruleForm.serviceAssetConfig.schedule.exceptions = []; + } ruleForm.serviceAssetConfig.schedule.exceptions.push({ exceptionType: 'date', date: '', @@ -596,6 +649,7 @@ const openDialog = (row?: any, edit?: boolean) => { // 主图预览 if (data.imageUrl) { mainImagePreview.value = formatImageUrl(data.imageUrl); + ruleForm.mainImage = data.imageUrl; } // 图片列表 @@ -615,6 +669,31 @@ const openDialog = (row?: any, edit?: boolean) => { } if (data.type === 'service' && data.serviceAssetConfig) { Object.assign(ruleForm.serviceAssetConfig, data.serviceAssetConfig); + // 确保 schedule 对象存在 + if (!ruleForm.serviceAssetConfig.schedule) { + ruleForm.serviceAssetConfig.schedule = { timeSlots: [], exceptions: [] }; + } + // 确保数组存在,防止后端返回 null 或 undefined 导致 push 报错 + if (!ruleForm.serviceAssetConfig.schedule.exceptions) { + ruleForm.serviceAssetConfig.schedule.exceptions = []; + } else { + // 补充缺失的 exceptionType + ruleForm.serviceAssetConfig.schedule.exceptions.forEach((exc) => { + if (!exc.exceptionType) { + if (exc.date) { + exc.exceptionType = 'date'; + } else if (exc.dayOfWeek) { + exc.exceptionType = 'dayOfWeek'; + } else { + // 默认值 + exc.exceptionType = 'date'; + } + } + }); + } + if (!ruleForm.serviceAssetConfig.schedule.timeSlots) { + ruleForm.serviceAssetConfig.schedule.timeSlots = []; + } } // 元数据