Explorar o código

feat(admin): enhance tcm_exam, scale_result, scale_user display

tcm_exam:
- Add summary section (陆 · 总结)
- Improve content formatting with markdown support
- Better line break handling

scale_result:
- Add proper labels for all fields including created_at

scale_user:
- Add country/race/occupation fields display
- Add enum options for new fields
- Support both list and show views

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Your Name hai 4 días
pai
achega
49aebda770

+ 59 - 18
app/models/scale_result.rb

@@ -22,40 +22,81 @@ class ScaleResult < ActiveRecord::Base
 
     list do
       filters [:wx_user,:created_at]
-      field :id
-      field :wx_user_id
+      field :id do
+        label 'ID'
+      end
+      field :wx_user_id do
+        label '微信用户ID'
+      end
       field :wx_user do
+        label '微信用户'
         pretty_value do
           bindings[:object].wx_user_contact
         end
       end
-      field :user_id
-      field :scale_user
-      field :result
-      field :created_at
-      field :updated_at
+      field :user_id do
+        label '称用户ID'
+      end
+      field :scale_user do
+        label '称用户名'
+      end
+      field :result do
+        label '测量结果'
+      end
+      field :created_at do
+        label '创建时间'
+      end
+      field :updated_at do
+        label '更新时间'
+      end
     end
 
     show do
-      field :wx_user_id
+      field :id do
+        label 'ID'
+      end
+      field :wx_user_id do
+        label '微信用户ID'
+      end
       field :wx_user do
+        label '微信用户'
         pretty_value do
           bindings[:object].wx_user_contact
         end
       end
-      field :user_id
-      field :scale_user
-      field :result
-      field :created_at
-      field :updated_at
+      field :user_id do
+        label '称用户ID'
+      end
+      field :scale_user do
+        label '称用户名'
+      end
+      field :result do
+        label '测量结果'
+      end
+      field :created_at do
+        label '创建时间'
+      end
+      field :updated_at do
+        label '更新时间'
+      end
     end
 
     edit do
-      field :wx_user
-      field :scale_user
-      field :result
-      field :created_at
-      field :updated_at
+      field :wx_user do
+        label '微信用户'
+      end
+      field :scale_user do
+        label '称用户名'
+      end
+      field :result do
+        label '测量结果'
+      end
+      field :created_at do
+        label '创建时间'
+      end
+      field :updated_at do
+        label '更新时间'
+      end
     end
   end
 end

+ 91 - 0
app/models/scale_user.rb

@@ -9,6 +9,36 @@ class ScaleUser < ActiveRecord::Base
   #after_create :update_paied_time
   SEX_ENUM = [["男",0],["女",1]]
 
+  # 国家选项
+  COUNTRY_ENUM = [
+    ["中国", "china"],
+    ["美国", "usa"],
+    ["日本", "japan"],
+    ["韩国", "korea"],
+    ["马来西亚", "malaysia"],
+    ["其他", "other"]
+  ]
+
+  # 种族选项
+  RACE_ENUM = [
+    ["亚洲人", "asian"],
+    ["白人", "caucasian"],
+    ["黑人", "black"],
+    ["拉丁裔", "latino"],
+    ["其他", "other"]
+  ]
+
+  # 职业选项
+  OCCUPATION_ENUM = [
+    ["IT/程序员", "it_programmer"],
+    ["教师", "teacher"],
+    ["医生", "doctor"],
+    ["学生", "student"],
+    ["自由职业", "freelancer"],
+    ["退休", "retired"],
+    ["其他", "other"]
+  ]
+
   def wx_user_contact
     return "-" if wx_user.blank?
     user = wx_user.user
@@ -23,6 +53,22 @@ class ScaleUser < ActiveRecord::Base
     url = "http://#{Ali::Oss::CDN_URL_FOR_HOST}/#{self.avatar}"
     return url
   end
+
+  # 获取国家显示名称
+  def country_label
+    COUNTRY_ENUM.find { |label, value| value == country }&.first || country || "-"
+  end
+
+  # 获取种族显示名称
+  def race_label
+    RACE_ENUM.find { |label, value| value == race }&.first || race || "-"
+  end
+
+  # 获取职业显示名称
+  def occupation_label
+    OCCUPATION_ENUM.find { |label, value| value == occupation }&.first || occupation || "-"
+  end
+
   rails_admin do
     navigation_label '体脂秤用户'
     parent ScaleDevice
@@ -55,6 +101,21 @@ class ScaleUser < ActiveRecord::Base
       field :age
       field :target_weight
       field :birthday
