scale_result.rb 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. # encoding:utf-8
  2. class ScaleResult < ActiveRecord::Base
  3. has_paper_trail
  4. self.table_name = "scale_result"
  5. belongs_to :wx_user
  6. belongs_to :scale_user, :foreign_key => :user_id
  7. def wx_user_contact
  8. return "-" if wx_user.blank?
  9. user = wx_user.user
  10. return "-" if user.blank?
  11. contact = user.tel
  12. contact = user.email if contact.blank?
  13. contact.blank? ? "-" : contact
  14. end
  15. # 从测量结果中获取时间戳
  16. def measurement_time
  17. return nil if result.blank?
  18. begin
  19. data = JSON.parse(result)
  20. timestamp = data['timestamp']
  21. return nil if timestamp.blank?
  22. Time.parse(timestamp)
  23. rescue => e
  24. nil
  25. end
  26. end
  27. # 格式化显示测量结果(列表简要版)
  28. def result_summary
  29. return '-' if result.blank?
  30. begin
  31. d = JSON.parse(result)
  32. "体重:#{d['weight_kg']}kg BMI:#{d['bmi']} 体脂:#{d['bodyFatPercent']}%"
  33. rescue
  34. '-'
  35. end
  36. end
  37. # 格式化显示测量结果(详情完整版)
  38. def result_formatted
  39. return '-' if result.blank?
  40. begin
  41. d = JSON.parse(result)
  42. userdata = d['userdata'] || {}
  43. html = '<table class="table table-striped table-condensed" style="font-size:13px;">'
  44. # 用户信息
  45. if userdata.present?
  46. html += '<tr><th colspan="4" style="background:#f5f5f5;">👤 用户信息</th></tr>'
  47. html += "<tr><td><b>昵称</b></td><td>#{userdata['nickName']}</td>"
  48. html += "<td><b>性别</b></td><td>#{userdata['sex'] == 0 ? '男' : '女'}</td></tr>"
  49. html += "<tr><td><b>年龄</b></td><td>#{userdata['age']}岁</td>"
  50. html += "<td><b>身高</b></td><td>#{userdata['height']}cm</td></tr>"
  51. end
  52. # 基础测量
  53. html += '<tr><th colspan="4" style="background:#f5f5f5;">📊 基础测量</th></tr>'
  54. html += "<tr><td><b>体重</b></td><td>#{d['weight_kg']} kg</td>"
  55. html += "<td><b>BMI</b></td><td>#{d['bmi']}</td></tr>"
  56. html += "<tr><td><b>身体评分</b></td><td>#{d['bodyScore']} 分</td>"
  57. html += "<td><b>身体年龄</b></td><td>#{d['physicalAge']} 岁</td></tr>"
  58. # 体成分
  59. html += '<tr><th colspan="4" style="background:#f5f5f5;">🏃 体成分分析</th></tr>'
  60. html += "<tr><td><b>体脂率</b></td><td>#{d['bodyFatPercent']}%</td>"
  61. html += "<td><b>肌肉率</b></td><td>#{d['musclePercent']}%</td></tr>"
  62. html += "<tr><td><b>内脏脂肪</b></td><td>#{d['visceralFat']}</td>"
  63. html += "<td><b>皮下脂肪</b></td><td>#{d['subcutaneousFatPercent']}%</td></tr>"
  64. html += "<tr><td><b>水分率</b></td><td>#{d['moisturePercent']}%</td>"
  65. html += "<td><b>蛋白质</b></td><td>#{d['proteinPercent']}%</td></tr>"
  66. html += "<tr><td><b>骨量</b></td><td>#{d['boneMass']} kg</td>"
  67. html += "<td><b>基础代谢</b></td><td>#{d['bmr']} kcal</td></tr>"
  68. html += "<tr><td><b>骨骼肌率</b></td><td>#{d['smPercent']}%</td>"
  69. html += "<td><b>体型</b></td><td>#{d['bodyType']}</td></tr>"
  70. # 目标建议
  71. html += '<tr><th colspan="4" style="background:#f5f5f5;">🎯 目标建议</th></tr>'
  72. html += "<tr><td><b>目标体重</b></td><td>#{d['targetWeight']} kg</td>"
  73. html += "<td><b>体重控制</b></td><td>#{d['weightControl']} kg</td></tr>"
  74. html += "<tr><td><b>标准体重</b></td><td>#{d['weightStandard']} kg</td>"
  75. html += "<td><b>标准BMI</b></td><td>#{d['bmiStandard']}</td></tr>"
  76. # 设备信息
  77. html += '<tr><th colspan="4" style="background:#f5f5f5;">📱 设备信息</th></tr>'
  78. html += "<tr><td><b>MAC地址</b></td><td>#{d['mac']}</td>"
  79. html += "<td><b>测量时间</b></td><td>#{d['timestamp']}</td></tr>"
  80. html += '</table>'
  81. html.html_safe
  82. rescue => e
  83. "解析错误: #{e.message}"
  84. end
  85. end
  86. rails_admin do
  87. navigation_label '测量记录'
  88. parent ScaleDevice
  89. weight 2
  90. list do
  91. filters [:wx_user]
  92. field :id do
  93. label 'ID'
  94. end
  95. field :wx_user_id do
  96. label '微信用户ID'
  97. end
  98. field :wx_user do
  99. label '微信用户'
  100. pretty_value do
  101. bindings[:object].wx_user_contact
  102. end
  103. end
  104. field :user_id do
  105. label '称用户ID'
  106. end
  107. field :scale_user do
  108. label '称用户名'
  109. end
  110. field :result do
  111. label '测量结果'
  112. pretty_value do
  113. bindings[:object].result_summary
  114. end
  115. end
  116. field :measurement_time do
  117. label '测量时间'
  118. pretty_value do
  119. time = bindings[:object].measurement_time
  120. time.present? ? time.strftime('%Y-%m-%d %H:%M:%S') : '-'
  121. end
  122. sortable false
  123. end
  124. end
  125. show do
  126. field :id do
  127. label 'ID'
  128. end
  129. field :wx_user_id do
  130. label '微信用户ID'
  131. end
  132. field :wx_user do
  133. label '微信用户'
  134. pretty_value do
  135. bindings[:object].wx_user_contact
  136. end
  137. end
  138. field :user_id do
  139. label '称用户ID'
  140. end
  141. field :scale_user do
  142. label '称用户名'
  143. end
  144. field :result do
  145. label '测量结果'
  146. pretty_value do
  147. bindings[:object].result_formatted
  148. end
  149. end
  150. field :measurement_time do
  151. label '测量时间'
  152. pretty_value do
  153. time = bindings[:object].measurement_time
  154. time.present? ? time.strftime('%Y-%m-%d %H:%M:%S') : '-'
  155. end
  156. end
  157. end
  158. edit do
  159. field :wx_user do
  160. label '微信用户'
  161. end
  162. field :scale_user do
  163. label '称用户名'
  164. end
  165. field :result do
  166. label '测量结果'
  167. end
  168. end
  169. end
  170. end