define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) { // 代码更新说明: // 1. 添加了单规格商品的"折扣库存"列,多规格商品使用按钮方式设置 // 2. 添加了折扣库存输入处理事件,并确保数据被正确保存 // 3. 更新了updateDiscountData函数,确保折扣库存数据被正确提交 var Controller = { index: function () { // 初始化表格参数配置 Table.api.init({ extend: { index_url: 'marketing/discount/index' + location.search, add_url: 'marketing/discount/add', edit_url: 'marketing/discount/edit', del_url: 'marketing/discount/del', multi_url: 'marketing/discount/multi', import_url: 'marketing/discount/import', table: 'shop_activity', } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', fixedColumns: true, fixedRightNumber: 1, columns: [ [ {checkbox: true}, {field: 'id', title: __('Id'), visible: false}, { field: 'name', title: __('活动名称'), operate: 'LIKE', align: 'left', cellStyle: {css: {'max-width': '180px', 'overflow': 'hidden', 'text-overflow': 'ellipsis', 'white-space': 'nowrap'}} }, { field: 'image', title: __('活动主图'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image, width: 80 }, { field: 'type', title: __('活动类型'), searchList: {"discount": "折扣活动"}, formatter: Table.api.formatter.normal, width: 80 }, { field: 'goods_count', title: __('商品数量'), width: 80, align: 'center' }, { field: 'start_time', title: __('开始时间'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime, width: 150 }, { field: 'end_time', title: __('结束时间'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime, width: 150 }, { field: 'activity_status', title: __('活动状态'), searchList: { 0: '未开始', 1: '进行中', 2: '已结束', 3: '手动停止' }, formatter: function(value, row, index) { var statusMap = { 0: '未开始', 1: '进行中', 2: '已结束', 3: '手动停止' }; return statusMap[value] || value; }, width: 80, align: 'center' }, { field: 'order_count', title: __('订单数'), width: 80, align: 'center' }, { field: 'order_amount', title: __('成交金额'), width: 100, align: 'right', formatter: function(value, row, index) { return '¥' + value; } }, { field: 'discount_amount', title: __('优惠金额'), width: 100, align: 'right', formatter: function(value, row, index) { return '¥' + value; } }, { field: 'sale_quantity', title: __('销售数量'), width: 80, align: 'center' }, { field: 'customer_count', title: __('成交人数'), width: 80, align: 'center' }, { field: 'createtime', title: __('创建时间'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime, visible: false }, { field: 'updatetime', title: __('更新时间'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime, visible: false }, { field: 'operate', title: __('操作'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate, buttons: [ { name: 'stop', text: __('停止活动'), icon: 'fa fa-stop', classname: 'btn btn-xs btn-warning btn-ajax', url: 'marketing/discount/stopActivity', confirm: '确认要停止此活动吗?停止后将无法恢复', visible: function(row) { return row.activity_status == 1; // 只有进行中的活动才显示停止按钮 }, success: function(data, ret) { Layer.msg(ret.msg); table.bootstrapTable('refresh'); return false; }, error: function(data, ret) { Layer.alert(ret.msg); return false; } } ] } ] ] }); // 为表格绑定事件 Table.api.bindevent(table); }, recyclebin: function () { // 初始化表格参数配置 Table.api.init({ extend: { 'dragsort_url': '' } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: 'marketing/discount/recyclebin' + location.search, pk: 'id', sortName: 'id', columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'title', title: __('Title'), align: 'left'}, { field: 'deletetime', title: __('Deletetime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime }, { field: 'operate', width: '140px', title: __('Operate'), table: table, events: Table.api.events.operate, buttons: [ { name: 'Restore', text: __('Restore'), classname: 'btn btn-xs btn-info btn-ajax btn-restoreit', icon: 'fa fa-rotate-left', url: 'marketing/discount/restore', refresh: true }, { name: 'Destroy', text: __('Destroy'), classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit', icon: 'fa fa-times', url: 'marketing/discount/destroy', refresh: true } ], formatter: Table.api.formatter.operate } ] ] }); // 为表格绑定事件 Table.api.bindevent(table); }, add: function () { Controller.api.bindevent(); // 表单提交前处理 $('#add-form').on('submit', function() { // 同时更新goods_info字段,包含商品的详细信息 updateGoodsInfo(); console.log('提交的商品信息:', $('#goods-info').val()); return true; }); // 选择商品功能 $('#select-goods').on('click', function() { Fast.api.open('shop/goods/select', '选择商品', { area: ['95%', '90%'], callback: function(data) { if (data && data.length > 0) { var goodsIds = []; // 收集商品ID $.each(data, function(index, item) { goodsIds.push(item.id); }); // 默认折扣值 var defaultDiscount = 9; // 使用模板渲染表格 var html = Template('goodsTableTpl', { list: data, discount: defaultDiscount }); // 清空容器并显示表格 $('#selected-goods-container').empty().append(html); // 初始化分页表格 $('#selected-goods-table').bootstrapTable({ data: data, pagination: true, pageSize: 5, pageList: [5, 10, 20], sortable: true, search: false, classes: 'table table-hover table-striped', onPostBody: function() { // 表格渲染完成后处理行属性 $('#selected-goods-table tbody tr').each(function(index) { // 确保每行有data-id属性 var rowData = data[index]; if(rowData && rowData.id) { $(this).attr('data-id', rowData.id); console.log('设置行data-id属性:', rowData.id); } }); }, columns: [ { field: 'goods', title: '商品', width: '30%', formatter: function(value, row) { return '
' + '' + '
' + '
' + row.title + '
' + '

分类:' + (row.category ? row.category.name : '') + ' | 规格:' + (row.spec_type == 0 ? '单规格' : '多规格') + '

' + '
' + '
' } }, { field: 'price', title: '价格', width: '10%', align: 'center', formatter: function(value, row) { return '¥' + row.price + ''; } }, { field: 'stocks', title: '现库存', width: '10%', align: 'center' }, { field: 'discount_stocks', title: '折扣库存', width: '20%', align: 'center', formatter: function(value, row) { if(row.spec_type == 0) { // 只有单规格商品显示输入框 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; console.log('渲染折扣库存输入框:', row.id, row.stocks); // 确保折扣库存默认等于现库存 var stocks = parseInt(row.stocks); // 移除max属性,仅通过JS验证限制最大值 return ''; } else { return ''; // 多规格商品留空 } } }, { field: 'discount', title: '折扣', width: '15%', align: 'center', formatter: function(value, row) { if(row.spec_type == 1) { var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; var hasSpec = discountData[row.id] && discountData[row.id].specs; var specBtnText = hasSpec ? '规格折扣设置 已设置' : '规格折扣设置'; var html = '
' + '' + specBtnText + '' + '
请点击设置各规格折扣
'; // 如果已设置规格折扣,显示汇总信息 if (hasSpec && discountData[row.id].summary) { var summary = discountData[row.id].summary; var infoText = '已设置' + summary.participate_count + '个规格,平均' + summary.avg_discount + '折,共' + summary.total_stocks + '件'; html += '
' + infoText + '
'; } html += '
'; return html; } else { return '
' + '' + '' + '
'; } } }, { field: 'discount_price', title: '折后价', width: '20%', align: 'center', formatter: function(value, row) { if(row.spec_type == 0) { return '¥' + (row.price * defaultDiscount / 10).toFixed(2) + ''; } else { return ''; } } }, { field: 'operate', title: '操作', width: '15%', align: 'center', formatter: function(value, row) { return ' 删除'; }, events: { 'click .remove-goods': function (e, value, row, index) { // 从表格中移除该行 $('#selected-goods-table').bootstrapTable('remove', { field: 'id', values: [row.id] }); // 更新隐藏字段 var currentIds = $('#goods-ids').val().split(','); var newIds = []; $.each(currentIds, function(i, val) { if (val != row.id && val) { newIds.push(val); } }); $('#goods-ids').val(newIds.join(',')); // 移除折扣数据 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; if(discountData[row.id]) { delete discountData[row.id]; $('#discount-data').val(JSON.stringify(discountData)); } // 如果表格为空,则移除整个表格 if(newIds.length === 0) { $('#selected-goods-container').empty(); } } } } ] }); // 更新隐藏字段 $('#goods-ids').val(goodsIds.join(',')); // 初始化折扣数据 var discountData = {}; $.each(data, function(index, item) { if (item.spec_type == 0) { // 单规格商品 // 确保折扣库存默认值为现有库存 var currentStocks = parseInt(item.stocks) || 0; // 单规格商品需要获取其默认SKU ID var skuId = item.sku_id || 0; // 如果返回数据中有sku_id就使用,否则用0 discountData[item.id] = { id: item.id, sku_id: skuId, // 添加SKU ID discount: defaultDiscount, discount_price: (item.price * defaultDiscount / 10).toFixed(2), stocks: currentStocks // 默认折扣库存等于商品库存 }; console.log('初始化单规格商品:', item.id, 'SKU ID:', skuId, '库存:', currentStocks); } }); $('#discount-data').val(JSON.stringify(discountData)); // 同步更新商品详情信息 updateGoodsInfo(); // 等待表格渲染完成后修复折扣库存输入框 setTimeout(function() { $('.discount-stocks-input').each(function() { var $input = $(this); var goodsId = $input.data('id'); var maxStocks = parseInt($input.data('max-stocks')) || 0; // 从折扣数据中获取正确的库存值 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; var correctStocks = discountData[goodsId] && discountData[goodsId].stocks !== undefined ? discountData[goodsId].stocks : maxStocks; // 直接设置正确的库存值 $input.val(correctStocks); console.log('修复折扣库存输入框值:', goodsId, '设置为:', correctStocks); }); }, 500); // 绑定折扣库存输入事件 $(document).on('input', '.discount-stocks-input', function() { var stocks = parseInt($(this).val()) || 0; var goodsId = $(this).data('id'); var maxStocks = parseInt($(this).data('max-stocks')) || 0; console.log('折扣库存输入事件:', goodsId, '输入值:', stocks, '最大值:', maxStocks); // 限制输入范围,确保不超过现库存 if(stocks < 0) stocks = 0; if(stocks > maxStocks) stocks = maxStocks; $(this).val(stocks); // 更新商品折扣数据 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; if(discountData[goodsId]) { discountData[goodsId].stocks = stocks; } else { // 新建数据时需要包含SKU ID discountData[goodsId] = { id: goodsId, sku_id: 0, // 单规格商品默认SKU ID为0,实际应从商品数据获取 stocks: stocks }; } $('#discount-data').val(JSON.stringify(discountData)); }); // 绑定折扣输入事件 $(document).on('input', '.discount-input', function() { var discount = parseFloat($(this).val()) || 0; if(discount < 0.1) discount = 0.1; if(discount > 10) discount = 10; var price = parseFloat($(this).data('price')) || 0; var goodsId = $(this).data('id'); var discountPrice = (price * discount / 10).toFixed(2); $('#discount-price-' + goodsId).text('¥' + discountPrice); // 更新商品折扣数据 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; // 保留折扣库存值和SKU ID,如果已存在 var stocks = discountData[goodsId] && discountData[goodsId].stocks ? discountData[goodsId].stocks : null; var skuId = discountData[goodsId] && discountData[goodsId].sku_id ? discountData[goodsId].sku_id : 0; var goodsDiscount = { id: goodsId, sku_id: skuId, // 保留SKU ID discount: discount, discount_price: discountPrice }; // 如果已有设置折扣库存,保留该值 if (stocks !== null) { goodsDiscount.stocks = stocks; } // 存储折扣数据 discountData[goodsId] = goodsDiscount; $('#discount-data').val(JSON.stringify(discountData)); // 更新商品详情信息 updateGoodsInfo(); }); // 处理规格设置按钮点击事件 $(document).on('click', '.btn-spec-discount', function() { var goodsId = $(this).data('id'); var $row = $(this).closest('tr'); var hasDiscountSetting = $row.attr('data-has-discount-setting'); var specData = ''; console.log('点击规格折扣设置按钮:', goodsId, '当前设置状态:', hasDiscountSetting); // 如果已经有设置,则传递已有的数据 if (hasDiscountSetting && $row.attr('data-discount-data')) { specData = encodeURIComponent($row.attr('data-discount-data')); console.log('已有折扣数据:', $row.attr('data-discount-data')); } Fast.api.open('marketing/discount/spec_discount?goods_id=' + goodsId + '&spec_data=' + specData, '规格折扣设置', { area: ['90%', '90%'], callback: function(data) { if (data && data.goodsId && data.specs) { console.log('规格折扣设置返回数据:', data); // 保存数据到行属性 $row.attr('data-has-discount-setting', 'true'); $row.attr('data-discount-data', JSON.stringify(data)); // 调试确认设置成功 console.log('设置后的data-discount-data属性:', $row.attr('data-discount-data')); // 更新按钮文字 $row.find('.btn-spec-discount').html('规格折扣设置 已设置'); // 更新状态和折扣显示 $row.find('.discount-status').text('已设置'); // 计算平均折扣和参与规格数量 var totalDiscount = 0; var count = 0; var totalStocks = 0; $.each(data.specs, function(id, item) { if (item.participate) { totalDiscount += parseFloat(item.discount); totalStocks += parseInt(item.stocks); count++; } }); var avgDiscount = count > 0 ? (totalDiscount / count).toFixed(1) : '-'; // 添加汇总信息 var summary = { participate_count: count, avg_discount: avgDiscount, total_stocks: totalStocks }; // 更新显示 var infoText = '已设置' + summary.participate_count + '个规格,平均' + summary.avg_discount + '折,共' + summary.total_stocks + '件'; // 如果已有汇总信息区域则更新,否则创建 var $infoArea = $row.find('.spec-discount-info'); if ($infoArea.length > 0) { $infoArea.text(infoText); } else { $row.find('.btn-spec-discount').parent().append('
' + infoText + '
'); } // 将汇总信息添加到数据中 data.summary = summary; // 将折扣数据保存到隐藏字段 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; discountData[goodsId] = data; $('#discount-data').val(JSON.stringify(discountData)); // 更新商品详情信息 updateGoodsInfo(); console.log('多规格商品设置后的折扣数据:', $('#discount-data').val()); } } }); }); } } }); }); }, edit: function () { Controller.api.bindevent(); // 表单提交前处理 $('#add-form').on('submit', function() { // 同时更新goods_info字段,包含商品的详细信息 updateGoodsInfo(); console.log('提交的商品信息:', $('#goods-info').val()); return true; }); // 初始化已选择的商品 var goodsIds = $('#goods-ids').val(); var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; if(goodsIds) { // 加载已选择的商品数据 Fast.api.ajax({ url: 'shop/goods/get_goods_by_ids', data: {ids: goodsIds} }, function(data) { if(data && data.length > 0) { // 使用模板渲染表格 var html = Template('goodsTableTpl', { list: data }); // 清空容器并显示表格 $('#selected-goods-container').empty().append(html); // 初始化分页表格 $('#selected-goods-table').bootstrapTable({ data: data, pagination: true, pageSize: 5, pageList: [5, 10, 20], sortable: true, search: false, classes: 'table table-hover table-striped', columns: [ { field: 'goods', title: '商品', width: '30%', formatter: function(value, row) { return '
' + '' + '
' + '
' + row.title + '
' + '

分类:' + (row.category ? row.category.name : '') + ' | 规格:' + (row.spec_type == 0 ? '单规格' : '多规格') + '

' + '
' + '
' } }, { field: 'price', title: '价格', width: '10%', align: 'center', formatter: function(value, row) { return '¥' + row.price + ''; } }, { field: 'stocks', title: '现库存', width: '10%', align: 'center' }, { field: 'discount_stocks', title: '折扣库存', width: '10%', align: 'center', formatter: function(value, row) { if(row.spec_type == 0) { // 只有单规格商品显示输入框 // 从折扣数据中获取库存值,如果没有则使用商品库存 var currentStocks = discountData[row.id] && discountData[row.id].stocks !== undefined ? discountData[row.id].stocks : parseInt(row.stocks); return ''; } else { return ''; // 多规格商品留空 } } }, { field: 'discount', title: '折扣', width: '15%', align: 'center', formatter: function(value, row) { if(row.spec_type == 1) { var hasSpec = discountData[row.id] && discountData[row.id].specs; var specBtnText = hasSpec ? '规格折扣设置 已设置' : '规格折扣设置'; var html = '
' + '' + specBtnText + '' + '
请点击设置各规格折扣
'; // 如果已设置规格折扣,显示汇总信息 if (hasSpec && discountData[row.id].summary) { var summary = discountData[row.id].summary; var infoText = '已设置' + summary.participate_count + '个规格,平均' + summary.avg_discount + '折,共' + summary.total_stocks + '件'; html += '
' + infoText + '
'; } html += '
'; return html; } else { var discount = (discountData[row.id] && discountData[row.id].discount) ? discountData[row.id].discount : 9; return '
' + '' + '' + '
'; } } }, { field: 'discount_price', title: '折后价', width: '20%', align: 'center', formatter: function(value, row) { if(row.spec_type == 0) { var discount = (discountData[row.id] && discountData[row.id].discount) ? discountData[row.id].discount : 9; var discountPrice = (row.price * discount / 10).toFixed(2); return '¥' + discountPrice + ''; } else { return ''; } } }, { field: 'operate', title: '操作', width: '15%', align: 'center', formatter: function(value, row) { return ' 删除'; }, events: { 'click .remove-goods': function (e, value, row, index) { // 从表格中移除该行 $('#selected-goods-table').bootstrapTable('remove', { field: 'id', values: [row.id] }); // 更新隐藏字段 var currentIds = $('#goods-ids').val().split(','); var newIds = []; $.each(currentIds, function(i, val) { if (val != row.id && val) { newIds.push(val); } }); $('#goods-ids').val(newIds.join(',')); // 移除折扣数据 var discountData = $('#discount-data').val() ? JSON.parse($('#discount-data').val()) : {}; if(discountData[row.id]) { delete discountData[row.id]; $('#discount-data').val(JSON.stringify(discountData)); } // 如果表格为空,则移除整个表格 if(newIds.length === 0) { $('#selected-goods-container').empty(); } } } } ] }); } return false; }); } // 选择商品功能和删除商品功能,与add方法相同 Controller.add(); }, // 规格折扣设置页面 spec_discount: function () { // 获取URL参数中的goods_id和spec_data var goodsId = Fast.api.query('goods_id'); var specData = Fast.api.query('spec_data'); // 设置批量折扣默认值,但不自动勾选 $('#batch-participate').prop('checked', false); $('#batch-discount').val(9); // 更新批量价格信息 Controller.api.updateBatchPriceInfo(); // 如果有规格数据,则进行回显 if (specData) { try { var data = JSON.parse(decodeURIComponent(specData)); if (data && data.specs) { $.each(data.specs, function(id, item) { var $row = $('tr[data-id="' + id + '"]'); if ($row.length > 0) { // 设置参与折扣 if (item.participate) { // 勾选并确保输入框可编辑 $row.find('.participate-checkbox').prop('checked', true); $row.find('.sku-stocks').prop('disabled', false); $row.find('.sku-discount').prop('disabled', false); // 设置折扣库存 if (item.stocks !== undefined) { var maxStocks = parseInt($row.data('stocks')) || 0; var stocks = parseInt(item.stocks) || 0; // 确保回显的库存不超过现有库存 if (stocks > maxStocks) { stocks = maxStocks; } $row.find('.sku-stocks').val(stocks); } // 设置折扣 if (item.discount !== undefined) { $row.find('.sku-discount').val(item.discount); // 更新折后价显示 var price = parseFloat($row.data('price')) || 0; var discount = parseFloat(item.discount) || 0; var discountPrice = (price * discount / 10).toFixed(2); $row.find('.discount-price').text('¥' + discountPrice); } } else { // 如果之前设置了不参与,则取消勾选 $row.find('.participate-checkbox').prop('checked', false); $row.find('.sku-stocks').prop('disabled', true); $row.find('.sku-discount').prop('disabled', true); } } }); // 检查已选规格数量,更新批量选择框状态 var checkedCount = $('.participate-checkbox:checked').length; var totalCount = $('.participate-checkbox').length; if (checkedCount > 0 && checkedCount === totalCount) { // 如果所有规格都已选中,勾选批量选择框 $('#batch-participate').prop('checked', true); } else if (checkedCount > 0) { // 部分选中,不勾选批量框但显示提示 $('#batch-participate').prop('checked', false); } else { // 没有任何选中 $('#batch-participate').prop('checked', false); } // 更新批量价格信息 Controller.api.updateBatchPriceInfo(); } } catch (e) { console.error('解析规格数据失败', e); } } // 参与折扣复选框事件,但勾选后可以直接编辑 $('.participate-checkbox').off('change').on('change', function() { var checked = $(this).prop('checked'); var $row = $(this).closest('tr'); // 启用/禁用库存和折扣输入框 var $stocksInput = $row.find('.sku-stocks'); var $discountInput = $row.find('.sku-discount'); $stocksInput.prop('disabled', !checked); $discountInput.prop('disabled', !checked); // 如果勾选,设置默认值 if (checked) { // 获取库存默认值 var stocks = $row.data('stocks') || 0; if (!$stocksInput.val()) { $stocksInput.val(stocks); } else if (parseInt($stocksInput.val()) > stocks) { // 如果当前值超过了最大库存,则调整为最大库存 $stocksInput.val(stocks); } // 设置折扣默认值,如果未设置 if (!$discountInput.val()) { $discountInput.val(9); } // 触发折扣输入框的input事件以更新折扣价格 $discountInput.trigger('input'); // 聚焦到折扣输入框方便用户直接修改 setTimeout(function() { $discountInput.focus(); }, 100); } }); // 批量参与复选框事件 $('#batch-participate').on('change', function() { var checked = $(this).prop('checked'); // 同步所有规格的选中状态 $('.participate-checkbox').prop('checked', checked).trigger('change'); // 如果勾选了批量参与,则聚焦到批量折扣输入框 if (checked) { setTimeout(function() { $('#batch-discount').focus(); }, 100); } }); // 批量折扣变化事件 $('#batch-discount').on('input', function() { var discount = parseFloat($(this).val()) || 0; if (discount < 0.1) discount = 0.1; if (discount > 10) discount = 10; $(this).val(discount); // 更新批量价格信息 Controller.api.updateBatchPriceInfo(); }); // 初始化批量价格信息 Controller.api.updateBatchPriceInfo(); // 应用批量设置按钮事件 $('#apply-batch').on('click', function() { var discount = parseFloat($('#batch-discount').val()) || 9; // 如果没有选中规格,先勾选所有规格 if ($('.participate-checkbox:checked').length === 0) { Layer.msg('请先勾选需要参与折扣的规格'); return; } // 应用到所有已勾选的行 $('.participate-checkbox:checked').each(function() { var $row = $(this).closest('tr'); $row.find('.sku-discount').val(discount).trigger('input'); }); Layer.msg('批量设置折扣已应用'); }); // 折扣输入事件 $('.sku-discount').off('input').on('input', function() { var discount = parseFloat($(this).val()) || 0; if(discount < 0.1) discount = 0.1; if(discount > 10) discount = 10; $(this).val(discount); var $row = $(this).closest('tr'); var price = parseFloat($row.data('price')) || 0; var discountPrice = (price * discount / 10).toFixed(2); $row.find('.discount-price').text('¥' + discountPrice); }); // 库存输入验证 $('.sku-stocks').on('input', function() { var stocks = parseInt($(this).val()) || 0; var $row = $(this).closest('tr'); var maxStocks = parseInt($row.data('stocks')) || 0; // 限制库存范围,不能超过现有库存 if (stocks < 0) stocks = 0; if (stocks > maxStocks) stocks = maxStocks; $(this).val(stocks); }); // 确认按钮事件 $('.btn-confirm').on('click', function() { var specs = {}; var hasParticipate = false; // 收集所有参与的规格数据 $('.participate-checkbox:checked').each(function() { var $row = $(this).closest('tr'); var id = $row.data('id'); var price = parseFloat($row.data('price')) || 0; var discount = parseFloat($row.find('.sku-discount').val()) || 9; var stocks = parseInt($row.find('.sku-stocks').val()) || 0; var discountPrice = (price * discount / 10).toFixed(2); specs[id] = { id: id, participate: true, discount: discount, price: price, stocks: stocks, discount_price: discountPrice }; hasParticipate = true; console.log('添加参与规格:', id, '折扣:', discount, '库存:', stocks); }); // 验证是否有选择参与的规格 if (!hasParticipate) { Layer.alert('请至少选择一个参与折扣的规格', {icon: 2}); return; } // 计算平均折扣和参与规格数量 var totalDiscount = 0; var count = 0; var totalStocks = 0; $.each(specs, function(id, item) { if (item.participate) { totalDiscount += parseFloat(item.discount); totalStocks += parseInt(item.stocks); count++; } }); var avgDiscount = count > 0 ? (totalDiscount / count).toFixed(1) : '-'; // 添加汇总信息 var summary = { participate_count: count, avg_discount: avgDiscount, total_stocks: totalStocks }; var returnData = { goodsId: goodsId, specs: specs, summary: summary }; console.log('多规格确认返回数据:', returnData); // 返回数据到add.html页面 Fast.api.close(returnData); }); }, api: { bindevent: function () { Form.api.bindevent($("form[role=form]")); // 处理活动类型选择 $('select[name="row[type]"]').on('change', function() { var type = $(this).val(); // 根据类型显示或隐藏内部类型选择 if (type == 'discount') { // 折扣活动隐藏内部类型选择,默认为0 $('#inner-type-group').hide(); $('#c-inner-type').val(0); // 折扣活动隐藏商品参与方式,强制为指定商品 $('.goods-join-type-group').hide(); $('input[name="row[goods_join_type]"][value="2"]').prop('checked', true); } else { // 其他活动类型显示相关选项 $('#inner-type-group').show(); $('.goods-join-type-group').show(); } }).trigger('change'); // 页面加载时立即触发一次 // 活动名称字数限制处理 var nameInput = $("#c-name"); var countElement = $("#name-count"); // 初始化显示 countElement.text(nameInput.val().length + "/20"); // 监听输入事件 nameInput.on("input propertychange", function() { var text = $(this).val(); var len = text.length; // 更新显示的字数 countElement.text(len + "/20"); // 限制最多输入20个字符 if (len > 20) { $(this).val(text.substring(0, 20)); countElement.text("20/20"); } }); // 限购选项处理 $('input[name="row[purchase_limit_type]"]').on('change', function() { var type = $(this).val(); // 禁用所有输入框 $('input[name="row[purchase_limit_total]"]').prop('disabled', true); $('input[name="row[purchase_limit_daily]"]').prop('disabled', true); // 根据选择启用对应输入框 if(type == '1') { $('input[name="row[purchase_limit_total]"]').prop('disabled', false).focus(); } else if(type == '2') { $('input[name="row[purchase_limit_daily]"]').prop('disabled', false).focus(); } }); }, // 更新批量价格信息 updateBatchPriceInfo: function() { var discount = parseFloat($('#batch-discount').val()) || 0; var totalPrice = 0; var totalCount = 0; $('tr[data-price]').each(function() { var price = parseFloat($(this).data('price')) || 0; totalPrice += price; totalCount++; }); var avgPrice = totalCount > 0 ? totalPrice / totalCount : 0; var discountPrice = (avgPrice * discount / 10).toFixed(2); $('.batch-price-info').text('平均折后价:¥' + discountPrice); } } }; // 更新商品详细信息到goods_info隐藏域 function updateGoodsInfo() { // 获取表格中的所有商品数据 var goodsInfo = []; var table = $('#selected-goods-table').bootstrapTable('getData'); var discountData = {}; // 处理单规格商品的折扣数据 $('.discount-input').each(function() { var $input = $(this); var goodsId = $input.data('id'); var discount = parseFloat($input.val()) || 0; var price = parseFloat($input.data('price')) || 0; var discountPrice = (price * discount / 10).toFixed(2); var $tr = $input.closest('tr'); var $stocksInput = $tr.find('.discount-stocks-input'); var stocks = parseInt($stocksInput.val()) || 0; discountData[goodsId] = { id: goodsId, discount: discount, discount_price: discountPrice, stocks: stocks }; }); // 处理多规格商品的折扣数据 $('#selected-goods-table tbody tr').each(function() { var $row = $(this); var goodsId = $row.data('id'); var hasDiscountSetting = $row.attr('data-has-discount-setting'); var discountDataStr = $row.attr('data-discount-data'); console.log('检查多规格商品:', goodsId, '设置状态:', hasDiscountSetting, '数据:', discountDataStr); if (goodsId && hasDiscountSetting === 'true' && discountDataStr) { try { // 如果是多规格商品且已设置规格折扣 var rowDiscountData = JSON.parse(discountDataStr); discountData[goodsId] = rowDiscountData; console.log('解析多规格数据成功:', goodsId, rowDiscountData); } catch (e) { console.error('解析多规格折扣数据失败:', e); } } }); // 调试所有收集的折扣数据 console.log('所有折扣数据:', discountData); // 更新折扣数据隐藏域 $('#discount-data').val(JSON.stringify(discountData)); if(table && table.length > 0) { $.each(table, function(index, item) { // 基础商品信息 var goodsData = { goods_id: item.id, title: item.title, stock: item.stocks || 0, spec_type: item.spec_type }; // 添加折扣信息 if(discountData[item.id]) { if(item.spec_type == 0) { // 单规格商品只保留折扣相关字段 goodsData.sku_id = discountData[item.id].sku_id || 0; // 添加SKU ID goodsData.discount = discountData[item.id].discount; goodsData.discount_price = discountData[item.id].discount_price; goodsData.discount_stocks = discountData[item.id].stocks; } else if(item.spec_type == 1) { // 多规格商品 - 检查是否有规格折扣设置 console.log('处理多规格商品:', item.id, discountData[item.id]); var spec = []; // 确保specs存在 if(discountData[item.id] && discountData[item.id].specs) { var specData = discountData[item.id].specs; // 提取已选中参与折扣的规格 $.each(specData, function(specId, specItem) { console.log('规格项:', specId, specItem); if(specItem && specItem.participate) { spec.push({ sku_id: specId, discount: specItem.discount, discount_price: specItem.discount_price, discount_stocks: specItem.stocks }); } }); console.log('最终生成的spec数组:', spec); } else { console.log('没有找到多规格商品的specs数据'); } // 即使为空也保存spec数组 goodsData.spec = spec; } } goodsInfo.push(goodsData); }); } // 调试最终结果 console.log('最终goods_info:', goodsInfo); // 更新隐藏域 $('#goods-info').val(JSON.stringify(goodsInfo)); return goodsInfo; } return Controller; });