management/src/views/coupon_manage/add_coupon.vue

446 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- eslint-disable vue/no-use-v-if-with-v-for -->
<template>
<div class="app-container">
<div class="tab">
<div v-for="(item,index) in tabList" v-if="(form.id&&form.type == item.type)||!form.id" :key="index" class="tab_item" :class="{active: form.type == item.type}" @click="tabClick(item)"> {{ item.name }} <span class="bor" /></div>
</div>
<!-- 优惠券 -->
<div v-if="form.type == 1" class="content">
<el-form ref="form" :inline="true" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="优惠券券名" prop="title" style="width: 100%;">
<el-input v-model="form.title" placeholder="" style="width: 289px;" />
</el-form-item>
<el-form-item label="使用门槛" prop="fullAmount">
<el-input v-model="form.fullAmount" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 180px;margin-right: 66px;">
<template slot="prepend">满</template>
<template slot="append">元</template>
</el-input>
</el-form-item>
<el-form-item label="" prop="discountAmount">
<el-input v-model="form.discountAmount" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 180px;">
<template slot="prepend">减</template>
<template slot="append">元</template>
</el-input>
</el-form-item>
<el-form-item label="有效期类型" style="width: 100%;">
<el-radio-group v-model="form.validityType">
<el-radio v-for="item in couponEnum.validityType" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.validityType == 'custom'" label="有效时间" prop="validEndTime" style="width: 100%;">
<el-date-picker
v-model="validityTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['06:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
@change="validityChange"
/>
</el-form-item>
<el-form-item label="有效期(天)" prop="validDays" style="width: 100%;">
<el-input v-model="form.validDays" placeholder="" style="width: 200px;">
<template slot="append">天</template>
</el-input>
</el-form-item>
<!-- <el-form-item label="使用门槛" prop="daysToTakeEffect" style="width: 100%;">
<el-input v-model="form.daysToTakeEffect" placeholder="" style="width: 200px;">
<template slot="prepend">隔</template>
<template slot="append">天生效</template>
</el-input>
<el-tooltip class="item" effect="dark" content="领取后0天后0点0分" placement="top-start">
<i class="el-icon-question" />
</el-tooltip>
</el-form-item> -->
<el-form-item label="可用周期" prop="userDays" style="width: 100%;">
<el-checkbox-group v-model="form.userDays">
<el-checkbox v-for="(city,index) in couponEnum.cycle" :key="index" :label="city.label" @change="userDayChagne">{{ city.label }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="指定时间段" style="width: 100%;">
<el-radio-group v-model="form.useTimeType">
<el-radio v-for="item in couponEnum.useTimeType" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.useTimeType == 'custom'" label="指定时间段" prop="useEndTime" style="width: 100%;">
<el-time-picker
v-model="useTime"
is-range
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
value-format="HH:mm"
@change="useTimeChange"
/>
</el-form-item>
<el-form-item label="发放数量" prop="number" style="width: 100%;">
<el-input v-model="form.number" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 200px;" />
<el-tooltip class="item" effect="dark" content="限用户自行领取,(当库存为 0时集草等活动仍会赠送" placement="top-start">
<i class="el-icon-question" />
</el-tooltip>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
</span>
</div>
<!-- 商品券 -->
<div v-if="form.type == 2" class="content">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="商品券券名" prop="title">
<el-input v-model="form.title" placeholder="" style="width: 289px;" />
</el-form-item>
<el-form-item label="发放数量" prop="number">
<el-input v-model="form.number" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 289px;" />
<el-tooltip class="item" effect="dark" content="限用户自行领取,(当库存为 0时集草等活动仍会赠送" placement="top-start">
<i class="el-icon-question" />
</el-tooltip>
</el-form-item>
<el-form-item label="使用门槛" prop="fullAmount">
全额满<el-input v-model="form.fullAmount" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 100px;margin: 0 23px;"><template slot="suffix">元</template></el-input>可用
</el-form-item>
<el-form-item label="赠送商品" prop="products">
<div>
<el-button type="primary" icon="el-icon-plus" @click="$refs.shopListRef.show([...form.products])">
添加 </el-button>
</div>
<div class="shop_list">
<div
v-for="(item, index) in form.products"
:key="item.id"
class="item_wrap"
>
<div class="name">{{ item.name }}</div>
<el-input v-model="item.num" placeholder="请填写数量" style="width: 100px;" />
<div class="del" @click="form.products.splice(index, 1)">删除</div>
</div>
</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle">确 定</el-button>
</span>
</div>
<shopList ref="shopListRef" @success="slectShop" />
</div>
</template>
<script>
import couponEnum from './couponEnum'
import shopList from '@/components/shopList'
import { addTbShopCoupon, getTbShopCouponInfo } from '@/api/coupon'
export default {
components: { shopList },
data() {
const validateProduct = (rule, value, callback) => {
if (!this.form.products.length) {
callback(new Error('请选择商品'))
} else {
callback()
}
}
return {
tabList: [
{ name: '新增优惠券', type: 1 },
{ name: '新增商品券', type: 2 }
],
tabActive: 1,
couponEnum,
dialogVisible: false,
loading: false,
validityTime: [],
useTime: ['06:00:00', '23:59:59'],
form: {
id: '',
shopId: '',
type: '1',
title: '',
fullAmount: null,
discountAmount: null,
validityType: 'fixed',
validStartTime: '',
validEndTime: '',
userDays: [],
validDays: '',
useTimeType: 'all',
useStartTime: '',
useEndTime: '',
products: [],
number: ''
},
rules: {
title: [
{
required: true,
message: '填写券名',
trigger: 'blur'
}
],
fullAmount: [
{
required: true,
message: '填写满减金额',
trigger: 'blur'
}
],
discountAmount: [
{
required: true,
message: '填写满减金额',
trigger: 'blur'
}
],
number: [
{
required: true,
message: '填写发放数量',
trigger: 'blur'
}
],
validDays: [
{
required: true,
message: '填写有效天数',
trigger: 'blur'
}
],
daysToTakeEffect: [
{
required: true,
message: '填写生效天数',
trigger: 'blur'
}
],
userDays: [
{
required: true,
message: '选择可用周期',
trigger: 'change'
}
],
validEndTime: [
{
required: true,
message: '选择有效时间段',
trigger: 'change'
}
],
useEndTime: [
{
required: true,
message: '选择指定时间段',
trigger: 'change'
}
],
products: [
{
required: true,
validator: validateProduct,
trigger: 'change'
}
]
},
resetForm: ''
}
},
mounted() {
this.resetForm = { ...this.form }
this.form.type = this.$route.query.type
this.form.useStartTime = this.useTime[0]
this.form.useEndTime = this.useTime[1]
if (this.$route.query.id) { this.form.id = this.$route.query.id; this.getCouponInfo(this.$route.query.id) }
},
methods: {
/**
* 切换类型
* @param item
*/
tabClick(item) {
console.log(this.form)
this.form.number = ''
this.form.type = item.type
this.$refs.form.resetFields()
},
/**
* 获取优惠券详情
*/
async getCouponInfo(id) {
const resInfo = await getTbShopCouponInfo(id)
this.form = resInfo
if (resInfo.validityType === 'custom') {
this.validityTime = [resInfo.validStartTime, resInfo.validEndTime]
}
if (resInfo.useTimeType === 'custom') {
this.useTime = [resInfo.useStartTime, resInfo.useEndTime]
}
this.form.userDays = this.form.userDays.split(',')
},
/**
* 选择可用周期
*/
userDayChagne(e) {
console.log(this.form.userDays)
},
/**
* 有效期选择
* @param e
*/
validityChange(e) {
this.form.validStartTime = e[0]
this.form.validEndTime = e[1]
},
/**
* 指定时间段选择
* @param e
*/
useTimeChange(e) {
this.form.useStartTime = e[0]
this.form.useEndTime = e[1]
},
/**
* 选择商品
* @param res
*/
slectShop(res) {
if (res.length <= 0) {
return
}
this.form.products = []
if (this.form.products.length) {
res.map(async item => {
if (!await this.checkShop(item.id)) {
this.form.products.push({
id: item.id,
name: item.name,
num: null
})
}
})
} else {
this.form.products.push({
id: res[0].id,
name: res[0].name,
num: null
})
}
},
/**
* 判断是否存在重复商品
* @param id
*/
checkShop(id) {
let falg = false
this.form.products.map(item => {
// eslint-disable-next-line eqeqeq
if (item.id == id) {
falg = true
}
})
return falg
},
/**
* 提交
*/
onSubmitHandle() {
console.log(this.form)
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
if (!this.form.shopId) { this.form.shopId = localStorage.getItem('shopId') }
this.form.userDays = this.form.userDays.toString()
// eslint-disable-next-line no-unused-vars
const res = await addTbShopCoupon(this.form)
this.$store.dispatch('tagsView/delView', this.$route) // 关闭当前页
this.$router.replace({ name: 'coupon_list' }) // 要打开的页面
this.$notify({
title: '成功',
message: `${this.form.id ? '编辑' : '添加'}成功`,
type: 'success'
})
this.loading = false
} catch (error) {
this.loading = false
console.log(error)
}
}
})
}
}
}
</script>
<style scoped lang="scss">
.tab{
display: flex;
margin-bottom: 30px;
padding-top: 40px;
padding-left: 10px;
.tab_item{
margin-right: 64px;
font-weight: 400;
font-size: 16px;
color: #666666;
cursor: pointer;
.bor{
display: block;
width: 56px;
height: 6px;
background-color: transparent;
border-radius: 3px 3px 3px 3px;
margin: 5px auto 0;
}
}
.active{
color: #3F9EFF;
.bor{
background-color: #3F9EFF;
}
}
}
.content{
font-weight: 400;
font-size: 16px;
color: #666666;
}
.shop_list {
display: flex;
flex-wrap: wrap;
margin-top: 15px;
.item_wrap {
$size: 80px;
display: flex;
align-items: center;
.name {
width: $size;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.del{
font-weight: 400;
font-size: 14px;
color: #3F9EFF;
margin-left: 11px;
}
}
}
</style>