compute_children_level.dart 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. /// 国家规范计算儿童身高和体重的标准
  3. class ComputeChildrenLevel {
  4. static int findClosestMonthIndex(List<int> monthsArray, int targetMonth) {
  5. int closestIndex = 0;
  6. int closestDiff = 2147483647; // 使用一个较大的整数值代替 Infinity
  7. for (int i = 0; i < monthsArray.length; i++) {
  8. int diff = targetMonth - monthsArray[i];
  9. if (diff >= 0 && diff < closestDiff) {
  10. closestDiff = diff;
  11. closestIndex = i;
  12. }
  13. }
  14. return closestIndex;
  15. }
  16. /// 计算儿童体重水平
  17. static String calculateWidthStatus(
  18. GenderEnum gender,
  19. int ageInMonths,
  20. double weight,
  21. ) {
  22. List<List<double>> boyWeightData = [
  23. [2.8, 3.0, 3.2, 3.5, 3.7, 4.0, 4.2],
  24. [3.7, 3.9, 4.2, 4.6, 4.9, 5.2, 5.6],
  25. [4.7, 5.0, 5.4, 5.8, 6.2, 6.7, 7.1],
  26. [5.5, 5.9, 6.3, 6.8, 7.3, 7.8, 8.3],
  27. [6.1, 6.5, 7.0, 7.5, 8.1, 8.6, 9.2],
  28. [6.6, 7.0, 7.5, 8.0, 8.6, 9.2, 9.8],
  29. [6.9, 7.4, 7.9, 8.4, 9.1, 9.7, 10.3],
  30. [7.2, 7.7, 8.2, 8.8, 9.5, 10.1, 10.8],
  31. [7.5, 8.0, 8.5, 9.1, 9.8, 10.4, 11.1],
  32. [7.7, 8.2, 8.7, 9.4, 10.1, 10.8, 11.5],
  33. [7.9, 8.4, 9.0, 9.6, 10.3, 11.0, 11.8],
  34. [8.1, 8.6, 9.2, 9.8, 10.6, 11.3, 12.0],
  35. [8.3, 8.8, 9.4, 10.1, 10.8, 11.5, 12.3],
  36. [8.4, 9.0, 9.6, 10.3, 11.0, 11.7, 12.5],
  37. [8.6, 9.1, 9.7, 10.5, 11.3, 12.1, 12.9],
  38. [8.8, 9.3, 9.9, 10.7, 11.4, 12.2, 13.0],
  39. [9.0, 9.5, 10.1, 10.9, 11.7, 12.4, 13.3],
  40. [9.1, 9.7, 10.3, 11.1, 11.9, 12.7, 13.5],
  41. [9.3, 9.9, 10.5, 11.3, 12.1, 12.9, 13.8],
  42. [9.5, 10.1, 10.7, 11.5, 12.3, 13.2, 14.0],
  43. [9.7, 10.3, 10.9, 11.7, 12.6, 13.4, 14.3],
  44. [9.8, 10.5, 11.1, 11.9, 12.8, 13.7, 14.6],
  45. [10.0, 10.6, 11.3, 12.2, 13.0, 13.9, 14.8],
  46. [10.2, 10.8, 11.5, 12.4, 13.3, 14.2, 15.1],
  47. [10.4, 11.0, 11.7, 12.6, 13.5, 14.4, 15.4],
  48. [10.8, 11.5, 12.2, 13.1, 14.1, 15.1, 16.1],
  49. [11.2, 12.0, 12.7, 13.7, 14.7, 15.7, 16.7],
  50. [11.6, 12.4, 13.2, 14.2, 15.2, 16.3, 17.4],
  51. [12.0, 12.8, 13.6, 14.6, 15.8, 16.9, 18.0],
  52. [12.4, 13.2, 14.1, 15.2, 16.3, 17.5, 18.7],
  53. [12.8, 13.7, 14.6, 15.7, 16.9, 18.1, 19.4],
  54. [13.2, 14.1, 15.1, 16.2, 17.5, 18.7, 20.1],
  55. [13.6, 14.5, 15.5, 16.7, 18.1, 19.4, 20.8],
  56. [14.0, 15.0, 16.0, 17.3, 18.7, 20.1, 21.6],
  57. [14.5, 15.4, 16.5, 17.9, 19.3, 20.8, 22.4],
  58. [14.9, 15.9, 17.1, 18.4, 20.0, 21.6, 23.3],
  59. [15.3, 16.4, 17.6, 19.1, 20.7, 22.4, 24.2],
  60. [15.8, 16.9, 18.1, 19.7, 21.4, 23.2, 25.1],
  61. [16.2, 17.4, 18.7, 20.3, 22.2, 24.0, 26.0],
  62. [16.6, 17.9, 19.3, 21.0, 22.9, 24.8, 27.0],
  63. [17.1, 18.3, 19.8, 21.6, 23.6, 25.7, 27.9]
  64. ];
  65. List<List<double>> girlWeightData = [
  66. [2.7, 2.9, 3.1, 3.3, 3.6, 3.8, 4.1],
  67. [3.5, 3.7, 4.0, 4.3, 4.6, 4.9, 5.3],
  68. [4.4, 4.7, 5.0, 5.4, 5.8, 6.2, 6.6],
  69. [5.1, 5.4, 5.8, 6.2, 6.7, 7.2, 7.6],
  70. [5.6, 6.0, 6.4, 6.9, 7.4, 7.9, 8.4],
  71. [6.0, 6.4, 6.9, 7.4, 7.9, 8.5, 9.1],
  72. [6.4, 6.8, 7.2, 7.8, 8.4, 9.0, 9.6],
  73. [6.7, 7.1, 7.6, 8.1, 8.8, 9.4, 10.0],
  74. [6.9, 7.4, 7.9, 8.4, 9.1, 9.7, 10.4],
  75. [7.2, 7.6, 8.1, 8.7, 9.4, 10.0, 10.8],
  76. [7.4, 7.8, 8.3, 9.0, 9.6, 10.3, 11.1],
  77. [7.6, 8.0, 8.6, 9.2, 9.9, 10.6, 11.4],
  78. [7.7, 8.2, 8.8, 9.4, 10.1, 10.9, 11.6],
  79. [7.9, 8.4, 9.0, 9.6, 10.4, 11.1, 11.9],
  80. [8.1, 8.6, 9.2, 9.8, 10.6, 11.3, 12.2],
  81. [8.3, 8.8, 9.4, 10.1, 10.8, 11.5, 12.3],
  82. [8.4, 9.0, 9.6, 10.3, 11.0, 11.7, 12.5],
  83. [8.6, 9.2, 9.7, 10.5, 11.2, 12.0, 12.8],
  84. [8.8, 9.3, 9.9, 10.7, 11.4, 12.2, 13.0],
  85. [9.0, 9.5, 10.1, 10.9, 11.7, 12.4, 13.3],
  86. [9.1, 9.7, 10.3, 11.1, 12.0, 12.8, 13.8],
  87. [9.3, 9.9, 10.5, 11.3, 12.2, 13.1, 14.0],
  88. [9.5, 10.1, 10.7, 11.5, 12.4, 13.3, 14.3],
  89. [9.7, 10.3, 10.9, 11.7, 12.6, 13.6, 14.6],
  90. [9.8, 10.4, 11.1, 11.9, 12.9, 13.8, 14.8],
  91. [10.3, 10.9, 11.6, 12.5, 13.5, 14.4, 15.5],
  92. [10.7, 11.4, 12.1, 13.0, 14.1, 15.1, 16.2],
  93. [11.1, 11.8, 12.6, 13.6, 14.6, 15.7, 16.9],
  94. [11.5, 12.3, 13.1, 14.1, 15.3, 16.4, 17.7],
  95. [12.0, 12.7, 13.6, 14.7, 15.9, 17.1, 18.4],
  96. [12.4, 13.2, 14.1, 15.2, 16.4, 17.7, 19.1],
  97. [12.8, 13.6, 14.5, 15.7, 17.0, 18.3, 19.8],
  98. [13.1, 14.0, 15.0, 16.2, 17.6, 18.9, 20.5],
  99. [13.5, 14.4, 15.4, 16.7, 18.1, 19.6, 21.1],
  100. [13.9, 14.8, 15.9, 17.2, 18.7, 20.2, 21.9],
  101. [14.3, 15.3, 16.4, 17.8, 19.3, 20.9, 22.6],
  102. [14.7, 15.8, 16.9, 18.4, 20.0, 21.6, 23.4],
  103. [15.1, 16.2, 17.5, 19.0, 20.7, 22.4, 24.3],
  104. [15.5, 16.7, 18.0, 19.6, 21.4, 23.2, 25.1],
  105. [15.9, 17.1, 18.5, 20.2, 22.0, 23.9, 26.0],
  106. [16.3, 17.6, 19.0, 20.7, 22.7, 24.7, 26.8]
  107. ];
  108. List<List<double>> weightData =
  109. gender == GenderEnum.Male ? boyWeightData : girlWeightData;
  110. List<int> monthsArray = [
  111. 0,
  112. 1,
  113. 2,
  114. 3,
  115. 4,
  116. 5,
  117. 6,
  118. 7,
  119. 8,
  120. 9,
  121. 10,
  122. 11,
  123. 12,
  124. 13,
  125. 14,
  126. 15,
  127. 16,
  128. 17,
  129. 18,
  130. 19,
  131. 20,
  132. 21,
  133. 22,
  134. 23,
  135. 24,
  136. 27,
  137. 30,
  138. 33,
  139. 36,
  140. 39,
  141. 42,
  142. 45,
  143. 48,
  144. 51,
  145. 54,
  146. 57,
  147. 60,
  148. 63,
  149. 66,
  150. 69,
  151. 72
  152. ];
  153. int adjustedAge = findClosestMonthIndex(monthsArray, ageInMonths);
  154. const lowerBound = 1;
  155. const upperBound = 4;
  156. if (weight < weightData[adjustedAge][lowerBound]) {
  157. return "下";
  158. } else if (weight >= weightData[adjustedAge][lowerBound] &&
  159. weight <= weightData[adjustedAge][upperBound]) {
  160. return "中";
  161. } else {
  162. return "上";
  163. }
  164. }
  165. /// 计算儿童身高水平
  166. static String calculateHeightStatus(
  167. GenderEnum gender, int ageInMonths, double height) {
  168. List<List<double>> boyHeightData = [
  169. [47.6, 48.7, 49.9, 51.2, 52.5, 53.6, 54.8],
  170. [51.3, 52.5, 53.8, 55.1, 56.5, 57.7, 59.0],
  171. [54.9, 56.2, 57.5, 59.0, 60.4, 61.7, 63.0],
  172. [58.0, 59.4, 60.7, 62.2, 63.7, 65.1, 66.4],
  173. [60.5, 61.9, 63.3, 64.8, 66.4, 67.8, 69.1],
  174. [62.5, 63.9, 65.4, 66.9, 68.5, 69.9, 71.3],
  175. [64.2, 65.7, 67.1, 68.7, 70.3, 71.8, 73.2],
  176. [65.7, 67.2, 68.7, 70.3, 71.9, 73.4, 74.9],
  177. [67.1, 68.6, 70.1, 71.7, 73.4, 74.9, 76.4],
  178. [68.3, 69.8, 71.4, 73.1, 74.7, 76.3, 77.8],
  179. [69.5, 71.0, 72.6, 74.3, 76.0, 77.6, 79.1],
  180. [70.7, 72.2, 73.8, 75.5, 77.3, 78.8, 80.4],
  181. [71.7, 73.3, 74.9, 76.7, 78.5, 80.1, 81.6],
  182. [72.8, 74.4, 76.0, 77.8, 79.6, 81.2, 82.8],
  183. [73.8, 75.4, 77.1, 78.9, 80.7, 82.4, 84.0],
  184. [74.8, 76.5, 78.1, 80.0, 81.8, 83.5, 85.1],
  185. [75.8, 77.5, 79.2, 81.0, 82.9, 84.6, 86.3],
  186. [76.8, 78.5, 80.2, 82.1, 84.0, 85.7, 87.4],
  187. [77.7, 79.4, 81.2, 83.1, 85.0, 86.8, 88.5],
  188. [78.6, 80.4, 82.1, 84.1, 86.1, 87.8, 89.6],
  189. [79.6, 81.3, 83.1, 85.1, 87.1, 88.9, 90.6],
  190. [80.5, 82.3, 84.1, 86.1, 88.1, 89.9, 91.7],
  191. [81.4, 83.2, 85.0, 87.0, 89.1, 90.9, 92.7],
  192. [82.2, 84.1, 85.9, 88.0, 90.0, 91.9, 93.7],
  193. [82.4, 84.2, 86.1, 88.2, 90.3, 92.2, 94.0],
  194. [84.8, 86.7, 88.6, 90.8, 93.0, 94.9, 96.8],
  195. [87.0, 88.9, 91.0, 93.2, 95.4, 97.4, 99.4],
  196. [89.0, 91.0, 93.1, 95.4, 97.7, 99.8, 101.8],
  197. [90.9, 93.0, 95.1, 97.5, 99.9, 102.0, 104.1],
  198. [92.7, 94.8, 97.0, 99.5, 101.9, 104.1, 106.2],
  199. [94.4, 96.6, 98.8, 101.3, 103.8, 106.1, 108.3],
  200. [96.0, 98.3, 100.6, 103.1, 105.7, 108.0, 110.2],
  201. [97.6, 99.9, 102.3, 104.9, 107.5, 109.8, 112.2],
  202. [99.2, 101.6, 104.0, 106.6, 109.3, 111.7, 114.1],
  203. [100.8, 103.2, 105.7, 108.4, 111.1, 113.6, 116.0],
  204. [102.4, 104.9, 107.4, 110.2, 113.0, 115.5, 117.9],
  205. [104.1, 106.6, 109.1, 112.0, 114.8, 117.4, 119.9],
  206. [105.7, 108.2, 110.9, 113.7, 116.6, 119.2, 121.8],
  207. [107.2, 109.9, 112.5, 115.5, 118.4, 121.1, 123.7],
  208. [108.8, 111.4, 114.1, 117.1, 120.2, 122.9, 125.5],
  209. [110.3, 113.0, 115.7, 118.8, 121.9, 124.6, 127.3]
  210. ];
  211. List<List<double>> girlHeightData = [
  212. [46.8, 47.9, 49.1, 50.3, 51.6, 52.7, 53.8],
  213. [50.4, 51.6, 52.8, 54.1, 55.4, 56.6, 57.8],
  214. [53.8, 55.0, 56.3, 57.7, 59.1, 60.4, 61.6],
  215. [56.7, 58.0, 59.3, 60.8, 62.2, 63.5, 64.8],
  216. [59.1, 60.4, 61.7, 63.3, 64.8, 66.1, 67.4],
  217. [61.0, 62.4, 63.8, 65.3, 66.9, 68.2, 69.6],
  218. [62.7, 64.1, 65.5, 67.1, 68.7, 70.1, 71.5],
  219. [64.2, 65.6, 67.1, 68.7, 70.3, 71.7, 73.1],
  220. [65.6, 67.0, 68.5, 70.1, 71.7, 73.2, 74.7],
  221. [66.8, 68.3, 69.8, 71.5, 73.1, 74.6, 76.1],
  222. [68.1, 69.6, 71.1, 72.8, 74.5, 76.0, 77.5],
  223. [69.2, 70.8, 72.3, 74.0, 75.7, 77.3, 78.8],
  224. [70.4, 71.9, 73.5, 75.2, 77.0, 78.6, 80.1],
  225. [71.4, 73.0, 74.6, 76.4, 78.2, 79.8, 81.4],
  226. [72.5, 74.1, 75.7, 77.5, 79.3, 81.0, 82.6],
  227. [73.5, 75.2, 76.8, 78.6, 80.5, 82.1, 83.8],
  228. [74.6, 76.2, 77.9, 79.7, 81.6, 83.3, 84.9],
  229. [75.5, 77.2, 78.9, 80.8, 82.7, 84.4, 86.1],
  230. [76.5, 78.2, 79.9, 81.9, 83.8, 85.5, 87.2],
  231. [77.5, 79.2, 80.9, 82.9, 84.8, 86.6, 88.3],
  232. [78.4, 80.2, 81.9, 83.9, 85.9, 87.6, 89.4],
  233. [79.3, 81.1, 82.9, 84.9, 86.9, 88.7, 90.4],
  234. [80.2, 82.0, 83.8, 85.8, 87.9, 89.7, 91.5],
  235. [81.1, 82.9, 84.7, 86.8, 88.8, 90.7, 92.5],
  236. [81.2, 83.0, 84.9, 87.0, 89.1, 90.9, 92.8],
  237. [83.6, 85.5, 87.4, 89.5, 91.7, 93.6, 95.5],
  238. [85.7, 87.7, 89.7, 91.9, 94.1, 96.1, 98.1],
  239. [87.7, 89.8, 91.8, 94.1, 96.4, 98.4, 100.5],
  240. [89.7, 91.8, 93.9, 96.2, 98.5, 100.7, 102.7],
  241. [91.5, 93.6, 95.8, 98.2, 100.6, 102.8, 104.9],
  242. [93.2, 95.4, 97.6, 100.1, 102.5, 104.8, 106.9],
  243. [94.9, 97.1, 99.4, 101.9, 104.4, 106.7, 108.9],
  244. [96.5, 98.8, 101.1, 103.7, 106.3, 108.6, 110.9],
  245. [98.1, 100.4, 102.8, 105.4, 108.1, 110.4, 112.8],
  246. [99.7, 102.1, 104.5, 107.2, 109.9, 112.3, 114.7],
  247. [101.3, 103.8, 106.2, 109.0, 111.8, 114.2, 116.7],
  248. [103.0, 105.5, 108.0, 110.8, 113.6, 116.1, 118.6],
  249. [104.6, 107.1, 109.7, 112.6, 115.4, 118.0, 120.6],
  250. [106.1, 108.7, 111.3, 114.3, 117.2, 119.8, 122.4],
  251. [107.6, 110.3, 112.9, 115.9, 118.9, 121.6, 124.2],
  252. [109.0, 111.7, 114.5, 117.5, 120.6, 123.3, 126.0]
  253. ];
  254. List<List<double>> heightData =
  255. gender == GenderEnum.Male ? boyHeightData : girlHeightData;
  256. List<int> monthsArray = [
  257. 0,
  258. 1,
  259. 2,
  260. 3,
  261. 4,
  262. 5,
  263. 6,
  264. 7,
  265. 8,
  266. 9,
  267. 10,
  268. 11,
  269. 12,
  270. 13,
  271. 14,
  272. 15,
  273. 16,
  274. 17,
  275. 18,
  276. 19,
  277. 20,
  278. 21,
  279. 22,
  280. 23,
  281. 24,
  282. 27,
  283. 30,
  284. 33,
  285. 36,
  286. 39,
  287. 42,
  288. 45,
  289. 48,
  290. 51,
  291. 54,
  292. 57,
  293. 60,
  294. 63,
  295. 66,
  296. 69,
  297. 72
  298. ];
  299. int adjustedAge = findClosestMonthIndex(monthsArray, ageInMonths);
  300. const lowerBound = 1;
  301. const upperBound = 4;
  302. if (height < heightData[adjustedAge][lowerBound]) {
  303. return "下";
  304. } else if (height >= heightData[adjustedAge][lowerBound] &&
  305. height <= heightData[adjustedAge][upperBound]) {
  306. return "中";
  307. } else {
  308. return "上";
  309. }
  310. }
  311. /// 计算儿童BMI水平
  312. static String calculateBmiStatus(
  313. GenderEnum gender,
  314. int ageInMonths,
  315. double weight,
  316. double height,
  317. ) {
  318. List<List<double>> boyBmiData = [
  319. [11.2, 11.8, 12.5, 13.2, 14.0, 14.8, 15.5],
  320. [13.0, 13.6, 14.3, 15.1, 16.0, 16.8, 17.6],
  321. [14.3, 15.0, 15.8, 16.7, 17.6, 18.5, 19.5],
  322. [14.9, 15.7, 16.5, 17.4, 18.5, 19.5, 20.5],
  323. [15.2, 16.0, 16.8, 17.8, 18.8, 19.9, 21.0],
  324. [15.3, 16.1, 16.9, 17.9, 19.0, 20.0, 21.1],
  325. [15.3, 16.1, 16.9, 17.9, 18.9, 20.0, 21.1],
  326. [15.3, 16.0, 16.8, 17.8, 18.9, 19.9, 21.0],
  327. [15.3, 16.0, 16.8, 17.7, 18.8, 19.8, 20.9],
  328. [15.2, 15.9, 16.7, 17.6, 18.6, 19.6, 20.7],
  329. [15.1, 15.8, 16.5, 17.5, 18.5, 19.4, 20.5],
  330. [15.0, 15.7, 16.4, 17.3, 18.3, 19.2, 20.3],
  331. [14.9, 15.5, 16.3, 17.1, 18.1, 19.1, 20.1],
  332. [14.8, 15.4, 16.1, 17.0, 17.9, 18.9, 19.9],
  333. [14.7, 15.3, 16.0, 16.8, 17.8, 18.7, 19.7],
  334. [14.6, 15.2, 15.9, 16.7, 17.6, 18.5, 19.5],
  335. [14.5, 15.1, 15.8, 16.6, 17.5, 18.4, 19.4],
  336. [14.4, 15.0, 15.7, 16.5, 17.4, 18.3, 19.2],
  337. [14.3, 14.9, 15.6, 16.4, 17.2, 18.1, 19.1],
  338. [14.2, 14.8, 15.5, 16.3, 17.1, 18.0, 19.0],
  339. [14.2, 14.8, 15.4, 16.2, 17.0, 17.9, 18.9],
  340. [14.1, 14.7, 15.3, 16.1, 17.0, 17.8, 18.8],
  341. [14.0, 14.6, 15.2, 16.0, 16.9, 17.7, 18.7],
  342. [14.0, 14.6, 15.2, 15.9, 16.8, 17.6, 18.6],
  343. [14.1, 14.7, 15.3, 16.1, 17.0, 17.9, 18.8],
  344. [14.0, 14.5, 15.2, 15.9, 16.8, 17.6, 18.6],
  345. [13.9, 14.4, 15.0, 15.8, 16.6, 17.4, 18.4],
  346. [13.7, 14.3, 14.9, 15.6, 16.5, 17.3, 18.2],
  347. [13.7, 14.2, 14.8, 15.5, 16.3, 17.2, 18.1],
  348. [13.6, 14.1, 14.7, 15.4, 16.3, 17.1, 18.0],
  349. [13.5, 14.1, 14.7, 15.4, 16.2, 17.0, 17.9],
  350. [13.5, 14.0, 14.6, 15.3, 16.2, 17.0, 17.9],
  351. [13.4, 14.0, 14.6, 15.3, 16.1, 17.0, 17.9],
  352. [13.4, 13.9, 14.5, 15.3, 16.1, 17.0, 17.9],
  353. [13.4, 13.9, 14.5, 15.3, 16.1, 17.0, 18.0],
  354. [13.3, 13.9, 14.5, 15.3, 16.1, 17.1, 18.1],
  355. [13.3, 13.8, 14.5, 15.3, 16.2, 17.1, 18.2],
  356. [13.2, 13.8, 14.5, 15.3, 16.2, 17.2, 18.3],
  357. [13.2, 13.8, 14.5, 15.3, 16.3, 17.3, 18.5],
  358. [13.2, 13.8, 14.5, 15.3, 16.3, 17.4, 18.6],
  359. [13.2, 13.8, 14.5, 15.4, 16.4, 17.5, 18.8]
  360. ];
  361. List<List<double>> girlBmiData = [
  362. [11.1, 11.7, 12.3, 13.1, 13.8, 14.5, 15.3],
  363. [12.7, 13.3, 13.9, 14.7, 15.5, 16.3, 17.1],
  364. [13.9, 14.5, 15.2, 16.1, 17.0, 17.9, 18.9],
  365. [14.4, 15.1, 15.8, 16.7, 17.7, 18.7, 19.8],
  366. [14.7, 15.4, 16.2, 17.1, 18.1, 19.1, 20.2],
  367. [14.8, 15.5, 16.3, 17.3, 18.3, 19.3, 20.5],
  368. [14.9, 15.6, 16.4, 17.3, 18.4, 19.4, 20.5],
  369. [14.9, 15.6, 16.3, 17.3, 18.3, 19.3, 20.5],
  370. [14.8, 15.5, 16.3, 17.2, 18.2, 19.2, 20.3],
  371. [14.8, 15.4, 16.2, 17.1, 18.1, 19.1, 20.2],
  372. [14.7, 15.3, 16.1, 17.0, 17.9, 18.9, 20.0],
  373. [14.6, 15.2, 15.9, 16.8, 17.8, 18.7, 19.8],
  374. [14.5, 15.1, 15.8, 16.7, 17.6, 18.5, 19.6],
  375. [14.4, 15.0, 15.7, 16.5, 17.4, 18.4, 19.4],
  376. [14.3, 14.9, 15.6, 16.4, 17.3, 18.2, 19.2],
  377. [14.2, 14.8, 15.5, 16.3, 17.2, 18.1, 19.0],
  378. [14.1, 14.7, 15.4, 16.2, 17.0, 17.9, 18.9],
  379. [14.0, 14.6, 15.3, 16.0, 16.9, 17.8, 18.7],
  380. [14.0, 14.5, 15.2, 15.9, 16.8, 17.7, 18.6],
  381. [13.9, 14.5, 15.1, 15.9, 16.7, 17.6, 18.5],
  382. [13.8, 14.4, 15.0, 15.8, 16.6, 17.5, 18.4],
  383. [13.8, 14.3, 14.9, 15.7, 16.5, 17.4, 18.3],
  384. [13.7, 14.3, 14.9, 15.6, 16.5, 17.3, 18.2],
  385. [13.7, 14.2, 14.8, 15.6, 16.4, 17.2, 18.1],
  386. [13.8, 14.4, 15.0, 15.8, 16.6, 17.4, 18.4],
  387. [13.7, 14.2, 14.8, 15.6, 16.4, 17.3, 18.2],
  388. [13.6, 14.1, 14.7, 15.5, 16.3, 17.1, 18.0],
  389. [13.5, 14.0, 14.6, 15.4, 16.2, 17.0, 17.9],
  390. [13.4, 13.9, 14.5, 15.3, 16.1, 16.9, 17.9],
  391. [13.3, 13.9, 14.5, 15.2, 16.1, 16.9, 17.8],
  392. [13.3, 13.8, 14.4, 15.2, 16.0, 16.9, 17.8],
  393. [13.2, 13.7, 14.4, 15.1, 16.0, 16.8, 17.8],
  394. [13.1, 13.7, 14.3, 15.1, 15.9, 16.8, 17.8],
  395. [13.1, 13.6, 14.3, 15.0, 15.9, 16.8, 17.8],
  396. [13.0, 13.6, 14.2, 15.0, 15.9, 16.8, 17.9],
  397. [13.0, 13.6, 14.2, 15.0, 15.9, 16.8, 17.9],
  398. [13.0, 13.5, 14.2, 15.0, 15.9, 16.9, 18.0],
  399. [12.9, 13.5, 14.2, 15.0, 15.9, 16.9, 18.0],
  400. [12.9, 13.5, 14.2, 15.0, 16.0, 17.0, 18.1],
  401. [12.9, 13.5, 14.2, 15.0, 16.0, 17.0, 18.2],
  402. [12.9, 13.5, 14.1, 15.0, 16.0, 17.1, 18.3]
  403. ];
  404. List<List<double>> bmiData =
  405. gender == GenderEnum.Male ? boyBmiData : girlBmiData;
  406. List<int> monthsArray = [
  407. 0,
  408. 1,
  409. 2,
  410. 3,
  411. 4,
  412. 5,
  413. 6,
  414. 7,
  415. 8,
  416. 9,
  417. 10,
  418. 11,
  419. 12,
  420. 13,
  421. 14,
  422. 15,
  423. 16,
  424. 17,
  425. 18,
  426. 19,
  427. 20,
  428. 21,
  429. 22,
  430. 23,
  431. 24,
  432. 27,
  433. 30,
  434. 33,
  435. 36,
  436. 39,
  437. 42,
  438. 45,
  439. 48,
  440. 51,
  441. 54,
  442. 57,
  443. 60,
  444. 63,
  445. 66,
  446. 69,
  447. 72
  448. ];
  449. int adjustedAge = findClosestMonthIndex(monthsArray, ageInMonths);
  450. const lowerBound = 1;
  451. const upperBound = 4;
  452. var bmi = weight / ((height / 100) * (height / 100));
  453. if (bmi < bmiData[adjustedAge][lowerBound]) {
  454. return "下";
  455. } else if (bmi >= bmiData[adjustedAge][lowerBound] &&
  456. bmi <= bmiData[adjustedAge][upperBound]) {
  457. return "中";
  458. } else {
  459. return "上";
  460. }
  461. }
  462. static String calculateMonthsFromBirthday(DateTime? birthday) {
  463. if (birthday == null) {
  464. return "0";
  465. }
  466. DateTime now = DateTime.now();
  467. int months = (now.year - birthday.year) * 12 + now.month - birthday.month;
  468. if (now.day < birthday.day) {
  469. months--;
  470. }
  471. if (months <= 0) {
  472. return '0';
  473. } else {
  474. return '$months';
  475. }
  476. }
  477. }