|
|
@@ -9,9 +9,9 @@
|
|
|
<div class="model">
|
|
|
<h3 style="font-weight: bold">基础信息:</h3>
|
|
|
<!-- 团购图片上传 -->
|
|
|
- <el-form-item label="图片" prop="fileList">
|
|
|
+ <el-form-item label="图片" prop="imageList">
|
|
|
<el-upload
|
|
|
- v-model:file-list="storeInfoModel.fileList"
|
|
|
+ v-model:file-list="storeInfoModel.imageList"
|
|
|
:action="uploadUrl"
|
|
|
list-type="picture-card"
|
|
|
:accept="'.jpg,.png'"
|
|
|
@@ -28,24 +28,23 @@
|
|
|
</el-upload>
|
|
|
</el-form-item>
|
|
|
<!-- 团购名称 -->
|
|
|
- <el-form-item label="团购名称" prop="storeName">
|
|
|
- <el-input maxlength="50" v-model="storeInfoModel.storeName" placeholder="请填写团购名称" clearable />
|
|
|
+ <el-form-item label="团购名称" prop="groupName">
|
|
|
+ <el-input maxlength="50" v-model="storeInfoModel.groupName" placeholder="请填写团购名称" clearable />
|
|
|
</el-form-item>
|
|
|
<!-- 开始售卖时间设置方式 -->
|
|
|
- <el-form-item label="开始售卖时间" prop="storeStatus">
|
|
|
- <el-radio-group v-model="storeInfoModel.storeStatus" class="ml-4">
|
|
|
+ <el-form-item label="开始售卖时间" prop="startTimeType">
|
|
|
+ <el-radio-group v-model="storeInfoModel.startTimeType" class="ml-4">
|
|
|
<el-radio v-for="status in storeStatusList" :value="status.value" :key="status.value">
|
|
|
{{ status.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
<!-- 自定义开始售卖时间(当选择"设置售卖时间"时显示) -->
|
|
|
- <el-form-item label="" prop="startTime" v-if="storeInfoModel.storeStatus == 1">
|
|
|
+ <el-form-item label="" prop="saleTimeStr" v-if="storeInfoModel.startTimeType == 1">
|
|
|
<el-date-picker
|
|
|
- v-model="storeInfoModel.startTime"
|
|
|
- format="YYYY/MM/DD hh:mm:ss"
|
|
|
- value-format="YYYY-MM-DD h:m:s"
|
|
|
- type="datetime"
|
|
|
+ v-model="storeInfoModel.saleTimeStr"
|
|
|
+ format="YYYY/MM/DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
placeholder="请选择开始售卖时间"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
@@ -53,27 +52,26 @@
|
|
|
<el-form-item label="结束售卖时间" prop="endTime">
|
|
|
<el-date-picker
|
|
|
v-model="storeInfoModel.endTime"
|
|
|
- format="YYYY/MM/DD hh:mm:ss"
|
|
|
- value-format="YYYY-MM-DD h:m:s"
|
|
|
- type="datetime"
|
|
|
+ format="YYYY/MM/DD"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
placeholder="请选择结束售卖时间"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 库存数量 -->
|
|
|
- <el-form-item label="库存数量" prop="stockQuantity">
|
|
|
- <el-input v-model="storeInfoModel.stockQuantity" maxlength="15" placeholder="请填写库存数量" clearable />
|
|
|
+ <el-form-item label="库存数量" prop="inventoryNum">
|
|
|
+ <el-input v-model="storeInfoModel.inventoryNum" maxlength="15" placeholder="请填写库存数量" clearable />
|
|
|
</el-form-item>
|
|
|
<!-- 每人限购设置 -->
|
|
|
- <el-form-item label="每人限购" prop="purchaseLimitPerPerson">
|
|
|
- <el-radio-group v-model="storeInfoModel.purchaseLimitPerPerson" class="ml-4">
|
|
|
+ <el-form-item label="每人限购" prop="quotaType">
|
|
|
+ <el-radio-group v-model="storeInfoModel.quotaType" class="ml-4">
|
|
|
<el-radio v-for="status in perList" :value="status.value" :key="status.value">
|
|
|
{{ status.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
<!-- 自定义限购数量(当选择"自定义限购数量"时显示) -->
|
|
|
- <el-form-item label="" prop="purchaseLimit" v-if="storeInfoModel.purchaseLimitPerPerson == 1">
|
|
|
- <el-input v-model="storeInfoModel.purchaseLimit" maxlength="15" placeholder="请填写自定义限购数量" clearable />
|
|
|
+ <el-form-item label="" prop="quotaValue" v-if="storeInfoModel.quotaType == 1">
|
|
|
+ <el-input v-model="storeInfoModel.quotaValue" maxlength="15" placeholder="请填写自定义限购数量" clearable />
|
|
|
</el-form-item>
|
|
|
<!-- 套餐内容 -->
|
|
|
<el-form-item label="套餐内容" prop="packageContent" class="package-content-item">
|
|
|
@@ -140,12 +138,12 @@
|
|
|
<div class="model">
|
|
|
<h3 style="font-weight: bold">价格:</h3>
|
|
|
<!-- 原价 -->
|
|
|
- <el-form-item label="原价" prop="price">
|
|
|
- <el-input maxlength="50" v-model="storeInfoModel.price" placeholder="请填写原价" clearable />
|
|
|
+ <el-form-item label="原价" prop="originalPrice">
|
|
|
+ <el-input maxlength="50" v-model="storeInfoModel.originalPrice" placeholder="请填写原价" clearable />
|
|
|
</el-form-item>
|
|
|
<!-- 优惠价 -->
|
|
|
- <el-form-item label="优惠价" prop="discountedPrice">
|
|
|
- <el-input maxlength="50" v-model="storeInfoModel.discountedPrice" placeholder="请填写优惠价" clearable />
|
|
|
+ <el-form-item label="优惠价" prop="preferentialPrice">
|
|
|
+ <el-input maxlength="50" v-model="storeInfoModel.preferentialPrice" placeholder="请填写优惠价" clearable />
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -154,43 +152,38 @@
|
|
|
<!-- 购买须知模块 -->
|
|
|
<div class="model">
|
|
|
<h3 style="font-weight: bold">购买须知:</h3>
|
|
|
- <el-form-item label="有效期" prop="expirationDate">
|
|
|
- <el-radio-group v-model="storeInfoModel.expirationDate" class="ml-4">
|
|
|
+ <el-form-item label="有效期" prop="effectiveDateType">
|
|
|
+ <el-radio-group v-model="storeInfoModel.effectiveDateType" class="ml-4">
|
|
|
<el-radio v-for="status in expirationDateList" :value="status.value" :key="status.value">
|
|
|
{{ status.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="" prop="expirationDateZdts" v-if="storeInfoModel.expirationDate == 0">
|
|
|
+ <el-form-item label="" prop="expirationDate" v-if="storeInfoModel.effectiveDateType == 0">
|
|
|
<div class="expiration-date-container">
|
|
|
<span class="expiration-label">用户购买</span>
|
|
|
- <el-input-number
|
|
|
- v-model="storeInfoModel.expirationDateZdts"
|
|
|
- placeholder="请输入"
|
|
|
- :min="0"
|
|
|
- :max="9999999"
|
|
|
- class="expiration-input"
|
|
|
- />
|
|
|
+ <el-input-number v-model="storeInfoModel.expirationDate" placeholder="请输入" :min="0" class="expiration-input" />
|
|
|
<span class="expiration-label">天内有效</span>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="" prop="expirationDateZdsjd" v-else>
|
|
|
+ <el-form-item label="" prop="effectiveDateValue" v-else>
|
|
|
<el-date-picker
|
|
|
- v-model="storeInfoModel.expirationDateZdsjd"
|
|
|
- type="datetimerange"
|
|
|
+ v-model="storeInfoModel.effectiveDateValue"
|
|
|
+ type="daterange"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
range-separator="-"
|
|
|
start-placeholder="开始时间"
|
|
|
end-placeholder="结束时间"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="不可用日期" prop="unavailableDates">
|
|
|
- <el-radio-group v-model="storeInfoModel.unavailableDates" class="ml-4">
|
|
|
+ <el-form-item label="不可用日期" prop="disableDateType">
|
|
|
+ <el-radio-group v-model="storeInfoModel.disableDateType" class="ml-4">
|
|
|
<el-radio v-for="status in unavailableDatesList" :value="status.value" :key="status.value">
|
|
|
{{ status.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <template v-if="storeInfoModel.unavailableDates == 1">
|
|
|
+ <template v-if="storeInfoModel.disableDateType == 1">
|
|
|
<el-form-item label="" prop="unavailableWeekdays">
|
|
|
<div class="unavailable-dates-container">
|
|
|
<!-- 星期选择 -->
|
|
|
@@ -199,12 +192,12 @@
|
|
|
<div class="button-group">
|
|
|
<el-button
|
|
|
v-for="weekday in weekdayList"
|
|
|
- :key="weekday.value"
|
|
|
- :type="storeInfoModel.unavailableWeekdays?.includes(weekday.value) ? 'primary' : ''"
|
|
|
+ :key="weekday.oName"
|
|
|
+ :type="storeInfoModel.unavailableWeekdays?.includes(weekday.oName) ? 'primary' : ''"
|
|
|
class="date-select-btn"
|
|
|
- @click="toggleWeekday(weekday.value)"
|
|
|
+ @click="toggleWeekday(weekday.oName)"
|
|
|
>
|
|
|
- {{ weekday.label }}
|
|
|
+ {{ weekday.name }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -218,25 +211,26 @@
|
|
|
<div class="button-group">
|
|
|
<el-button
|
|
|
v-for="holiday in holidayList"
|
|
|
- :key="holiday.value"
|
|
|
- :type="storeInfoModel.unavailableHolidays?.includes(holiday.value) ? 'primary' : ''"
|
|
|
+ :key="holiday.id"
|
|
|
+ :type="storeInfoModel.unavailableHolidays?.includes(holiday.id) ? 'primary' : ''"
|
|
|
class="date-select-btn"
|
|
|
- @click="toggleHoliday(holiday.value)"
|
|
|
+ @click="toggleHoliday(holiday.id)"
|
|
|
>
|
|
|
- {{ holiday.label }}
|
|
|
+ {{ holiday.festivalName }}
|
|
|
</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <el-form-item label="" prop="customUnavailableDates" v-else-if="storeInfoModel.unavailableDates == 2">
|
|
|
+ <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>
|
|
|
<div v-for="(item, index) in dates" :key="index" class="date-item">
|
|
|
<el-date-picker
|
|
|
v-model="dates[index]"
|
|
|
- type="datetimerange"
|
|
|
+ type="daterange"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
range-separator="-"
|
|
|
start-placeholder="开始时间"
|
|
|
end-placeholder="结束时间"
|
|
|
@@ -255,28 +249,28 @@
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<!-- 预约规则 -->
|
|
|
- <el-form-item label="预约规则" prop="appointmentRules">
|
|
|
+ <el-form-item label="预约规则" prop="reservationRules">
|
|
|
<el-input
|
|
|
maxlength="300"
|
|
|
- v-model="storeInfoModel.appointmentRules"
|
|
|
+ v-model="storeInfoModel.reservationRules"
|
|
|
:rows="4"
|
|
|
type="textarea"
|
|
|
placeholder="请输入预约规则"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 使用规则 -->
|
|
|
- <el-form-item label="使用规则" prop="rulesOfUse">
|
|
|
+ <el-form-item label="使用规则" prop="useRules">
|
|
|
<el-input
|
|
|
maxlength="300"
|
|
|
- v-model="storeInfoModel.rulesOfUse"
|
|
|
+ v-model="storeInfoModel.useRules"
|
|
|
:rows="4"
|
|
|
type="textarea"
|
|
|
placeholder="请输入使用规则"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 适用人数 -->
|
|
|
- <el-form-item label="适用人数" prop="numberOfPeople">
|
|
|
- <el-input v-model="storeInfoModel.numberOfPeople" maxlength="15" placeholder="请填写适用人数" clearable />
|
|
|
+ <el-form-item label="适用人数" prop="applicableNum">
|
|
|
+ <el-input v-model="storeInfoModel.applicableNum" maxlength="15" placeholder="请填写适用人数" clearable />
|
|
|
</el-form-item>
|
|
|
<!-- 其他规则 -->
|
|
|
<el-form-item label="其他规则" prop="otherRules">
|
|
|
@@ -289,16 +283,16 @@
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 发票信息 -->
|
|
|
- <el-form-item label="发票信息" prop="businessTypes">
|
|
|
- <el-checkbox-group v-model="storeInfoModel.businessTypes">
|
|
|
+ <el-form-item label="发票信息" prop="invoiceInformation">
|
|
|
+ <el-checkbox-group v-model="storeInfoModel.invoiceInformation">
|
|
|
<el-checkbox v-for="bt in businessTypes" :key="bt.value" :value="bt.value" :label="bt.label">
|
|
|
{{ bt.label }}
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
</el-form-item>
|
|
|
<!-- 发票说明 -->
|
|
|
- <el-form-item label="发票说明" prop="invoiceDescription">
|
|
|
- <el-input v-model="storeInfoModel.invoiceDescription" maxlength="15" placeholder="请填写发票说明" clearable />
|
|
|
+ <el-form-item label="发票说明" prop="invoiceDescribe">
|
|
|
+ <el-input v-model="storeInfoModel.invoiceDescribe" maxlength="15" placeholder="请填写发票说明" clearable />
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -307,7 +301,8 @@
|
|
|
<!-- 底部按钮区域 -->
|
|
|
<div class="button-container">
|
|
|
<el-button @click="goBack"> 返回 </el-button>
|
|
|
- <el-button type="primary" @click="handleSubmit"> 确定 </el-button>
|
|
|
+ <el-button @click="handleSubmit('cg')"> 存草稿 </el-button>
|
|
|
+ <el-button type="primary" @click="handleSubmit()"> 确定 </el-button>
|
|
|
</div>
|
|
|
<!-- 图片预览对话框 -->
|
|
|
<el-dialog v-model="imagePopupVisible" title="预览" width="30%">
|
|
|
@@ -337,7 +332,7 @@
|
|
|
</div>
|
|
|
<div class="dish-price">¥{{ dish.price }}/份</div>
|
|
|
</div>
|
|
|
- <el-radio :model-value="selectedDishId" :label="dish.id" @click.stop="selectDish(dish)" />
|
|
|
+ <el-radio v-model="selectedDishId" :label="dish.id" @click.stop="selectDish(dish)" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -358,9 +353,17 @@
|
|
|
import { ref, reactive, onMounted, watch, nextTick } from "vue";
|
|
|
import { ElMessage, ElMessageBox } from "element-plus";
|
|
|
import { Plus, Delete, ArrowDown, ArrowUp, Picture } from "@element-plus/icons-vue";
|
|
|
-import { saveStoreInfo, editStoreInfo, getStoreDetail } from "@/api/modules/storeUser";
|
|
|
+import {
|
|
|
+ saveStoreInfo,
|
|
|
+ editStoreInfo,
|
|
|
+ getDetail,
|
|
|
+ getStoreDetail,
|
|
|
+ getHolidayList,
|
|
|
+ getUserByPhone
|
|
|
+} from "@/api/modules/groupPackageManagement";
|
|
|
import { useRouter, useRoute } from "vue-router";
|
|
|
import type { UploadProps, FormInstance } from "element-plus";
|
|
|
+import { localGet, localSet } from "@/utils";
|
|
|
|
|
|
// ==================== 响应式数据定义 ====================
|
|
|
|
|
|
@@ -382,12 +385,12 @@ const uploadUrl = ref(`${import.meta.env.VITE_API_URL_STORE}/file/upload`);
|
|
|
|
|
|
// ==================== 表单验证规则 ====================
|
|
|
const rules = reactive({
|
|
|
- fileList: [{ required: true, message: "请上传图片" }],
|
|
|
- storeName: [{ required: true, message: "请填写团购名称" }],
|
|
|
- storeStatus: [{ required: true, message: "请选择开始售卖时间" }],
|
|
|
- startTime: [{ required: true, message: "请选择开始售卖时间" }],
|
|
|
+ imageList: [{ required: true, message: "请上传图片" }],
|
|
|
+ groupName: [{ required: true, message: "请填写团购名称" }],
|
|
|
+ startTimeType: [{ required: true, message: "请选择开始售卖时间" }],
|
|
|
+ saleTimeStr: [{ required: true, message: "请选择开始售卖时间" }],
|
|
|
endTime: [{ required: true, message: "请选择结束售卖时间" }],
|
|
|
- stockQuantity: [
|
|
|
+ inventoryNum: [
|
|
|
{ required: true, message: "请填写库存数量" },
|
|
|
{
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
@@ -409,12 +412,12 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- purchaseLimitPerPerson: [{ required: true, message: "请选择每人限购" }],
|
|
|
- purchaseLimit: [
|
|
|
+ quotaType: [{ required: true, message: "请选择每人限购" }],
|
|
|
+ quotaValue: [
|
|
|
{
|
|
|
required: true,
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
- if (storeInfoModel.value.purchaseLimitPerPerson === 1) {
|
|
|
+ if (storeInfoModel.value.quotaType === 1) {
|
|
|
if (!value || value.toString().trim() === "") {
|
|
|
callback(new Error("请输入自定义限购数量"));
|
|
|
return;
|
|
|
@@ -434,51 +437,51 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- packageContent: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- validator: (rule: any, value: any, callback: any) => {
|
|
|
- if (!value || value.length === 0) {
|
|
|
- callback(new Error("请至少添加一个套餐分组"));
|
|
|
- return;
|
|
|
- }
|
|
|
- for (let i = 0; i < value.length; i++) {
|
|
|
- const group = value[i];
|
|
|
- if (!group.category || group.category.trim() === "") {
|
|
|
- callback(new Error(`第${i + 1}个分组的类别不能为空`));
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!group.dishes || group.dishes.length === 0) {
|
|
|
- callback(new Error(`第${i + 1}个分组至少需要添加一个菜品`));
|
|
|
- return;
|
|
|
- }
|
|
|
- for (let j = 0; j < group.dishes.length; j++) {
|
|
|
- const dish = group.dishes[j];
|
|
|
- if (!dish.dishId) {
|
|
|
- callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品未选择`));
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!dish.quantity || dish.quantity.toString().trim() === "") {
|
|
|
- callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品数量不能为空`));
|
|
|
- return;
|
|
|
- }
|
|
|
- const quantityNum = Number(dish.quantity);
|
|
|
- if (isNaN(quantityNum) || quantityNum <= 0) {
|
|
|
- callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品数量必须为正整数`));
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!Number.isInteger(quantityNum)) {
|
|
|
- callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品数量必须为正整数`));
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- callback();
|
|
|
- },
|
|
|
- trigger: "blur"
|
|
|
- }
|
|
|
- ],
|
|
|
- price: [
|
|
|
+ // packageContent: [
|
|
|
+ // {
|
|
|
+ // required: true,
|
|
|
+ // validator: (rule: any, value: any, callback: any) => {
|
|
|
+ // if (!value || value.length === 0) {
|
|
|
+ // callback(new Error("请至少添加一个套餐分组"));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // for (let i = 0; i < value.length; i++) {
|
|
|
+ // const group = value[i];
|
|
|
+ // if (!group.category || group.category.trim() === "") {
|
|
|
+ // callback(new Error(`第${i + 1}个分组的类别不能为空`));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // if (!group.dishes || group.dishes.length === 0) {
|
|
|
+ // callback(new Error(`第${i + 1}个分组至少需要添加一个菜品`));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // for (let j = 0; j < group.dishes.length; j++) {
|
|
|
+ // const dish = group.dishes[j];
|
|
|
+ // if (!dish.dishId) {
|
|
|
+ // callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品未选择`));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // if (!dish.quantity || dish.quantity.toString().trim() === "") {
|
|
|
+ // callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品数量不能为空`));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // const quantityNum = Number(dish.quantity);
|
|
|
+ // if (isNaN(quantityNum) || quantityNum <= 0) {
|
|
|
+ // callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品数量必须为正整数`));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // if (!Number.isInteger(quantityNum)) {
|
|
|
+ // callback(new Error(`第${i + 1}个分组的第${j + 1}个菜品数量必须为正整数`));
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // callback();
|
|
|
+ // },
|
|
|
+ // trigger: "blur"
|
|
|
+ // }
|
|
|
+ // ],
|
|
|
+ originalPrice: [
|
|
|
{ required: true, message: "请输入原价" },
|
|
|
{
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
@@ -496,7 +499,7 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- discountedPrice: [
|
|
|
+ preferentialPrice: [
|
|
|
{ required: true, message: "请输入优惠价" },
|
|
|
{
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
@@ -514,8 +517,8 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- expirationDate: [{ required: true, message: "请选择有效期" }],
|
|
|
- expirationDateZdts: [
|
|
|
+ effectiveDateType: [{ required: true, message: "请选择有效期" }],
|
|
|
+ expirationDate: [
|
|
|
{
|
|
|
required: true,
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
@@ -534,7 +537,7 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- expirationDateZdsjd: [
|
|
|
+ effectiveDateValue: [
|
|
|
{
|
|
|
required: true,
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
@@ -549,7 +552,7 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- unavailableDates: [{ required: true, message: "请选择不可用日期" }],
|
|
|
+ disableDateType: [{ required: true, message: "请选择不可用日期" }],
|
|
|
unavailableWeekdays: [
|
|
|
{
|
|
|
required: true,
|
|
|
@@ -602,9 +605,9 @@ const rules = reactive({
|
|
|
trigger: "blur"
|
|
|
}
|
|
|
],
|
|
|
- appointmentRules: [{ required: true, message: "请输入预约规则" }],
|
|
|
- rulesOfUse: [{ required: true, message: "请输入使用规则" }],
|
|
|
- numberOfPeople: [
|
|
|
+ reservationRules: [{ required: true, message: "请输入预约规则" }],
|
|
|
+ useRules: [{ required: true, message: "请输入使用规则" }],
|
|
|
+ applicableNum: [
|
|
|
{ required: true, message: "请输入适用人数" },
|
|
|
{
|
|
|
validator: (rule: any, value: any, callback: any) => {
|
|
|
@@ -627,28 +630,28 @@ const rules = reactive({
|
|
|
}
|
|
|
],
|
|
|
otherRules: [{ required: true, message: "请输入其他规则" }],
|
|
|
- businessTypes: [{ required: true, message: "请选择发票信息" }],
|
|
|
- invoiceDescription: [{ required: true, message: "请输入发票说明" }]
|
|
|
+ invoiceInformation: [{ required: true, message: "请选择发票信息" }],
|
|
|
+ invoiceDescribe: [{ required: true, message: "请输入发票说明" }]
|
|
|
});
|
|
|
|
|
|
// ==================== 团购包信息数据模型 ====================
|
|
|
const storeInfoModel = ref<any>({
|
|
|
// 团购图片列表
|
|
|
- fileList: [],
|
|
|
+ imageList: [],
|
|
|
// 团购名称
|
|
|
- storeName: "",
|
|
|
+ groupName: "",
|
|
|
// 开始售卖时间设置方式:0-审核通过后立即开始,1-设置售卖时间
|
|
|
- storeStatus: 0,
|
|
|
+ startTimeType: 0,
|
|
|
// 开始售卖时间(当storeStatus为1时必填)
|
|
|
- startTime: "",
|
|
|
+ saleTimeStr: "",
|
|
|
// 结束售卖时间
|
|
|
endTime: "",
|
|
|
// 库存数量
|
|
|
- stockQuantity: "",
|
|
|
+ inventoryNum: "",
|
|
|
// 每人限购设置:0-不限量,1-自定义限购数量
|
|
|
- purchaseLimitPerPerson: 0,
|
|
|
- // 自定义限购数量(当purchaseLimitPerPerson为1时必填)
|
|
|
- purchaseLimit: "",
|
|
|
+ quotaValueStr: 0,
|
|
|
+ // 自定义限购数量(当quotaType为1时必填)
|
|
|
+ quotaValue: 0,
|
|
|
// 套餐内容(数组,每个元素是一个分组)
|
|
|
packageContent: [
|
|
|
{
|
|
|
@@ -667,37 +670,39 @@ const storeInfoModel = ref<any>({
|
|
|
}
|
|
|
],
|
|
|
// 原价
|
|
|
- price: "",
|
|
|
+ originalPrice: "",
|
|
|
// 优惠价
|
|
|
- discountedPrice: "",
|
|
|
+ preferentialPrice: "",
|
|
|
// 有效期设置:0-指定天数,1-指定时间段内可用
|
|
|
+ effectiveDateType: 0,
|
|
|
expirationDate: 0,
|
|
|
+ effectiveDateValue: [],
|
|
|
// 不可用日期设置:0-全部日期可用,1-限制日期,2-自定义不可用日期
|
|
|
- unavailableDates: 0,
|
|
|
+ disableDateType: 0,
|
|
|
// 限制日期 - 星期选择(数组,存储选中的星期值)
|
|
|
unavailableWeekdays: [],
|
|
|
// 限制日期 - 节日选择(数组,存储选中的节日值)
|
|
|
unavailableHolidays: [],
|
|
|
// 预约规则
|
|
|
- appointmentRules: "",
|
|
|
+ reservationRules: "",
|
|
|
// 使用规则
|
|
|
- rulesOfUse: "",
|
|
|
+ useRules: "",
|
|
|
// 适用人数
|
|
|
- numberOfPeople: "",
|
|
|
+ applicableNum: "",
|
|
|
// 其他规则
|
|
|
otherRules: "",
|
|
|
// 发票信息(复选框,可多选)
|
|
|
- businessTypes: [],
|
|
|
+ invoiceInformation: [],
|
|
|
// 发票说明
|
|
|
- invoiceDescription: ""
|
|
|
+ invoiceDescribe: ""
|
|
|
});
|
|
|
|
|
|
// ==================== 下拉选项数据 ====================
|
|
|
|
|
|
// 发票类型列表
|
|
|
const businessTypes = ref<any[]>([
|
|
|
- { value: 1, label: "提供电子发票" },
|
|
|
- { value: 2, label: "提供纸质发票" }
|
|
|
+ { value: 0, label: "提供电子发票" },
|
|
|
+ { value: 1, label: "提供纸质发票" }
|
|
|
]);
|
|
|
|
|
|
// 开始售卖时间设置方式列表
|
|
|
@@ -729,13 +734,13 @@ const dates = ref<any[]>([]);
|
|
|
|
|
|
// 星期选项列表
|
|
|
const weekdayList = ref<any[]>([
|
|
|
- { value: 1, label: "周一" },
|
|
|
- { value: 2, label: "周二" },
|
|
|
- { value: 3, label: "周三" },
|
|
|
- { value: 4, label: "周四" },
|
|
|
- { value: 5, label: "周五" },
|
|
|
- { value: 6, label: "周六" },
|
|
|
- { value: 7, label: "周日" }
|
|
|
+ { name: "周一", id: "0", oName: "星期一" },
|
|
|
+ { name: "周二", id: "1", oName: "星期二" },
|
|
|
+ { name: "周三", id: "2", oName: "星期三" },
|
|
|
+ { name: "周四", id: "3", oName: "星期四" },
|
|
|
+ { name: "周五", id: "4", oName: "星期五" },
|
|
|
+ { name: "周六", id: "5", oName: "星期六" },
|
|
|
+ { name: "周日", id: "6", oName: "星期日" }
|
|
|
]);
|
|
|
|
|
|
// 节日选项列表
|
|
|
@@ -800,13 +805,43 @@ watch(
|
|
|
onMounted(async () => {
|
|
|
id.value = (route.query.id as string) || "";
|
|
|
type.value = (route.query.type as string) || "";
|
|
|
+ let param = {
|
|
|
+ // phone: localGet("iphone")
|
|
|
+ phone: "18641153170"
|
|
|
+ };
|
|
|
+ const resP: any = await getUserByPhone(param);
|
|
|
+ if (resP.data && resP.data.storeId) {
|
|
|
+ localSet("createdId", resP.data.storeId);
|
|
|
+ const resD: any = await getDetail({
|
|
|
+ id: localGet("createdId")
|
|
|
+ });
|
|
|
+ if (resD.data && resD.data.commissionRate) {
|
|
|
+ localSet("commissionRate", resD.data.commissionRate);
|
|
|
+ }
|
|
|
+ if (resD.data && resD.data.businessSection) {
|
|
|
+ localSet("businessSection", resD.data.businessSection);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ElMessage.warning("请完成商家入驻后再进行新建团购");
|
|
|
+ }
|
|
|
+ let params = {
|
|
|
+ year: new Date().getFullYear(),
|
|
|
+ page: 1,
|
|
|
+ size: 500,
|
|
|
+ openFlag: 1,
|
|
|
+ holidayName: ""
|
|
|
+ };
|
|
|
+ let res = await getHolidayList(params);
|
|
|
+ if (res && res.code == 200) {
|
|
|
+ holidayList.value = res.data.records;
|
|
|
+ }
|
|
|
if (type.value != "add") {
|
|
|
let res: any = await getStoreDetail({ id: id.value } as any);
|
|
|
storeInfoModel.value = res.data as any;
|
|
|
videoUrlList.value = (res.data as any).businessLicenseAddress || [];
|
|
|
- let fileList: any[] = [];
|
|
|
- handleImageParam((res.data as any).businessLicenseAddress || [], fileList);
|
|
|
- storeInfoModel.value.fileList = fileList;
|
|
|
+ let imageList: any[] = [];
|
|
|
+ handleImageParam((res.data as any).businessLicenseAddress || [], imageList);
|
|
|
+ storeInfoModel.value.imageList = imageList;
|
|
|
// 确保星期和节日字段存在
|
|
|
if (!storeInfoModel.value.unavailableWeekdays) {
|
|
|
storeInfoModel.value.unavailableWeekdays = [];
|
|
|
@@ -908,7 +943,7 @@ const handleRemove: UploadProps["onRemove"] = (uploadFile, uploadFiles) => {
|
|
|
*/
|
|
|
const handleSuccess = (response: any) => {
|
|
|
ElMessage.success("图片上传成功");
|
|
|
- // 上传成功后,fileList 会自动更新,response.data 包含图片URL
|
|
|
+ // 上传成功后,imageList 会自动更新,response.data 包含图片URL
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -943,7 +978,7 @@ const removeDate = (index: number) => {
|
|
|
* 切换星期选择
|
|
|
* @param value 星期值
|
|
|
*/
|
|
|
-const toggleWeekday = (value: number) => {
|
|
|
+const toggleWeekday = value => {
|
|
|
if (!storeInfoModel.value.unavailableWeekdays) {
|
|
|
storeInfoModel.value.unavailableWeekdays = [];
|
|
|
}
|
|
|
@@ -953,6 +988,7 @@ const toggleWeekday = (value: number) => {
|
|
|
} else {
|
|
|
storeInfoModel.value.unavailableWeekdays.push(value);
|
|
|
}
|
|
|
+ console.log(storeInfoModel.value.unavailableWeekdays);
|
|
|
// 触发表单验证
|
|
|
nextTick(() => {
|
|
|
ruleFormRef.value?.validateField("unavailableWeekdays");
|
|
|
@@ -963,7 +999,7 @@ const toggleWeekday = (value: number) => {
|
|
|
* 切换节日选择
|
|
|
* @param value 节日值
|
|
|
*/
|
|
|
-const toggleHoliday = (value: number) => {
|
|
|
+const toggleHoliday = value => {
|
|
|
if (!storeInfoModel.value.unavailableHolidays) {
|
|
|
storeInfoModel.value.unavailableHolidays = [];
|
|
|
}
|
|
|
@@ -973,6 +1009,7 @@ const toggleHoliday = (value: number) => {
|
|
|
} else {
|
|
|
storeInfoModel.value.unavailableHolidays.push(value);
|
|
|
}
|
|
|
+ console.log(storeInfoModel.value.unavailableHolidays);
|
|
|
// 触发表单验证
|
|
|
nextTick(() => {
|
|
|
ruleFormRef.value?.validateField("unavailableHolidays");
|
|
|
@@ -1123,40 +1160,30 @@ const ruleFormRef = ref<FormInstance>(); // 表单引用
|
|
|
* 提交数据(新增/编辑)
|
|
|
* 验证表单,通过后调用相应的API接口
|
|
|
*/
|
|
|
-const handleSubmit = () => {
|
|
|
+const handleSubmit = type => {
|
|
|
+ let params: any = { ...storeInfoModel.value };
|
|
|
+ if (params.effectiveDateType == 0) {
|
|
|
+ params.couponCompDate = `用户购买${params.expirationDate}天内有效`;
|
|
|
+ } else {
|
|
|
+ params.effectiveDateValue = params.effectiveDateValue.join(",");
|
|
|
+ }
|
|
|
+ if (params.disableDateType == 1) {
|
|
|
+ params.disableDateValue = params.unavailableWeekdays.join(",") + ";" + params.unavailableHolidays.join(",");
|
|
|
+ delete params.unavailableWeekdays;
|
|
|
+ delete params.unavailableHolidays;
|
|
|
+ } else if (params.disableDateType == 2) {
|
|
|
+ params.disableDateValue = dates.value.map(subArray => subArray.join(",")).join(";");
|
|
|
+ }
|
|
|
+ params.invoiceType = params.invoiceInformation.join(",");
|
|
|
+ console.log(params);
|
|
|
+ if (type) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
// 验证表单
|
|
|
ruleFormRef.value!.validate(async valid => {
|
|
|
if (!valid) return;
|
|
|
-
|
|
|
// 组装提交参数
|
|
|
- let param: any = { ...storeInfoModel.value };
|
|
|
- // 处理图片列表:将上传组件格式转换为URL数组
|
|
|
- param.businessLicenseAddress = handleImageResult(storeInfoModel.value.fileList || []);
|
|
|
- // 清空时间戳字段
|
|
|
- param.createTime = null;
|
|
|
- param.updatedTime = null;
|
|
|
-
|
|
|
- // 根据页面类型调用不同的API
|
|
|
- if (type.value == "add") {
|
|
|
- // 新增团购包
|
|
|
- let res = await saveStoreInfo(param);
|
|
|
- if (res.code == "200") {
|
|
|
- ElMessage.success("新增成功");
|
|
|
- router.go(-1);
|
|
|
- } else {
|
|
|
- ElMessage.error("新增失败");
|
|
|
- }
|
|
|
- } else if (type.value == "edit") {
|
|
|
- // 编辑团购包
|
|
|
- param.id = id.value; // 编辑时需要传递ID
|
|
|
- let res = await editStoreInfo(param);
|
|
|
- if (res.code == "200") {
|
|
|
- ElMessage.success("编辑成功");
|
|
|
- router.go(-1);
|
|
|
- } else {
|
|
|
- ElMessage.error("编辑失败");
|
|
|
- }
|
|
|
- }
|
|
|
+ let params: any = { ...storeInfoModel.value };
|
|
|
});
|
|
|
};
|
|
|
|