From f30ddaf40025888bcf0d231bae2e680e239b1428 Mon Sep 17 00:00:00 2001
From: WUSIJIAN <13825895+wsj0228@user.noreply.gitee.com>
Date: Tue, 23 Dec 2025 13:10:26 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B5=84=E4=BA=A7=E7=BC=96?=
=?UTF-8?q?=E8=BE=91=E8=A1=A8=E5=8D=95=E9=AA=8C=E8=AF=81=E5=92=8C=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E8=B5=84=E4=BA=A7=E9=85=8D=E7=BD=AE,=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E4=B8=8A=E4=B8=8B=E7=BA=BF=E6=97=B6=E9=97=B4=E8=81=94?=
=?UTF-8?q?=E5=8A=A8=E6=A0=A1=E9=AA=8C=E3=80=81=E4=B8=BB=E5=9B=BE=E5=BF=85?=
=?UTF-8?q?=E5=A1=AB=E6=A0=A1=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../assets/asset/component/editAsset.vue | 109 +++++++++++++++---
1 file changed, 94 insertions(+), 15 deletions(-)
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 = [];
+ }
}
// 元数据