@xdev-asia/xdev-knowledge-mcp 1.0.55 → 1.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/01-phan-1-tong-quan-nen-tang/lessons/bai-1-omop-cdm-la-gi-tai-sao-can-chuan-hoa-du-lieu-y-te.md +339 -0
  2. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/01-phan-1-tong-quan-nen-tang/lessons/bai-2-kien-truc-tong-the-omop-cdm-5-4-nhom-bang-nguyen-ly-thiet-ke.md +440 -0
  3. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/01-phan-1-tong-quan-nen-tang/lessons/bai-3-hieu-concept-trai-tim-cua-omop-cdm.md +441 -0
  4. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/02-phan-2-person-visit-nen-tang/lessons/bai-4-bang-person-quan-ly-danh-tinh-benh-nhan.md +323 -0
  5. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/02-phan-2-person-visit-nen-tang/lessons/bai-5-observation-period-khoang-thoi-gian-theo-doi-benh-nhan.md +308 -0
  6. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/02-phan-2-person-visit-nen-tang/lessons/bai-6-visit-occurrence-visit-detail-luot-kham-chi-tiet.md +353 -0
  7. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-10-measurement-xet-nghiem-do-luong.md +409 -0
  8. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-7-condition-occurrence-chan-doan-benh-ly.md +285 -0
  9. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-8-drug-exposure-thuoc-dieu-tri.md +354 -0
  10. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-9-procedure-occurrence-thu-thuat-phau-thuat.md +291 -0
  11. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/04-phan-4-bang-lam-sang-mo-rong/lessons/bai-11-observation-su-kien-lam-sang-tong-hop.md +289 -0
  12. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/04-phan-4-bang-lam-sang-mo-rong/lessons/bai-12-device-exposure-specimen-note.md +313 -0
  13. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/04-phan-4-bang-lam-sang-mo-rong/lessons/bai-13-death-episode-episode-event.md +346 -0
  14. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/05-phan-5-standardized-vocabularies/lessons/bai-14-concept-vocabulary-nen-tang-tu-dien-chuan.md +298 -0
  15. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/05-phan-5-standardized-vocabularies/lessons/bai-15-concept-relationship-concept-ancestor.md +336 -0
  16. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/05-phan-5-standardized-vocabularies/lessons/bai-16-drug-strength-cac-bang-vocabulary-con-lai.md +295 -0
  17. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/06-phan-6-health-system-economics-derived/lessons/bai-17-location-care-site-provider.md +334 -0
  18. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/06-phan-6-health-system-economics-derived/lessons/bai-18-payer-plan-period-cost.md +343 -0
  19. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/06-phan-6-health-system-economics-derived/lessons/bai-19-condition-era-drug-era-dose-era.md +418 -0
  20. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/07-phan-7-metadata-cohort-tong-ket/lessons/bai-20-cdm-source-metadata-cohort-tong-ket.md +517 -0
  21. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/index.md +385 -0
  22. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/01-bai-1-gioi-thieu-vyos-va-cai-dat.md +10 -1
  23. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/02-bai-2-cau-hinh-interface-va-ip-co-ban.md +4 -3
  24. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/03-bai-3-nat-source-nat-destination-nat-va-masquerade.md +1 -0
  25. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/04-bai-4-firewall-co-ban-rules-chains-va-groups.md +2 -2
  26. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/05-bai-5-zone-based-firewall.md +2 -2
  27. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/06-bai-6-dhcp-server-dns-forwarding-va-ntp.md +4 -1
  28. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/07-bai-7-vlans-bonding-va-bridge.md +2 -0
  29. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/08-bai-8-static-routing-va-policy-based-routing.md +2 -0
  30. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/09-bai-9-dynamic-routing-ospf.md +2 -0
  31. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/10-bai-10-dynamic-routing-bgp.md +2 -0
  32. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/11-bai-11-vpn-wireguard-va-openvpn.md +2 -0
  33. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/12-bai-12-vpn-ipsec-site-to-site.md +2 -0
  34. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/13-bai-13-high-availability-vrrp-va-conntrack-sync.md +2 -0
  35. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/14-bai-14-wan-load-balancing-qos-va-monitoring.md +2 -0
  36. package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/15-bai-15-containers-automation-va-production-best-practices.md +2 -0
  37. package/package.json +1 -1
