index.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. const app = getApp()
  2. Page({
  3. query: {
  4. "grouping_id": "62e601c72dc7343e137fff6f",
  5. "match_id": "62e388d4fd61d871861b80af",
  6. "project_id": "62e5fff82dc7343e137ffef5"
  7. },
  8. data: {
  9. frameStyle: { useTop: true, name: '注册', leftArrow: false, useBar: false },
  10. canvasWidth: 375,
  11. canvasHeight: 600,
  12. pixelRatio: 1,
  13. forceMini: false,
  14. data: undefined,
  15. // picker
  16. show: false,
  17. personList: [],
  18. selectNode: undefined
  19. },
  20. computedTreeData() {
  21. const getWinnerNumList = [4, 4, 4, 4]; // 造的数据,4各组,每组取前2
  22. const getWinnerNum = getWinnerNumList.reduce((p, n) => p + n, 0); // 小组赛选取人数: 应该是该比赛项目的 各组选取人数加和
  23. let level = 1;
  24. let loop = true;
  25. while (loop) {
  26. const needUserNum = 2 ** (level - 1);
  27. // 相等,说明已经计算出结果
  28. if (needUserNum === getWinnerNum) loop = false;
  29. // 小于,说明还可以继续往后计算
  30. else if (needUserNum < getWinnerNum) level++;
  31. else {
  32. // 大于,说明不符合淘汰赛安排,需要手动定位
  33. loop = false;
  34. level = NaN
  35. }
  36. }
  37. if (!level) {
  38. console.log('不继续,返回了,编不了数据')
  39. return;
  40. }
  41. const levelList = [];
  42. // 1:16;2:8;3:4;4:2
  43. for (let i = 0; i < level - 1; i++) {
  44. const t = level - i - 1;
  45. // 计算:该层的位置数量
  46. const number = 2 ** t;
  47. const arr = [];
  48. for (let j = 1; j <= number; j++) {
  49. const obj = { id: `${i}-${j}`, num: `${i}-${j}`, label: `label-${i}-${j}` }
  50. arr.push(obj);
  51. }
  52. levelList.push(arr)
  53. }
  54. // 进行数据组合,从最少的入手,依次取回,然后将取出来的数据删除掉
  55. let getLevelIndex = levelList.length - 1;
  56. const data = this.resetData(levelList, getLevelIndex)
  57. let obj = { id: `${levelList.length}`, num: `${levelList.length}`, children: data }
  58. return obj;
  59. },
  60. resetData(dataList, index = 0) {
  61. const thisLevelList = dataList[index]
  62. // 取出2条数据
  63. const p1 = thisLevelList[0]
  64. const p2 = thisLevelList[1]
  65. // 删除取出的2条数据
  66. dataList[index].shift()
  67. dataList[index].shift()
  68. if (index - 1 < 0) return [p1, p2]
  69. const p1c = this.resetData(dataList, index - 1)
  70. const p2c = this.resetData(dataList, index - 1)
  71. p1.children = p1c
  72. p2.children = p2c;
  73. return [p1, p2]
  74. },
  75. nodeTap(e) {
  76. const node = e.detail;
  77. if (!node) return;
  78. this.setData({ selectNode: node })
  79. this.getPersonList();
  80. this.toOpen();
  81. },
  82. getPersonList() {
  83. // 先用模拟数据
  84. const node = this.data.data;
  85. const arr = this.getFirstLevelNodes(node);
  86. this.setData({ personList: arr })
  87. },
  88. getFirstLevelNodes(node) {
  89. if (!node.children) return node;
  90. const res = [];
  91. const nodes = node.children;
  92. for (const node of nodes) {
  93. if (node?.children) {
  94. let list = this.getFirstLevelNodes(node);
  95. res.push(list);
  96. } else {
  97. res.push(node)
  98. }
  99. }
  100. return res.flat();
  101. },
  102. selectChange(changeNode) {
  103. const selectNode = this.data.selectNode;
  104. console.log(changeNode, selectNode)
  105. },
  106. async onLoad() {
  107. // 设置初始的晋级图
  108. const data = this.computedTreeData();
  109. this.setData({ data })
  110. // 请求 小组赛的 胜者列表
  111. await this.setWinnerList();
  112. },
  113. async setWinnerList() {
  114. const res = await app.$post(`/newCourt/api/race/getWinnerList`, this.query)
  115. console.log(res)
  116. },
  117. //picker
  118. onChange(event) {
  119. const obj = event?.detail?.value;
  120. const label = obj['label']
  121. const value = obj['id']
  122. console.log(label, value)
  123. this.selectChange(obj);
  124. this.toClose();
  125. },
  126. toOpen() {
  127. console.log('in')
  128. this.setData({ show: true })
  129. },
  130. toClose() {
  131. this.setData({ show: false, selectNode: undefined })
  132. }
  133. });