createSkuTable.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. var alreadySetSkuVals = {};//已经设置的SKU值数据
  2. $(function(){
  3. //sku属性发生改变时,进行表格创建
  4. $(document).on("change",'.sku_value',function(){ //所有 input
  5. getAlreadySetSkuVals()
  6. createTab()
  7. });
  8. });
  9. function createTab(type='') {
  10. var b = true;
  11. var skuTypeArr = [];//存放SKU类型的数组
  12. var totalRow = 1;//总行数
  13. //获取元素类型
  14. $(".SKU_TYPE").each(function(){ // 标题 土豪金 黑色
  15. //SKU类型节点
  16. var skuTypeNode = $(this).children("li"); // 标题下 的li 遍历
  17. var skuTypeObj = {};//sku类型对象
  18. //SKU属性类型标题
  19. skuTypeObj.skuTypeTitle = $(skuTypeNode).attr("sku-type-name"); // li 的类 以后赋给 生成的li 对象属性
  20. //SKU属性类型主键
  21. skuTypeObj.skuTypeKey = $(skuTypeNode).attr("propid"); // 自定义 id 值 1, 2 , 3
  22. //是否是必选SKU 0:不是;1:是;
  23. var is_required = $(skuTypeNode).attr("is_required");
  24. skuValueArr = [];//存放SKU值得数组
  25. //SKU相对应的节点
  26. var skuValNode = $(this).next(); // 兄弟 节点 所有 input 节点
  27. //获取SKU值
  28. var skuValCheckBoxs = $(skuValNode).find("input[type='checkbox'][class*='sku_value']"); // input value
  29. var checkedNodeLen = 0 ;//选中的SKU节点的个数
  30. $(skuValCheckBoxs).each(function(){
  31. if($(this).is(":checked")){ // 选中所有的 input 值
  32. var skuValObj = {};//SKU值对象
  33. skuValObj.skuValueTitle = $(this).val();//SKU值名称
  34. skuValObj.skuValueId = $(this).attr("propvalid");//SKU值主键
  35. skuValObj.skuPropId = $(this).attr("propid");//SKU类型主键
  36. skuValueArr.push(skuValObj);
  37. checkedNodeLen ++ ;
  38. }
  39. });
  40. if(is_required && 1 == is_required){//必选sku
  41. if(checkedNodeLen <= 0){//有必选的SKU仍然没有选中
  42. b = false;
  43. return false;//直接返回
  44. }
  45. }
  46. if(skuValueArr && skuValueArr.length > 0){
  47. totalRow = totalRow * skuValueArr.length;
  48. skuTypeObj.skuValues = skuValueArr;//sku值数组
  49. skuTypeObj.skuValueLen = skuValueArr.length;//sku值长度
  50. skuTypeArr.push(skuTypeObj);//保存进数组中
  51. }
  52. });
  53. // skuTypeArr = skuTypeArrCopy
  54. var SKUTableDom = "";//sku表格数据
  55. //开始创建行
  56. if(b){//必选的SKU属性已经都选中了
  57. // //调整顺序(少的在前面,多的在后面)
  58. // skuTypeArr.sort(function(skuType1,skuType2){
  59. // return (skuType1.skuValueLen - skuType2.skuValueLen)
  60. // });
  61. //
  62. SKUTableDom += "<table class='skuTable'><tr>";
  63. //创建表头
  64. for(let t = 0 ; t < skuTypeArr.length ; t ++){
  65. SKUTableDom += '<th>'+skuTypeArr[t].skuTypeTitle+'</th>';
  66. }
  67. SKUTableDom += '<th>价格</th><th>库存</th>';
  68. SKUTableDom += "</tr>";
  69. //循环处理表体
  70. for(var i = 0 ; i < totalRow ; i ++){//总共需要创建多少行
  71. var currRowDoms = "";
  72. var rowCount = 1;//记录行数
  73. var propvalidArr = [];//记录SKU值主键
  74. var propIdArr = [];//属性类型主键
  75. var propvalnameArr = [];//记录SKU值标题
  76. var propNameArr = [];//属性类型标题
  77. for(var j = 0 ; j < skuTypeArr.length ; j ++){//sku列
  78. var skuValues = skuTypeArr[j].skuValues;//SKU值数组
  79. var skuValueLen = skuValues.length;//sku值长度
  80. rowCount = (rowCount * skuValueLen);//目前的生成的总行数
  81. var anInterBankNum = (totalRow / rowCount);//跨行数
  82. var point = ((i / anInterBankNum) % skuValueLen);
  83. propNameArr.push(skuTypeArr[j].skuTypeTitle);
  84. if(0 == (i % anInterBankNum)){//需要创建td
  85. currRowDoms += '<td rowspan='+anInterBankNum+'>'+skuValues[point].skuValueTitle+'</td>';
  86. propvalidArr.push(skuValues[point].skuValueId);
  87. propIdArr.push(skuValues[point].skuPropId);
  88. propvalnameArr.push(skuValues[point].skuValueTitle);
  89. }else{
  90. //当前单元格为跨行
  91. propvalidArr.push(skuValues[parseInt(point)].skuValueId);
  92. propIdArr.push(skuValues[parseInt(point)].skuPropId);
  93. propvalnameArr.push(skuValues[parseInt(point)].skuValueTitle);
  94. }
  95. }
  96. //
  97. // //进行排序(主键小的在前,大的在后),注意:适用于数值类型的主键
  98. // propvalidArr.sort(function(provids1,propvids2){
  99. // return (provids1 - propvids2)
  100. // });
  101. var propvalids = propvalidArr.toString()
  102. var alreadySetSkuPrice = "";//已经设置的SKU价格
  103. var alreadySetSkuStock = "";//已经设置的SKU库存
  104. console.log(propvalids, '已经设置的SKU库存')
  105. //赋值
  106. if(alreadySetSkuVals){
  107. var currGroupSkuVal = alreadySetSkuVals[propvalids];//当前这组SKU值
  108. if(currGroupSkuVal){
  109. alreadySetSkuPrice = currGroupSkuVal.skuPrice;
  110. alreadySetSkuStock = currGroupSkuVal.skuStock
  111. }
  112. }
  113. //console.log(propvalids);
  114. SKUTableDom += `<tr propvalids='${propvalids}' propids='${propIdArr.toString()}'
  115. propvalnames='${propvalnameArr.join(";")}' propnames='${propNameArr.join(";")}' class="sku_table_tr">
  116. ${currRowDoms}
  117. <td><input type="text" class="setting_sku_price" value="${alreadySetSkuPrice}"/></td>
  118. <td><input type="text" class="setting_sku_stock" value="${alreadySetSkuStock}"/></td>
  119. </tr>`;
  120. }
  121. SKUTableDom += "</table>";
  122. }
  123. $("#skuTable").html(SKUTableDom);
  124. }
  125. function getAlreadySetSkuVals(){
  126. alreadySetSkuVals = {};
  127. //获取设置的SKU属性值
  128. // console.log(alreadySetSkuVals, 'alreadySetSkuVals')
  129. $(".sku_table_tr").each(function(){
  130. var skuPrice = $(this).find("input[type='text'][class*='setting_sku_price']" ).val() || 0;//SKU价格
  131. var skuStock = $(this).find("input[type='text'][class*='setting_sku_stock']").val() || 0;//SKU库存
  132. if(skuPrice || skuStock){//已经设置了全部或部分值
  133. var propvalids = $(this).attr("propvalids");//SKU值主键集合
  134. alreadySetSkuVals[propvalids] = {
  135. "skuPrice" : skuPrice,
  136. "skuStock" : skuStock
  137. }
  138. }
  139. });
  140. }