AMELA_SOSHIKI_SYSTEM-257 · Báo cáo điều tra · 03/09/2026
Import file E2 → Grade hàng loạt nhân viên bị reset về 「一般」
Dành cho dev: nhiều hình, ít chữ. Chi tiết code xem bản kỹ thuật riêng.
1 TL;DR
Một hàm resolve grade chạy cho mọi dòng import, kể cả khi file không hề có cột grade.
5/6
file import KHÔNG có cột grade nhưng vẫn ghi đè grade
~4.282
nhân viên bị reset về 一般
0
test case cho tình huống "update, file không có cột grade"
23:00
batch đồng bộ sang Zoo/Ocean → hôm sau mới thấy badge đổi
Root cause: logic không phân biệt "file không có cột grade" (phải giữ nguyên) với "ô grade để trống" (spec mới → default 一般). Kết quả: mọi file thiếu cột grade đều reset grade toàn bộ nhân viên trong file.
2 6 file khách import ngày 31/08
Chỉ file ⑤ có cột grade. 5 file còn lại không có — nhưng vẫn kích hoạt ghi đè grade.
📄
① 社員基本情報
4.282 dòng
✗ Không có cột grade → reset 一般
📄
② 社内履歴(主務)
4.282 dòng
✗ Không có cột grade → reset 一般
📄
③ 社員住所情報
4.282 dòng
✗ Không có cột grade → reset 一般
📄
④ 社員給与情報
4.282 dòng
✗ Không có cột grade → reset 一般
📄
⑤ 社員号俸履歴情報
85 dòng
✓ Có cột grade (77 dòng trống → reset · 8 set đúng)
📄
⑥ メールアドレス
3.086 dòng
✗ Không có cột grade → reset 一般
Giải nghịch lý khách nêu: file grade (⑤) chỉ 85 dòng nhưng ~4.282 người bị đổi — vì thủ phạm chính là ①②③④⑥. File nào import sau cùng sẽ đè kết quả file trước, nên 8 người được set đúng ở ⑤ vẫn có thể bị ⑥ đè lại.
3 Chuyện gì xảy ra khi import 1 file?
Flow trong ors-api. Hai bước đỏ là nơi phát sinh bug.
⬆️
User upload file E2
Màn hình import nhân viên (ors-client)
▼
🔍
Hệ thống tự nhận diện loại file qua header
Quét ≤20 dòng đầu, so khớp với 7 bộ header mẫu → biết đây là file ①…⑦
▼
🗺️
Map cột tiếng Nhật → field hệ thống
Chỉ mapping của file ⑤ có cột grade. File ①②③④⑥ → dữ liệu dòng KHÔNG có grade
▼
💥
BUG ① — Resolve grade cho MỌI dòng, MỌI loại file
Không có cột grade → giá trị rỗng → hàm resolve trả về default 一般 thay vì bỏ qua
▼
💥
BUG ② — Nhánh UPDATE gán đè vô điều kiện
Grade thật đang có của nhân viên bị thay bằng default, không kiểm tra nguồn dữ liệu
▼
🔐
Cấp lại quyền theo grade mới NGAY LẬP TỨC
Permission cũ bị end, tạo bộ mới theo 一般 → user mất quyền ngay trong Ocean, không chờ batch
▼
✅
Trả về "Import thành công"
Không có warning về số grade bị thay đổi → khách không phát hiện tại chỗ
4 Chuỗi nhân quả — vì sao "không có cột" thành "default"?
Hệ thống coi 2 tình huống rất khác nhau là một.
📄 File không có cột grade①②③④⑥
→
Dữ liệu dòng: grade rỗngkhông tồn tại giá trị
→
Hàm resolve: "rỗng = default"trả về 一般 (spec YST-208)
→
UPDATE ghi đègrade thật bị thay
→
~4.282 người = 一般mất quyền ngay
Đáng lẽ: file không có cột grade = "file này không nói gì về grade" → giữ nguyên giá trị hiện tại.
Thực tế: hệ thống hiểu là "grade để trống" → áp spec mới "trống → default 一般" → ghi đè.
5 Vì sao badge grade trên Ocean trễ 1 ngày?
Badge dưới tên user đọc từ DB Zoo — đồng bộ từ ORS mỗi ngày 1 lần.
Ban ngày 31/08
Import → grade trong ORS đổi ngay. Màn hình chi tiết nhân viên + permission Ocean đổi NGAY
23:00 cùng ngày
Batch sync:employeeOrs (zoo-auth) pull employees + grade + roles về DB Zoo
Hôm sau 01/09
Badge grade + role phía Zoo và các hệ thống SSO liên kết mới hiển thị giá trị mới
Trả lời 4 câu hỏi của khách: đồng bộ lúc 23:00 hằng ngày · chạy tại zoo-auth · có, hiển thị phải chờ sau batch (hôm sau mới thấy) · tài liệu flow hiện chưa có — AMELA sẽ soạn sequence diagram gửi khách.
Lưu ý: chỉ phần hiển thị chờ batch — permission bị hạ NGAY lúc import (mục 3).
6 Vì sao test không bắt được?
Không phải thiếu test — mà test khẳng định luôn hành vi sai là "expected".
✅
Các case ĐÃ test (20+)
Nhân viên chưa có grade + import file có cột grade để trống → default 一般.
4 case verify STG đều là tạo mới nhân viên.
❌
Case BỊ THIẾU (chính là sự cố)
Nhân viên đang có grade thật + import file không có cột grade (①③④⑥) → kỳ vọng giữ nguyên.
Không tồn tại case nào như vậy.
Vì sao thiếu: spec khách chốt "全ての条件で未選択 → 一般" (mọi điều kiện) — dev + tester hiểu theo nghĩa đen, và không ai chạy thử bộ 6 file E2 update dữ liệu thật.
7 Đề xuất fix — quyết định theo 2 câu hỏi
Default 一般 chỉ áp dụng khi tạo mới, hoặc khi file thực sự có cột grade mà user để trống.
❓
Câu hỏi 1: Nhân viên đã tồn tại chưa?
Chưa (CREATE) → giữ spec YST-208: grade trống → default 一般 ✔
▼ đã tồn tại (UPDATE)
❓
Câu hỏi 2: File import có cột grade không?
Kiểm tra theo bộ header đã nhận diện, không phải theo giá trị từng ô
▼
✅
CÓ cột grade
Ô trống → default 一般 (đúng spec) · Có giá trị → resolve theo giá trị
🔒
KHÔNG có cột grade
Bỏ qua field grade hoàn toàn → GIỮ NGUYÊN grade hiện tại
Kèm theo: ① rà soát các field cùng pattern gán đè (department…) — nguy cơ bug đồng dạng · ② bổ sung test case "update + file thiếu cột" · ③ thêm warning số lượng grade thay đổi khi import · ④ script khôi phục grade từ history/snapshot trước 31/08.
AMELA · Báo cáo điều tra YST-257 · 03/09/2026 · Bản visual cho dev — chi tiết code xem investigation-report-vi.md