Tuần này gần như toàn bộ công sức đổ vào ChicStay: biến bàn kiểm tra dữ liệu (verify) thành công cụ dùng được thật, để đội BD soi xong 420/423 phòng trong 4 ngày, rồi dựng đường ống xuất — audit — báo cáo để biết kho dữ liệu đó đang tốt xấu ra sao.
Cần chú ý ngay — hai luồng chicgo_data đang đứng: enrich đã dừng 11 ngày (lần chạy cuối 31/07 11:30 — nêu ở báo cáo tuần trước, chưa được xử lý), hàng chờ phình từ 32.167 lên 37.033 địa điểm. Và từ 09/08 22:22 crawl cũng dừng hẳn, BD confirm rơi từ ~400/ngày xuống 1/ngày. Chi tiết ở mục 1.
Số liệu truy vấn trực tiếp từ DB chicgo ngày 11/08 (đã lọc địa điểm còn hiệu lực):
Địa điểm crawl mới theo ngày:
Địa điểm BD confirm theo ngày:
Địa điểm mới cuối cùng ghi nhận lúc 09/08 22:22. BD confirm trung bình ~278/ngày giai đoạn 04–09/08 (tuần trước ~604/ngày), rồi về gần 0 từ 10/08. Hai luồng dừng cùng thời điểm nên nhiều khả năng cùng một nguyên nhân (service/tiến trình dừng), chưa xác minh — cần kiểm tra trước khi kết luận.
Lượt enrich cuối cùng vẫn là 31/07 11:30 — 11 ngày không xử lý một địa điểm nào. Con số enriched tính trên toàn bảng là 23.891, đúng bằng con số của báo cáo tuần trước, xác nhận không có lượt chạy nào.
| Trạng thái enrich | Tuần trước | Hiện tại | Thay đổi |
|---|---|---|---|
need_to_enrich | 32.167 | 37.033 | +4.866 |
enriched | 23.891 | 23.891 | 0 |
error | 142 | 137 | −5 |
not_eligible | 183 | 180 | −3 |
Hàng chờ nay gấp 1,57 lần số đã xử lý. Hàng đợi từ khoá vẫn còn 320 từ khoá chờ (không đổi so với tuần trước — thêm một dấu hiệu crawl không chạy).
Vấn đề: bốn đường ghi tự động — crawler từ khoá (override_category_for_urls), upsert_place với ON CONFLICT, import từ file, và luồng enrich — đều ghi đè thẳng lên category, sub_categories, keywords, customer_intents của địa điểm đã được BD kiểm tra và xác nhận. 1.240 địa điểm bị ảnh hưởng, không có nhật ký nào ghi lại — nghĩa là nếu không rà thì không ai biết công BD đã mất.
Đã xử lý:
bd_confirm_at, hoặc bd_pass = true, hoặc có bd_email. Sửa ở db/connection.py, db/imports.py, tools/enrich_places_flow.py — tức chặn ở chỗ ghi chứ không dặn từng người gọi.Nguyên tắc rút ra: dữ liệu người làm và dữ liệu máy làm phải có ranh giới cứng ở tầng thấp nhất. Bất kỳ luồng tự động nào mới thêm sau này cũng tự động thừa hưởng chốt này.
26 commit, +5.864 / −2.122 dòng. Đây là phần lớn công việc trong tuần: đưa bàn kiểm tra dữ liệu từ "có màn hình" thành "đội BD ngồi làm cả ngày được".
| Đề xuất | Đã làm |
|---|---|
| Số thứ tự phòng | Cột thật rooms.seq_no có sequence, không phải số tính lúc truy vấn — trước đây thêm một phòng là mọi số phía sau dịch một bậc, dải việc đã giao cho CTV trỏ sang phòng khác |
| Nút "Loại" | Thêm trạng thái REJECTED — trước chỉ có Duyệt và Cần sửa, bản ghi hỏng nằm mãi trong hàng đợi |
| Mô tả | Giữ nguyên xuống dòng, giới hạn 500 ký tự, có bộ đếm; mô tả cũ dài hơn vẫn đọc được, chỉ khi sửa mới buộc cắt |
| Chính sách huỷ | Chuyển lên cấp cơ sở — 81 dòng phải điền thay vì 1.663 gói giá |
| Tiện ích "biến mất" | Không phải bị ẩn mà endpoint không truy vấn room_amenities; trả lại tiện ích + tag kèm lưới tick sửa được |
Kèm: sửa được tiện ích cấp cơ sở (bể bơi, thang máy không thuộc phòng nào — trước phải đi vòng qua từng phòng), và edit phòng phủ đủ mọi thứ trang khách hiện (chính sách phòng, lịch trống, giường — các bảng con trước đây không có ô sửa nào).
Đầu tuần đặt HDCI (link hướng dẫn nhận phòng) và chính sách phòng thành bắt buộc. Kết quả thực đo: 0/423 phòng đủ điều kiện chốt — vì 410/423 phòng chưa có link HDCI và sheet gốc phần lớn bỏ trống chính sách thú cưng/hút thuốc/trẻ em. Bỏ HDCI ra thì 20 phòng duyệt được ngay.
Vấn đề gốc: một trường qa_status đang gánh hai việc khác nhau — "BD đã soi xong" và "đủ điều kiện lên bán". Khi trường bắt buộc lại là thứ BD chưa có thông tin để điền, gộp hai việc làm một nghĩa là công đã soi không ghi lại được.
Đã chốt (theo trao đổi nhóm 07/08): nút "Đã kiểm, duyệt" luôn bấm được; chính sách phòng và HDCI về tuỳ chọn. Độ đầy vẫn hiện nguyên (badge "thiếu N", tooltip trên nút) — chỉ thôi không chặn. Ai cần lọc "đủ điều kiện publish" thì lọc theo độ đầy ở hàng đợi, không lẫn vào qa_status.
Phản hồi từ đội BD: phân loại ảnh quá lâu. Còn 2.922/3.286 ảnh chưa phân loại nên mỗi thao tác thừa bị nhân lên hàng nghìn lần.
Một bản "phân loại hàng loạt" đã thử rồi revert trong ngày — giữ hướng tối ưu thao tác đơn thay vì thêm chế độ chọn nhiều.
Đi qua ba bản trong tuần, chốt ở bản cuối: khối xem trước nằm ở đáy cột chỉnh sửa — thứ để đối chiếu sau khi sửa xong, không phải thứ chen giữa lúc đang điền. Nội dung dựng đúng bố cục trang chi tiết: ảnh, thông số, tag, mô tả, giường, tiện ích, chính sách, lịch trống, giá theo từng gói. Chỗ nào trống vẫn nói thành chữ để BD thấy lỗ hổng đúng ở dạng khách sẽ thấy.
Ghi chú kỹ thuật: bản modal ở giữa màn hình mở lên được nhưng bấm gì cũng không đóng — khung sống bên trong slideover, thư viện UI đặt pointer-events:none cho mọi thứ ngoài lớp dialog của nó. Thay vì vá lớp phủ, bỏ hẳn modal.
Phần duy nhất trong tuần không thuộc ChicStay. Mỗi địa điểm chicgo nay có mục "Lịch sử chỉnh sửa" ở cuối panel chi tiết: graph kiểu GitHub, màu theo loại thao tác, click mở diff Trước / Sau, hiện đủ mọi tác giả — kể cả thao tác revert của hệ thống.
Liên quan trực tiếp tới sự cố ở mục 2: có graph này thì lần sau dữ liệu BD bị ghi đè sẽ nhìn thấy được ngay trên màn hình, không phải đi dò DB. Kèm một lỗi đã sửa: mở place bằng URL trực tiếp thì lịch sử rỗng vĩnh viễn — fetch chạy lúc dựng trang phía server không kèm cookie phiên nên bị trả 401.
Nửa cuối tuần dựng bộ công cụ trả lời câu hỏi "kho dữ liệu này đang tốt xấu ra sao". Toàn bộ chạy từ file JSON export, không chạm DB — báo cáo gửi đi được mà không cần quyền truy cập DB.
| Bước | Nội dung |
|---|---|
Exportexport-chicstay-verify.mjs | Xuất cây Brand → Cơ sở → Phòng với toàn bộ cột và quan hệ (gói giá, dòng giá, ảnh, tiện ích, tag, giường, chính sách, lịch trống…). Lọc theo trạng thái verify ở cấp phòng hoặc cấp brand. Không xuất mã cửa/khoá, tài khoản ngân hàng merchant, dữ liệu đặt phòng & thanh toán. |
Auditaudit-chicstay-export.mjs | 22 lớp kiểm tra chia 3 mức + độ đầy mọi cột từng bảng + bảng theo brand |
Báo cáoreport-chicstay-final.mjs | Quy mô catalog, địa chỉ & toạ độ, verify & QA, độ hoàn thiện, giá & nguồn cung, bảng theo brand |
| Mức | Phát hiện | Số | Nghĩa là |
|---|---|---|---|
| nghiêm trọng | Gói giá không có dòng giá nào | 30 | Chọn gói sẽ không ra tiền |
| nghiêm trọng | Phòng không có gói giá nào | 2 | Không thể bán |
| đã sạch | Khách tối đa < khách tiêu chuẩn · Phòng lệch brand so với cơ sở · Giá null hoặc ≤ 0 · Toạ độ ngoài lãnh thổ VN · Brand thiếu ô bắt buộc · Phòng trùng tên trong cùng cơ sở · Cơ sở trùng địa chỉ · Phòng có >1 ảnh chính | ||
Kiểu dữ liệu toạ độ cũ là numeric(12,2) — cắt còn 2 số lẻ, sai số ~1km, tức pin bản đồ rơi lệch cả khu phố. Đã đổi sang numeric(9,6) (~10cm) và fill lại toàn bộ.
address_new + ward_new theo đơn vị hành chính 2025 (NQ 1656 Hà Nội · NQ 1666 Hưng Yên). BD sửa được cả hai trên dashboard.change_audit từng trường — chạy lại không hỏng, và biết được giá trị nào do script đặt.Kết quả trên production 10/08: 84/84 cơ sở có đủ địa chỉ cũ + địa chỉ mới + phường/xã mới (27 đơn vị hành chính) + toạ độ 6 số lẻ, 84/84 nằm trong lãnh thổ VN.
Bản đồ kiểm tra toạ độ (file riêng, 84 pin):
| Độ chính xác pin | Số cơ sở |
|---|---|
| Pin Google Maps / toà nhà | 4 |
| Khớp số nhà / địa chỉ đầy đủ | 57 |
| Mức ngõ (~50–150m) | 13 |
| Mức khu/đường (~200–500m) | 10 |
23 cơ sở còn ở mức ngõ trở lên — chính xác đủ để hiển thị danh sách, chưa đủ để dẫn đường tới cửa. Cần đội BD chỉnh pin tay khi có dịp tới nơi.
Cùng 1.866 gói giá, 4.565 dòng giá, 2.744 tag đã gán. So với báo cáo tuần trước (4 brand · 10 cơ sở · 33 phòng · 119 gói giá): lô nhập lớn về ngày 03/08 và 06/08, tuần này là tuần soi và làm sạch lô đó chứ không phải nhập thêm.
| Cấp | Đã soi | Tỷ lệ |
|---|---|---|
| Phòng | 420 / 423 | 99,3% |
| Cơ sở | 84 / 84 | 100% |
| Brand | 30 / 31 | 96,8% |
| Media | 80 / 4.064 | 2,0% |
| Kết quả QA phòng | Số phòng | Tỷ lệ |
|---|---|---|
| Duyệt (QA_APPROVED) | 251 | 59% |
| Loại (REJECTED) | 127 | 30% |
| Cần sửa (NEEDS_FIX) | 42 | 10% |
| Chờ (PENDING) | 3 | 1% |
Cần xem lại: tỷ lệ loại 30% là cao bất thường và tập trung vào vài brand — ALÀ HOMESTAY loại 35/54 phòng, GBOX loại 29/29, NOBLE APARTMENT loại 12/12, BỆU loại 9/9. Cần làm rõ đây là dữ liệu nguồn hỏng thật hay là BD đang dùng nút "Loại" thay cho "Cần sửa" — hai cách hiểu này dẫn tới hai hành động hoàn toàn khác nhau.
| Dữ liệu phòng | Có | Độ phủ |
|---|---|---|
| Gói giá / tiện ích / tag | 421–423 / 423 | 100% |
| Mô tả | 416 / 423 | 98% |
| Diện tích | 310 / 423 | 73% |
| Ảnh trên R2 | 303 / 423 | 72% |
| Khai báo giường | 148 / 423 | 35% |
| Số phòng ngủ | 148 / 423 | 35% |
| Đã publish | 0 / 423 | 0% |
Ô bắt buộc trống nhiều nhất: bedroom_count 275 phòng (65%), bathroom_access_type 129 (30%), area_sqm 113 (27%), primary_style 64 (15%). Ở cấp cơ sở: chính sách hoàn huỷ trống 84/84 — chưa cơ sở nào có.
| Kiểu thuê | Dòng giá | Trung vị | Min | Max |
|---|---|---|---|---|
| Theo giờ | 2.427 | 356k | 85k | 4.800k |
| Qua đêm | 1.059 | 469k | 270k | 4.800k |
| Cả ngày | 1.045 | 569k | 180k | 4.800k |
| Day-use | 34 | 190k | 118k | 200k |
Trung vị toàn kho 440k. Phân bố dồn ở 350–500k (1.722 dòng) và 200–350k (1.060 dòng). Nguồn cung tập trung Cầu Giấy (18 cơ sở / 108 phòng) và Tây Hồ (18 / 91).
Sheet ngày 06/08 đổi tiêu đề cột A của tab 02_Phòng từ "Mã cơ sở *" thành " Mã cơ sở" (bỏ dấu sao, thêm khoảng trắng). Importer tra đúng chuỗi có dấu sao nên mọi dòng trả về mã rỗng, hàm nhận diện dòng ví dụ coi cả 1.466 dòng là dòng mẫu, và lượt sync báo thành công với kết quả "Phòng: 0". Không một cảnh báo nào.
* (chỉ là quy ước "bắt buộc" của người soạn sheet, không phải định danh cột) và gom khoảng trắng.Kèm replay_edits.py: importer ghi đè 19 cột của rooms và 10 cột của properties — đúng những cột dashboard verify cũng ghi vào. Script đắp lại giá trị mới nhất từ change_audit sau mỗi lượt import, nên sync không còn xoá công BD đã làm. (Cùng một lớp vấn đề với sự cố chicgo ở mục 2, phát hiện trong cùng tuần ở hai hệ thống khác nhau.)
room_grade, availability_method, applicable_days, accepts_foreign_guests, province_code thành danh mục; hotline, số tầng, link HDCI, mã phường thành regex; toạ độ phải trong lãnh thổ VN; max_guests ≥ standard_guests. Mọi danh mục và regex lấy từ chính dữ liệu đang có, đối chiếu khớp 100% dòng hiện tại.media (dùng lại nguyên đường upload R2, trạng thái QA, bản quyền, nhật ký) thay vì thêm hai cột URL rời.OTHER_REVIEW và CONTACT_FIRST có trong danh mục nhưng thiếu trong ràng buộc, khiến BD chọn xong lưu là báo lỗi.Không có thay đổi code trong tuần. Số liệu DB ngày 11/08 cho thấy hệ thống vẫn chạy đều:
| Chỉ số | Tuần trước | Hiện tại |
|---|---|---|
| Event | 1.972 | 1.988 |
| Đã đẩy thành công | 1.940 | 1.956 |
| Bị từ chối / đang chờ | 30 / 2 | 30 / 2 |
| Tổ chức | 781 | 788 |
| Lượt crawl (8 ngày) | — | 192 |
vẫn bị chặn Luồng học bổng đứng im từ 03/08 — vẫn 5/364 bài đã viết lại. Nguyên nhân không đổi: App key production thiếu quyền scholarships:read/write/publish, cần admin CheckEvent cấp. Đây là việc chờ người khác đã nêu từ báo cáo tuần trước.
scholarships:read/write/publish. Chưa có thì 359 bài còn lại không lên được.qa_status (đã bàn ở mục 3.3 nhưng chưa dựng bộ lọc).