sku.html 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <div class="layui-form-item">
  2. <label class="control-label">规格项目</label>
  3. <table class="layui-table ctrl-group">
  4. </table>
  5. <button class="layui-btn icon-btn add-spec-btn" type="button">添加规格</button>
  6. </div>
  7. <div id="lv_table_con" class="control-group" style="display: none;">
  8. <label class="control-label">规格项目(sku)表</label>
  9. <div class="controls">
  10. <div id="lv_table">
  11. </div>
  12. </div>
  13. </div>
  14. let specHtml = '<tr class="spec-box" style="position: relative">\n' +
  15. ' <td class="spec" style="width: 100px;position: relative">\n' +
  16. ' <input class="layui-input" name="spec" value="">\n' +
  17. ' <button class="rm-spec-btn" style="border: none;position: absolute;top: 15px;right: 16px;background: #ff0000;color: #fff;border-radius: 2px;padding: 1px 5px;">X</button>\n' +
  18. ' </td>\n' +
  19. ' <td class="spec-item" style="display:flex;flex-wrap: wrap;align-items: center;position: relative">\n' +
  20. ' <div class="item-one" style="position: relative;margin: 5px 0 5px 6px">\n' +
  21. ' <input class="layui-input" name="spec_value" style="width: 100px" value="">\n' +
  22. ' </div>\n' +
  23. ' <button type="button" class="layui-btn layui-btn-sm add-spec-item-btn" style="margin-left: 20px">添加参数</button>\n' +
  24. ' </td>\n' +
  25. ' </tr>';
  26. let itemHtml ='<div class="item-one" style="position: relative;margin: 5px 0 5px 6px">\n' +
  27. ' <input class="layui-input" name="spec_value" style="width: 100px" value="">\n' +
  28. ' <button class="rm-spec-item-btn" style="border: none;position: absolute;top: 1px;right: 1px;background: #ff0000;color: #fff;border-radius: 2px;padding: 1px 5px;">X</button>\n' +
  29. ' </div>';
  30. // 添加规格
  31. $(document).on('click','.add-spec-btn',function () {
  32. // 添加tr
  33. var last = $('.ctrl-group tr:last');
  34. if (!last || last.length == 0) {
  35. $(this).prev().eq(0).html(specHtml)
  36. } else {
  37. last.eq(0).after(specHtml);
  38. }
  39. })
  40. $(document).on('click', '.rm-spec-btn', function() {
  41. $(this).parents('tr').remove();
  42. renderSkuItem()
  43. });
  44. // 添加规格参数
  45. $(document).on('click','.add-spec-item-btn', function () {
  46. $(this).parents('.spec-item').find('.item-one:last').after(itemHtml);
  47. });
  48. $(document).on('click', '.rm-spec-item-btn', function() {
  49. $(this).parents('.item-one:last').remove();
  50. renderSkuItem()
  51. });
  52. // 及时生成
  53. $(document).on('focusout', 'input[name="spec_value"]', function() {
  54. renderSkuItem();
  55. })
  56. function renderSkuItem()
  57. {
  58. var lv1Arr = $('input[name="spec"]');
  59. if (!lv1Arr || lv1Arr.length == 0) {
  60. $('#lv_table_con').hide();
  61. $('#lv_table').html('');
  62. return;
  63. }
  64. for (var i = 0; i < lv1Arr.length; i++) {
  65. var lv2Arr = $(lv1Arr[i]).parents('.spec-box').find('input[name="spec_value"]');
  66. if (!lv2Arr || lv2Arr.length == 0) {
  67. layer.tips('规格项必须填写哟!', $(lv1Arr[i]), {tips: [1, '#ff4c4c']})
  68. return false;
  69. }
  70. $.each(lv2Arr, (i,t) => {
  71. if($(t).val() === ""){
  72. layer.tips('规格项必须填写哟!', $(t), {tips: [1, '#ff4c4c']})
  73. return false;
  74. }
  75. })
  76. }
  77. // 数据采集 spec
  78. let specs = [],specv = [];
  79. $.each(lv1Arr, (i,t) => {
  80. let val = $(t).val();
  81. specs.push(val);
  82. })
  83. console.log(specs);
  84. // var SKU = sku.init({ id:'sku',item:item});
  85. // return false;
  86. var tableHTML = '', spec = [],spec_value=[];
  87. tableHTML += '<table class="layui-table">';
  88. tableHTML += ' <thead>';
  89. tableHTML += ' <tr>';
  90. for (var i = 0; i < lv1Arr.length; i++) {
  91. // 收集商品属性
  92. tableHTML += '<th width="50">' + $(lv1Arr[i]).val() + '</th>';
  93. }
  94. // 添加要获取的数据
  95. tableHTML += ' <th style="width: 50px">现价</th>';
  96. tableHTML += ' <th style="width: 50px">原价</th>';
  97. tableHTML += ' <th style="width: 50px">库存</th>';
  98. tableHTML += ' </tr>';
  99. tableHTML += ' </thead>';
  100. tableHTML += ' <tbody>';
  101. var numsArr = new Array();
  102. var idxArr = new Array();
  103. for (var i = 0; i < lv1Arr.length; i++) {
  104. numsArr.push($(lv1Arr[i]).parents('.spec-box').find('input[name="spec_value"]').length);
  105. idxArr[i] = 0;
  106. }
  107. var len = 1;
  108. var rowsArr = new Array();
  109. for (var i = 0; i < numsArr.length; i++) {
  110. len = len * numsArr[i];
  111. var tmpnum = 1;
  112. for (var j = numsArr.length - 1; j > i; j--) {
  113. tmpnum = tmpnum * numsArr[j];
  114. }
  115. rowsArr.push(tmpnum);
  116. }
  117. for (var i = 0; i < len; i++) {
  118. tableHTML += ' <tr data-row="' + (i+1) + '">';
  119. var name = '';
  120. for (var j = 0; j < lv1Arr.length; j++) {
  121. var n = parseInt(i / rowsArr[j]);
  122. if (j == 0) {
  123. } else if (j == lv1Arr.length - 1) {
  124. n = idxArr[j];
  125. if (idxArr[j] + 1 >= numsArr[j]) {
  126. idxArr[j] = 0;
  127. } else {
  128. idxArr[j]++;
  129. }
  130. } else {
  131. var m = parseInt(i / rowsArr[j]);
  132. n = m % numsArr[j];
  133. }
  134. var text = $(lv1Arr[j]).parents('.spec-box').find('input[name="spec_value"]').eq(n).val();
  135. console.log(text);
  136. if (j != lv1Arr.length - 1) {
  137. name += text + '_';
  138. } else {
  139. name += text;
  140. }
  141. if (i % rowsArr[j] == 0) {
  142. tableHTML += '<td rowspan="' + rowsArr[j] + '" data-rc="' + (i+1) + '_' + (j+1) + '">' + text + '</td>';
  143. }
  144. }
  145. // 对应上面
  146. tableHTML += '<td style="width: 50px"><input type="text" class="layui-input" name="' + name + '[price]" /></td>';
  147. tableHTML += '<td style="width: 50px"><input type="text" class="layui-input" name="' + name + '[original_price]" /></td>';
  148. tableHTML += '<td style="width: 50px"><input type="text" class="layui-input" name="' + name + '[stock]" /></td>';
  149. tableHTML += '</tr>';
  150. }
  151. tableHTML += '</tbody>';
  152. tableHTML += '</table>';
  153. $('#lv_table_con').show();
  154. $('#lv_table').html(tableHTML);
  155. }