Tuổi sức khỏe là gì?
Tuổi sức khỏe là tuổi ước tính từ các chỉ số sức khỏe - thể lực, không phải tuổi sinh học thật hay chẩn đoán y khoa. Nó cho biết với bộ chỉ số hiện tại, người tham gia đang có tình trạng sức khỏe, thể lực trẻ hơn, ngang bằng hoặc già hơn tuổi thật.
Công thức chung: Tuổi sức khỏe ước tính = Tuổi thật - k × CHFS
Trong đó:
CHFS = tổng(z_score của từng chỉ số × trọng số của chỉ số đó)Cách tính:
z_score = (giá trị đo được - giá trị chuẩn) / độ lệch chuẩn
Với chỉ số càng cao càng tốt, giữ nguyên dấu:
z = (giá trị - chuẩn) / SD
Với chỉ số càng thấp càng tốt, đảo dấu:
z = - (giá trị - chuẩn) / SDVới BMI: z_BMI = - |BMI - BMI tối ưu| / SD_BMI
Vì BMI lệch cao hay thấp khỏi mức tối ưu đều không tốt.
Sau đó: CHFS = z1×w1 + z2×w2 + z3×w3 + ...
Cuối cùng: Tuổi sức khỏe = Tuổi thật - k × CHFS (K = 4 hoặc 5)
Bối cảnh ban đầu
Mục tiêu tóm gọn lại từ bác sĩ đó là làm ra một app để điền các chỉ số từ nhiều trạm test sức khỏe, sau đó tính toán và cho ra tuổi sức khỏe bằng một công thức chung. Sau đó xuất kết quả dạng ảnh QR ở trang staff. Người được đo sẽ dùng app ở vai trò khách và quét QR để xem kết quả của mình.
Mỗi trạm test là 1 cách tính khác nhau, sau đó lấy tổng số chênh lệch so với chuẩn gốc để tính vào công thức chung, âm hay dương sẽ phụ thuộc vào chỉ số đó có tốt hay không nếu lệch chuẩn.
App này không thay bác sĩ chẩn đoán. Nó hỗ trợ thu thập dữ liệu, chuẩn hóa chỉ số, tính kết quả ước tính và trình bày lại để bác sĩ hoặc staff vận hành quy trình nhanh hơn.
Yêu cầu đầu tiên từ bác sĩ và BTC
Bộ test ban đầu gồm tuổi, giới tính, cân nặng, chiều cao, nhịp tim nghỉ, huyết áp, CMJ, SRT, RU-SATED và dinh dưỡng.
Có 2 dạng trạm test gồm
-Trạm test tại nhà (Không cần dụng cụ đo).
-Trạm test trực tiếp (Các chỉ số cần dụng cụ đo của Bác sĩ mới lấy được.
Lựa chọn công nghệ
Vì sao không dùng Google Form thuần?
Google Form phù hợp để thu câu trả lời, nhưng không đủ cho toàn bộ luồng: tạo ID + PIN, phân quyền staff/bác sĩ, cập nhật đúng hồ sơ cũ, không tạo trùng, tính lại sau mỗi lần sửa số liệu, và chỉ cho người tham gia xem snapshot khi đã có kết quả. Vì vậy hướng phù hợp hơn là dùng Google Sheets làm database và Google Apps Script làm web app.
Thiết kế vai trò
Người tham gia không cần đăng nhập. Họ chỉ dùng ID + PIN (Quét QR) để xem kết quả đã công bố.
Staff/BTC đăng nhập tài khoản nội bộ để tạo hồ sơ, nhập dữ liệu, import hàng loạt và công bố kết quả khi cần.
Bác sĩ đăng nhập để xem danh sách hồ sơ, lọc hồ sơ đã đủ dữ liệu, xem snapshot và dùng kết quả làm phần tham khảo khi tư vấn.
Admin quản lý tài khoản, dữ liệu tổng, cấu hình công thức và xử lý các trường hợp sai hoặc trùng hồ sơ.
Những khó khăn đã gặp
1. Khó khăn lớn là luồng thật của chương trình thay đổi liên tục.
- Ban đầu người tham gia sẽ đăng ký trước và điền form vào web để tạo hồ sơ, hồ sơ gồm ID, Pin, QR và các chỉ số đã được sinh ra trong sheet.
- Sau đó yêu cầu đổi thành staff tạo hồ sơ từ dữ liệu form có sẵn. Rồi lại cần import online hàng loạt để không phải tạo từng member thủ công. Mỗi thay đổi này kéo theo thay đổi ở cấu trúc sheet, giao diện, luồng tính toán và cách sinh ID/PIN.
2. Apps Script hiện dòng cảnh báo do ứng dụng được tạo bởi một người dùng Google Apps Script. Đây là hạn chế nền tảng, không phải lỗi code.
- Tôi đã chuyển qua dùng Google Site và nhúng appscript vào để triển khai.
3. Số lượng người tham gia ngày càng đông và theo form thu thập trước, thì nếu tạo thủ công sẽ rất lâu.
- Thiết kế Bulk import cho 1 sheet thủ công để cho staff nhập liệu vào, sau đó nhấn nhập hàng loạt để tất cả hồ sơ được chuyển sang sheet chính.
- Vì là sheet thủ công nếu bấm nhập hàng loạt lần 2, nó sẽ chạy lại hồ sơ cũ, nên tôi đã cho cả 3 cột participant_id, ma_pin và QR để tham chiếu dữ liệu của hồ sơ qua sheet gốc. Sau đó check Nếu chưa tạo hồ sơ thì 3 cột này sẽ trống, còn nếu tạo hồ sơ rồi thì 3 dòng này sẽ có data và không tạo thêm.
4. Công thức cũng thay đổi trong quá trình làm
- Sau chương trình đầu tiên, thì BTC quyết định sẽ chuyển qua cách tính khác. Ban đầu app này dùng cho offline, nhưng BTC quyết định tổ chức thêm online, BTC muốn giữ phần web hiện tại lại để làm chương trình onlie nhưng tạo thêm 1 app mới song song để tổ chức offline với 1 công thức và quy trình tính khác.
- Với chương trình offline, hệ thống có thêm nhánh test theo tuổi và bài test phù hợp: dưới 65 tuổi có CMJ/SRT, từ 65 tuổi hoặc có đau khớp gối dùng CST/5-STS, phần thăng bằng cũng đổi theo nhóm tuổi.
- Với chương trình online, công thức vẫn giữ luồng cũ nhưng chuyển cách chọn mạnh/yếu sang z_score x trọng_số.
5. Điều học được
- Nó là quy trình vận hành. Nếu quy trình chưa rõ, code sẽ liên tục bị sửa theo cách rất mệt. Vì vậy việc viết lại vai trò, luồng dữ liệu, cấu trúc sheet, quyền truy cập và tiêu chí nghiệm thu giúp hệ thống bớt mơ hồ hơn rất nhiều.
- Điều thứ hai là Google Sheets và Apps Script có thể làm được khá nhiều việc khi chưa có server riêng, nhưng phải chấp nhận giới hạn: cảnh báo Apps Script, quota, quyền truy cập, tốc độ khi nhiều lượt nhập cùng lúc và việc bảo trì code trực tiếp trong môi trường Google.