Compare commits

...

2 Commits

8 changed files with 498 additions and 162 deletions

View File

@ -56,7 +56,12 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="useNum" label="已使用" width="180" /> <el-table-column prop="useNum" label="已使用" width="180" />
<el-table-column prop="leftNum" label="剩余" width="180" /> <el-table-column prop="leftNum" label="剩余" width="180">
<template #default="scope">
<template v-if="scope.row.giveNum == -10086">无限</template>
<template v-else>{{ scope.row.leftNum }}</template>
</template>
</el-table-column>
<el-table-column prop="" label="已关联功能" width="180"> <el-table-column prop="" label="已关联功能" width="180">
<template #default="scope"> <template #default="scope">
<el-link type="primary" @click="RelevanceDialogRef.show(scope.row)"> <el-link type="primary" @click="RelevanceDialogRef.show(scope.row)">
@ -70,29 +75,47 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="1" :active-value="1"
:inactive-value="0" :inactive-value="0"
:disabled="scope.row.syncId" :disabled="!!scope.row.syncId"
@change="statusChange($event, scope.row)" @change="statusChange($event, scope.row)"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180" /> <el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column prop="actions" label="操作" align="center" width="140" fixed="right"> <el-table-column
prop="actions"
label="操作"
align="center"
width="140"
fixed="right"
>
<template #default="scope"> <template #default="scope">
<el-button <template v-if="!scope.row.syncId">
type="primary" <el-button
link type="primary"
@click="CouponDialogRef.show(couponType, scope.row)" link
> @click="CouponDialogRef.show(couponType, scope.row)"
编辑 >
</el-button> 编辑
<el-popconfirm </el-button>
title="确认要删除吗?" <el-popconfirm
@confirm="deleteHandle(scope.row)" title="确认要删除吗?"
> @confirm="deleteHandle(scope.row)"
<template #reference> >
<el-button type="danger" link>删除</el-button> <template #reference>
</template> <el-button type="danger" link>删除</el-button>
</el-popconfirm> </template>
</el-popconfirm>
</template>
<template v-else>
<el-button
type="primary"
link
@click="CouponDialogRef.show(couponType, scope.row)"
>
详情
</el-button>
<el-button type="danger" disabled link>删除</el-button>
</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -1,6 +1,12 @@
<template> <template>
<el-dialog v-model="dialogVisible" :title="titleOptions.title" width="80%" top="4vh"> <el-dialog
<div class="scroll"> v-model="dialogVisible"
:title="titleOptions.title"
width="80%"
top="4vh"
@closed="closedReset"
>
<div class="scroll" ref="scrollRef">
<el-form <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@ -11,6 +17,7 @@
<el-form-item label="优惠券名称" prop="title"> <el-form-item label="优惠券名称" prop="title">
<el-input <el-input
v-model="form.title" v-model="form.title"
:maxlength="20"
placeholder="请输入优惠券名称" placeholder="请输入优惠券名称"
style="width: 300px" style="width: 300px"
/> />
@ -23,6 +30,7 @@
placeholder="请输入使用门槛" placeholder="请输入使用门槛"
style="width: 240px" style="width: 240px"
input-style="text-align: center;" input-style="text-align: center;"
@input="(e) => (form.fullAmount = filterNumberInput(e))"
> >
<template #prepend></template> <template #prepend></template>
<template #append></template> <template #append></template>
@ -32,6 +40,7 @@
placeholder="请输入满减金额" placeholder="请输入满减金额"
style="width: 240px" style="width: 240px"
input-style="text-align: center;" input-style="text-align: center;"
@input="(e) => (form.discountAmount = filterNumberInput(e))"
> >
<template #prepend></template> <template #prepend></template>
<template #append></template> <template #append></template>
@ -47,6 +56,7 @@
placeholder="请输入使用门槛" placeholder="请输入使用门槛"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="(e) => (form.fullAmount = filterNumberInput(e))"
> >
<template #prepend></template> <template #prepend></template>
<template #append>可用</template> <template #append>可用</template>
@ -83,6 +93,7 @@
v-model="form.discountNum" v-model="form.discountNum"
placeholder="请输入可抵扣商品件数" placeholder="请输入可抵扣商品件数"
style="width: 200px" style="width: 200px"
@input="discountNumInput"
/> />
</el-form-item> </el-form-item>
</div> </div>
@ -92,6 +103,7 @@
v-model="form.discountRate" v-model="form.discountRate"
placeholder="输入折扣(%" placeholder="输入折扣(%"
style="width: 200px" style="width: 200px"
@input="discountRateInput"
/> />
</el-form-item> </el-form-item>
<el-form-item label="使用门槛" prop="discountAmount"> <el-form-item label="使用门槛" prop="discountAmount">
@ -101,6 +113,7 @@
placeholder="请输入使用门槛" placeholder="请输入使用门槛"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="(e) => (form.discountAmount = filterNumberInput(e))"
> >
<template #prepend></template> <template #prepend></template>
<template #append>可用</template> <template #append>可用</template>
@ -113,6 +126,7 @@
v-model="form.maxDiscountAmount" v-model="form.maxDiscountAmount"
placeholder="请输入金额" placeholder="请输入金额"
style="width: 200px" style="width: 200px"
@input="(e) => (form.maxDiscountAmount = filterNumberInput(e))"
> >
<template #append>可用</template> <template #append>可用</template>
</el-input> </el-input>
@ -122,13 +136,11 @@
<div v-if="form.couponType == 4"></div> <div v-if="form.couponType == 4"></div>
<div v-if="form.couponType == 6"></div> <div v-if="form.couponType == 6"></div>
<div class="title">指定设置</div> <div class="title">指定设置</div>
<el-form-item label="选择门店" prop="useShopType"> <el-form-item label="选择门店" prop="useShopType" v-if="shopInfo.isHeadShop">
<el-radio-group v-model="form.useShopType"> <el-radio-group v-model="form.useShopType">
<el-radio label="仅本店可用" value="only"></el-radio> <el-radio label="仅本店可用" value="only"></el-radio>
<template v-if="shopInfo.isHeadShop"> <el-radio label="全部门店" value="all"></el-radio>
<el-radio label="全部门店" value="all"></el-radio> <el-radio label="指定门店可用" value="custom"></el-radio>
<el-radio label="指定门店可用" value="custom"></el-radio>
</template>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="选择门店" v-if="form.useShopType == 'custom'"> <el-form-item label="选择门店" v-if="form.useShopType == 'custom'">
@ -190,29 +202,49 @@
style="width: 200px" style="width: 200px"
v-if="form.validType == 'fixed'" v-if="form.validType == 'fixed'"
input-style="text-align: center;" input-style="text-align: center;"
@input="validDaysInput"
> >
<template #append></template> <template #append></template>
</el-input> </el-input>
<el-date-picker <div style="width: 200px">
v-model="validityScope" <el-date-picker
type="daterange" v-model="validityScope"
range-separator="至" type="daterange"
start-placeholder="开始时间" range-separator="至"
end-placeholder="结束时间" start-placeholder="开始时间"
v-if="form.validType == 'custom'" end-placeholder="结束时间"
@change="validityScopeChange" v-if="form.validType == 'custom'"
/> @change="validityScopeChange"
/>
</div>
</el-form-item> </el-form-item>
<el-form-item label="隔天生效" prop="daysToTakeEffect"> <el-form-item
<el-input label="隔天生效"
v-model="form.daysToTakeEffect" prop="daysToTakeEffect"
placeholder="请输入隔天生效日期" v-if="form.validType == 'fixed'"
style="width: 300px" >
input-style="text-align: center;" <div class="center">
> <el-input
<template #prepend></template> v-model="form.daysToTakeEffect"
<template #append>天生效</template> placeholder="请输入隔天生效日期"
</el-input> style="width: 300px"
input-style="text-align: center;"
@input="daysToTakeEffectInput"
>
<template #prepend></template>
<template #append>天生效</template>
</el-input>
<el-tooltip
class="box-item"
effect="dark"
:content="`领取后${form.daysToTakeEffect}天后的0点0分生效`"
placement="top-start"
>
<el-icon size="18">
<QuestionFilled />
</el-icon>
</el-tooltip>
</div>
</el-form-item> </el-form-item>
<el-form-item label="可用周期" prop="useDays"> <el-form-item label="可用周期" prop="useDays">
<el-checkbox-group v-model="form.useDays"> <el-checkbox-group v-model="form.useDays">
@ -222,25 +254,26 @@
<el-checkbox value="周四" label="周四" /> <el-checkbox value="周四" label="周四" />
<el-checkbox value="周五" label="周五" /> <el-checkbox value="周五" label="周五" />
<el-checkbox value="周六" label="周六" /> <el-checkbox value="周六" label="周六" />
<el-checkbox value="周七" label="周" /> <el-checkbox value="周七" label="周" />
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
<el-form-item label="指定时间段"> <el-form-item label="指定时间段">
<el-radio-group v-model="form.useTimeType"> <el-radio-group v-model="form.useTimeType">
<el-radio label="领券后有效期内可用" value="all"></el-radio> <el-radio label="全时段可用" value="all"></el-radio>
<el-radio label="固定有效期范围内可用" value="custom"></el-radio> <el-radio label="指定时间段可用" value="custom"></el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-if="form.useTimeType == 'custom'" prop="useTimeType"> <el-form-item v-if="form.useTimeType == 'custom'" prop="useTimeType">
<el-time-picker <div style="width: 200px">
v-model="useTimeScope" <el-time-picker
is-range v-model="useTimeScope"
range-separator="至" is-range
start-placeholder="开始时间" range-separator="至"
end-placeholder="结束时间" start-placeholder="开始时间"
@change="useTimeScopeChange" end-placeholder="结束时间"
style="width: 300px" @change="useTimeScopeChange"
/> />
</div>
</el-form-item> </el-form-item>
<div class="title">发放设置</div> <div class="title">发放设置</div>
<el-form-item label="发放设置"> <el-form-item label="发放设置">
@ -268,6 +301,7 @@
placeholder="请输入总发放数量" placeholder="请输入总发放数量"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="giveNumInput"
> >
<template #append></template> <template #append></template>
</el-input> </el-input>
@ -288,31 +322,35 @@
placeholder="请输入每人限领量" placeholder="请输入每人限领量"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="getLimitInput"
> >
<template #append></template> <template #append></template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="每人每日使用限量" prop="useLimit"> <el-form-item label="每人每日使用限量">
<div class="column"> <div class="column">
<div class="center"> <div class="center">
<el-switch <el-radio-group
v-model="infiniteUseLimit" v-model="infiniteUseLimit"
@change="infiniteUseLimitChange" @change="infiniteUseLimitChange"
/>
<span>关闭则为无限制</span>
</div>
<div v-if="infiniteUseLimit" style="margin-top: 10px">
<el-input
v-model="form.useLimit"
placeholder="请输入每人每日使用限量"
style="width: 255px"
input-style="text-align: center;"
> >
<template #append>/每人1天</template> <el-radio label="无限制" :value="true"></el-radio>
</el-input> <el-radio label="每日限用" :value="false"></el-radio>
</el-radio-group>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="限用数量" v-if="!infiniteUseLimit" prop="useLimit">
<el-input
v-model="form.useLimit"
placeholder="需小于或等于每人限领量"
style="width: 255px"
input-style="text-align: center;"
@input="useLimitInput"
>
<template #append>/每人1天</template>
</el-input>
</el-form-item>
<div class="title">其他设置</div> <div class="title">其他设置</div>
<el-form-item label="与限时折扣同享"> <el-form-item label="与限时折扣同享">
<div class="column"> <div class="column">
@ -370,7 +408,7 @@
</el-form> </el-form>
</div> </div>
<template #footer> <template #footer>
<div class="dialog-footer" v-if="shopInfo.isHeadShop"> <div class="dialog-footer" v-if="shopInfo.isHeadShop || !form.syncId">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="submitHandle"> </el-button> <el-button type="primary" :loading="loading" @click="submitHandle"> </el-button>
</div> </div>
@ -379,6 +417,7 @@
</template> </template>
<script setup> <script setup>
import _ from "lodash";
import { dayjs } from "element-plus"; import { dayjs } from "element-plus";
import { ref, reactive, onMounted } from "vue"; import { ref, reactive, onMounted } from "vue";
import { getBranchPage, getProductList, getCategoryList, addCoupon } from "@/api/coupon/index.js"; import { getBranchPage, getProductList, getCategoryList, addCoupon } from "@/api/coupon/index.js";
@ -447,14 +486,26 @@ function shopsChange(e) {
// //
const validityScope = ref([]); const validityScope = ref([]);
function validityScopeChange(e) { function validityScopeChange(e) {
form.value.validStartTime = dayjs(e[0]).format("YYYY-MM-DD 00:00:00"); console.log("validityScopeChange===", e);
form.value.validEndTime = dayjs(e[1]).format("YYYY-MM-DD 23:59:59"); if (e && e.length) {
form.value.validStartTime = dayjs(e[0]).format("YYYY-MM-DD 00:00:00");
form.value.validEndTime = dayjs(e[1]).format("YYYY-MM-DD 23:59:59");
} else {
form.value.validStartTime = "";
form.value.validEndTime = "";
}
} }
// //
const useTimeScope = ref([]); const useTimeScope = ref([]);
function useTimeScopeChange(e) { function useTimeScopeChange(e) {
form.value.useStartTime = dayjs(e[0]).format("HH:mm:00"); console.log("useTimeScopeChange===", e);
form.value.useEndTime = dayjs(e[1]).format("HH:mm:00"); if (e && e.length) {
form.value.useStartTime = dayjs(e[0]).format("HH:mm:00");
form.value.useEndTime = dayjs(e[1]).format("HH:mm:00");
} else {
form.value.useStartTime = "";
form.value.useEndTime = "";
}
} }
// //
@ -462,15 +513,18 @@ const infiniteFlagNum = ref(-10086);
const infiniteGiveNum = ref(true); const infiniteGiveNum = ref(true);
function infiniteGiveNumChange(e) { function infiniteGiveNumChange(e) {
if (!e) { if (!e) {
form.giveNum = infiniteFlagNum.value; form.value.giveNum = infiniteFlagNum.value;
} else {
form.value.giveNum = "";
} }
formRef.value.validate();
} }
// //
const infiniteUseLimit = ref(true); const infiniteUseLimit = ref(true);
function infiniteUseLimitChange(e) { function infiniteUseLimitChange(e) {
if (!e) { if (e) {
form.useLimit = infiniteFlagNum.value; form.value.useLimit = infiniteFlagNum.value;
} else {
form.value.useLimit = "";
} }
} }
@ -497,12 +551,12 @@ const form = ref({
useTimeType: "all", // all-custom- useTimeType: "all", // all-custom-
useStartTime: "", // useStartTime: "", //
useEndTime: "", // useEndTime: "", //
getType: "yes", // /no/yes getType: "no", // /no/yes
getMode: ["home", "eat"], // home/- eat/- order/ getMode: ["eat"], // home/- eat/- order/
giveNum: "", // -10086 giveNum: "", // -10086
getUserType: "all", // /all/new/vip getUserType: "all", // /all/new/vip
getLimit: "", // -10086 getLimit: 1, // -10086
useLimit: "", // 使-10086 useLimit: -10086, // 使-10086
discountShare: 1, // 0-1- discountShare: 1, // 0-1-
vipPriceShare: 1, // 0-1- vipPriceShare: 1, // 0-1-
ruleDetails: "", // ruleDetails: "", //
@ -587,8 +641,8 @@ const daysToTakeEffectValidate = (rule, value, callback) => {
// //
const useTimeTypeValidate = (rule, value, callback) => { const useTimeTypeValidate = (rule, value, callback) => {
if (form.value.daysToTakeEffect < 0) { if (!form.value.useStartTime) {
callback(new Error("请输入大于等于0的值")); callback(new Error("请选择指定可用时间段"));
} else { } else {
callback(); callback();
} }
@ -605,7 +659,7 @@ const giveNumValidate = (rule, value, callback) => {
// 使 // 使
const useLimitValidate = (rule, value, callback) => { const useLimitValidate = (rule, value, callback) => {
if (form.value.useLimit <= 0 && infiniteUseLimit.value) { if (form.value.useLimit <= 0 && !infiniteUseLimit.value) {
callback(new Error("请输入每人每日使用限量")); callback(new Error("请输入每人每日使用限量"));
} else { } else {
callback(); callback();
@ -748,7 +802,15 @@ function formatCategoryWithProducts(categories, products) {
} }
// //
const scrollRef = ref(null);
function show(t, obj = null) { function show(t, obj = null) {
nextTick(() => {
if (scrollRef.value) {
setTimeout(() => {
scrollRef.value.scrollTop = 0;
}, 50);
}
});
let m = titleOptions.couponTypeList.find((item) => item.value == t); let m = titleOptions.couponTypeList.find((item) => item.value == t);
if (obj && obj.id) { if (obj && obj.id) {
titleOptions.title = `编辑${m.label}`; titleOptions.title = `编辑${m.label}`;
@ -758,6 +820,10 @@ function show(t, obj = null) {
form.value.useDays = JSON.parse(form.value.useDays); form.value.useDays = JSON.parse(form.value.useDays);
form.value.useType = JSON.parse(form.value.useType); form.value.useType = JSON.parse(form.value.useType);
if (!!form.value.syncId) {
form.value.useShopType = "only";
}
if (form.value.foods != "") { if (form.value.foods != "") {
goodsType.value = 2; goodsType.value = 2;
goodsTypeCascaderValue.value = form.value.foods.split(","); goodsTypeCascaderValue.value = form.value.foods.split(",");
@ -787,7 +853,7 @@ function show(t, obj = null) {
} }
if (form.value.useLimit == infiniteFlagNum.value) { if (form.value.useLimit == infiniteFlagNum.value) {
infiniteUseLimit.value = false; infiniteUseLimit.value = true;
} }
} else { } else {
reset(); reset();
@ -797,6 +863,11 @@ function show(t, obj = null) {
dialogVisible.value = true; dialogVisible.value = true;
} }
//
function closedReset() {
formRef.value.resetFields();
}
/** /**
* 将时分秒字符串转换为完整日期格式 * 将时分秒字符串转换为完整日期格式
* @param {string} timeStr - 时分秒字符串格式需为 HH:mm:ss '00:53:00' * @param {string} timeStr - 时分秒字符串格式需为 HH:mm:ss '00:53:00'
@ -844,6 +915,93 @@ function convertTimeToDate(timeStr, options = {}) {
return dateObj.format(format); return dateObj.format(format);
} }
// input
const time = 500;
const discountNumInput = _.debounce(function (value) {
form.value.discountNum = filterNumberInput(value, true);
}, time);
const discountRateInput = _.debounce(function (value) {
form.value.discountRate = filterNumberInput(value, true);
if (form.value.discountRate >= 100) {
form.value.discountRate = 100;
}
}, time);
const validDaysInput = _.debounce(function (value) {
form.value.validDays = filterNumberInput(value, true);
}, time);
const daysToTakeEffectInput = _.debounce(function (value) {
form.value.daysToTakeEffect = filterNumberInput(value, true);
if (form.value.daysToTakeEffect === "") {
form.value.daysToTakeEffect = 0;
}
}, time);
const giveNumInput = _.debounce(function (value) {
form.value.giveNum = filterNumberInput(value, true);
}, time);
const getLimitInput = _.debounce(function (value) {
form.value.getLimit = filterNumberInput(value, true);
if (form.value.getLimit == "") {
form.value.getLimit = 1;
}
}, time);
const useLimitInput = _.debounce(function (value) {
form.value.useLimit = filterNumberInput(value, true);
if (form.value.useLimit >= form.value.getLimit) {
form.value.useLimit = form.value.getLimit;
}
}, time);
/**
* 过滤输入只允许数字和最多两位小数
* @param {string} value - 输入框当前值
* @param {boolean} isIntegerOnly - 是否只允许正整数无小数点开启时最小值为1
* @returns {string} 过滤后的合法值
*/
function filterNumberInput(value, isIntegerOnly = false) {
//
let filtered = value.replace(/[^\d.]/g, "");
//
if (isIntegerOnly) {
//
filtered = filtered.replace(/\./g, "");
//
filtered = filtered.replace(/^0+(\d)/, "$1") || filtered;
//
if (filtered === "") {
return "";
}
//
if (filtered === "0" || parseInt(filtered, 10) < 1) {
return "1";
}
return filtered;
}
//
const parts = filtered.split(".");
if (parts.length > 1) {
filtered = parts[0] + "." + (parts[1].substring(0, 2) || "");
}
//
if (filtered.startsWith("0") && filtered.length > 1 && !filtered.startsWith("0.")) {
filtered = filtered.replace(/^0+(\d)/, "$1");
}
return filtered;
}
defineExpose({ defineExpose({
show, show,
}); });

View File

@ -17,7 +17,7 @@
</el-table-column> </el-table-column>
<!-- <el-table-column label="描述" prop="id"></el-table-column> --> <!-- <el-table-column label="描述" prop="id"></el-table-column> -->
<el-table-column label="数量" prop="num"></el-table-column> <el-table-column label="数量" prop="num"></el-table-column>
<el-table-column label="操作"> <el-table-column label="操作" width="100">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link @click="linkTo(scope.row)">查看</el-button> <el-button type="primary" link @click="linkTo(scope.row)">查看</el-button>
<!-- <el-popconfirm <!-- <el-popconfirm

View File

@ -1,6 +1,11 @@
<template> <template>
<div> <div>
<el-dialog v-model="dialogVisible" :title="titleOptions.title" width="80%"> <el-dialog
v-model="dialogVisible"
:title="titleOptions.title"
width="80%"
@closed="closedReset"
>
<el-form <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@ -14,6 +19,7 @@
placeholder="请输入赠券门槛" placeholder="请输入赠券门槛"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="(e) => (form.fullAmount = filterNumberInput(e))"
> >
<template #prepend></template> <template #prepend></template>
<template #append></template> <template #append></template>
@ -38,6 +44,7 @@
placeholder="请输入" placeholder="请输入"
style="width: 250px" style="width: 250px"
input-style="text-align: center;" input-style="text-align: center;"
@input="couponGiveNumInput"
> >
<template #prepend>每次赠送</template> <template #prepend>每次赠送</template>
<template #append></template> <template #append></template>
@ -66,6 +73,7 @@
placeholder="请输入总发放数量" placeholder="请输入总发放数量"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="giveNumInput"
> >
<template #append></template> <template #append></template>
</el-input> </el-input>
@ -87,6 +95,7 @@
placeholder="请输入每人限量" placeholder="请输入每人限量"
style="width: 200px" style="width: 200px"
input-style="text-align: center;" input-style="text-align: center;"
@input="getLimitInput"
> >
<template #append></template> <template #append></template>
</el-input> </el-input>
@ -110,6 +119,7 @@
</template> </template>
<script setup> <script setup>
import _ from "lodash";
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { addConsumerCoupon, couponPage, updateConsumerCouponById } from "@/api/coupon/index.js"; import { addConsumerCoupon, couponPage, updateConsumerCouponById } from "@/api/coupon/index.js";
const shopInfo = ref(""); const shopInfo = ref("");
@ -157,6 +167,8 @@ const infiniteGiveNum = ref(true);
function infiniteGiveNumChange(e) { function infiniteGiveNumChange(e) {
if (!e) { if (!e) {
form.value.giveNum = infiniteFlagNum.value; form.value.giveNum = infiniteFlagNum.value;
} else {
form.value.giveNum = "";
} }
} }
@ -165,6 +177,8 @@ const infiniteUseLimit = ref(true);
function infiniteUseLimitChange(e) { function infiniteUseLimitChange(e) {
if (!e) { if (!e) {
form.value.getLimit = infiniteFlagNum.value; form.value.getLimit = infiniteFlagNum.value;
} else {
form.value.getLimit = "";
} }
} }
@ -308,6 +322,11 @@ function show(t, obj = null) {
dialogVisible.value = true; dialogVisible.value = true;
} }
//
function closedReset() {
formRef.value.resetFields();
}
// //
async function couponPageAjax() { async function couponPageAjax() {
try { try {
@ -331,6 +350,65 @@ onMounted(() => {
couponPageAjax(); couponPageAjax();
}); });
/**
* 过滤输入只允许数字和最多两位小数
* @param {string} value - 输入框当前值
* @param {boolean} isIntegerOnly - 是否只允许正整数无小数点开启时最小值为1
* @returns {string} 过滤后的合法值
*/
function filterNumberInput(value, isIntegerOnly = false) {
//
let filtered = value.replace(/[^\d.]/g, "");
//
if (isIntegerOnly) {
//
filtered = filtered.replace(/\./g, "");
//
filtered = filtered.replace(/^0+(\d)/, "$1") || filtered;
//
if (filtered === "") {
return "";
}
//
if (filtered === "0" || parseInt(filtered, 10) < 1) {
return "1";
}
return filtered;
}
//
const parts = filtered.split(".");
if (parts.length > 1) {
filtered = parts[0] + "." + (parts[1].substring(0, 2) || "");
}
//
if (filtered.startsWith("0") && filtered.length > 1 && !filtered.startsWith("0.")) {
filtered = filtered.replace(/^0+(\d)/, "$1");
}
return filtered;
}
// input
const time = 500;
const couponGiveNumInput = _.debounce(function (value) {
couponGiveNum.value = filterNumberInput(value, true);
}, time);
const giveNumInput = _.debounce(function (value) {
form.value.giveNum = filterNumberInput(value, true);
}, time);
const getLimitInput = _.debounce(function (value) {
form.value.getLimit = filterNumberInput(value, true);
}, time);
defineExpose({ defineExpose({
show, show,
}); });

View File

@ -31,7 +31,12 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="giveNum" label="总发放数量" width="100" /> <el-table-column prop="giveNum" label="总发放数量" width="100">
<template #default="scope">
<template v-if="scope.row.giveNum == -10086">无限</template>
<template v-else>{{ scope.row.giveNum }}</template>
</template>
</el-table-column>
<el-table-column prop="giftNum" label="已领取" width="180"> <el-table-column prop="giftNum" label="已领取" width="180">
<template #default="scope"> <template #default="scope">
<div class="center"> <div class="center">
@ -47,7 +52,12 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="useNum" label="已使用" width="180" /> <el-table-column prop="useNum" label="已使用" width="180" />
<el-table-column prop="leftNum" label="剩余" width="180" /> <el-table-column prop="leftNum" label="剩余" width="180">
<template #default="scope">
<template v-if="scope.row.giveNum == -10086">无限</template>
<template v-else>{{ scope.row.leftNum }}</template>
</template>
</el-table-column>
<el-table-column prop="" label="已关联功能" width="180"> <el-table-column prop="" label="已关联功能" width="180">
<template #default="scope"> <template #default="scope">
<el-link type="primary" @click="RelevanceDialogRef.show(scope.row)"> <el-link type="primary" @click="RelevanceDialogRef.show(scope.row)">
@ -61,7 +71,7 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="1" :active-value="1"
:inactive-value="0" :inactive-value="0"
:disabled="scope.row.syncId" :disabled="!!scope.row.syncId"
@change="statusChange($event, scope.row)" @change="statusChange($event, scope.row)"
/> />
</template> </template>
@ -75,23 +85,33 @@
fixed="right" fixed="right"
> >
<template #default="scope"> <template #default="scope">
<el-button <template v-if="!scope.row.syncId">
type="primary" <el-button
link type="primary"
@click="CouponDialogRef.show(couponType, scope.row)" link
> @click="CouponDialogRef.show(couponType, scope.row)"
编辑 >
</el-button> 编辑
<el-popconfirm </el-button>
title="确认要删除吗?" <el-popconfirm
@confirm="deleteHandle(scope.row)" title="确认要删除吗?"
v-if="!scope.row.syncId" @confirm="deleteHandle(scope.row)"
> >
<template #reference> <template #reference>
<el-button type="danger" link>删除</el-button> <el-button type="danger" link>删除</el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button type="danger link" v-else>删除</el-button> </template>
<template v-else>
<el-button
type="primary"
link
@click="CouponDialogRef.show(couponType, scope.row)"
>
详情
</el-button>
<el-button type="danger" disabled link>删除</el-button>
</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -70,29 +70,47 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="1" :active-value="1"
:inactive-value="0" :inactive-value="0"
:disabled="scope.row.syncId" :disabled="!!scope.row.syncId"
@change="statusChange($event, scope.row)" @change="statusChange($event, scope.row)"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180" /> <el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column prop="actions" label="操作" align="center" width="140" fixed="right"> <el-table-column
prop="actions"
label="操作"
align="center"
width="140"
fixed="right"
>
<template #default="scope"> <template #default="scope">
<el-button <template v-if="!scope.row.syncId">
type="primary" <el-button
link type="primary"
@click="CouponDialogRef.show(couponType, scope.row)" link
> @click="CouponDialogRef.show(couponType, scope.row)"
编辑 >
</el-button> 编辑
<el-popconfirm </el-button>
title="确认要删除吗?" <el-popconfirm
@confirm="deleteHandle(scope.row)" title="确认要删除吗?"
> @confirm="deleteHandle(scope.row)"
<template #reference> >
<el-button type="danger" link>删除</el-button> <template #reference>
</template> <el-button type="danger" link>删除</el-button>
</el-popconfirm> </template>
</el-popconfirm>
</template>
<template v-else>
<el-button
type="primary"
link
@click="CouponDialogRef.show(couponType, scope.row)"
>
详情
</el-button>
<el-button type="danger" disabled link>删除</el-button>
</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -45,7 +45,12 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="useNum" label="已使用" width="180" /> <el-table-column prop="useNum" label="已使用" width="180" />
<el-table-column prop="leftNum" label="剩余" width="180" /> <el-table-column prop="leftNum" label="剩余" width="180">
<template #default="scope">
<template v-if="scope.row.giveNum == -10086">无限</template>
<template v-else>{{ scope.row.leftNum }}</template>
</template>
</el-table-column>
<el-table-column prop="" label="已关联功能" width="180"> <el-table-column prop="" label="已关联功能" width="180">
<template #default="scope"> <template #default="scope">
<el-link type="primary" @click="RelevanceDialogRef.show(scope.row)"> <el-link type="primary" @click="RelevanceDialogRef.show(scope.row)">
@ -59,7 +64,7 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="1" :active-value="1"
:inactive-value="0" :inactive-value="0"
:disabled="scope.row.syncId" :disabled="!!scope.row.syncId"
@change="statusChange($event, scope.row)" @change="statusChange($event, scope.row)"
/> />
</template> </template>
@ -73,21 +78,33 @@
fixed="right" fixed="right"
> >
<template #default="scope"> <template #default="scope">
<el-button <template v-if="!scope.row.syncId">
type="primary" <el-button
link type="primary"
@click="CouponDialogRef.show(couponType, scope.row)" link
> @click="CouponDialogRef.show(couponType, scope.row)"
编辑 >
</el-button> 编辑
<el-popconfirm </el-button>
title="确认要删除吗?" <el-popconfirm
@confirm="deleteHandle(scope.row)" title="确认要删除吗?"
> @confirm="deleteHandle(scope.row)"
<template #reference> >
<el-button type="danger" link>删除</el-button> <template #reference>
</template> <el-button type="danger" link>删除</el-button>
</el-popconfirm> </template>
</el-popconfirm>
</template>
<template v-else>
<el-button
type="primary"
link
@click="CouponDialogRef.show(couponType, scope.row)"
>
详情
</el-button>
<el-button type="danger" disabled link>删除</el-button>
</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -21,7 +21,7 @@
label="最大折扣金额" label="最大折扣金额"
width="180" width="180"
/> />
<el-table-column prop="validStartTime" label="有效期" width="200" > <el-table-column prop="validStartTime" label="有效期" width="200">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.validType == 'fixed'"> <div v-if="scope.row.validType == 'fixed'">
{{ scope.row.validDays }} {{ scope.row.validDays }}
@ -31,7 +31,12 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="giveNum" label="总发放数量" width="100" /> <el-table-column prop="giveNum" label="总发放数量" width="100">
<template #default="scope">
<template v-if="scope.row.giveNum == -10086">无限</template>
<template v-else>{{ scope.row.giveNum }}</template>
</template>
</el-table-column>
<el-table-column prop="giftNum" label="已领取" width="180"> <el-table-column prop="giftNum" label="已领取" width="180">
<template #default="scope"> <template #default="scope">
<div class="center"> <div class="center">
@ -47,7 +52,12 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="useNum" label="已使用" width="180" /> <el-table-column prop="useNum" label="已使用" width="180" />
<el-table-column prop="leftNum" label="剩余" width="180" /> <el-table-column prop="leftNum" label="剩余" width="180">
<template #default="scope">
<template v-if="scope.row.giveNum == -10086">无限</template>
<template v-else>{{ scope.row.leftNum }}</template>
</template>
</el-table-column>
<el-table-column prop="" label="已关联功能" width="180"> <el-table-column prop="" label="已关联功能" width="180">
<template #default="scope"> <template #default="scope">
<el-link type="primary" @click="RelevanceDialogRef.show(scope.row)"> <el-link type="primary" @click="RelevanceDialogRef.show(scope.row)">
@ -61,11 +71,12 @@
v-model="scope.row.status" v-model="scope.row.status"
:active-value="1" :active-value="1"
:inactive-value="0" :inactive-value="0"
:disabled="scope.row.syncId" :disabled="!!scope.row.syncId"
@change="statusChange($event, scope.row)" @change="statusChange($event, scope.row)"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column <el-table-column
prop="actions" prop="actions"
label="操作" label="操作"
@ -74,22 +85,33 @@
fixed="right" fixed="right"
> >
<template #default="scope"> <template #default="scope">
<el-button <template v-if="!scope.row.syncId">
type="primary" <el-button
size="small" type="primary"
link link
@click="CouponDialogRef.show(couponType, scope.row)" @click="CouponDialogRef.show(couponType, scope.row)"
> >
编辑 编辑
</el-button> </el-button>
<el-popconfirm <el-popconfirm
title="确认要删除吗?" title="确认要删除吗?"
@confirm="deleteHandle(scope.row)" @confirm="deleteHandle(scope.row)"
> >
<template #reference> <template #reference>
<el-button type="danger" link size="small">删除</el-button> <el-button type="danger" link>删除</el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
</template>
<template v-else>
<el-button
type="primary"
link
@click="CouponDialogRef.show(couponType, scope.row)"
>
详情
</el-button>
<el-button type="danger" disabled link>删除</el-button>
</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>