skuHelper.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { UNSELECTED_SKU_VALUE_ID } from '../constants';
  2. /*
  3. normalize sku tree
  4. [
  5. {
  6. count: 2,
  7. k: "品种", // 规格名称 skuKeyName
  8. k_id: "1200", // skuKeyId
  9. k_s: "s1" // skuKeyStr
  10. v: [ // skuValues
  11. { // skuValue
  12. id: "1201", // skuValueId
  13. name: "萌" // 具体的规格值 skuValueName
  14. }, {
  15. id: "973",
  16. name: "帅"
  17. }
  18. ]
  19. },
  20. ...
  21. ]
  22. |
  23. v
  24. {
  25. s1: [{
  26. id: "1201",
  27. name: "萌"
  28. }, {
  29. id: "973",
  30. name: "帅"
  31. }],
  32. ...
  33. }
  34. */
  35. export const normalizeSkuTree = skuTree => {
  36. const normalizedTree = {};
  37. skuTree.forEach(treeItem => {
  38. normalizedTree[treeItem.k_s] = treeItem.v;
  39. });
  40. return normalizedTree;
  41. };
  42. // 判断是否所有的sku都已经选中
  43. export const isAllSelected = (skuTree, selectedSku) => {
  44. // 筛选selectedSku对象中key值不为空的值
  45. const selected = Object.keys(selectedSku).filter(
  46. skuKeyStr => selectedSku[skuKeyStr] !== UNSELECTED_SKU_VALUE_ID
  47. );
  48. return skuTree.length === selected.length;
  49. };
  50. // 根据已选择的 sku 获取 skuComb
  51. export const getSkuComb = (skuList, selectedSku) => {
  52. const skuComb = skuList.filter(item => (
  53. Object.keys(selectedSku).every(
  54. skuKeyStr => String(item[skuKeyStr]) === String(selectedSku[skuKeyStr])
  55. )
  56. ));
  57. return skuComb[0];
  58. };
  59. // 获取已选择的sku名称
  60. export const getSelectedSkuValues = (skuTree, selectedSku) => {
  61. const normalizedTree = normalizeSkuTree(skuTree);
  62. return Object.keys(selectedSku).reduce((selectedValues, skuKeyStr) => {
  63. const skuValues = normalizedTree[skuKeyStr];
  64. const skuValueId = selectedSku[skuKeyStr];
  65. if (skuValueId !== UNSELECTED_SKU_VALUE_ID) {
  66. const skuValue = skuValues.filter(value => value.id === skuValueId)[0];
  67. skuValue && selectedValues.push(skuValue);
  68. }
  69. return selectedValues;
  70. }, []);
  71. };
  72. // 判断sku是否可选
  73. export const isSkuChoosable = (skuList, selectedSku, skuToChoose) => {
  74. const { key, valueId } = skuToChoose;
  75. // 先假设sku已选中,拼入已选中sku对象中
  76. const matchedSku = Object.assign({}, selectedSku, {
  77. [key]: valueId
  78. });
  79. // 再判断剩余sku是否全部不可选,若不可选则当前sku不可选中
  80. const skusToCheck = Object.keys(matchedSku).filter(
  81. skuKey => matchedSku[skuKey] !== UNSELECTED_SKU_VALUE_ID
  82. );
  83. const filteredSku = skuList.filter(sku => (
  84. skusToCheck.every(
  85. skuKey => String(matchedSku[skuKey]) === String(sku[skuKey])
  86. )
  87. ));
  88. const stock = filteredSku.reduce((total, sku) => {
  89. total += sku.stock_num;
  90. return total;
  91. }, 0);
  92. return stock > 0;
  93. };
  94. export default {
  95. normalizeSkuTree,
  96. getSkuComb,
  97. getSelectedSkuValues,
  98. isAllSelected,
  99. isSkuChoosable
  100. };