|
|
@@ -76,7 +76,7 @@
|
|
|
<el-form-item class="activity-time-item" label="报名时间" prop="signupTimeRange">
|
|
|
<el-date-picker
|
|
|
v-model="activityModel.signupTimeRange"
|
|
|
- :disabled-date="disabledSignupDate"
|
|
|
+ :disabled-date="disabledDate"
|
|
|
class="form-input"
|
|
|
end-placeholder="结束日期"
|
|
|
format="YYYY/MM/DD"
|
|
|
@@ -91,12 +91,10 @@
|
|
|
<el-form-item label="活动限制人数">
|
|
|
<el-input
|
|
|
v-model="activityModel.activityLimitPeople"
|
|
|
- style="width: 94%"
|
|
|
placeholder="请输入"
|
|
|
maxlength="20"
|
|
|
@input="handlePositiveIntegerInput('activityLimitPeople', $event)"
|
|
|
/>
|
|
|
- <div style="width: 6%; text-align: right">人</div>
|
|
|
</el-form-item>
|
|
|
|
|
|
<!-- 活动详情 -->
|
|
|
@@ -174,7 +172,6 @@
|
|
|
:before-remove="handleBeforeRemove"
|
|
|
:disabled="hasUnuploadedImages"
|
|
|
:limit="9"
|
|
|
- :multiple="true"
|
|
|
:on-change="handleDetailUploadChange"
|
|
|
:on-exceed="handleDetailUploadExceed"
|
|
|
:on-preview="handlePictureCardPreview"
|
|
|
@@ -316,6 +313,17 @@ const rules = reactive({
|
|
|
return;
|
|
|
}
|
|
|
callback();
|
|
|
+ // 活动时间验证通过后,重新验证报名时间(如果已设置)
|
|
|
+ if (
|
|
|
+ activityModel.value.activityType === 1 &&
|
|
|
+ activityModel.value.signupTimeRange &&
|
|
|
+ Array.isArray(activityModel.value.signupTimeRange) &&
|
|
|
+ activityModel.value.signupTimeRange.length === 2
|
|
|
+ ) {
|
|
|
+ nextTick(() => {
|
|
|
+ ruleFormRef.value?.validateField("signupTimeRange");
|
|
|
+ });
|
|
|
+ }
|
|
|
},
|
|
|
trigger: "change"
|
|
|
}
|
|
|
@@ -418,14 +426,19 @@ const rules = reactive({
|
|
|
callback(new Error("报名开始时间必须早于报名结束时间"));
|
|
|
return;
|
|
|
}
|
|
|
- // 检查报名时间是否在活动结束时间之后
|
|
|
- if (activityModel.value.activityTimeRange && activityModel.value.activityTimeRange.length === 2) {
|
|
|
- const activityEndTime = new Date(activityModel.value.activityTimeRange[1]);
|
|
|
- activityEndTime.setHours(0, 0, 0, 0);
|
|
|
- start.setHours(0, 0, 0, 0);
|
|
|
- if (start <= activityEndTime) {
|
|
|
- callback(new Error("报名开始时间必须在活动结束时间之后"));
|
|
|
- return;
|
|
|
+ // 检查报名结束时间是否在活动开始时间之前
|
|
|
+ if (
|
|
|
+ activityModel.value.activityTimeRange &&
|
|
|
+ Array.isArray(activityModel.value.activityTimeRange) &&
|
|
|
+ activityModel.value.activityTimeRange.length === 2
|
|
|
+ ) {
|
|
|
+ const [activityStartTime] = activityModel.value.activityTimeRange;
|
|
|
+ if (activityStartTime) {
|
|
|
+ const activityStart = new Date(activityStartTime);
|
|
|
+ if (end >= activityStart) {
|
|
|
+ callback(new Error("报名结束时间必须在活动开始时间之前"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -546,27 +559,6 @@ const disabledDate = (time: Date) => {
|
|
|
return time.getTime() < today.getTime();
|
|
|
};
|
|
|
|
|
|
-// 禁用报名日期(不能早于今天,且不能早于活动结束时间)
|
|
|
-const disabledSignupDate = (time: Date) => {
|
|
|
- const today = new Date();
|
|
|
- today.setHours(0, 0, 0, 0);
|
|
|
-
|
|
|
- // 不能早于今天
|
|
|
- if (time.getTime() < today.getTime()) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- // 如果已选择活动时间,报名时间不能早于活动结束时间
|
|
|
- if (activityModel.value.activityTimeRange && activityModel.value.activityTimeRange.length === 2) {
|
|
|
- const activityEndTime = new Date(activityModel.value.activityTimeRange[1]);
|
|
|
- activityEndTime.setHours(0, 0, 0, 0);
|
|
|
- // 报名时间必须晚于活动结束时间(不能等于)
|
|
|
- return time.getTime() <= activityEndTime.getTime();
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-};
|
|
|
-
|
|
|
// ==================== 图片参数转换函数 ====================
|
|
|
|
|
|
/**
|
|
|
@@ -745,21 +737,14 @@ const handleTitleUploadChange: UploadProps["onChange"] = async (uploadFile, uplo
|
|
|
titleFileList.value.push(uploadFile);
|
|
|
}
|
|
|
|
|
|
- // 使用 nextTick 确保所有文件的 onChange 事件都处理完毕后再统一处理队列
|
|
|
- await nextTick();
|
|
|
-
|
|
|
- // 重新收集所有待上传的文件(包括新添加的和之前未上传的)
|
|
|
- const readyFiles = titleFileList.value.filter(file => (file.status === "ready" || file.status === undefined) && file.raw);
|
|
|
-
|
|
|
- // 清空并重新填充待上传队列
|
|
|
- pendingUploadFiles.value = [];
|
|
|
- readyFiles.forEach(file => {
|
|
|
- if (!pendingUploadFiles.value.some(item => item.uid === file.uid)) {
|
|
|
- pendingUploadFiles.value.push(file);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- // 处理上传队列
|
|
|
+ const readyFiles = titleFileList.value.filter(file => file.status === "ready");
|
|
|
+ if (readyFiles.length) {
|
|
|
+ readyFiles.forEach(file => {
|
|
|
+ if (!pendingUploadFiles.value.some(item => item.uid === file.uid)) {
|
|
|
+ pendingUploadFiles.value.push(file);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
processUploadQueue("title");
|
|
|
};
|
|
|
|
|
|
@@ -821,21 +806,14 @@ const handleDetailUploadChange: UploadProps["onChange"] = async (uploadFile, upl
|
|
|
detailFileList.value.push(uploadFile);
|
|
|
}
|
|
|
|
|
|
- // 使用 nextTick 确保所有文件的 onChange 事件都处理完毕后再统一处理队列
|
|
|
- await nextTick();
|
|
|
-
|
|
|
- // 重新收集所有待上传的文件(包括新添加的和之前未上传的)
|
|
|
- const readyFiles = detailFileList.value.filter(file => (file.status === "ready" || file.status === undefined) && file.raw);
|
|
|
-
|
|
|
- // 清空并重新填充待上传队列
|
|
|
- pendingUploadFiles.value = [];
|
|
|
- readyFiles.forEach(file => {
|
|
|
- if (!pendingUploadFiles.value.some(item => item.uid === file.uid)) {
|
|
|
- pendingUploadFiles.value.push(file);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- // 处理上传队列
|
|
|
+ const readyFiles = detailFileList.value.filter(file => file.status === "ready");
|
|
|
+ if (readyFiles.length) {
|
|
|
+ readyFiles.forEach(file => {
|
|
|
+ if (!pendingUploadFiles.value.some(item => item.uid === file.uid)) {
|
|
|
+ pendingUploadFiles.value.push(file);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
processUploadQueue("detail");
|
|
|
};
|
|
|
|
|
|
@@ -843,27 +821,14 @@ const handleDetailUploadChange: UploadProps["onChange"] = async (uploadFile, upl
|
|
|
* 处理上传队列 - 逐个上传文件
|
|
|
*/
|
|
|
const processUploadQueue = async (type: string) => {
|
|
|
- // 如果正在上传或队列为空,直接返回
|
|
|
if (uploading.value || pendingUploadFiles.value.length === 0) {
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // 从队列中取出第一个文件
|
|
|
const file = pendingUploadFiles.value.shift();
|
|
|
- if (!file || !file.raw) {
|
|
|
- // 如果文件无效,继续处理下一个
|
|
|
+ if (file) {
|
|
|
+ await uploadSingleFile(file, type);
|
|
|
processUploadQueue(type);
|
|
|
- return;
|
|
|
}
|
|
|
-
|
|
|
- // 上传文件
|
|
|
- await uploadSingleFile(file, type);
|
|
|
-
|
|
|
- // 上传完成后,继续处理队列中的下一个文件
|
|
|
- // 使用 setTimeout 确保状态已更新
|
|
|
- setTimeout(() => {
|
|
|
- processUploadQueue(type);
|
|
|
- }, 100);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -1051,37 +1016,21 @@ watch(
|
|
|
);
|
|
|
|
|
|
/**
|
|
|
- * 监听活动时间变化,如果报名时间不符合要求则清空并提示
|
|
|
+ * 监听活动时间变化,重新验证报名时间
|
|
|
*/
|
|
|
watch(
|
|
|
() => activityModel.value.activityTimeRange,
|
|
|
- (newVal, oldVal) => {
|
|
|
- // 初始化时不处理
|
|
|
- if (oldVal === undefined || oldVal === null) return;
|
|
|
-
|
|
|
- // 只有营销活动才需要检查报名时间
|
|
|
- if (activityModel.value.activityType !== 1) return;
|
|
|
-
|
|
|
- // 如果活动时间已选择且报名时间已选择
|
|
|
+ () => {
|
|
|
+ // 当活动时间改变时,如果已设置报名时间,重新验证报名时间
|
|
|
if (
|
|
|
- newVal &&
|
|
|
- newVal.length === 2 &&
|
|
|
+ activityModel.value.activityType === 1 &&
|
|
|
activityModel.value.signupTimeRange &&
|
|
|
+ Array.isArray(activityModel.value.signupTimeRange) &&
|
|
|
activityModel.value.signupTimeRange.length === 2
|
|
|
) {
|
|
|
- const activityEndTime = new Date(newVal[1]);
|
|
|
- activityEndTime.setHours(0, 0, 0, 0);
|
|
|
- const signupStartTime = new Date(activityModel.value.signupTimeRange[0]);
|
|
|
- signupStartTime.setHours(0, 0, 0, 0);
|
|
|
-
|
|
|
- // 如果报名开始时间早于或等于活动结束时间,清空报名时间并提示
|
|
|
- if (signupStartTime <= activityEndTime) {
|
|
|
- activityModel.value.signupTimeRange = [];
|
|
|
- nextTick(() => {
|
|
|
- ruleFormRef.value?.clearValidate("signupTimeRange");
|
|
|
- ElMessage.warning("报名开始时间必须在活动结束时间之后,请重新选择报名时间");
|
|
|
- });
|
|
|
- }
|
|
|
+ nextTick(() => {
|
|
|
+ ruleFormRef.value?.validateField("signupTimeRange");
|
|
|
+ });
|
|
|
}
|
|
|
}
|
|
|
);
|