|
@@ -116,10 +116,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
rules: {
|
|
|
// 奖品设置验证
|
|
|
prize_setting_check: function(element) {
|
|
|
- // 检查奖品数量
|
|
|
- var prizeCount = $('.prize-item').length - 1; // 减去未中奖项
|
|
|
- if (prizeCount < 8) {
|
|
|
- return '奖品数量不足,必须添加8个奖品,当前只有' + prizeCount + '个';
|
|
|
+ // 检查奖品数量(总共需要8个奖品,包含系统默认的未中奖项)
|
|
|
+ var totalPrizeCount = $('.prize-item').length; // 总奖品数
|
|
|
+ if (totalPrizeCount < 8) {
|
|
|
+ var userPrizeCount = totalPrizeCount - 1; // 用户添加的奖品数
|
|
|
+ var needCount = 8 - totalPrizeCount; // 还需要添加的奖品数
|
|
|
+ return '奖品数量不足,还需要添加' + needCount + '个奖品(当前总共' + totalPrizeCount + '个奖品)';
|
|
|
}
|
|
|
|
|
|
// 检查总概率
|
|
@@ -171,58 +173,81 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
|
|
|
// 初始化添加页面
|
|
|
initAddPage: function() {
|
|
|
- // 使用辅助函数解析并输出JSON数据
|
|
|
- var conditionTypeList = Controller.api.parseConfigJson('conditionTypeList', {});
|
|
|
- var prizeTypeList = Controller.api.parseConfigJson('prizeTypeList', {});
|
|
|
- var prizeDefaultImages = Controller.api.parseConfigJson('prizeDefaultImages', {});
|
|
|
+ // 初始化基础UI组件
|
|
|
+ Controller.api.initBasicUI();
|
|
|
|
|
|
-
|
|
|
+ // 初始化奖品管理
|
|
|
+ Controller.api.initPrizeManagement();
|
|
|
+
|
|
|
+ // 初始化任务规则管理
|
|
|
+ Controller.api.initTaskRuleManagement();
|
|
|
|
|
|
+ // 确保DOM渲染完成后再计算奖品数量
|
|
|
+ setTimeout(function() {
|
|
|
+ Controller.api.updatePrizeCount();
|
|
|
+ }, 50);
|
|
|
+
|
|
|
+ // 初始化表单验证
|
|
|
+ Controller.api.initFormValidation();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 初始化基础UI组件
|
|
|
+ initBasicUI: function() {
|
|
|
// 活动名称字数统计
|
|
|
$('#c-name').on('input', function(){
|
|
|
var len = $(this).val().length;
|
|
|
$('#activity-name-count').text(len + '/24');
|
|
|
});
|
|
|
|
|
|
+ // 初始化商品选择
|
|
|
+ Controller.api.initGoodsSelector();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 初始化任务规则管理
|
|
|
+ initTaskRuleManagement: function() {
|
|
|
// 任务类型切换(复选框)
|
|
|
$(document).on('change', 'input[name="row[task_type][]"]', function() {
|
|
|
- var checkedTypes = $('input[name="row[task_type][]"]:checked');
|
|
|
-
|
|
|
- // 更新复选框样式
|
|
|
- $('input[name="row[task_type][]"]').each(function() {
|
|
|
- var label = $(this).closest('label');
|
|
|
- if ($(this).is(':checked')) {
|
|
|
- label.addClass('checked');
|
|
|
- } else {
|
|
|
- label.removeClass('checked');
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- // 隐藏所有任务设置项
|
|
|
- $('.task-setting-item').hide();
|
|
|
-
|
|
|
- // 显示选中的任务设置项
|
|
|
- checkedTypes.each(function() {
|
|
|
- var type = parseInt($(this).val());
|
|
|
- $('#task-setting-' + type).show();
|
|
|
- });
|
|
|
+ Controller.api.handleTaskTypeChange();
|
|
|
});
|
|
|
|
|
|
- // 初始化奖品管理
|
|
|
- Controller.api.initPrizeManagement();
|
|
|
+ // 商品规则切换
|
|
|
+ $(document).on('change', 'input[name^="condition"][name$="[goods_rule]"]', function() {
|
|
|
+ Controller.api.updateGoodsRuleDisplay($(this));
|
|
|
+ });
|
|
|
|
|
|
- // 初始化奖品计数(因为默认有未中奖项,所以显示0)
|
|
|
- $('#prize-count').text('0');
|
|
|
+ // 初始化任务类型状态
|
|
|
+ Controller.api.initTaskTypeState();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 处理任务类型变化
|
|
|
+ handleTaskTypeChange: function() {
|
|
|
+ var checkedTypes = $('input[name="row[task_type][]"]:checked');
|
|
|
|
|
|
- // 初始化添加奖品按钮状态
|
|
|
- Controller.api.updateAddPrizeButtonState(0);
|
|
|
+ // 更新复选框样式
|
|
|
+ $('input[name="row[task_type][]"]').each(function() {
|
|
|
+ var label = $(this).closest('label');
|
|
|
+ if ($(this).is(':checked')) {
|
|
|
+ label.addClass('checked');
|
|
|
+ } else {
|
|
|
+ label.removeClass('checked');
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- // 初始化商品选择
|
|
|
- Controller.api.initGoodsSelector();
|
|
|
+ // 隐藏所有任务设置项
|
|
|
+ $('.task-setting-item').hide();
|
|
|
|
|
|
-
|
|
|
+ // 显示选中的任务设置项
|
|
|
+ checkedTypes.each(function() {
|
|
|
+ var type = parseInt($(this).val());
|
|
|
+ $('#task-setting-' + type).show();
|
|
|
+ });
|
|
|
|
|
|
- // 初始化任务类型验证状态和显示
|
|
|
+ // 更新验证规则
|
|
|
+ Controller.api.updateTaskValidation();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 初始化任务类型状态
|
|
|
+ initTaskTypeState: function() {
|
|
|
var checkedTasks = $('input[name="row[task_type][]"]:checked');
|
|
|
|
|
|
// 初始化复选框样式
|
|
@@ -244,9 +269,245 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
});
|
|
|
},
|
|
|
|
|
|
+ // 更新商品规则显示
|
|
|
+ updateGoodsRuleDisplay: function($radio) {
|
|
|
+ var container = $radio.closest('.task-setting-item');
|
|
|
+ var rule = $radio.val();
|
|
|
+ var helpText = container.find('.goods-description-box');
|
|
|
+
|
|
|
+ if (rule == '1') {
|
|
|
+ helpText.html('<span class="text-muted">指定商品下单后将自动触发抽奖活动且发放一次抽奖机会,若用户产生维权退款,已发放的奖励自动回收。</span>');
|
|
|
+ } else {
|
|
|
+ helpText.html('<span class="text-muted">除指定商品外的其他商品下单后将自动触发抽奖活动且发放一次抽奖机会。</span>');
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 更新任务验证规则
|
|
|
+ updateTaskValidation: function() {
|
|
|
+ var checkedTypes = $('input[name="row[task_type][]"]:checked');
|
|
|
+
|
|
|
+ // 移除旧的验证规则
|
|
|
+ $('[name^="condition"]').removeAttr('data-rule');
|
|
|
+
|
|
|
+ // 为选中的任务类型添加验证规则
|
|
|
+ checkedTypes.each(function() {
|
|
|
+ var type = parseInt($(this).val());
|
|
|
+
|
|
|
+ switch(type) {
|
|
|
+ case 1: // 购买指定商品
|
|
|
+ // 商品选择验证会在选择商品时处理
|
|
|
+ break;
|
|
|
+ case 2: // 单笔订单消费满额
|
|
|
+ case 3: // 单次充值满额
|
|
|
+ case 4: // 活动期间累计消费满额
|
|
|
+ $('[name="condition[' + type + '][condition_value]"]').attr('data-rule', 'required;number(0.01~999999.99)');
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ // 初始化表单验证
|
|
|
+ initFormValidation: function() {
|
|
|
+ // 自定义验证规则已在bindevent中定义
|
|
|
+
|
|
|
+ // 监听表单提交事件
|
|
|
+ $('form[role="form"]').on('submit', function(e) {
|
|
|
+ console.log('表单提交开始');
|
|
|
+
|
|
|
+ // 验证奖品设置
|
|
|
+ if (!Controller.api.validatePrizes()) {
|
|
|
+ e.preventDefault();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证任务规则设置
|
|
|
+ if (!Controller.api.validateTaskRules()) {
|
|
|
+ e.preventDefault();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 收集奖品数据并添加到表单
|
|
|
+ var prizeData = Controller.api.collectPrizeData();
|
|
|
+ if (prizeData.length > 0) {
|
|
|
+ // 移除之前的隐藏字段
|
|
|
+ $('form[role="form"] input[name^="prizes["]').remove();
|
|
|
+
|
|
|
+ // 添加新的奖品数据
|
|
|
+ for (var i = 0; i < prizeData.length; i++) {
|
|
|
+ var prize = prizeData[i];
|
|
|
+ for (var key in prize) {
|
|
|
+ if (prize[key] !== null && prize[key] !== undefined) {
|
|
|
+ $('<input>').attr({
|
|
|
+ type: 'hidden',
|
|
|
+ name: 'prizes[' + i + '][' + key + ']',
|
|
|
+ value: prize[key]
|
|
|
+ }).appendTo('form[role="form"]');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 收集条件数据并添加到表单
|
|
|
+ var conditionResult = Controller.api.collectConditionData();
|
|
|
+ var conditionData = conditionResult.conditionData;
|
|
|
+ var taskTypes = conditionResult.taskTypes;
|
|
|
+
|
|
|
+ if (conditionData.length > 0) {
|
|
|
+ // 移除之前的隐藏字段
|
|
|
+ $('form[role="form"] input[name^="condition["]').remove();
|
|
|
+
|
|
|
+ // 添加新的条件数据
|
|
|
+ for (var i = 0; i < conditionData.length; i++) {
|
|
|
+ var condition = conditionData[i];
|
|
|
+ for (var key in condition) {
|
|
|
+ if (condition[key] !== null && condition[key] !== undefined) {
|
|
|
+ var value = condition[key];
|
|
|
+ if (Array.isArray(value)) {
|
|
|
+ value = JSON.stringify(value);
|
|
|
+ }
|
|
|
+ $('<input>').attr({
|
|
|
+ type: 'hidden',
|
|
|
+ name: 'condition[' + i + '][' + key + ']',
|
|
|
+ value: value
|
|
|
+ }).appendTo('form[role="form"]');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加任务类型数据
|
|
|
+ if (taskTypes.length > 0) {
|
|
|
+ // 移除之前的task_type隐藏字段
|
|
|
+ $('form[role="form"] input[type="hidden"][name^="task_type"]').remove();
|
|
|
+
|
|
|
+ // 添加任务类型数据
|
|
|
+ for (var i = 0; i < taskTypes.length; i++) {
|
|
|
+ $('<input>').attr({
|
|
|
+ type: 'hidden',
|
|
|
+ name: 'task_type[' + i + ']',
|
|
|
+ value: taskTypes[i]
|
|
|
+ }).appendTo('form[role="form"]');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('表单验证通过,数据收集完成,准备提交');
|
|
|
+ console.log('奖品数据:', prizeData);
|
|
|
+ console.log('条件数据:', conditionData);
|
|
|
+ console.log('任务类型:', taskTypes);
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
// 初始化编辑页面
|
|
|
initEditPage: function() {
|
|
|
Controller.api.initAddPage(); // 复用添加页面的初始化逻辑
|
|
|
+ },
|
|
|
+
|
|
|
+ // 验证奖品设置
|
|
|
+ validatePrizes: function() {
|
|
|
+ var prizeItems = $('.prize-item');
|
|
|
+ var prizeCount = prizeItems.length;
|
|
|
+
|
|
|
+ // 检查奖品数量
|
|
|
+ if (prizeCount < 1) {
|
|
|
+ Toastr.error('请至少设置一个奖品');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查奖品总概率
|
|
|
+ var totalRate = 0;
|
|
|
+ var hasValidPrize = false;
|
|
|
+
|
|
|
+ prizeItems.each(function() {
|
|
|
+ var type = $(this).attr('data-type');
|
|
|
+ var rateInput = $(this).find('.prize-rate');
|
|
|
+ var rate = parseFloat(rateInput.val()) || 0;
|
|
|
+
|
|
|
+ totalRate += rate;
|
|
|
+
|
|
|
+ // 检查非未中奖项是否有有效概率
|
|
|
+ if (type !== 'no-prize' && rate > 0) {
|
|
|
+ hasValidPrize = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查奖品设置是否完整
|
|
|
+ var nameInput = $(this).find('.prize-name');
|
|
|
+ if (nameInput.length > 0 && !nameInput.val().trim()) {
|
|
|
+ Toastr.error('请填写奖品名称');
|
|
|
+ nameInput.focus();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查奖品数量(未中奖项除外)
|
|
|
+ if (type !== 'no-prize') {
|
|
|
+ var quantityInput = $(this).find('.prize-quantity');
|
|
|
+ var quantity = parseInt(quantityInput.val()) || 0;
|
|
|
+ if (quantity <= 0) {
|
|
|
+ Toastr.error('奖品数量必须大于0');
|
|
|
+ quantityInput.focus();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 检查是否有非未中奖的有效奖品
|
|
|
+ if (!hasValidPrize) {
|
|
|
+ Toastr.error('请至少设置一个有效的奖品(概率大于0)');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查总概率是否合理
|
|
|
+ if (totalRate > 100) {
|
|
|
+ Toastr.error('奖品总概率不能超过100%');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ },
|
|
|
+
|
|
|
+ // 验证任务规则设置
|
|
|
+ validateTaskRules: function() {
|
|
|
+ var checkedTypes = $('input[name="row[task_type][]"]:checked');
|
|
|
+
|
|
|
+ // 检查是否选择了任务类型
|
|
|
+ if (checkedTypes.length === 0) {
|
|
|
+ Toastr.error('请选择至少一种参与条件');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证每个选中的任务类型
|
|
|
+ var isValid = true;
|
|
|
+ checkedTypes.each(function() {
|
|
|
+ var type = parseInt($(this).val());
|
|
|
+ var container = $('#task-setting-' + type);
|
|
|
+
|
|
|
+ switch(type) {
|
|
|
+ case 1: // 购买指定商品
|
|
|
+ var goodsContainer = container.find('#selected-goods');
|
|
|
+ if (goodsContainer.find('.goods-list-item').length === 0) {
|
|
|
+ Toastr.error('请选择参与的商品');
|
|
|
+ isValid = false;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2: // 单笔订单消费满额
|
|
|
+ case 3: // 单次充值满额
|
|
|
+ case 4: // 活动期间累计消费满额
|
|
|
+ var amountInput = container.find('input[name*="[condition_value]"]');
|
|
|
+ var amount = parseFloat(amountInput.val()) || 0;
|
|
|
+ if (amount <= 0) {
|
|
|
+ var typeName = type === 2 ? '订单消费' : (type === 3 ? '充值' : '累计消费');
|
|
|
+ Toastr.error('请填写' + typeName + '金额');
|
|
|
+ amountInput.focus();
|
|
|
+ isValid = false;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return isValid;
|
|
|
},
|
|
|
// 初始化奖品管理
|
|
|
initPrizeManagement: function() {
|
|
@@ -366,7 +627,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
Layer.open({
|
|
|
type: 1,
|
|
|
title: config.title,
|
|
|
- area: isEditMode ? ['700px', '600px'] : ['80%', '80%'],
|
|
|
+ area: isEditMode ? ['80%', '80%'] : ['80%', '80%'],
|
|
|
content: formHtml,
|
|
|
btn: [isEditMode ? '保存' : '确定', '取消'],
|
|
|
success: function(layero, index) {
|
|
@@ -427,6 +688,22 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
// 设置奖品类型(单选框)
|
|
|
form.find('input[name="row[prize_type]"][value="' + data.type + '"]').prop('checked', true);
|
|
|
|
|
|
+ // 根据奖品类型处理特殊字段
|
|
|
+ if (data.type == '8' && data.goodsId) {
|
|
|
+ // 商城奖品:设置商品ID并获取商品信息
|
|
|
+ form.find('input[name="goods_id"]').val(data.goodsId);
|
|
|
+ Controller.api.loadGoodsInfo(form, data.goodsId, function() {
|
|
|
+ // 商品信息加载完成,触发FastAdmin的表单更新
|
|
|
+ setTimeout(function() {
|
|
|
+ Form.api.bindevent(form);
|
|
|
+ }, 100);
|
|
|
+ });
|
|
|
+ } else if (data.type == '5' && data.couponId) {
|
|
|
+ // 优惠券:设置优惠券ID并获取优惠券信息
|
|
|
+ form.find('input[name="coupon_id"]').val(data.couponId);
|
|
|
+ Controller.api.loadCouponInfo(form, data.couponId);
|
|
|
+ }
|
|
|
+
|
|
|
// FastAdmin的动态显示会根据奖品类型自动处理字段显示
|
|
|
// 无需手动控制显示逻辑
|
|
|
|
|
@@ -505,6 +782,114 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
form.find('input[name="prize_image"]').val(defaultImage).trigger('change');
|
|
|
},
|
|
|
|
|
|
+ // 加载商品信息用于编辑模式回显
|
|
|
+ loadGoodsInfo: function(form, goodsId, callback) {
|
|
|
+ if (!goodsId) {
|
|
|
+ console.warn('loadGoodsInfo: 商品ID为空');
|
|
|
+ if (callback) callback();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('正在加载商品信息,ID:', goodsId);
|
|
|
+
|
|
|
+ // 通过Ajax获取商品信息
|
|
|
+ $.ajax({
|
|
|
+ url: Fast.api.fixurl('shop/goods/info'),
|
|
|
+ type: 'POST',
|
|
|
+ data: {id: goodsId},
|
|
|
+ dataType: 'json',
|
|
|
+ success: function(data) {
|
|
|
+ console.log('商品信息API响应:', data);
|
|
|
+
|
|
|
+ if (data.code === 1 && data.data) {
|
|
|
+ var goods = data.data; // 标准FastAdmin响应格式
|
|
|
+ console.log('成功获取商品信息:', goods);
|
|
|
+
|
|
|
+ // 处理商品数据
|
|
|
+ var processedGoods = {
|
|
|
+ id: goods.id,
|
|
|
+ name: goods.name || goods.title,
|
|
|
+ title: goods.title || goods.name,
|
|
|
+ image: goods.image ? Fast.api.cdnurl(goods.image) : '',
|
|
|
+ price: goods.price || goods.sellprice || '',
|
|
|
+ goods_sn: goods.goods_sn || '',
|
|
|
+ spec_type: goods.spec_type !== undefined ? goods.spec_type : null,
|
|
|
+ category: goods.category || null,
|
|
|
+ type_name: Controller.api.getGoodsTypeName(goods),
|
|
|
+ type_text: Controller.api.getGoodsTypeText(goods)
|
|
|
+ };
|
|
|
+
|
|
|
+ // 使用商品模板显示
|
|
|
+ var html = Template('prize-goods-template', processedGoods);
|
|
|
+ form.find('#selected-goods-display').html(html).show();
|
|
|
+
|
|
|
+ // 绑定删除事件
|
|
|
+ form.find('.remove-prize-goods').off('click').on('click', function() {
|
|
|
+ $(this).closest('.prize-goods-item').remove();
|
|
|
+ form.find('input[name="goods_id"]').val('');
|
|
|
+ });
|
|
|
+
|
|
|
+ console.log('商品信息已成功显示');
|
|
|
+
|
|
|
+ // 执行回调
|
|
|
+ if (callback) callback();
|
|
|
+ } else {
|
|
|
+ console.warn('商品信息API返回异常:', data);
|
|
|
+ // 显示友好的提示信息
|
|
|
+ var errorMsg = data.msg || '获取商品信息失败';
|
|
|
+ form.find('#selected-goods-display').html(
|
|
|
+ '<div class="alert alert-warning" style="margin-top: 10px;">' +
|
|
|
+ '<i class="fa fa-warning"></i> ' + errorMsg +
|
|
|
+ ' (商品ID: ' + goodsId + ')' +
|
|
|
+ '</div>'
|
|
|
+ ).show();
|
|
|
+
|
|
|
+ // 即使失败也执行回调
|
|
|
+ if (callback) callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ error: function(xhr, status, error) {
|
|
|
+ console.error('加载商品信息失败 - 详细信息:');
|
|
|
+ console.error('- 商品ID:', goodsId);
|
|
|
+ console.error('- HTTP状态:', xhr.status);
|
|
|
+ console.error('- 错误信息:', error);
|
|
|
+ console.error('- 响应内容:', xhr.responseText);
|
|
|
+
|
|
|
+ // 显示友好的错误提示
|
|
|
+ var errorHtml = '<div class="alert alert-danger" style="margin-top: 10px;">' +
|
|
|
+ '<i class="fa fa-exclamation-circle"></i> 加载商品信息失败<br>' +
|
|
|
+ '<small>商品ID: ' + goodsId + '</small><br>' +
|
|
|
+ '<small>错误: ' + (xhr.status === 404 ? '商品不存在或已删除' :
|
|
|
+ xhr.status === 403 ? '无权限访问' :
|
|
|
+ '网络错误,请稍后重试') + '</small>' +
|
|
|
+ '</div>';
|
|
|
+ form.find('#selected-goods-display').html(errorHtml).show();
|
|
|
+
|
|
|
+ // 错误时也执行回调
|
|
|
+ if (callback) callback();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ // 加载优惠券信息用于编辑模式回显
|
|
|
+ loadCouponInfo: function(form, couponId) {
|
|
|
+ if (!couponId) {
|
|
|
+ console.warn('loadCouponInfo: 优惠券ID为空');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('正在加载优惠券信息,ID:', couponId);
|
|
|
+
|
|
|
+ // 暂时显示一个简单的占位信息,提醒需要重新选择
|
|
|
+ var placeholderHtml = '<div class="alert alert-info" style="margin-top: 10px;">' +
|
|
|
+ '<i class="fa fa-info-circle"></i> 编辑模式下需要重新选择优惠券<br>' +
|
|
|
+ '<small>优惠券ID: ' + couponId + '</small>' +
|
|
|
+ '</div>';
|
|
|
+ form.find('#selected-coupon-display').html(placeholderHtml).show();
|
|
|
+
|
|
|
+ console.log('优惠券占位信息已显示,用户需要重新选择');
|
|
|
+ },
|
|
|
+
|
|
|
|
|
|
// 打开商品选择器
|
|
|
openGoodsSelector: function(form) {
|
|
@@ -569,9 +954,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- },
|
|
|
-
|
|
|
-
|
|
|
+ },
|
|
|
|
|
|
// 保存奖品
|
|
|
savePrize: function(layero) {
|
|
@@ -580,7 +963,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
var type = form.find('input[name="row[prize_type]"]:checked').val();
|
|
|
var image = form.find('input[name="prize_image"]').val();
|
|
|
var quantity = form.find('input[name="prize_quantity"]').val();
|
|
|
- var rewardValue = form.find('input[name="reward_value"]').val();
|
|
|
+
|
|
|
+ // 根据奖品类型获取对应的奖励值
|
|
|
+ var rewardValue = '';
|
|
|
+ if (type == 3) { // 积分
|
|
|
+ rewardValue = form.find('input[name="reward_value_integral"]').val();
|
|
|
+ } else if (type == 4) { // 余额
|
|
|
+ rewardValue = form.find('input[name="reward_value_balance"]').val();
|
|
|
+ } else if (type == 6) { // 红包
|
|
|
+ rewardValue = form.find('input[name="reward_value_redpack"]').val();
|
|
|
+ }
|
|
|
+
|
|
|
var goodsId = form.find('input[name="goods_id"]').val();
|
|
|
var couponId = form.find('input[name="coupon_id"]').val();
|
|
|
|
|
@@ -676,7 +1069,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
break;
|
|
|
case 8: // 商城奖品
|
|
|
prizeData.goods_id = goodsId;
|
|
|
- prizeData.goods_name = form.find('#selected-goods-display .selected-goods-item span').text();
|
|
|
+ // 使用简化的选择器获取商品名称
|
|
|
+ prizeData.goods_name = form.find('#selected-goods-display .goods-name-display').text() || '';
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -715,7 +1109,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
imageRelative: imageRelative, // 相对路径
|
|
|
imageDisplay: imageDisplay, // CDN URL
|
|
|
quantity: prize.quantity || 0,
|
|
|
- rate: prize.rate || 0
|
|
|
+ rate: prize.rate || 0,
|
|
|
+ goodsId: prize.goods_id || '',
|
|
|
+ couponId: prize.coupon_id || ''
|
|
|
});
|
|
|
|
|
|
$('.prize-list').append(prizeHtml);
|
|
@@ -832,23 +1228,23 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
case 2: // 实物奖品
|
|
|
return '';
|
|
|
case 3: // 积分
|
|
|
- var points = form.find('input[name="reward_value"]').val();
|
|
|
+ var points = form.find('input[name="reward_value_integral"]').val();
|
|
|
return points ? (points + ' 积分') : '';
|
|
|
case 4: // 余额
|
|
|
- var balance = form.find('input[name="reward_value"]').val();
|
|
|
+ var balance = form.find('input[name="reward_value_balance"]').val();
|
|
|
return balance ? (balance + ' 余额') : '';
|
|
|
case 5: // 优惠券
|
|
|
var couponName = form.find('#selected-coupon-display .selected-coupon-item span:first').text();
|
|
|
return couponName || '';
|
|
|
case 6: // 红包
|
|
|
- var amount = form.find('input[name="reward_value"]').val();
|
|
|
+ var amount = form.find('input[name="reward_value_redpack"]').val();
|
|
|
return amount ? (amount + ' 元红包') : '';
|
|
|
case 7: // 兑换码
|
|
|
var codeType = form.find('input[name="code_type"]:checked').val();
|
|
|
return codeType == 'manual' ? '手动兑换码' : '自动兑换码';
|
|
|
case 8: // 商城奖品
|
|
|
- var goodsName = form.find('#selected-goods-display .selected-goods-item span').text();
|
|
|
- return goodsName || '';
|
|
|
+ // 使用简化的选择器获取商品名称
|
|
|
+ return form.find('#selected-goods-display .goods-name-display').text() || '';
|
|
|
default:
|
|
|
return '';
|
|
|
}
|
|
@@ -869,23 +1265,26 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
|
|
|
// 更新奖品数量统计
|
|
|
updatePrizeCount: function() {
|
|
|
- var count = $('.prize-item').length - 1; // 减去未中奖项
|
|
|
- $('#prize-count').text(count);
|
|
|
+ var totalCount = $('.prize-item').length; // 总奖品数(包含未中奖项)
|
|
|
+ var userCount = totalCount - 1; // 用户添加的奖品数(减去未中奖项)
|
|
|
+
|
|
|
+ // 显示总奖品数(包含系统默认的未中奖项)
|
|
|
+ $('#prize-count').text(totalCount);
|
|
|
|
|
|
- // 更新添加奖品按钮状态
|
|
|
- Controller.api.updateAddPrizeButtonState(count);
|
|
|
+ // 更新添加奖品按钮状态(基于用户可添加的奖品数)
|
|
|
+ Controller.api.updateAddPrizeButtonState(userCount);
|
|
|
|
|
|
// 更新验证状态
|
|
|
$('input[name="prize_setting_check"]').val('1').trigger('change');
|
|
|
},
|
|
|
|
|
|
// 更新添加奖品按钮状态
|
|
|
- updateAddPrizeButtonState: function(count) {
|
|
|
- var maxCount = 8; // 最大奖品数量
|
|
|
+ updateAddPrizeButtonState: function(userCount) {
|
|
|
+ var maxUserCount = 8; // 用户最大可添加奖品数量
|
|
|
var addButton = $('#add-prize-btn');
|
|
|
- var remainingCount = maxCount - count;
|
|
|
+ var remainingCount = maxUserCount - userCount;
|
|
|
|
|
|
- if (count >= maxCount) {
|
|
|
+ if (userCount >= maxUserCount) {
|
|
|
// 达到最大数量,禁用按钮
|
|
|
addButton.prop('disabled', true).addClass('disabled');
|
|
|
addButton.find('.btn-text').text('已达最大数量');
|
|
@@ -897,7 +1296,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
if (remainingCount <= 2) {
|
|
|
$('#prize-count-tip').text('还可添加 ' + remainingCount + ' 个奖品').removeClass('text-muted text-danger').addClass('text-warning');
|
|
|
} else {
|
|
|
- $('#prize-count-tip').text('还需添加 ' + remainingCount + ' 个奖品').removeClass('text-warning text-danger').addClass('text-muted');
|
|
|
+ // 当用户还没添加奖品时,显示还需添加多少个才能满足最低要求
|
|
|
+ var minRequired = Math.max(0, 7 - userCount); // 至少需要7个用户奖品(总共8个,已有1个系统默认)
|
|
|
+ if (minRequired > 0) {
|
|
|
+ $('#prize-count-tip').text('还需添加 ' + minRequired + ' 个奖品').removeClass('text-warning text-danger').addClass('text-muted');
|
|
|
+ } else {
|
|
|
+ $('#prize-count-tip').text('还可添加 ' + remainingCount + ' 个奖品').removeClass('text-warning text-danger').addClass('text-muted');
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
},
|
|
@@ -929,17 +1334,15 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
|
|
|
// 更新验证状态
|
|
|
$('input[name="prize_setting_check"]').val('1').trigger('change');
|
|
|
- },
|
|
|
-
|
|
|
-
|
|
|
+ },
|
|
|
|
|
|
- // 编辑奖品(统一处理所有类型)
|
|
|
+ // 编辑奖品(统一处理所有类型)
|
|
|
editPrize: function(prizeItem) {
|
|
|
// 判断是否为系统默认未中奖项
|
|
|
var isSystemNoPrize = prizeItem.attr('data-type') === 'no-prize';
|
|
|
|
|
|
// 获取奖品信息
|
|
|
- var name, imageRelative, type, quantity, rate;
|
|
|
+ var name, imageRelative, type, quantity, rate, goodsId, couponId;
|
|
|
|
|
|
if (isSystemNoPrize) {
|
|
|
// 系统默认项从不同位置获取数据
|
|
@@ -955,6 +1358,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
type = prizeItem.find('.prize-type-input').val();
|
|
|
quantity = prizeItem.find('.prize-quantity').val();
|
|
|
rate = prizeItem.find('.prize-rate').val();
|
|
|
+
|
|
|
+ // 获取商品ID和优惠券ID(如果存在)
|
|
|
+ goodsId = prizeItem.find('.prize-goods-id-input').val();
|
|
|
+ couponId = prizeItem.find('.prize-coupon-id-input').val();
|
|
|
}
|
|
|
|
|
|
var title = isSystemNoPrize ? '编辑未中奖项' : '编辑奖品';
|
|
@@ -970,7 +1377,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
image: imageRelative,
|
|
|
type: type,
|
|
|
quantity: quantity,
|
|
|
- rate: rate
|
|
|
+ rate: rate,
|
|
|
+ goodsId: goodsId,
|
|
|
+ couponId: couponId
|
|
|
}
|
|
|
});
|
|
|
},
|
|
@@ -1052,22 +1461,141 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
|
|
|
// 重新编号所有奖品的隐藏域name属性
|
|
|
$('.prize-list .prize-item').each(function(index) {
|
|
|
var $item = $(this);
|
|
|
- var isNoPrize = $item.attr('data-type') === 'no-prize';
|
|
|
- var prizeIndex = isNoPrize ? 0 : index; // 未中奖项固定为索引0
|
|
|
+ var prizeIndex = index; // 按实际位置索引
|
|
|
|
|
|
// 更新隐藏域的name属性
|
|
|
$item.find('.prize-name-input').attr('name', 'prizes[' + prizeIndex + '][name]');
|
|
|
$item.find('.prize-type-input').attr('name', 'prizes[' + prizeIndex + '][type]');
|
|
|
$item.find('.prize-image-input').attr('name', 'prizes[' + prizeIndex + '][image]');
|
|
|
|
|
|
+ // 更新商品ID和优惠券ID的隐藏域name属性
|
|
|
+ $item.find('.prize-goods-id-input').attr('name', 'prizes[' + prizeIndex + '][goods_id]');
|
|
|
+ $item.find('.prize-coupon-id-input').attr('name', 'prizes[' + prizeIndex + '][coupon_id]');
|
|
|
+
|
|
|
// 更新其他表单字段的name属性
|
|
|
$item.find('.prize-quantity').attr('name', 'prizes[' + prizeIndex + '][quantity]');
|
|
|
$item.find('.prize-rate').attr('name', 'prizes[' + prizeIndex + '][rate]');
|
|
|
+
|
|
|
+ // 更新奖品特定字段的name属性
|
|
|
+ var prizeType = parseInt($item.find('.prize-type-input').val());
|
|
|
+ switch(prizeType) {
|
|
|
+ case 3: // 积分
|
|
|
+ $item.find('.prize-points-input').attr('name', 'prizes[' + prizeIndex + '][points]');
|
|
|
+ break;
|
|
|
+ case 4: // 余额
|
|
|
+ $item.find('.prize-balance-input').attr('name', 'prizes[' + prizeIndex + '][balance]');
|
|
|
+ break;
|
|
|
+ case 6: // 红包
|
|
|
+ $item.find('.prize-redpack-input').attr('name', 'prizes[' + prizeIndex + '][redpack_amount]');
|
|
|
+ break;
|
|
|
+ case 7: // 兑换码
|
|
|
+ $item.find('.prize-codes-input').attr('name', 'prizes[' + prizeIndex + '][manual_codes]');
|
|
|
+ break;
|
|
|
+ }
|
|
|
});
|
|
|
|
|
|
console.log('奖品排序已更新');
|
|
|
},
|
|
|
|
|
|
+ // 在表单提交前收集奖品数据
|
|
|
+ collectPrizeData: function() {
|
|
|
+ var prizesData = [];
|
|
|
+
|
|
|
+ $('.prize-list .prize-item').each(function(index) {
|
|
|
+ var $item = $(this);
|
|
|
+ var prizeType = parseInt($item.find('.prize-type-input').val());
|
|
|
+
|
|
|
+ var prizeData = {
|
|
|
+ name: $item.find('.prize-name-input').val() || $item.find('.prize-name').text() || $item.find('td:eq(1)').text(),
|
|
|
+ type: prizeType,
|
|
|
+ image: $item.find('.prize-image-input').val(),
|
|
|
+ quantity: $item.find('.prize-quantity').val() || 0,
|
|
|
+ rate: $item.find('.prize-rate').val() || 0
|
|
|
+ };
|
|
|
+
|
|
|
+ // 根据奖品类型添加特定字段
|
|
|
+ switch(prizeType) {
|
|
|
+ case 3: // 积分
|
|
|
+ var pointsInput = $item.find('.prize-points-input');
|
|
|
+ if (pointsInput.length === 0) {
|
|
|
+ // 如果隐藏域不存在,从表单中获取
|
|
|
+ pointsInput = $('input[name="reward_value_integral"]');
|
|
|
+ }
|
|
|
+ prizeData.points = pointsInput.val() || 0;
|
|
|
+ break;
|
|
|
+ case 4: // 余额
|
|
|
+ var balanceInput = $item.find('.prize-balance-input');
|
|
|
+ if (balanceInput.length === 0) {
|
|
|
+ balanceInput = $('input[name="reward_value_balance"]');
|
|
|
+ }
|
|
|
+ prizeData.balance = balanceInput.val() || 0;
|
|
|
+ break;
|
|
|
+ case 5: // 优惠券
|
|
|
+ prizeData.coupon_id = $item.find('.prize-coupon-id-input').val() || 0;
|
|
|
+ break;
|
|
|
+ case 6: // 红包
|
|
|
+ var redpackInput = $item.find('.prize-redpack-input');
|
|
|
+ if (redpackInput.length === 0) {
|
|
|
+ redpackInput = $('input[name="reward_value_redpack"]');
|
|
|
+ }
|
|
|
+ prizeData.redpack_amount = redpackInput.val() || 0;
|
|
|
+ break;
|
|
|
+ case 7: // 兑换码
|
|
|
+ var codesInput = $item.find('.prize-codes-input');
|
|
|
+ if (codesInput.length === 0) {
|
|
|
+ codesInput = $('textarea[name="manual_codes"]');
|
|
|
+ }
|
|
|
+ prizeData.manual_codes = codesInput.val() || '';
|
|
|
+ break;
|
|
|
+ case 8: // 商城奖品
|
|
|
+ prizeData.goods_id = $item.find('.prize-goods-id-input').val() || 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ prizesData.push(prizeData);
|
|
|
+ });
|
|
|
+
|
|
|
+ return prizesData;
|
|
|
+ },
|
|
|
+
|
|
|
+ // 在表单提交前收集条件数据
|
|
|
+ collectConditionData: function() {
|
|
|
+ var conditionData = {};
|
|
|
+ var taskTypes = [];
|
|
|
+
|
|
|
+ // 获取选中的任务类型
|
|
|
+ $('input[name="row[task_type][]"]:checked').each(function() {
|
|
|
+ taskTypes.push($(this).val());
|
|
|
+ });
|
|
|
+
|
|
|
+ // 为每个任务类型收集条件数据
|
|
|
+ taskTypes.forEach(function(taskType) {
|
|
|
+ var type = parseInt(taskType);
|
|
|
+ var condition = {};
|
|
|
+
|
|
|
+ switch(type) {
|
|
|
+ case 1: // 购买指定商品
|
|
|
+ condition.type = type;
|
|
|
+ condition.goods_rule = $('input[name="condition[' + type + '][goods_rule]"]:checked').val() || 1;
|
|
|
+ condition.goods_ids = $('#task-goods-ids-' + type).val() || '[]';
|
|
|
+ break;
|
|
|
+ case 2: // 单笔订单消费满额
|
|
|
+ case 3: // 单次充值满额
|
|
|
+ case 4: // 活动期间累计消费满额
|
|
|
+ condition.type = type;
|
|
|
+ condition.condition_value = $('input[name="condition[' + type + '][condition_value]"]').val() || 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ conditionData[type] = condition;
|
|
|
+ });
|
|
|
+
|
|
|
+ return {
|
|
|
+ conditionData: conditionData,
|
|
|
+ taskTypes: taskTypes
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
// 初始化商品选择器
|
|
|
initGoodsSelector: function() {
|
|
|
// 商品选择器初始化逻辑
|