@@ -0,0 +1,334 @@
1
+ ---
2
+ id: 019f1a00-a117-7b01-e001-omopcdm54017
3
+ title: "Bài 17: LOCATION, CARE_SITE & PROVIDER — Hệ thống cơ sở y tế"
4
+ slug: bai-17-location-care-site-provider
5
+ description: >-
6
+ Ba bảng Health System Data: LOCATION (địa lý), CARE_SITE
7
+ (cơ sở khám chữa bệnh), PROVIDER (bác sĩ, nhân viên y tế)
8
+ và cách chúng liên kết với dữ liệu lâm sàng.
9
+ duration_minutes: 45
10
+ is_free: true
11
+ video_url: null
12
+ sort_order: 17
13
+ section_title: "Phần 6: Health System, Economics & Derived Elements"
14
+ course:
15
+ id: 019f1a00-a100-7b01-e001-omopcdm54001
16
+ title: "OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z"
17
+ slug: omop-cdm-5-4-cho-nguoi-moi-bat-dau
18
+ ---
19
+
20
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 340" style="max-width: 100%; height: auto; border-radius: 12px; margin-bottom: 1.5rem;">
21
+ <defs>
22
+ <linearGradient id="bg-omop17" x1="0%" y1="0%" x2="100%" y2="100%">
23
+ <stop offset="0%" style="stop-color:#0c1222"/>
24
+ <stop offset="100%" style="stop-color:#1e293b"/>
25
+ </linearGradient>
26
+ </defs>
27
+ <rect width="1200" height="340" rx="12" fill="url(#bg-omop17)"/>
28
+ <g>
29
+ <circle cx="750" cy="80" r="24" fill="#818cf8" opacity="0.12"/>
30
+ <circle cx="850" cy="120" r="20" fill="#818cf8" opacity="0.08"/>
31
+ <circle cx="680" cy="150" r="18" fill="#818cf8" opacity="0.07"/>
32
+ <line x1="600" y1="100" x2="1100" y2="260" stroke="#818cf8" stroke-width="0.5" opacity="0.1"/>
33
+ </g>
34
+ <rect x="60" y="50" width="4" height="60" rx="2" fill="#818cf8"/>
35
+ <rect x="80" y="50" width="130" height="28" rx="14" fill="#818cf8" opacity="0.15"/>
36
+ <text x="92" y="69" font-family="system-ui,-apple-system,sans-serif" font-size="13" font-weight="600" fill="#818cf8">🏗️ Kiến trúc — Bài 17</text>
37
+ <text x="60" y="140" font-family="system-ui,-apple-system,sans-serif" font-size="34" font-weight="700" fill="#f1f5f9">
38
+ <tspan x="60" dy="0">LOCATION, CARE_SITE &amp;</tspan>
39
+ <tspan x="60" dy="42">PROVIDER — Hệ thống CSYT</tspan>
40
+ </text>
41
+ <text x="60" y="244" font-family="system-ui,-apple-system,sans-serif" font-size="15" fill="#94a3b8" opacity="0.8">OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z</text>
42
+ <text x="60" y="268" font-family="system-ui,-apple-system,sans-serif" font-size="13" fill="#64748b" opacity="0.6">Phần 6: Health System, Economics &amp; Derived Elements</text>
43
+ <text x="1140" y="320" font-family="system-ui,-apple-system,sans-serif" font-size="12" fill="#475569" text-anchor="end" opacity="0.4">xdev.asia</text>
44
+ </svg>
45
+
46
+ ![Phân cấp hệ thống y tế: Location → Care Site → Provider](/storage/uploads/2026/04/omop-cdm-bai17-health-system.png)
47
+
48
+ ## Giới thiệu
49
+
50
+ Nhóm **Health System Data** gồm 3 bảng mô tả *nơi* và *ai* cung cấp dịch vụ y tế. Trong bệnh viện Việt Nam, đây là nơi lưu thông tin cơ sở y tế (tuyến trung ương, tỉnh, huyện), phòng khoa, và bác sĩ phụ trách.
51
+
52
+ ---
53
+
54
+ ## 1. LOCATION — Địa điểm địa lý
55
+
56
+ ### 1.1. Cấu trúc bảng
57
+
58
+ | Cột | Kiểu | Bắt buộc | Mô tả |
59
+ |-----|------|----------|-------|
60
+ | `location_id` | INTEGER | ✅ PK | ID duy nhất |
61
+ | `address_1` | VARCHAR(50) | | Địa chỉ dòng 1 |
62
+ | `address_2` | VARCHAR(50) | | Địa chỉ dòng 2 |
63
+ | `city` | VARCHAR(50) | | Thành phố / Quận / Huyện |
64
+ | `state` | VARCHAR(2) | | Bang/Tỉnh (US: 2 ký tự) |
65
+ | `zip` | VARCHAR(9) | | Mã bưu điện |
66
+ | `county` | VARCHAR(20) | | County |
67
+ | `location_source_value` | VARCHAR(50) | | Mã nguồn |
68
+ | `country_concept_id` | INTEGER | | FK → CONCEPT (quốc gia) |
69
+ | `country_source_value` | VARCHAR(80) | | Mã quốc gia nguồn |
70
+ | `latitude` | FLOAT | | Vĩ độ |
71
+ | `longitude` | FLOAT | | Kinh độ |
72
+
73
+ ### 1.2. ETL cho Việt Nam
74
+
75
+ ```sql
76
+ INSERT INTO location (
77
+ location_id,
78
+ address_1,
79
+ city,
80
+ state,
81
+ zip,
82
+ country_concept_id,
83
+ country_source_value,
84
+ latitude,
85
+ longitude
86
+ ) VALUES (
87
+ 1001,
88
+ '78 Giải Phóng',
89
+ 'Hai Bà Trưng',
90
+ 'HN', -- Mã tỉnh 2 ký tự
91
+ '100000', -- Mã bưu điện VN
92
+ 4330442, -- concept_id cho 'Viet Nam'
93
+ 'VN',
94
+ 21.0024, -- Latitude
95
+ 105.8432 -- Longitude
96
+ );
97
+ ```
98
+
99
+ > **Lưu ý VN:** Trường `state` chỉ 2 ký tự — dùng mã tỉnh rút gọn (HN, HCM, DN...).
100
+ > Nếu cần đầy đủ, dùng `location_source_value` lưu "Hà Nội".
101
+
102
+ ---
103
+
104
+ ## 2. CARE_SITE — Cơ sở khám chữa bệnh
105
+
106
+ ### 2.1. Cấu trúc bảng
107
+
108
+ | Cột | Kiểu | Bắt buộc | Mô tả |
109
+ |-----|------|----------|-------|
110
+ | `care_site_id` | INTEGER | ✅ PK | ID duy nhất |
111
+ | `care_site_name` | VARCHAR(255) | | Tên cơ sở |
112
+ | `place_of_service_concept_id` | INTEGER | | Loại cơ sở (FK → CONCEPT) |
113
+ | `location_id` | INTEGER | | FK → LOCATION |
114
+ | `care_site_source_value` | VARCHAR(50) | | Mã nguồn |
115
+ | `place_of_service_source_value` | VARCHAR(50) | | Mã loại nguồn |
116
+
117
+ ### 2.2. Loại cơ sở y tế (place_of_service_concept_id)
118
+
119
+ | Concept ID | Concept Name | Ví dụ VN |
120
+ |------------|-------------|-----------|
121
+ | 8717 | Inpatient Hospital | Khoa Nội trú |
122
+ | 8756 | Outpatient Hospital | Phòng khám ngoại trú |
123
+ | 8940 | Office | Phòng khám tư |
124
+ | 8883 | Skilled Nursing Facility | Cơ sở điều dưỡng |
125
+ | 8716 | Home Health Agency | Chăm sóc tại nhà |
126
+ | 8761 | Emergency Room | Khoa Cấp cứu |
127
+ | 581382 | Telehealth | Khám từ xa |
128
+
129
+ ### 2.3. Ví dụ ETL từ dữ liệu bệnh viện VN
130
+
131
+ ```sql
132
+ -- Bệnh viện Bạch Mai
133
+ INSERT INTO care_site VALUES (
134
+ 2001, -- care_site_id
135
+ 'Bệnh viện Bạch Mai', -- care_site_name
136
+ 8717, -- Inpatient Hospital
137
+ 1001, -- location_id (78 GP, HBT)
138
+ 'BV-BACHMAI-001', -- care_site_source_value
139
+ 'TUYEN_TW' -- place_of_service_source_value
140
+ );
141
+
142
+ -- Khoa Nội tiêu hóa - Bạch Mai
143
+ INSERT INTO care_site VALUES (
144
+ 2002,
145
+ 'Khoa Nội Tiêu hóa - BV Bạch Mai',
146
+ 8756, -- Outpatient Hospital
147
+ 1001, -- cùng location
148
+ 'BV-BM-NOI-TIEUHOA',
149
+ 'KHOA_NOITRU'
150
+ );
151
+ ```
152
+
153
+ ### 2.4. Mô hình phân cấp VN
154
+
155
+ ```
156
+ CARE_SITE (Tuyến TW)
157
+ ├── BV Bạch Mai (care_site_id = 2001)
158
+ │ ├── Khoa Nội Tiêu hóa (2002)
159
+ │ ├── Khoa Tim mạch (2003)
160
+ │ └── Khoa Cấp cứu (2004)
161
+
162
+ CARE_SITE (Tuyến Tỉnh)
163
+ ├── BV Đa khoa Hà Nội (2010)
164
+ │ ├── Khoa Ngoại (2011)
165
+ │ └── Khoa Sản (2012)
166
+
167
+ CARE_SITE (Tuyến Huyện)
168
+ └── TTYT Hoàng Mai (2020)
169
+ └── Phòng khám đa khoa (2021)
170
+ ```
171
+
172
+ > **Lưu ý:** OMOP CDM không có cấu trúc parent-child cho CARE_SITE. Nếu cần phân cấp, dùng convention đặt tên hoặc thêm bảng mapping riêng.
173
+
174
+ ---
175
+
176
+ ## 3. PROVIDER — Nhân viên y tế
177
+
178
+ ### 3.1. Cấu trúc bảng
179
+
180
+ | Cột | Kiểu | Bắt buộc | Mô tả |
181
+ |-----|------|----------|-------|
182
+ | `provider_id` | INTEGER | ✅ PK | ID duy nhất |
183
+ | `provider_name` | VARCHAR(255) | | Tên (khuyến nghị de-identify) |
184
+ | `npi` | VARCHAR(20) | | National Provider Identifier (US) |
185
+ | `dea` | VARCHAR(20) | | DEA Number (US) |
186
+ | `specialty_concept_id` | INTEGER | | Chuyên khoa (FK → CONCEPT) |
187
+ | `care_site_id` | INTEGER | | FK → CARE_SITE |
188
+ | `year_of_birth` | INTEGER | | Năm sinh |
189
+ | `gender_concept_id` | INTEGER | | Giới tính |
190
+ | `provider_source_value` | VARCHAR(50) | | Mã nguồn |
191
+ | `specialty_source_value` | VARCHAR(50) | | Mã chuyên khoa nguồn |
192
+ | `specialty_source_concept_id` | INTEGER | | FK → CONCEPT |
193
+ | `gender_source_value` | VARCHAR(50) | | Giới tính nguồn |
194
+ | `gender_source_concept_id` | INTEGER | | FK → CONCEPT |
195
+
196
+ ### 3.2. Specialty trong OMOP
197
+
198
+ ```sql
199
+ -- Tìm specialty concepts phổ biến
200
+ SELECT
201
+ c.concept_id,
202
+ c.concept_name,
203
+ c.vocabulary_id
204
+ FROM concept c
205
+ WHERE c.domain_id = 'Provider'
206
+ AND c.standard_concept = 'S'
207
+ AND c.concept_name LIKE '%Cardiol%'
208
+ ORDER BY c.concept_name;
209
+ -- 38004451 | Cardiology | Medicare Specialty
210
+ ```
211
+
212
+ ### 3.3. ETL cho bác sĩ VN
213
+
214
+ ```sql
215
+ INSERT INTO provider (
216
+ provider_id,
217
+ provider_name,
218
+ specialty_concept_id,
219
+ care_site_id,
220
+ provider_source_value,
221
+ specialty_source_value
222
+ ) VALUES (
223
+ 3001,
224
+ NULL, -- De-identify: không lưu tên
225
+ 38004451, -- Cardiology
226
+ 2003, -- Khoa Tim mạch - BV Bạch Mai
227
+ 'BS-BM-TM-001', -- Mã bác sĩ nội bộ
228
+ 'TIM_MACH' -- Chuyên khoa nguồn
229
+ );
230
+ ```
231
+
232
+ > **De-identification:** Ở VN dữ liệu nghiên cứu thường cần ẩn danh bác sĩ. Set `provider_name = NULL` và chỉ giữ `provider_source_value` mã hóa.
233
+
234
+ ---
235
+
236
+ ## 4. Quan hệ 3 bảng Health System
237
+
238
+ ```
239
+ ┌──────────┐
240
+ │ LOCATION │ ← Địa lý (tỉnh, thành phố, tọa độ)
241
+ │ 1001 │
242
+ └────┬─────┘
243
+ │ location_id
244
+
245
+ ┌──────────┐
246
+ │CARE_SITE │ ← Cơ sở y tế (BV, Khoa)
247
+ │ 2001 │
248
+ └────┬─────┘
249
+ │ care_site_id
250
+
251
+ ┌──────────┐
252
+ │ PROVIDER │ ← Bác sĩ, nhân viên y tế
253
+ │ 3001 │
254
+ └──────────┘
255
+
256
+ Ba bảng này được tham chiếu từ:
257
+ ┌───────────────────────┐
258
+ │ PERSON │ ← location_id, care_site_id, provider_id
259
+ │ VISIT_OCCURRENCE │ ← care_site_id, provider_id
260
+ │ CONDITION_OCCURRENCE │ ← provider_id
261
+ │ DRUG_EXPOSURE │ ← provider_id
262
+ │ ... (tất cả bảng │
263
+ │ clinical) │
264
+ └───────────────────────┘
265
+ ```
266
+
267
+ ---
268
+
269
+ ## 5. Truy vấn phân tích
270
+
271
+ ### 5.1. Phân bổ bệnh nhân theo cơ sở y tế
272
+
273
+ ```sql
274
+ SELECT
275
+ cs.care_site_name,
276
+ c.concept_name AS facility_type,
277
+ COUNT(DISTINCT vo.person_id) AS patient_count,
278
+ COUNT(vo.visit_occurrence_id) AS visit_count
279
+ FROM visit_occurrence vo
280
+ JOIN care_site cs ON vo.care_site_id = cs.care_site_id
281
+ JOIN concept c ON cs.place_of_service_concept_id = c.concept_id
282
+ GROUP BY cs.care_site_name, c.concept_name
283
+ ORDER BY visit_count DESC;
284
+ ```
285
+
286
+ ### 5.2. Phân tích theo chuyên khoa bác sĩ
287
+
288
+ ```sql
289
+ SELECT
290
+ c_spec.concept_name AS specialty,
291
+ COUNT(DISTINCT p.provider_id) AS provider_count,
292
+ COUNT(DISTINCT co.person_id) AS patient_count,
293
+ COUNT(*) AS diagnosis_count
294
+ FROM condition_occurrence co
295
+ JOIN provider p ON co.provider_id = p.provider_id
296
+ JOIN concept c_spec ON p.specialty_concept_id = c_spec.concept_id
297
+ GROUP BY c_spec.concept_name
298
+ ORDER BY diagnosis_count DESC
299
+ LIMIT 10;
300
+ ```
301
+
302
+ ### 5.3. Phân bố địa lý bệnh nhân (VN)
303
+
304
+ ```sql
305
+ SELECT
306
+ l.state AS province_code,
307
+ l.city,
308
+ COUNT(DISTINCT per.person_id) AS patient_count
309
+ FROM person per
310
+ JOIN location l ON per.location_id = l.location_id
311
+ WHERE l.country_concept_id = 4330442 -- Vietnam
312
+ GROUP BY l.state, l.city
313
+ ORDER BY patient_count DESC;
314
+ ```
315
+
316
+ ---
317
+
318
+ ## Tổng kết
319
+
320
+ 1. **LOCATION**: địa lý (VN: mã tỉnh 2 ký tự + mã bưu điện)
321
+ 2. **CARE_SITE**: cơ sở y tế với `place_of_service_concept_id` phân loại
322
+ 3. **PROVIDER**: nhân viên y tế, cần de-identify trong nghiên cứu
323
+ 4. Quan hệ: LOCATION → CARE_SITE → PROVIDER (hệ thống phân cấp)
324
+ 5. Tất cả bảng lâm sàng đều tham chiếu `provider_id` và `care_site_id`
325
+
326
+ **Bài tiếp theo:** PAYER_PLAN_PERIOD & COST — Chi phí y tế và bảo hiểm.
327
+
328
+ ---
329
+
330
+ ## Tài liệu tham khảo
331
+
332
+ - [OMOP CDM 5.4 — LOCATION](https://ohdsi.github.io/CommonDataModel/cdm54.html#LOCATION)
333
+ - [OMOP CDM 5.4 — CARE_SITE](https://ohdsi.github.io/CommonDataModel/cdm54.html#CARE_SITE)
334
+ - [OMOP CDM 5.4 — PROVIDER](https://ohdsi.github.io/CommonDataModel/cdm54.html#PROVIDER)
@@ -0,0 +1,343 @@
1
+ ---
2
+ id: 019f1a00-a118-7b01-e001-omopcdm54018
3
+ title: "Bài 18: PAYER_PLAN_PERIOD & COST — Chi phí y tế và bảo hiểm"
4
+ slug: bai-18-payer-plan-period-cost
5
+ description: >-
6
+ PAYER_PLAN_PERIOD theo dõi quyền lợi bảo hiểm,
7
+ COST ghi nhận chi phí từng sự kiện lâm sàng.
8
+ Ứng dụng cho phân tích BHXH/BHYT tại Việt Nam.
9
+ duration_minutes: 45
10
+ is_free: true
11
+ video_url: null
12
+ sort_order: 18
13
+ section_title: "Phần 6: Health System, Economics & Derived Elements"
14
+ course:
15
+ id: 019f1a00-a100-7b01-e001-omopcdm54001
16
+ title: "OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z"
17
+ slug: omop-cdm-5-4-cho-nguoi-moi-bat-dau
18
+ ---
19
+
20
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 340" style="max-width: 100%; height: auto; border-radius: 12px; margin-bottom: 1.5rem;">
21
+ <defs>
22
+ <linearGradient id="bg-omop18" x1="0%" y1="0%" x2="100%" y2="100%">
23
+ <stop offset="0%" style="stop-color:#0c1222"/>
24
+ <stop offset="100%" style="stop-color:#1e293b"/>
25
+ </linearGradient>
26
+ </defs>
27
+ <rect width="1200" height="340" rx="12" fill="url(#bg-omop18)"/>
28
+ <g>
29
+ <circle cx="720" cy="100" r="22" fill="#818cf8" opacity="0.12"/>
30
+ <circle cx="820" cy="130" r="26" fill="#818cf8" opacity="0.08"/>
31
+ <circle cx="900" cy="90" r="18" fill="#818cf8" opacity="0.07"/>
32
+ <line x1="650" y1="140" x2="1100" y2="250" stroke="#818cf8" stroke-width="0.5" opacity="0.1"/>
33
+ </g>
34
+ <rect x="60" y="50" width="4" height="60" rx="2" fill="#818cf8"/>
35
+ <rect x="80" y="50" width="130" height="28" rx="14" fill="#818cf8" opacity="0.15"/>
36
+ <text x="92" y="69" font-family="system-ui,-apple-system,sans-serif" font-size="13" font-weight="600" fill="#818cf8">🏗️ Kiến trúc — Bài 18</text>
37
+ <text x="60" y="140" font-family="system-ui,-apple-system,sans-serif" font-size="34" font-weight="700" fill="#f1f5f9">
38
+ <tspan x="60" dy="0">PAYER_PLAN_PERIOD &amp;</tspan>
39
+ <tspan x="60" dy="42">COST — Chi phí y tế</tspan>
40
+ </text>
41
+ <text x="60" y="244" font-family="system-ui,-apple-system,sans-serif" font-size="15" fill="#94a3b8" opacity="0.8">OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z</text>
42
+ <text x="60" y="268" font-family="system-ui,-apple-system,sans-serif" font-size="13" fill="#64748b" opacity="0.6">Phần 6: Health System, Economics &amp; Derived Elements</text>
43
+ <text x="1140" y="320" font-family="system-ui,-apple-system,sans-serif" font-size="12" fill="#475569" text-anchor="end" opacity="0.4">xdev.asia</text>
44
+ </svg>
45
+
46
+ ![Luồng chi phí y tế và BHYT chi trả](/storage/uploads/2026/04/omop-cdm-bai18-cost-insurance.png)
47
+
48
+ ## Giới thiệu
49
+
50
+ Nhóm **Health Economics Data** gồm bảng **PAYER_PLAN_PERIOD** (quyền lợi bảo hiểm) và **COST** (chi phí từng dịch vụ). Ở VN, phần này map với dữ liệu **BHYT** (Bảo hiểm Y tế) và bảng thanh toán viện phí.
51
+
52
+ ---
53
+
54
+ ## 1. PAYER_PLAN_PERIOD — Thời gian bảo hiểm
55
+
56
+ ### 1.1. Cấu trúc bảng
57
+
58
+ | Cột | Kiểu | Bắt buộc | Mô tả |
59
+ |-----|------|----------|-------|
60
+ | `payer_plan_period_id` | INTEGER | ✅ PK | ID duy nhất |
61
+ | `person_id` | INTEGER | ✅ | FK → PERSON |
62
+ | `payer_plan_period_start_date` | DATE | ✅ | Ngày bắt đầu |
63
+ | `payer_plan_period_end_date` | DATE | ✅ | Ngày kết thúc |
64
+ | `payer_concept_id` | INTEGER | | Đơn vị chi trả (FK → CONCEPT) |
65
+ | `payer_source_value` | VARCHAR(50) | | Mã nguồn payer |
66
+ | `payer_source_concept_id` | INTEGER | | FK → CONCEPT |
67
+ | `plan_concept_id` | INTEGER | | Loại gói bảo hiểm |
68
+ | `plan_source_value` | VARCHAR(50) | | Mã nguồn plan |
69
+ | `plan_source_concept_id` | INTEGER | | FK → CONCEPT |
70
+ | `sponsor_concept_id` | INTEGER | | Nhà tài trợ |
71
+ | `sponsor_source_value` | VARCHAR(50) | | Mã nguồn sponsor |
72
+ | `sponsor_source_concept_id` | INTEGER | | FK → CONCEPT |
73
+ | `family_source_value` | VARCHAR(50) | | Mã gia đình |
74
+ | `stop_reason_concept_id` | INTEGER | | Lý do ngừng |
75
+ | `stop_reason_source_value` | VARCHAR(50) | | Mã lý do nguồn |
76
+ | `stop_reason_source_concept_id` | INTEGER | | FK → CONCEPT |
77
+
78
+ ### 1.2. Mapping BHYT Việt Nam
79
+
80
+ ```
81
+ Nguồn VN (BHXH) → OMOP CDM
82
+ ─────────────────────────────────────────────
83
+ Mã thẻ BHYT: DN4-01-001 → payer_source_value
84
+ Loại đối tượng: Hưu trí → payer_concept_id
85
+ Ngày cấp: 01/01/2024 → payer_plan_period_start_date
86
+ Ngày hết hạn: 31/12/2024 → payer_plan_period_end_date
87
+ Nơi ĐKKCB: BV Bạch Mai → plan_source_value
88
+ BHXH Hà Nội → sponsor_source_value
89
+ ```
90
+
91
+ ### 1.3. ETL ví dụ
92
+
93
+ ```sql
94
+ INSERT INTO payer_plan_period (
95
+ payer_plan_period_id,
96
+ person_id,
97
+ payer_plan_period_start_date,
98
+ payer_plan_period_end_date,
99
+ payer_concept_id,
100
+ payer_source_value,
101
+ plan_source_value,
102
+ sponsor_source_value
103
+ ) VALUES (
104
+ 5001,
105
+ 100001,
106
+ '2024-01-01',
107
+ '2024-12-31',
108
+ 0, -- Concept cho BHYT VN (cần mapping)
109
+ 'DN4-01-001', -- Mã thẻ BHYT
110
+ 'BV-BACHMAI-001', -- Nơi ĐKKCB ban đầu
111
+ 'BHXH_HANOI' -- Cơ quan BHXH
112
+ );
113
+ ```
114
+
115
+ ### 1.4. Kiểm tra overlap
116
+
117
+ ```sql
118
+ -- BN có nhiều giai đoạn BHYT chồng chéo?
119
+ SELECT
120
+ p1.person_id,
121
+ p1.payer_plan_period_start_date AS start_1,
122
+ p1.payer_plan_period_end_date AS end_1,
123
+ p2.payer_plan_period_start_date AS start_2,
124
+ p2.payer_plan_period_end_date AS end_2
125
+ FROM payer_plan_period p1
126
+ JOIN payer_plan_period p2
127
+ ON p1.person_id = p2.person_id
128
+ AND p1.payer_plan_period_id < p2.payer_plan_period_id
129
+ AND p1.payer_plan_period_start_date <= p2.payer_plan_period_end_date
130
+ AND p2.payer_plan_period_start_date <= p1.payer_plan_period_end_date;
131
+ ```
132
+
133
+ ---
134
+
135
+ ## 2. COST — Chi phí dịch vụ y tế
136
+
137
+ ### 2.1. Cấu trúc bảng
138
+
139
+ | Cột | Kiểu | Bắt buộc | Mô tả |
140
+ |-----|------|----------|-------|
141
+ | `cost_id` | INTEGER | ✅ PK | ID duy nhất |
142
+ | `cost_event_id` | INTEGER | ✅ | FK → clinical event PK |
143
+ | `cost_domain_id` | VARCHAR(20) | ✅ | Domain của event (Visit, Drug...) |
144
+ | `cost_type_concept_id` | INTEGER | ✅ | Loại (charge/cost/payment) |
145
+ | `currency_concept_id` | INTEGER | | Đơn vị tiền tệ |
146
+ | `total_charge` | FLOAT | | Tổng phí |
147
+ | `total_cost` | FLOAT | | Tổng chi phí |
148
+ | `total_paid` | FLOAT | | Tổng đã thanh toán |
149
+ | `paid_by_payer` | FLOAT | | BHYT chi trả |
150
+ | `paid_by_patient` | FLOAT | | BN tự trả |
151
+ | `paid_patient_copay` | FLOAT | | Đồng chi trả |
152
+ | `paid_patient_coinsurance` | FLOAT | | Đồng bảo hiểm |
153
+ | `paid_patient_deductible` | FLOAT | | Khoản khấu trừ |
154
+ | `paid_by_primary` | FLOAT | | BH chính chi trả |
155
+ | `paid_ingredient_cost` | FLOAT | | Chi phí hoạt chất |
156
+ | `paid_dispensing_fee` | FLOAT | | Phí bán thuốc |
157
+ | `payer_plan_period_id` | INTEGER | | FK → PAYER_PLAN_PERIOD |
158
+ | `amount_allowed` | FLOAT | | Mức cho phép |
159
+ | `revenue_code_concept_id` | INTEGER | | Mã doanh thu |
160
+ | `revenue_code_source_value` | VARCHAR(50) | | Mã doanh thu nguồn |
161
+ | `drg_concept_id` | INTEGER | | DRG group |
162
+ | `drg_source_value` | VARCHAR(3) | | Mã DRG nguồn |
163
+
164
+ ### 2.2. Cách COST hoạt động: polymorphic FK
165
+
166
+ ```
167
+ cost_event_id + cost_domain_id → xác định bảng nguồn
168
+
169
+ cost_domain_id = 'Visit' → visit_occurrence.visit_occurrence_id
170
+ cost_domain_id = 'Drug' → drug_exposure.drug_exposure_id
171
+ cost_domain_id = 'Procedure' → procedure_occurrence.procedure_occurrence_id
172
+ cost_domain_id = 'Device' → device_exposure.device_exposure_id
173
+ ```
174
+
175
+ > **Quan trọng:** Không có FK cứng — bạn cần JOIN theo `cost_event_id` = PK của bảng tương ứng VÀ `cost_domain_id` khớp domain.
176
+
177
+ ### 2.3. ETL chi phí khám bệnh VN
178
+
179
+ ```sql
180
+ -- Chi phí 1 lượt khám ngoại trú
181
+ INSERT INTO cost (
182
+ cost_id,
183
+ cost_event_id,
184
+ cost_domain_id,
185
+ cost_type_concept_id,
186
+ currency_concept_id,
187
+ total_charge,
188
+ total_paid,
189
+ paid_by_payer, -- BHYT trả
190
+ paid_by_patient, -- BN tự trả
191
+ payer_plan_period_id
192
+ ) VALUES (
193
+ 7001,
194
+ 4001, -- visit_occurrence_id
195
+ 'Visit',
196
+ 32810, -- EHR charge (Type Concept)
197
+ 44818568, -- Vietnamese Dong (VND)
198
+ 2500000, -- 2.5 triệu VNĐ tổng phí
199
+ 2500000, -- Đã thanh toán hết
200
+ 2000000, -- BHYT trả 80%
201
+ 500000, -- BN trả 20%
202
+ 5001 -- payer_plan_period_id
203
+ );
204
+ ```
205
+
206
+ ### 2.4. Mapping phí BHYT theo tỷ lệ
207
+
208
+ ```
209
+ Tỷ lệ BHYT VN:
210
+ ──────────────────────────────────────────
211
+ Đúng tuyến, KCB ban đầu → 80% (hưu trí: 95%)
212
+ Trái tuyến tỉnh → 60%
213
+ Trái tuyến TW → 40%
214
+ Cấp cứu → 100%
215
+ ──────────────────────────────────────────
216
+
217
+ Trong COST:
218
+ - total_charge = tổng viện phí
219
+ - paid_by_payer = total_charge × tỷ_lệ_BHYT
220
+ - paid_by_patient = total_charge - paid_by_payer
221
+ - paid_patient_copay = phần đồng chi trả theo quy định
222
+ ```
223
+
224
+ ---
225
+
226
+ ## 3. Truy vấn phân tích kinh tế
227
+
228
+ ### 3.1. Tổng chi phí theo loại dịch vụ
229
+
230
+ ```sql
231
+ SELECT
232
+ cost.cost_domain_id AS service_type,
233
+ COUNT(*) AS event_count,
234
+ SUM(cost.total_charge) AS total_charges,
235
+ SUM(cost.paid_by_payer) AS insurance_paid,
236
+ SUM(cost.paid_by_patient) AS patient_paid,
237
+ ROUND(
238
+ SUM(cost.paid_by_payer) * 100.0 / NULLIF(SUM(cost.total_charge), 0),
239
+ 1
240
+ ) AS insurance_coverage_pct
241
+ FROM cost
242
+ GROUP BY cost.cost_domain_id
243
+ ORDER BY total_charges DESC;
244
+ ```
245
+
246
+ ### 3.2. Chi phí thuốc theo nhóm hoạt chất
247
+
248
+ ```sql
249
+ SELECT
250
+ c_ing.concept_name AS ingredient,
251
+ COUNT(DISTINCT de.person_id) AS patient_count,
252
+ SUM(cost.total_charge) AS total_drug_cost,
253
+ ROUND(
254
+ SUM(cost.total_charge) / COUNT(DISTINCT de.person_id),
255
+ 0
256
+ ) AS cost_per_patient
257
+ FROM cost
258
+ JOIN drug_exposure de
259
+ ON cost.cost_event_id = de.drug_exposure_id
260
+ AND cost.cost_domain_id = 'Drug'
261
+ JOIN concept_ancestor ca
262
+ ON de.drug_concept_id = ca.descendant_concept_id
263
+ JOIN concept c_ing
264
+ ON ca.ancestor_concept_id = c_ing.concept_id
265
+ AND c_ing.concept_class_id = 'Ingredient'
266
+ AND c_ing.standard_concept = 'S'
267
+ GROUP BY c_ing.concept_name
268
+ ORDER BY total_drug_cost DESC
269
+ LIMIT 20;
270
+ ```
271
+
272
+ ### 3.3. So sánh chi phí đúng tuyến vs trái tuyến
273
+
274
+ ```sql
275
+ SELECT
276
+ CASE
277
+ WHEN pp.plan_source_value = cs.care_site_source_value
278
+ THEN 'Đúng tuyến'
279
+ ELSE 'Trái tuyến'
280
+ END AS referral_type,
281
+ COUNT(DISTINCT vo.person_id) AS patient_count,
282
+ AVG(cost.total_charge) AS avg_charge,
283
+ AVG(cost.paid_by_payer) AS avg_insurance,
284
+ AVG(cost.paid_by_patient) AS avg_patient_pay
285
+ FROM cost
286
+ JOIN visit_occurrence vo
287
+ ON cost.cost_event_id = vo.visit_occurrence_id
288
+ AND cost.cost_domain_id = 'Visit'
289
+ JOIN care_site cs ON vo.care_site_id = cs.care_site_id
290
+ JOIN payer_plan_period pp
291
+ ON vo.person_id = pp.person_id
292
+ AND vo.visit_start_date BETWEEN pp.payer_plan_period_start_date
293
+ AND pp.payer_plan_period_end_date
294
+ GROUP BY referral_type;
295
+ ```
296
+
297
+ ---
298
+
299
+ ## 4. ER Diagram — Health Economics
300
+
301
+ ```
302
+ ┌──────────────────┐
303
+ │PAYER_PLAN_PERIOD │
304
+ │ │
305
+ │ person_id ──────→│ PERSON
306
+ │ payer_concept_id │
307
+ │ plan_concept_id │
308
+ │ start_date │
309
+ │ end_date │
310
+ └────────┬─────────┘
311
+ │ payer_plan_period_id
312
+
313
+ ┌──────────────────┐
314
+ │ COST │
315
+ │ │ ┌─── VISIT_OCCURRENCE
316
+ │ cost_event_id ──→│────────├─── DRUG_EXPOSURE
317
+ │ cost_domain_id │ ├─── PROCEDURE_OCCURRENCE
318
+ │ total_charge │ └─── DEVICE_EXPOSURE
319
+ │ paid_by_payer │
320
+ │ paid_by_patient │
321
+ │ currency_id │
322
+ └──────────────────┘
323
+ ```
324
+
325
+ ---
326
+
327
+ ## Tổng kết
328
+
329
+ 1. **PAYER_PLAN_PERIOD**: ghi nhận thời gian bảo hiểm (VN: thẻ BHYT, mã ĐKKCB)
330
+ 2. **COST**: chi phí từng sự kiện, dùng polymorphic FK (`cost_event_id` + `cost_domain_id`)
331
+ 3. **VN mapping**: `paid_by_payer` = phần BHYT, `paid_by_patient` = phần tự chi trả
332
+ 4. COST hỗ trợ phân tích hiệu quả chi phí, so sánh đúng/trái tuyến
333
+ 5. `currency_concept_id` = 44818568 cho VND
334
+
335
+ **Bài tiếp theo:** CONDITION_ERA, DRUG_ERA, DOSE_ERA — Bảng tổng hợp tự động.
336
+
337
+ ---
338
+
339
+ ## Tài liệu tham khảo
340
+
341
+ - [OMOP CDM 5.4 — PAYER_PLAN_PERIOD](https://ohdsi.github.io/CommonDataModel/cdm54.html#PAYER_PLAN_PERIOD)
342
+ - [OMOP CDM 5.4 — COST](https://ohdsi.github.io/CommonDataModel/cdm54.html#COST)
343
+ - [Book of OHDSI — Health Economics chapter](https://ohdsi.github.io/TheBookOfOhdsi/)