更新:增加vip续费功能
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
width="1200px"
|
width="1200px"
|
||||||
title="开通VIP"
|
:title="`${dataForm.id ? '续费' : '开通'}VIP`"
|
||||||
destroy-on-close
|
destroy-on-close
|
||||||
:close-on-click-modal="false"
|
:close-on-click-modal="false"
|
||||||
:visible.sync="visible"
|
:visible.sync="visible"
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
>
|
>
|
||||||
<div style="overflow: hidden;">
|
<div style="overflow: hidden;">
|
||||||
<el-form-item
|
<el-form-item
|
||||||
|
v-if="!dataForm.id"
|
||||||
style="width: 50%;float: left;"
|
style="width: 50%;float: left;"
|
||||||
label="手机号/邮箱:"
|
label="手机号/邮箱:"
|
||||||
prop="userKey"
|
prop="userKey"
|
||||||
@@ -26,6 +27,7 @@
|
|||||||
size="small"
|
size="small"
|
||||||
style="width: 100%;"
|
style="width: 100%;"
|
||||||
v-model="dataForm.userKey"
|
v-model="dataForm.userKey"
|
||||||
|
debounce="500"
|
||||||
:fetch-suggestions="loadAll"
|
:fetch-suggestions="loadAll"
|
||||||
placeholder="请输入手机号/邮箱"
|
placeholder="请输入手机号/邮箱"
|
||||||
@select="handleSelect"
|
@select="handleSelect"
|
||||||
@@ -62,12 +64,23 @@
|
|||||||
<el-radio
|
<el-radio
|
||||||
style="margin-right: 10px;"
|
style="margin-right: 10px;"
|
||||||
v-for="(option, index) in typeList"
|
v-for="(option, index) in typeList"
|
||||||
|
:disabled="vipTypeDisabled(option.value)"
|
||||||
:key="index"
|
:key="index"
|
||||||
:label="option.value"
|
:label="option.value"
|
||||||
>
|
>
|
||||||
{{ option.label }}
|
{{ option.label }}
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
|
<el-alert
|
||||||
|
v-if="showSelectVipTips"
|
||||||
|
:title="dataForm.id ? '只能续费已开通的VIP' : '已开通的VIP不允许再次开通,如需续费请使用续费功能。'"
|
||||||
|
class="select-vip-tips"
|
||||||
|
type="warning"
|
||||||
|
close-text="不再提示"
|
||||||
|
@close="closeVipSelectedTips"
|
||||||
|
show-icon
|
||||||
|
>
|
||||||
|
</el-alert>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="VIP年限" prop="year" class="year_block">
|
<el-form-item label="VIP年限" prop="year" class="year_block">
|
||||||
<div style="height: 40px;">
|
<div style="height: 40px;">
|
||||||
@@ -93,6 +106,14 @@
|
|||||||
<span style=" color: #f56c6c;">{{ dataForm.price }}元</span>
|
<span style=" color: #f56c6c;">{{ dataForm.price }}元</span>
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
|
|
||||||
|
<el-form-item v-if="dataForm.type && dataForm.year" label="有效期预览">
|
||||||
|
<el-table :data="periodPreview" class="periodPreview-table" row-class-name="periodPreview-table-row" header-row-class-name="periodPreview-table-row">
|
||||||
|
<el-table-column prop="vipType" label="VIP类型" width="180"></el-table-column>
|
||||||
|
<el-table-column v-if="dataForm.id" prop="oldPeriod" label="续费前有效期"></el-table-column>
|
||||||
|
<el-table-column prop="currentPeriod" :label="`本次${dataForm.id ? '续费' : '开通'}的时长`"></el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="支付方式" class="coin_block">
|
<el-form-item label="支付方式" class="coin_block">
|
||||||
<div>
|
<div>
|
||||||
<el-radio-group v-model="dataForm.payType" @input="payTypeChange">
|
<el-radio-group v-model="dataForm.payType" @input="payTypeChange">
|
||||||
@@ -143,7 +164,7 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="抵扣积分" class="coin_block">
|
<el-form-item v-if="dataForm.payType == '天医币'" label="抵扣积分" class="coin_block">
|
||||||
<div>
|
<div>
|
||||||
<el-input
|
<el-input
|
||||||
clearable
|
clearable
|
||||||
@@ -172,6 +193,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import global from "../../common/common.vue"; //引入共用组间
|
import global from "../../common/common.vue"; //引入共用组间
|
||||||
|
import { parseTime } from "@/utils";
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -226,9 +248,77 @@ export default {
|
|||||||
{ value: "1", label: "1年" },
|
{ value: "1", label: "1年" },
|
||||||
{ value: "3", label: "3年" },
|
{ value: "3", label: "3年" },
|
||||||
{ value: "4", label: "4年" }
|
{ value: "4", label: "4年" }
|
||||||
]
|
],
|
||||||
|
superVipTypeDict: {
|
||||||
|
"11": ["4", "5", "6", "9", "7", "8"],
|
||||||
|
"12": ["4", "5", "6", "9", "8"],
|
||||||
|
"1": ["4", "5", "6", "9"],
|
||||||
|
"2": ["7", "8"]
|
||||||
|
},
|
||||||
|
hasVipList: [],
|
||||||
|
hasVipMaps: {}, // 初始化为空对象
|
||||||
|
vipTypeSet: new Set(), // 添加 vipTypeSet
|
||||||
|
isShowSelectVipTips_open: !!localStorage.getItem("closeVipSelectedTips_open"),
|
||||||
|
isShowSelectVipTips_renewal: !!localStorage.getItem("closeVipSelectedTips_renewal"),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
periodPreview() {
|
||||||
|
let types = [], result = []
|
||||||
|
if (this.superVipTypeDict[this.dataForm.type]) {
|
||||||
|
types = this.superVipTypeDict[this.dataForm.type]
|
||||||
|
} else {
|
||||||
|
types = [this.dataForm.type]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取当前时间
|
||||||
|
const now = new Date();
|
||||||
|
// 计算本次开通的时长
|
||||||
|
const years = parseInt(this.dataForm.year) || 0;
|
||||||
|
|
||||||
|
types.forEach(item => {
|
||||||
|
const vipData = this.hasVipMaps[item];
|
||||||
|
// 确定开始日期
|
||||||
|
let startDate;
|
||||||
|
if (vipData && vipData.endTime) {
|
||||||
|
const endTime = new Date(vipData.endTime);
|
||||||
|
if (endTime > now) {
|
||||||
|
// 如果原有效期结束时间大于当前时间,开始日期为原结束时间
|
||||||
|
startDate = new Date(endTime);
|
||||||
|
startDate.setDate(startDate.getDate());
|
||||||
|
} else {
|
||||||
|
// 否则使用当前时间
|
||||||
|
startDate = new Date(now);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 没有原有效期信息,使用当前时间
|
||||||
|
startDate = new Date(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算结束日期
|
||||||
|
const endDate = new Date(startDate);
|
||||||
|
endDate.setFullYear(endDate.getFullYear() + years);
|
||||||
|
// 格式化日期
|
||||||
|
const formattedStartDate = parseTime(startDate, '{y}-{m}-{d}');
|
||||||
|
const formattedEndDate = parseTime(endDate, '{y}-{m}-{d}');
|
||||||
|
|
||||||
|
result.push({
|
||||||
|
vipType: this.typeList.find(e => e.value === item).label || item,
|
||||||
|
currentPeriod: `${formattedStartDate} ~ ${formattedEndDate}`,
|
||||||
|
oldPeriod: vipData ? (parseTime(vipData.startTime, '{y}-{m}-{d}') + " ~ " + parseTime(vipData.endTime, '{y}-{m}-{d}')) : '无'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
showSelectVipTips() {
|
||||||
|
if (this.dataForm.id) {
|
||||||
|
return !this.isShowSelectVipTips_renewal
|
||||||
|
} else {
|
||||||
|
return !this.isShowSelectVipTips_open
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
init(data) {
|
init(data) {
|
||||||
this.dataForm = {
|
this.dataForm = {
|
||||||
@@ -255,6 +345,7 @@ export default {
|
|||||||
}).then(({ data }) => {
|
}).then(({ data }) => {
|
||||||
if (data && data.code === 0) {
|
if (data && data.code === 0) {
|
||||||
this.dataForm = data.userVipInfo;
|
this.dataForm = data.userVipInfo;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
cb([]);
|
cb([]);
|
||||||
}
|
}
|
||||||
@@ -267,6 +358,72 @@ export default {
|
|||||||
// this.dataForm.peanutCoin = data.peanutCoin;
|
// this.dataForm.peanutCoin = data.peanutCoin;
|
||||||
// this.dataForm.jf = data.jf;
|
// this.dataForm.jf = data.jf;
|
||||||
},
|
},
|
||||||
|
renewalInit(userId, data) {
|
||||||
|
this.dataForm = {
|
||||||
|
id: userId,
|
||||||
|
name: "",
|
||||||
|
tel: "",
|
||||||
|
email: "",
|
||||||
|
userId: userId,
|
||||||
|
pageType: "", //vip类型
|
||||||
|
type: "", //vip类型
|
||||||
|
year: "",
|
||||||
|
orderSn:'',
|
||||||
|
remark: "",
|
||||||
|
fee: 0, //金额
|
||||||
|
jf: 0 //积分
|
||||||
|
}
|
||||||
|
this.visible = true;
|
||||||
|
this.$http({
|
||||||
|
url: this.$http.adornUrl("/master/userVip/getUserVipInfoByUserId"),
|
||||||
|
method: "post",
|
||||||
|
data: this.$http.adornData({
|
||||||
|
state: "",
|
||||||
|
userId,
|
||||||
|
})
|
||||||
|
}).then(({ data }) => {
|
||||||
|
if (data && data.code === 0) {
|
||||||
|
this.hasVipList = data.userVips || [];
|
||||||
|
// 在这里生成 hasVipMaps 和 vipTypeSet
|
||||||
|
this.generateVipMaps();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
generateVipMaps() {
|
||||||
|
const hasVipMaps = {};
|
||||||
|
const vipTypeSet = new Set();
|
||||||
|
|
||||||
|
// 确保 this.hasVipList 是数组
|
||||||
|
(this.hasVipList || []).forEach(vip => {
|
||||||
|
const type = vip.type.toString();
|
||||||
|
vipTypeSet.add(type);
|
||||||
|
if (!hasVipMaps[type]) {
|
||||||
|
hasVipMaps[type] = vip;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.hasVipMaps = hasVipMaps;
|
||||||
|
this.vipTypeSet = vipTypeSet;
|
||||||
|
},
|
||||||
|
vipTypeDisabled(type) {
|
||||||
|
let typeArr = [];
|
||||||
|
if (type === "11" || type === "12" || type === "1" || type === "2") {
|
||||||
|
typeArr = this.superVipTypeDict[type];
|
||||||
|
} else {
|
||||||
|
typeArr = [type];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是新开通(没有id)
|
||||||
|
if (!this.dataForm.id) {
|
||||||
|
// 如果用户已经拥有该类型(或超V包含的任何一个类型),则禁用
|
||||||
|
return typeArr.some(type => this.vipTypeSet.has(type));
|
||||||
|
}
|
||||||
|
// 如果是续费(有id)
|
||||||
|
else {
|
||||||
|
// 如果用户缺少该类型(或超V包含的任何一个类型),则禁用
|
||||||
|
return typeArr.some(type => !this.vipTypeSet.has(type));
|
||||||
|
}
|
||||||
|
},
|
||||||
handleSelect(data) {
|
handleSelect(data) {
|
||||||
console.log("data at line 161:", data);
|
console.log("data at line 161:", data);
|
||||||
this.dataForm.userKey = data.tel || data.email;
|
this.dataForm.userKey = data.tel || data.email;
|
||||||
@@ -274,6 +431,13 @@ export default {
|
|||||||
this.dataForm.name = data.name;
|
this.dataForm.name = data.name;
|
||||||
this.dataForm.tel = data.tel;
|
this.dataForm.tel = data.tel;
|
||||||
this.dataForm.email = data.email;
|
this.dataForm.email = data.email;
|
||||||
|
|
||||||
|
// 更改用户后清空已选vip类型
|
||||||
|
this.dataForm.type = "";
|
||||||
|
|
||||||
|
// 赋值当前用户已经拥有的vip,用于禁用已开通过的vip类型
|
||||||
|
this.hasVipList = data.userVips;
|
||||||
|
this.generateVipMaps();
|
||||||
},
|
},
|
||||||
loadAll(queryString, cb) {
|
loadAll(queryString, cb) {
|
||||||
this.dataForm.userId = "";
|
this.dataForm.userId = "";
|
||||||
@@ -287,7 +451,7 @@ export default {
|
|||||||
method: "post",
|
method: "post",
|
||||||
data: this.$http.adornData({
|
data: this.$http.adornData({
|
||||||
page: 1,
|
page: 1,
|
||||||
limit: 9999,
|
limit: 20,
|
||||||
key: queryString
|
key: queryString
|
||||||
})
|
})
|
||||||
}).then(({ data }) => {
|
}).then(({ data }) => {
|
||||||
@@ -301,6 +465,8 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
payTypeChange(e){
|
payTypeChange(e){
|
||||||
|
document.activeElement && document.activeElement.blur();
|
||||||
|
|
||||||
if(this.dataForm.payType){
|
if(this.dataForm.payType){
|
||||||
delete this.dataForm.orderSn;
|
delete this.dataForm.orderSn;
|
||||||
|
|
||||||
@@ -349,7 +515,7 @@ export default {
|
|||||||
var data = {
|
var data = {
|
||||||
...this.dataForm,
|
...this.dataForm,
|
||||||
|
|
||||||
jf: this.dataForm.jf || 0,
|
jf: this.dataForm.payType === "天医币" ? this.dataForm.jf || 0 : 0,
|
||||||
fee: this.dataForm.fee || 0,
|
fee: this.dataForm.fee || 0,
|
||||||
orderSn: this.dataForm.orderSn || '',
|
orderSn: this.dataForm.orderSn || '',
|
||||||
};
|
};
|
||||||
@@ -357,8 +523,9 @@ export default {
|
|||||||
data.adminId = 1;
|
data.adminId = 1;
|
||||||
console.log("...this.dataForm at line 273:", this.dataForm);
|
console.log("...this.dataForm at line 273:", this.dataForm);
|
||||||
|
|
||||||
|
const submitHttpUrl = this.dataForm.id ? "/master/userVip/renewUserVipByAdmin" : "/master/userVip/addUserVipByAdmin";
|
||||||
this.$http({
|
this.$http({
|
||||||
url: this.$http.adornUrl("/master/userVip/addUserVipByAdmin"),
|
url: this.$http.adornUrl(submitHttpUrl),
|
||||||
method: "post",
|
method: "post",
|
||||||
data: this.$http.adornData({
|
data: this.$http.adornData({
|
||||||
...data
|
...data
|
||||||
@@ -384,6 +551,41 @@ export default {
|
|||||||
//取消
|
//取消
|
||||||
handlereset() {
|
handlereset() {
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
|
|
||||||
|
// 重置 VIP 相关状态
|
||||||
|
this.hasVipList = [];
|
||||||
|
this.hasVipMaps = {};
|
||||||
|
this.vipTypeSet = new Set();
|
||||||
|
|
||||||
|
// 重置表单数据
|
||||||
|
this.dataForm = {
|
||||||
|
id: 0,
|
||||||
|
name: "",
|
||||||
|
tel: "",
|
||||||
|
email: "",
|
||||||
|
userId: "",
|
||||||
|
pageType: "",
|
||||||
|
type: "",
|
||||||
|
year: "",
|
||||||
|
orderSn: "",
|
||||||
|
remark: "",
|
||||||
|
fee: 0,
|
||||||
|
jf: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// 重置表单验证
|
||||||
|
if (this.$refs.dataForm) {
|
||||||
|
this.$refs.dataForm.resetFields();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
closeVipSelectedTips() {
|
||||||
|
if (this.dataForm.id) {
|
||||||
|
localStorage.setItem("closeVipSelectedTips_renewal", "true");
|
||||||
|
this.isShowSelectVipTips_renewal = true;
|
||||||
|
} else {
|
||||||
|
localStorage.setItem("closeVipSelectedTips_open", "true");
|
||||||
|
this.isShowSelectVipTips_open = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -445,4 +647,20 @@ export default {
|
|||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.periodPreview-table {
|
||||||
|
/deep/ tr,
|
||||||
|
/deep/ th {
|
||||||
|
background-color: #F8FAFF;
|
||||||
|
}
|
||||||
|
/deep/ .periodPreview-table-row .cell {
|
||||||
|
padding: 0 20px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.select-vip-tips {
|
||||||
|
line-height: 1;
|
||||||
|
/deep/.el-alert__content {
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -251,6 +251,12 @@
|
|||||||
@click="handleDetail(scope.row.id)"
|
@click="handleDetail(scope.row.id)"
|
||||||
>管理</el-button
|
>管理</el-button
|
||||||
>
|
>
|
||||||
|
<el-button
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
@click="handleRenewal(scope.row)"
|
||||||
|
>续费</el-button
|
||||||
|
>
|
||||||
<!-- <el-button
|
<!-- <el-button
|
||||||
type="text"
|
type="text"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -943,18 +949,28 @@ if (latest && latest.endTime) {
|
|||||||
this.youVisible = true;
|
this.youVisible = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
// 续费
|
||||||
|
handleRenewal(row) {
|
||||||
|
this.openVipVisible = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.openVip.renewalInit(row.id, row);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style scoped>
|
<style scoped>
|
||||||
::v-deep .mod-config .el-table .el-table__cell {
|
.mod-config /deep/ .el-table .el-table__cell {
|
||||||
padding: 4px 0 !important;
|
padding: 4px 0 !important;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
::v-deep .mod-config .el-table .cell,
|
.mod-config /deep/ .el-table .cell,
|
||||||
.el-table th div {
|
.el-table th div {
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
.el-form /deep/ .el-form-item{
|
||||||
|
margin-bottom:10px !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user