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 @@
-
- 资产描述
-
-
-
-
-
-
图片信息
-
+
+
+
+ 资产描述
+
+
+
+
+
+
+
实物资产配置
@@ -204,19 +208,19 @@
-
+
分钟
-
+
分钟
-
+
分钟
@@ -224,7 +228,7 @@
-
+
@@ -249,7 +253,7 @@
-
+
@@ -267,7 +271,7 @@
-
添加例外
+
添加休息时间
@@ -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 = [];
+ }
}
// 元数据