+      field :country do
+        pretty_value do
+          bindings[:object].country_label
+        end
+      end
+      field :race do
+        pretty_value do
+          bindings[:object].race_label
+        end
+      end
+      field :occupation do
+        pretty_value do
+          bindings[:object].occupation_label
+        end
+      end
       field :created_at
       field :updated_at
     end
@@ -84,6 +145,21 @@ class ScaleUser < ActiveRecord::Base
       field :age
       field :target_weight
       field :birthday
+      field :country do
+        pretty_value do
+          bindings[:object].country_label
+        end
+      end
+      field :race do
+        pretty_value do
+          bindings[:object].race_label
+        end
+      end
+      field :occupation do
+        pretty_value do
+          bindings[:object].occupation_label
+        end
+      end
       field :created_at
       field :updated_at
     end
@@ -107,6 +183,21 @@ class ScaleUser < ActiveRecord::Base
       field :age
       field :target_weight
       field :birthday
+      field :country, :enum do
+        enum do
+          COUNTRY_ENUM
+        end
+      end
+      field :race, :enum do
+        enum do
+          RACE_ENUM
+        end
+      end
+      field :occupation, :enum do
+        enum do
+          OCCUPATION_ENUM
+        end
+      end
       field :created_at
       field :updated_at
     end

+ 29 - 5
app/models/tcm_exam.rb

@@ -72,6 +72,18 @@ class TcmExam < ActiveRecord::Base
     end
   end
 
+  # 格式化内容,处理换行和 markdown 格式
+  def format_content(content)
+    return "-" if content.blank?
+    # 处理换行符
+    formatted = content.to_s
+      .gsub(/\\n/, "<br>")
+      .gsub(/\n/, "<br>")
+      .gsub(/\*\*([^*]+)\*\*/, '<strong>\1</strong>')  # **粗体**
+      .gsub(/\*([^*]+)\*/, '<em>\1</em>')  # *斜体*
+    formatted
+  end
+
   rails_admin do
     navigation_label '中医诊疗记录'
     parent ScaleDevice
@@ -185,7 +197,7 @@ class TcmExam < ActiveRecord::Base
           exam = bindings[:object]
           summary = exam.parsed_ai_summary
           content = summary['general'] || summary['summary'] || '-'
-          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{content.to_s.gsub("\n", "<br>")}</div>}.html_safe
+          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{exam.format_content(content)}</div>}.html_safe
         end
       end
 
@@ -196,7 +208,7 @@ class TcmExam < ActiveRecord::Base
           exam = bindings[:object]
           summary = exam.parsed_ai_summary
           content = summary['inquiry'] || '-'
-          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{content.to_s.gsub("\n", "<br>")}</div>}.html_safe
+          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{exam.format_content(content)}</div>}.html_safe
         end
       end
 
@@ -207,7 +219,7 @@ class TcmExam < ActiveRecord::Base
           exam = bindings[:object]
           summary = exam.parsed_ai_summary
           content = summary['observation'] || '-'
-          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{content.to_s.gsub("\n", "<br>")}</div>}.html_safe
+          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{exam.format_content(content)}</div>}.html_safe
         end
       end
 
@@ -218,7 +230,7 @@ class TcmExam < ActiveRecord::Base
           exam = bindings[:object]
           summary = exam.parsed_ai_summary
           content = summary['constitution'] || '-'
-          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{content.to_s.gsub("\n", "<br>")}</div>}.html_safe
+          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{exam.format_content(content)}</div>}.html_safe
         end
       end
 
@@ -229,7 +241,19 @@ class TcmExam < ActiveRecord::Base
           exam = bindings[:object]
           summary = exam.parsed_ai_summary
           content = summary['advice'] || '-'
-          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{content.to_s.gsub("\n", "<br>")}</div>}.html_safe
+          %Q{<div style="background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7;">#{exam.format_content(content)}</div>}.html_safe
+        end
+      end
+
+      # 总结
+      field :model do
+        label '陆 · 总结'
+        pretty_value do
+          exam = bindings[:object]
+          summary = exam.parsed_ai_summary
+          content = summary['summary']
+          return "-" if content.blank?
+          %Q{<div style="background: #fff7ed; border: 1px solid #fed7aa; border-radius: 10px; padding: 14px; margin: 10px 0; line-height: 1.7; color: #9a3412;">#{exam.format_content(content)}</div>}.html_safe
         end
       end
 

+ 4 - 1
config/locales/models/scale_user.yml

@@ -14,5 +14,8 @@ zh-CN:
         age: 年龄
         birthday: 生日
         target_weight: 目标体重
+        country: 国家
+        race: 种族
+        occupation: 职业
         created_at: 创建时间
-        updated_at: 更新时间
+        updated_at: 更新时间