464 lines
16 KiB
JavaScript
464 lines
16 KiB
JavaScript
|
|
// 批量编辑第二步 - 等级设置页面
|
||
|
|
|
||
|
|
let selectedShops = [];
|
||
|
|
let levelData = [];
|
||
|
|
|
||
|
|
// 预设模板
|
||
|
|
const templates = {
|
||
|
|
default: [
|
||
|
|
{
|
||
|
|
level: 'LV1',
|
||
|
|
name: '铜牌会员',
|
||
|
|
growthMin: 0,
|
||
|
|
growthMax: 100,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 5,
|
||
|
|
pointExchange: false,
|
||
|
|
birthdayCoupon: false,
|
||
|
|
birthdayDoublePoints: false
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV2',
|
||
|
|
name: '银牌会员',
|
||
|
|
growthMin: 101,
|
||
|
|
growthMax: 500,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 10,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV3',
|
||
|
|
name: '金牌会员',
|
||
|
|
growthMin: 501,
|
||
|
|
growthMax: 1200,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 15,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
}
|
||
|
|
],
|
||
|
|
premium: [
|
||
|
|
{
|
||
|
|
level: 'LV1',
|
||
|
|
name: '新手会员',
|
||
|
|
growthMin: 0,
|
||
|
|
growthMax: 200,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 8,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: false
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV2',
|
||
|
|
name: '进阶会员',
|
||
|
|
growthMin: 201,
|
||
|
|
growthMax: 800,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 15,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV3',
|
||
|
|
name: '高级会员',
|
||
|
|
growthMin: 801,
|
||
|
|
growthMax: 2000,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 20,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
level: 'LV4',
|
||
|
|
name: 'VIP会员',
|
||
|
|
growthMin: 2001,
|
||
|
|
growthMax: 9999,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: 25,
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
}
|
||
|
|
]
|
||
|
|
};
|
||
|
|
|
||
|
|
// 获取URL参数
|
||
|
|
function getUrlParameter(name) {
|
||
|
|
const urlParams = new URLSearchParams(window.location.search);
|
||
|
|
return urlParams.get(name) || '';
|
||
|
|
}
|
||
|
|
|
||
|
|
// 页面初始化
|
||
|
|
document.addEventListener('DOMContentLoaded', function() {
|
||
|
|
loadSelectedShops();
|
||
|
|
loadTemplate('default'); // 默认加载基础模板
|
||
|
|
displaySelectedShops();
|
||
|
|
});
|
||
|
|
|
||
|
|
// 加载选中的店铺数据
|
||
|
|
function loadSelectedShops() {
|
||
|
|
const storedShops = sessionStorage.getItem('batchEditSelectedShops');
|
||
|
|
if (storedShops) {
|
||
|
|
selectedShops = JSON.parse(storedShops);
|
||
|
|
} else {
|
||
|
|
// 如果没有数据,返回上一步
|
||
|
|
showNotification('未找到选中的店铺数据,请重新选择', 'error');
|
||
|
|
setTimeout(() => {
|
||
|
|
navigateTo('batch-edit-step1.html');
|
||
|
|
}, 2000);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 显示选中的店铺
|
||
|
|
function displaySelectedShops() {
|
||
|
|
const shopCount = document.getElementById('shop-count');
|
||
|
|
const shopsList = document.getElementById('selected-shops-list');
|
||
|
|
|
||
|
|
shopCount.textContent = selectedShops.length;
|
||
|
|
|
||
|
|
const html = selectedShops.map(shop => `
|
||
|
|
<span class="shop-tag">${shop.name}</span>
|
||
|
|
`).join('');
|
||
|
|
|
||
|
|
shopsList.innerHTML = html;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 加载模板
|
||
|
|
function loadTemplate(templateName) {
|
||
|
|
if (templates[templateName]) {
|
||
|
|
levelData = JSON.parse(JSON.stringify(templates[templateName])); // 深拷贝
|
||
|
|
renderTable();
|
||
|
|
showNotification(`已加载${templateName === 'default' ? '默认' : '高级'}模板`, 'success');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 重置设置
|
||
|
|
function resetSettings() {
|
||
|
|
confirmAction('确定要重置所有设置吗?', () => {
|
||
|
|
levelData = [];
|
||
|
|
renderTable();
|
||
|
|
showNotification('已重置所有设置', 'info');
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 渲染表格
|
||
|
|
function renderTable() {
|
||
|
|
const tableBody = document.getElementById('level-edit-table');
|
||
|
|
let html = '';
|
||
|
|
|
||
|
|
levelData.forEach((level, index) => {
|
||
|
|
// 主行
|
||
|
|
html += `
|
||
|
|
<tr>
|
||
|
|
<td>${level.level}</td>
|
||
|
|
<td>
|
||
|
|
<input type="text" value="${level.name}" id="levelName_${index}"
|
||
|
|
style="width: 100%; padding: 5px; border: 1px solid #ddd;"
|
||
|
|
onchange="updateLevelData(${index}, 'name', this.value)">
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<button class="expand-btn" onclick="toggleLevelDetail(${index})" id="expandBtn_${index}">
|
||
|
|
展开详情
|
||
|
|
</button>
|
||
|
|
</td>
|
||
|
|
</tr>`;
|
||
|
|
|
||
|
|
// 详情行(默认隐藏)
|
||
|
|
html += `
|
||
|
|
<tr id="detailRow_${index}" class="level-detail-row hidden">
|
||
|
|
<td colspan="3">
|
||
|
|
<div class="level-detail-content">
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">成长值范围</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<input type="number" value="${level.growthMin}" id="growthMin_${index}"
|
||
|
|
style="width:60px;" onchange="updateLevelData(${index}, 'growthMin', this.value)">
|
||
|
|
-
|
||
|
|
<input type="number" value="${level.growthMax}" id="growthMax_${index}"
|
||
|
|
style="width:60px;" onchange="updateLevelData(${index}, 'growthMax', this.value)">
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">开启会员折扣</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<label class="switch">
|
||
|
|
<input type="checkbox" ${level.memberDiscount ? 'checked' : ''}
|
||
|
|
id="memberDiscount_${index}" onchange="toggleDiscountRate(${index})">
|
||
|
|
<span class="slider"></span>
|
||
|
|
</label>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">折扣率(%)</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<input type="number" value="${level.discountRate}" id="discountRate_${index}"
|
||
|
|
${!level.memberDiscount ? 'disabled' : ''}
|
||
|
|
onchange="updateLevelData(${index}, 'discountRate', this.value)">
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">开启积分兑换</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<label class="switch">
|
||
|
|
<input type="checkbox" ${level.pointExchange ? 'checked' : ''}
|
||
|
|
id="pointExchange_${index}" onchange="updateLevelData(${index}, 'pointExchange', this.checked)">
|
||
|
|
<span class="slider"></span>
|
||
|
|
</label>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">开启生日优惠券</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<label class="switch">
|
||
|
|
<input type="checkbox" ${level.birthdayCoupon ? 'checked' : ''}
|
||
|
|
id="birthdayCoupon_${index}" onchange="toggleCouponButton(${index})">
|
||
|
|
<span class="slider"></span>
|
||
|
|
</label>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">生日优惠券设置</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<button class="btn btn-small ${!level.birthdayCoupon ? 'hidden' : ''}"
|
||
|
|
id="addCouponBtn_${index}" onclick="addBirthdayCoupon(${index})">
|
||
|
|
添加优惠券
|
||
|
|
</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-form-group">
|
||
|
|
<div class="detail-label">开启生日双倍积分</div>
|
||
|
|
<div class="detail-input">
|
||
|
|
<label class="switch">
|
||
|
|
<input type="checkbox" ${level.birthdayDoublePoints ? 'checked' : ''}
|
||
|
|
id="birthdayDoublePoints_${index}" onchange="updateLevelData(${index}, 'birthdayDoublePoints', this.checked)">
|
||
|
|
<span class="slider"></span>
|
||
|
|
</label>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="detail-actions">
|
||
|
|
${index === levelData.length - 1 ? `
|
||
|
|
<button class="btn btn-primary" onclick="addNewLevel()" style="margin-right: 10px;">
|
||
|
|
添加新等级
|
||
|
|
</button>
|
||
|
|
<button class="btn" style="background: #f44336; color: white;" onclick="deleteLevel(${index})">
|
||
|
|
删除等级
|
||
|
|
</button>
|
||
|
|
` : ''}
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</td>
|
||
|
|
</tr>`;
|
||
|
|
});
|
||
|
|
|
||
|
|
tableBody.innerHTML = html;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更新等级数据
|
||
|
|
function updateLevelData(index, field, value) {
|
||
|
|
if (levelData[index]) {
|
||
|
|
if (field === 'growthMin' || field === 'growthMax' || field === 'discountRate') {
|
||
|
|
levelData[index][field] = parseInt(value) || 0;
|
||
|
|
} else {
|
||
|
|
levelData[index][field] = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 切换等级详情展开/收缩
|
||
|
|
function toggleLevelDetail(index) {
|
||
|
|
const detailRow = document.getElementById(`detailRow_${index}`);
|
||
|
|
const expandBtn = document.getElementById(`expandBtn_${index}`);
|
||
|
|
|
||
|
|
if (detailRow.classList.contains('hidden')) {
|
||
|
|
// 展开
|
||
|
|
detailRow.classList.remove('hidden');
|
||
|
|
expandBtn.textContent = '收起详情';
|
||
|
|
expandBtn.style.background = '#ff9800';
|
||
|
|
} else {
|
||
|
|
// 收起
|
||
|
|
detailRow.classList.add('hidden');
|
||
|
|
expandBtn.textContent = '展开详情';
|
||
|
|
expandBtn.style.background = '#4CAF50';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 切换折扣率输入框状态
|
||
|
|
function toggleDiscountRate(index) {
|
||
|
|
const checkbox = document.getElementById(`memberDiscount_${index}`);
|
||
|
|
const discountInput = document.getElementById(`discountRate_${index}`);
|
||
|
|
|
||
|
|
if (checkbox.checked) {
|
||
|
|
discountInput.disabled = false;
|
||
|
|
levelData[index].memberDiscount = true;
|
||
|
|
} else {
|
||
|
|
discountInput.disabled = true;
|
||
|
|
levelData[index].memberDiscount = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 切换优惠券按钮显示
|
||
|
|
function toggleCouponButton(index) {
|
||
|
|
const checkbox = document.getElementById(`birthdayCoupon_${index}`);
|
||
|
|
const addButton = document.getElementById(`addCouponBtn_${index}`);
|
||
|
|
|
||
|
|
if (checkbox.checked) {
|
||
|
|
addButton.classList.remove('hidden');
|
||
|
|
levelData[index].birthdayCoupon = true;
|
||
|
|
} else {
|
||
|
|
addButton.classList.add('hidden');
|
||
|
|
levelData[index].birthdayCoupon = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 添加生日优惠券
|
||
|
|
function addBirthdayCoupon(index) {
|
||
|
|
const modal = document.getElementById('coupon-modal');
|
||
|
|
modal.classList.remove('hidden');
|
||
|
|
resetCouponForm();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 关闭优惠券弹窗
|
||
|
|
function closeCouponModal(event) {
|
||
|
|
if (event && event.target !== event.currentTarget) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const modal = document.getElementById('coupon-modal');
|
||
|
|
if (modal) {
|
||
|
|
modal.classList.add('hidden');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 重置优惠券表单
|
||
|
|
function resetCouponForm() {
|
||
|
|
document.getElementById('coupon-name').value = '生日优惠券';
|
||
|
|
document.getElementById('coupon-threshold').value = '10';
|
||
|
|
document.getElementById('coupon-discount').value = '1';
|
||
|
|
document.getElementById('coupon-validity').value = '1';
|
||
|
|
}
|
||
|
|
|
||
|
|
// 提交优惠券
|
||
|
|
function submitCoupon() {
|
||
|
|
const couponData = {
|
||
|
|
name: document.getElementById('coupon-name').value,
|
||
|
|
threshold: document.getElementById('coupon-threshold').value,
|
||
|
|
discount: document.getElementById('coupon-discount').value,
|
||
|
|
validity: document.getElementById('coupon-validity').value
|
||
|
|
};
|
||
|
|
|
||
|
|
if (!couponData.name.trim()) {
|
||
|
|
showNotification('请输入优惠券名称', 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (parseInt(couponData.discount) >= parseInt(couponData.threshold)) {
|
||
|
|
showNotification('减免金额不能大于或等于门槛金额', 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
showNotification(`成功添加优惠券:${couponData.name}`, 'success');
|
||
|
|
closeCouponModal();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 删除等级
|
||
|
|
function deleteLevel(index) {
|
||
|
|
if (levelData.length <= 1) {
|
||
|
|
showNotification('至少需要保留一个等级', 'warning');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
confirmAction('确定要删除这个等级吗?', () => {
|
||
|
|
levelData.splice(index, 1);
|
||
|
|
|
||
|
|
// 重新编号等级
|
||
|
|
levelData.forEach((level, i) => {
|
||
|
|
level.level = `LV${i + 1}`;
|
||
|
|
});
|
||
|
|
|
||
|
|
renderTable();
|
||
|
|
showNotification(`删除等级成功`, 'success');
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 添加新等级
|
||
|
|
function addNewLevel() {
|
||
|
|
const newLevelNum = levelData.length + 1;
|
||
|
|
const lastLevel = levelData[levelData.length - 1];
|
||
|
|
|
||
|
|
const newLevel = {
|
||
|
|
level: `LV${newLevelNum}`,
|
||
|
|
name: `新等级${newLevelNum}`,
|
||
|
|
growthMin: lastLevel.growthMax + 1,
|
||
|
|
growthMax: lastLevel.growthMax + 1000,
|
||
|
|
memberDiscount: true,
|
||
|
|
discountRate: Math.min(lastLevel.discountRate + 5, 50),
|
||
|
|
pointExchange: true,
|
||
|
|
birthdayCoupon: true,
|
||
|
|
birthdayDoublePoints: true
|
||
|
|
};
|
||
|
|
|
||
|
|
levelData.push(newLevel);
|
||
|
|
renderTable();
|
||
|
|
showNotification(`添加新等级 LV${newLevelNum}`, 'success');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 上一步
|
||
|
|
function previousStep() {
|
||
|
|
navigateTo('batch-edit-step1.html');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 下一步
|
||
|
|
function nextStep() {
|
||
|
|
if (levelData.length === 0) {
|
||
|
|
showNotification('请至少设置一个等级', 'warning');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证等级设置
|
||
|
|
for (let i = 0; i < levelData.length; i++) {
|
||
|
|
const level = levelData[i];
|
||
|
|
if (!level.name.trim()) {
|
||
|
|
showNotification(`请为 ${level.level} 设置等级名称`, 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (level.growthMin >= level.growthMax) {
|
||
|
|
showNotification(`${level.level} 的成长值范围设置有误`, 'error');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 将等级设置数据存储到sessionStorage
|
||
|
|
sessionStorage.setItem('batchEditLevelData', JSON.stringify(levelData));
|
||
|
|
|
||
|
|
// 跳转到第三步
|
||
|
|
navigateTo('batch-edit-step3.html');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 导出函数到全局
|
||
|
|
window.loadTemplate = loadTemplate;
|
||
|
|
window.resetSettings = resetSettings;
|
||
|
|
window.toggleLevelDetail = toggleLevelDetail;
|
||
|
|
window.toggleDiscountRate = toggleDiscountRate;
|
||
|
|
window.toggleCouponButton = toggleCouponButton;
|
||
|
|
window.addBirthdayCoupon = addBirthdayCoupon;
|
||
|
|
window.closeCouponModal = closeCouponModal;
|
||
|
|
window.submitCoupon = submitCoupon;
|
||
|
|
window.deleteLevel = deleteLevel;
|
||
|
|
window.addNewLevel = addNewLevel;
|
||
|
|
window.updateLevelData = updateLevelData;
|
||
|
|
window.previousStep = previousStep;
|
||
|
|
window.nextStep = nextStep;
|