|
|
@@ -44,7 +44,7 @@
|
|
|
</el-form-item>
|
|
|
<!-- 团购名称 -->
|
|
|
<el-form-item label="团购名称" prop="groupName">
|
|
|
- <el-input maxlength="50" v-model="storeInfoModel.groupName" placeholder="请填写团购名称" clearable />
|
|
|
+ <el-input maxlength="30" v-model="storeInfoModel.groupName" placeholder="请填写团购名称" clearable />
|
|
|
</el-form-item>
|
|
|
<!-- 开始售卖时间设置方式 -->
|
|
|
<el-form-item label="开始售卖时间" prop="startTimeType">
|
|
|
@@ -145,7 +145,7 @@
|
|
|
>
|
|
|
<div class="category-row">
|
|
|
<span class="label">类别</span>
|
|
|
- <el-input v-model="item.group.groupName" placeholder="请输入" clearable />
|
|
|
+ <el-input v-model="item.group.groupName" placeholder="请输入" maxlength="10" clearable />
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<!-- 第一行菜品,始终显示 -->
|
|
|
@@ -322,7 +322,15 @@
|
|
|
</template>
|
|
|
<el-form-item label="" prop="customUnavailableDates" v-else-if="storeInfoModel.disableDateType == 2">
|
|
|
<div class="date-picker-container">
|
|
|
- <el-button :icon="Plus" class="add-date-btn" type="primary" @click="addDate"> 添加日期 </el-button>
|
|
|
+ <el-button
|
|
|
+ :icon="Plus"
|
|
|
+ class="add-date-btn"
|
|
|
+ type="primary"
|
|
|
+ :disabled="storeInfoModel.disableDateList.length >= 10"
|
|
|
+ @click="addDate"
|
|
|
+ >
|
|
|
+ 添加日期
|
|
|
+ </el-button>
|
|
|
<div v-for="(item, index) in storeInfoModel.disableDateList" :key="index" class="date-item">
|
|
|
<el-date-picker
|
|
|
v-model="storeInfoModel.disableDateList[index]"
|
|
|
@@ -354,6 +362,7 @@
|
|
|
:rows="4"
|
|
|
type="textarea"
|
|
|
placeholder="请输入预约规则"
|
|
|
+ show-word-limit
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 使用规则 prop="useRules"-->
|
|
|
@@ -364,6 +373,7 @@
|
|
|
:rows="4"
|
|
|
type="textarea"
|
|
|
placeholder="请输入使用规则"
|
|
|
+ show-word-limit
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 适用人数 -->
|
|
|
@@ -378,6 +388,7 @@
|
|
|
:rows="4"
|
|
|
type="textarea"
|
|
|
placeholder="请输入其他规则"
|
|
|
+ show-word-limit
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 发票信息 prop="invoiceInformation"-->
|
|
|
@@ -575,7 +586,24 @@ const rules = reactive({
|
|
|
inventoryNum: [
|
|
|
{ required: true, message: "请填写库存数量" },
|
|
|
{
|
|
|
- validator: validatePositiveInteger("库存数量必须为正整数", { required: false }),
|
|
|
+ validator: (rule: any, value: any, callback: any) => {
|
|
|
+ // 先验证是否为正整数
|
|
|
+ validatePositiveInteger("库存数量必须为正整数", { required: false })(rule, value, (error: any) => {
|
|
|
+ if (error) {
|
|
|
+ callback(error);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 验证最大值
|
|
|
+ if (value) {
|
|
|
+ const numValue = Number(value);
|
|
|
+ if (!isNaN(numValue) && numValue > 99999) {
|
|
|
+ callback(new Error("库存数量不得大于99999"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ });
|
|
|
+ },
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
@@ -618,9 +646,9 @@ const rules = reactive({
|
|
|
}
|
|
|
],
|
|
|
originalPrice: [
|
|
|
- { required: true, message: "请输入原价" },
|
|
|
{
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
+ // 非必填,如果为空则直接通过
|
|
|
if (!value || value.toString().trim() === "") {
|
|
|
callback();
|
|
|
return;
|
|
|
@@ -633,6 +661,10 @@ const rules = reactive({
|
|
|
callback();
|
|
|
},
|
|
|
trigger: "blur"
|
|
|
+ },
|
|
|
+ {
|
|
|
+ validator: validatePriceFormat("整数部分最多6位,小数部分最多2位"),
|
|
|
+ trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
preferentialPrice: [
|
|
|
@@ -720,12 +752,62 @@ const rules = reactive({
|
|
|
callback(new Error("至少需要添加一个自定义不可用日期"));
|
|
|
return;
|
|
|
}
|
|
|
- validateDateListArray(
|
|
|
- () => storeInfoModel.value.disableDateList,
|
|
|
- "日期项未完整填写",
|
|
|
- "开始时间必须早于结束时间",
|
|
|
- true
|
|
|
- )(rule, value, callback);
|
|
|
+
|
|
|
+ const dateList = storeInfoModel.value.disableDateList;
|
|
|
+ const today = new Date();
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
+
|
|
|
+ // 用于存储所有日期范围,用于检查重复
|
|
|
+ const dateRanges: Array<{ start: Date; end: Date; index: number }> = [];
|
|
|
+
|
|
|
+ for (let i = 0; i < dateList.length; i++) {
|
|
|
+ const dateItem = dateList[i];
|
|
|
+ if (!dateItem || !Array.isArray(dateItem) || dateItem.length !== 2) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项未完整填写`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const startDate = new Date(dateItem[0]);
|
|
|
+ const endDate = new Date(dateItem[1]);
|
|
|
+ startDate.setHours(0, 0, 0, 0);
|
|
|
+ endDate.setHours(0, 0, 0, 0);
|
|
|
+
|
|
|
+ // 验证不能早于今天
|
|
|
+ if (startDate < today) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项的开始时间不能早于当前时间`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (endDate < today) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项的结束时间不能早于当前时间`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证开始时间不能晚于结束时间(允许相等,即可以选择单天)
|
|
|
+ if (startDate > endDate) {
|
|
|
+ callback(new Error(`第${i + 1}个日期项的开始时间不能晚于结束时间`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 存储日期范围用于重复检查
|
|
|
+ dateRanges.push({ start: startDate, end: endDate, index: i });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查日期范围是否重复
|
|
|
+ for (let i = 0; i < dateRanges.length; i++) {
|
|
|
+ for (let j = i + 1; j < dateRanges.length; j++) {
|
|
|
+ const range1 = dateRanges[i];
|
|
|
+ const range2 = dateRanges[j];
|
|
|
+
|
|
|
+ // 检查两个日期范围是否有重叠
|
|
|
+ // 重叠条件:range1的开始时间 <= range2的结束时间 && range1的结束时间 >= range2的开始时间
|
|
|
+ if (range1.start.getTime() <= range2.end.getTime() && range1.end.getTime() >= range2.start.getTime()) {
|
|
|
+ callback(new Error(`第${range1.index + 1}个日期项与第${range2.index + 1}个日期项存在重复,请重新选择`));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ callback();
|
|
|
} else {
|
|
|
callback();
|
|
|
}
|
|
|
@@ -736,9 +818,34 @@ const rules = reactive({
|
|
|
reservationRules: [{ required: true, message: "请输入预约规则" }],
|
|
|
useRules: [{ required: true, message: "请输入使用规则" }],
|
|
|
applicableNum: [
|
|
|
- { required: true, message: "请输入适用人数" },
|
|
|
{
|
|
|
- validator: validatePositiveInteger("适用人数必须为正整数", { required: false }),
|
|
|
+ validator: (rule: any, value: any, callback: any) => {
|
|
|
+ // 非必填,如果为空则直接通过
|
|
|
+ if (!value || value.toString().trim() === "") {
|
|
|
+ callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 先验证是否为正整数
|
|
|
+ validatePositiveInteger("适用人数必须为正整数", { required: false })(rule, value, (error: any) => {
|
|
|
+ if (error) {
|
|
|
+ callback(error);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 验证范围:1-99999
|
|
|
+ const numValue = Number(value);
|
|
|
+ if (!isNaN(numValue)) {
|
|
|
+ if (numValue < 1) {
|
|
|
+ callback(new Error("适用人数不能小于1"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (numValue > 99999) {
|
|
|
+ callback(new Error("适用人数不能大于99999"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ });
|
|
|
+ },
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
@@ -1323,6 +1430,11 @@ const handlePictureCardPreview = (file: any) => {
|
|
|
* 添加自定义不可用日期
|
|
|
*/
|
|
|
const addDate = () => {
|
|
|
+ // 检查最大数量限制
|
|
|
+ if (storeInfoModel.value.disableDateList.length >= 10) {
|
|
|
+ ElMessage.warning("最多只能添加10个自定义不可用日期");
|
|
|
+ return;
|
|
|
+ }
|
|
|
storeInfoModel.value.disableDateList.push(null);
|
|
|
};
|
|
|
|
|
|
@@ -1797,6 +1909,11 @@ const packageFormRules = computed(() => {
|
|
|
return;
|
|
|
}
|
|
|
const trimmedValue = value.toString().trim();
|
|
|
+ // 检查长度(不得大于10字)
|
|
|
+ if (trimmedValue.length > 10) {
|
|
|
+ callback(new Error("类别不得大于10字"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
// 检查是否与其他分组的类别重复
|
|
|
for (let i = 0; i < lifeGroupBuyThalis.value.length; i++) {
|
|
|
// 跳过当前分组
|
|
|
@@ -1836,9 +1953,26 @@ const packageFormRules = computed(() => {
|
|
|
trigger: "blur"
|
|
|
},
|
|
|
{
|
|
|
- validator: validatePositiveInteger(`第${groupIndex + 1}个分组的第${dishIndex + 1}个菜品数量必须为正整数`, {
|
|
|
- required: false
|
|
|
- }),
|
|
|
+ validator: (rule: any, value: any, callback: any) => {
|
|
|
+ // 先验证是否为正整数
|
|
|
+ validatePositiveInteger(`第${groupIndex + 1}个分组的第${dishIndex + 1}个菜品数量必须为正整数`, {
|
|
|
+ required: false
|
|
|
+ })(rule, value, (error: any) => {
|
|
|
+ if (error) {
|
|
|
+ callback(error);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 验证最大值
|
|
|
+ if (value) {
|
|
|
+ const numValue = Number(value);
|
|
|
+ if (!isNaN(numValue) && numValue > 99999) {
|
|
|
+ callback(new Error("数量不得大于99999"));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+ });
|
|
|
+ },
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
];
|