goods.spec.js 14.3 KB
(function () {

    // 商品规格数据
    var data = {
            spec_attr: [],
            goods_spec_list: []
        }

        // 配置信息
        , setting = {
            container: '.goods-spec-many'
        };

    function GoodsSpec(options, baseData) {
        // 配置信息
        setting = $.extend(true, {}, setting, options);
        // 已存在的规格数据
        typeof baseData !== 'undefined' && baseData !== null && (data = baseData);
        // 初始化
        this.initialize();
    }

    GoodsSpec.prototype = {
        /**
         * 初始化
         */
        initialize: function () {
            // 注册html容器
            this.$container = $(setting.container);
            this.$specAttr = this.$container.find('.spec-attr');
            // 显示添加规格事件
            this.showAddSpecEvent();
            // 确认新增规格事件
            this.submitAddSpecEvent();
            // 取消新增规格事件
            this.cancelAddSpecEvent();
            // 注册添加规格值事件
            this.addSpecValueEvent();
            // 注册删除规格事件
            this.deleteSpecEvent();
            // 注册删除规格值事件
            this.deleteSpecValueEvent();
            // 注册批量设置sku事件
            this.batchUpdateSku();
            // 注册表格input数据修改事件
            this.updateSpecInputEvent();
            // 渲染已存在的sku信息
            this.renderHtml();
        },

        /**
         * 显示添加规格
         */
        showAddSpecEvent: function () {
            // 显示添加规则组表单
            this.$container.on('click', '.btn-addSpec', function () {
                var $specButton = $(this).parent()
                    , $specAdd = $specButton.next();
                $specButton.hide();
                $specAdd.show();
            });
        },

        /**
         * 确认新增规格
         */
        submitAddSpecEvent: function () {
            var _this = this;
            // 确认添加
            _this.$container.on('click', '.btn-addSpecName', function () {
                var $specAdd = $(this).parent().parent()
                    , $specButton = $specAdd.prev()
                    , $specNameInput = _this.$container.find('.input-specName')
                    , $specValueInput = _this.$container.find('.input-specValue')
                    , specValueInputValue = $specValueInput.val()
                    , specNameInputValue = $specNameInput.val();
                if (specNameInputValue === '' || specValueInputValue === '') {
                    layer.msg('请填写规则名或规则值');
                    return false;
                }
                // 添加到数据库
                var load = layer.load();
                $.post('spec/addSpec', {
                    spec_name: specNameInputValue,
                    spec_value_name: specValueInputValue
                }, function (result) {
                    layer.close(load);
                    if (result.code !== 1) {
                        layer.msg(result.msg);
                        return false;
                    }
                    // 清空输入内容
                    $specNameInput.val('') && $specValueInput.val('');
                    // 记录规格数据
                    data.spec_attr.push({
                        spec_id: result.data.spec_id,
                        spec_name: specNameInputValue,
                        spec_value_list: [{
                            spec_value_id: result.data.spec_value_id,
                            spec_value_name: specValueInputValue
                        }]
                    });
                    // 渲染规格属性html
                    _this.renderHtml();
                    // 隐藏添加规格组表单
                    $specAdd.hide() && $specButton.show();
                });

            });
        },

        /**
         * 取消新增规格名
         */
        cancelAddSpecEvent: function () {
            this.$container.on('click', '.btn-cancleAddSpecName', function () {
                var $specAdd = $(this).parent().parent()
                    , $specButton = $specAdd.prev();
                // 隐藏添加规格组表单
                $specAdd.hide() && $specButton.show()
            });
        },

        /**
         * 添加规格值事件
         */
        addSpecValueEvent: function () {
            var _this = this;
            _this.$container.on('click', '.btn-addSpecValue', function () {
                var $this = $(this)
                    , $iptSpecValue = $this.prev('.ipt-specValue')
                    , specValueInputValue = $iptSpecValue.val()
                    , $specValueAddContainer = $this.parent()
                    , $spec = $specValueAddContainer.parent().parent();
                if (specValueInputValue === '') {
                    layer.msg('规格值不能为空');
                    return false;
                }
                // 添加到数据库
                var load = layer.load();
                $.post('spec/addSpecValue', {
                    spec_id: $spec.data('group-id'),
                    spec_value_name: specValueInputValue
                }, function (result) {
                    layer.close(load);
                    if (result.code !== 1) {
                        layer.msg(result.msg);
                        return false;
                    }
                    // 记录规格数据
                    data.spec_attr[$spec.data('index')].spec_value_list.push({
                        spec_value_id: result.data.spec_value_id,
                        spec_value_name: specValueInputValue
                    });
                    // 渲染规格属性html
                    _this.renderHtml();
                });
            });
        },

        /**
         * 删除规则组事件
         */
        deleteSpecEvent: function () {
            var _this = this;
            _this.$container.on('click', '.spec-delete', function () {
                // 规则组索引
                var index = $(this).parent().parent().attr('data-index');
                layer.confirm('确定要删除该规则组吗?确认后不可恢复请谨慎操作', function (layerIndex) {
                    // 删除指定规则组
                    data.spec_attr.splice(index, 1);
                    // 重新渲染规格属性html
                    _this.renderHtml();
                    layer.close(layerIndex);
                });
            });
        },

        /**
         * 删除规格值事件
         */
        deleteSpecValueEvent: function () {
            var _this = this;
            _this.$container.on('click', '.spec-value-delete', function () {
                var $specValue = $(this).parent()
                    , $spec = $specValue.parent().parent()
                    , specIndex = $spec.attr('data-index')
                    , specValueIndex = $specValue.attr('data-item-index');
                layer.confirm('确定要删除该规则吗?确认后不可恢复请谨慎操作', function (layerIndex) {
                    // 删除指定规则组
                    data.spec_attr[specIndex].spec_value_list.splice(specValueIndex, 1);
                    // 重新渲染规格属性html
                    _this.renderHtml();
                    layer.close(layerIndex);
                });
            });
        },

        /**
         * 注册批量设置sku事件
         */
        batchUpdateSku: function () {
            var _this = this,
                $specBatch = _this.$container.find('.spec-batch');
            $specBatch.on('click', '.btn-specBatchBtn', function () {
                var formData = {};
                $specBatch.find('input').each(function () {
                    var $this = $(this)
                        , formType = $this.data('type')
                        , value = $this.val();
                    if (typeof formType !== 'undefined' && formType !== '' && value !== '') {
                        formData[formType] = value;
                    }
                });
                if (!$.isEmptyObject(formData)) {
                    data.goods_spec_list.forEach(function (item, index) {
                        data.goods_spec_list[index].form = $.extend({}, data.goods_spec_list[index].form, formData);
                    });
                    // 渲染商品规格table
                    _this.renderTabelHtml();
                }
            });
        },

        /**
         * 渲染多规格模块html
         */
        renderHtml: function () {
            // 渲染商品规格元素
			var html_spec_attr = '';
			$.each(data.spec_attr,function(index,value){
				html_spec_attr += '<div class="spec" data-index="'+index+'" data-group-id="'+value.spec_id+'">'+
					'<div class="spec-name">'+
						'<span>'+value.spec_name+'</span>'+
						'<i class="spec-delete glyphicon glyphicon-remove" title="点击删除"></i>'+
					'</div>'+
					'<div class="spec-value-list am-cf">';
						$.each(value.spec_value_list,function(key,item){
						html_spec_attr += '<div class="spec-value am-fl" data-item-index="'+key+'">'+
							'<span>'+item.spec_value_name+'</span>'+
							'<i class="spec-value-delete glyphicon glyphicon-remove-circle" title="点击删除"></i>'+
						'</div>';
						})
						html_spec_attr += '<div class="spec-value-add am-cf am-fl">'+
							'<input type="text" class="ipt-specValue am-fl am-field-valid">'+
							'<button type="button" class="btn-addSpecValue am-btn am-fl">添加</button>'+
						'</div>'+
					'</div>'+
				'</div>';
			})
            this.$specAttr.html(html_spec_attr);
            // 渲染商品规格table
            this.renderTabelHtml();
        },

        /**
         * 渲染表格html
         */
        renderTabelHtml: function () {
            var $specTabel = this.$container.find('.spec-sku-tabel')
                , $goodsSku = $specTabel.parent();
            // 商品规格为空:隐藏sku容器
            if (data.spec_attr.length === 0) {
                $specTabel.empty();
                $goodsSku.hide();
                return false;
            }
            // 构建规格组合列表
            this.buildSpeclist();
            // 渲染table
			var html_spec_table = '<tbody>'+
									'<tr>';
	        $.each(data.spec_attr,function(index,value){
				html_spec_table += '<th>'+value.spec_name+'</th>';
	        })
				        html_spec_table += '<th>商品价格</th>'+
							'<th>库存</th>'+
							'<th>重量(kg)</th>'+
						'</tr>';
				    $.each(data.goods_spec_list,function(index,item){
					html_spec_table += '<tr data-index="'+index+'" data-sku-id="'+item.spec_sku_id+'">';
							$.each(item.rows,function(itemKey,td){
								html_spec_table += '<td class="td-spec-value am-text-middle" rowspan="'+td.rowspan+'">'
									+td.spec_value_name+
								'</td>';
							})
				html_spec_table += '<td>'+
								'<input data-rule="required" class="ipt-w80" type="number" name="goods_price" value="'+item.form.goods_price+'">'+
							'</td>'+
							'<td>'+
								'<input data-rule="required" class="ipt-w80" type="number" name="stock_num" value="'+item.form.stock_num+'">'+
							'</td>'+
							'<td>'+
								'<input data-rule="required" class="ipt-w80" type="number" name="goods_weight" value="'+item.form.goods_weight+'">'+
							'</td>'+
						'</tr>';
				    })
				    html_spec_table += '</tbody>';
            $specTabel.html(html_spec_table);
            // 显示sku容器
            $goodsSku.show();
        },

        /**
         * 构建规格组合列表
         */
        buildSpeclist: function () {
            // 规格组合总数 (table行数)
            var totalRow = 1;
            for (var i = 0; i < data.spec_attr.length; i++) {
                totalRow *= data.spec_attr[i].spec_value_list.length;
            }
            // 遍历tr 行
            var goods_spec_list = [];
            for (i = 0; i < totalRow; i++) {
                var rowData = [], rowCount = 1, specSkuIdAttr = [];
                // 遍历td 列
                for (var j = 0; j < data.spec_attr.length; j++) {
                    var skuValues = data.spec_attr[j].spec_value_list;
                    rowCount *= skuValues.length;
                    var anInterBankNum = (totalRow / rowCount)
                        , point = ((i / anInterBankNum) % skuValues.length);
                    if (0 === (i % anInterBankNum)) {
                        rowData.push({
                            rowspan: anInterBankNum,
                            spec_value_id: skuValues[point].spec_value_id,
                            spec_value_name: skuValues[point].spec_value_name
                        });
                    }
                    specSkuIdAttr.push(skuValues[parseInt(point.toString())].spec_value_id);
                }
                goods_spec_list.push({
                    spec_sku_id: specSkuIdAttr.join('_'),
                    rows: rowData,
                    form: {}
                });
            }
            // 合并旧sku数据
            if (data.goods_spec_list.length > 0 && goods_spec_list.length > 0) {
                for (i = 0; i < goods_spec_list.length; i++) {
                    var overlap = data.goods_spec_list.filter(function (val) {
                        return val.spec_sku_id === goods_spec_list[i].spec_sku_id;
                    });
                    if (overlap.length > 0) goods_spec_list[i].form = overlap[0].form;
                }
            }
            data.goods_spec_list = goods_spec_list;
        },

        /**
         * 输入规格信息自动同步更新goods_spec_list
         */
        updateSpecInputEvent: function () {
            var _this = this;
            _this.$container.find('.spec-sku-tabel').on('propertychange change', 'input', function () {
                var $this = $(this)
                    , dataType = $this.attr('name')
                    , specIndex = $this.parent().parent().data('index');
                data.goods_spec_list[specIndex].form[dataType] = $this.val();
            });
        },

        /**
         * 获取当前data
         */
        getData: function () {
            return data;
        },

        /**
         * sku列表是否为空
         * @returns {boolean}
         */
        isEmptySkuList: function () {
            return !data.goods_spec_list.length;
        }

    };

    window.GoodsSpec = GoodsSpec;

})();