# -*- coding: utf-8 -*-
"""Gán nhóm sự vụ chính cho 39 vụ Base + thống kê theo nhóm / cột / khách hàng / tháng."""
import json, os, re, collections

D = r"C:\Claw 2\QC\Base"
TMP = r"C:\Users\admin\AppData\Local\Temp\base_jobs"
data = json.load(open(os.path.join(D, "du_lieu_base.json"), encoding="utf-8"))
cards = json.load(open(os.path.join(TMP, "board_cards.json"), encoding="utf-8"))
STAGES = {"95246": "Kiểm tra & xử lý sự cố", "95248": "QC & KT kiểm tra nguyên nhân gốc rễ",
          "95252": "Theo dõi tình trạng", "98799": "Theo dõi - nghiên cứu",
          "95244": "Hoàn thành", "95245": "Thất bại"}

NHOM = {
 "P1": "Sai màu / lệch tông màu",
 "P2": "Sai độ bóng",
 "P3": "Chất lượng sơn — nguyên liệu (lắng, kết tủa, độ nhớt, pha phụ gia)",
 "P4": "Bám dính kém / tróc màng sơn",
 "P5": "Dính màng khi xếp chồng — đóng gói — tiếp xúc (mút xốp, carton, vân tay)",
 "P6": "Khuyết tật bề mặt màng sơn (đốm, lõm dầu, nhám, lỗ kim, mốc)",
 "P7": "Nứt màng sơn",
 "P8": "Xì dầu mắt gỗ / ngả vàng ở kẽ góc / ngả vàng theo thời gian",
 "P9": "Bề mặt phôi — cước — ghim gỗ — chà nhám",
 "P10": "Vật tư phụ trợ (dung môi, hoá chất vệ sinh thiết bị)",
}
GAN = {
 "3323728": "P1", "3382376": "P1", "3430726": "P1", "3469793": "P1", "3497330": "P1", "3497376": "P1", "3239449": "P1",
 "3415174": "P2", "3520768": "P2", "3563781": "P2",
 "3411514": "P3", "3552520": "P3", "3556609": "P3", "3570070": "P3",
 "3301928": "P4", "3541940": "P4", "3569006": "P4", "3572567": "P4",
 "3296414": "P5", "3449551": "P5", "3463867": "P5", "3464908": "P5", "3515676": "P5", "3530490": "P5", "3523776": "P5",
 "3170695": "P6", "3441602": "P6", "3441692": "P6", "3449244": "P6", "3497749": "P6", "3506797": "P6",
 "3423528": "P7",
 "3363236": "P8", "3423482": "P8", "3556429": "P8",
 "3397028": "P9", "3411084": "P9", "3135002": "P9",
 "3344788": "P10",
}
MOTA = {
 "3323728": "Sơn màu NC HP 535 10% (ms 180526) đậm đỏ hơn mẫu ký",
 "3382376": "KW 536H 20% (ms 1060626) màu sai so với mẫu",
 "3430726": "Tủ MHT 66 WH: kiểm tra trước sản xuất màu sai so với mẫu (trắng vàng hơn)",
 "3469793": "Sản phẩm tủ MHT 66WH màu chưa đạt so với mẫu ký",
 "3497330": "MHT 69 WH 10%: kiểm tra trước sản xuất màu đậm, vàng hơn mẫu",
 "3497376": "MHT 71 Grey 10%: màu nhạt hơn, thiếu đỏ, vàng hơn mẫu",
 "3239449": "TD 162: màu sắc chưa đạt kèm cước sọc ngang, lông nhám, ghim đen, táp màu góc cạnh (khoảng 2 cont)",
 "3415174": "AQ 703 + AQ 724: độ bóng 15–19% không đạt, khách yêu cầu khui thùng sửa lại",
 "3520768": "Bóng Bex 03 – 2706H 10%: độ bóng cao (20%)",
 "3563781": "Bóng Bex 03 – 2706H 10%: độ bóng 18% trên thẻ, thực tế trên 20%",
 "3411514": "Sơn màu PU VNHW 19 1234 TCX 80%: pha hỗn hợp để 1–2 giờ bị lắng",
 "3552520": "MP 744H sọc bóng: pha 2% phụ gia TCF vào bóng ABR 2410 → 2–3 giờ lắng và sọc bóng",
 "3556609": "Màu lau ART 19: kiểm tra trước sản xuất bị lắng, co màu",
 "3570070": "Lót màu HP 269 (ms 280826): độ nhớt 10–11 giây, không đạt quy trình 13 giây",
 "3301928": "KH Cherry: kiểm tra trước sản xuất độ bám yếu",
 "3541940": "DL 16/19: sau khi hoàn thiện để khô 24 giờ, kiểm tra độ bám yếu",
 "3569006": "SC W 3307: độ bám không đạt trên 40 sản phẩm băng tầng",
 "3572567": "MD 02A (mây): sau hơn 1 ngày đóng gói, xịt bụi bằng vòi hơi bị tróc sơn; test băng keo giấy cũng tróc",
 "3296414": "MHT 02 (AX 123): dính vết giấy tổ ong ở nóc và hông tủ",
 "3449551": "THTH 92: sản phẩm tái chế bị dính",
 "3463867": "TVIET 246 và TVIET 299A: sản phẩm bị dính",
 "3464908": "MP 394: sản phẩm sau khi sơn hoàn thiện bị dính bìa carton",
 "3515676": "MD 2153: xếp chồng 10 sản phẩm kệ tầng, 3 sản phẩm lớp dưới dính mút xốp",
 "3530490": "KH 3900: sau 24 giờ bề mặt dính dấu vân tay, rít lau khó ra",
 "3523776": "MP 744H: vết đốm trắng tại vị trí có mồ hôi tay khi thao tác",
 "3170695": "#15 Mocha: sản phẩm hoàn thiện bị mốc cục bộ",
 "3441602": "Bóng NC 2605 KH 40%: phun súng tự động bị lõm dầu trên bề mặt",
 "3441692": "Bóng NC NY 10% + Bóng NC PC 23 20%: màng nhám toàn bề mặt, nghẹt lưới lọc, không bơm lên được",
 "3449244": "VNHW 7499 C: khách phản ánh đốm trên bề mặt cả phần gỗ và MDF",
 "3497749": "KT BT P 390 trên kim loại: bề mặt bị đốm trắng đậm lợt",
 "3506797": "Lót SW 2 – 2108H trắng: kéo cọ để khô thấy lỗ kim trên bề mặt",
 "3423528": "Demeyer White H: sau khi phun lót trắng SW6 0909H new để khô 30 phút, nứt sơn trên cạnh sản phẩm",
 "3363236": "DD 834: 6 sản phẩm, mỗi sản phẩm xì vàng 3–4 mắt gỗ",
 "3423482": "AQ 002H: khe kẽ và góc mặt trong tủ bị ngả màu vàng",
 "3556429": "HN 52, HN 12, HN 13: mẫu màu nhân lại sau 4 tháng bị ngả vàng",
 "3397028": "AQ 929: tại vị trí cước sâu, phun lót đen NC màu khó vào ghim gỗ",
 "3411084": "Lót màu KH Cherry FOA H: bề mặt sau khi cán dễ bị trầy xước",
 "3135002": "Lót NC T2012 (1:1.5): sau 4 giờ chà nhám bị dính nhám, khó chà nhám",
 "3344788": "Xăng công nghiệp rửa dàn máy cán UV, dàn phun tự động và súng sơn: chậm ra, ít sạch",
}
def cust(t):
    t = re.sub(r"^.*?\(|^[^(]*", "", t)
    return (t.split("(")[0] or "").strip()

out = []
for st, items in cards.items():
    for x in items:
        jid = x["job"]
        d = data.get(jid, {})
        title = re.sub(r"\s*\|\s*(Không thời hạn|\d{2}:\d{2} \d{2}/\d{2}/\d{4}).*$", "", x["title"]).strip()
        ten = title.split("(")[0].strip() or title
        out.append({"job": jid, "ten_vu": ten[:60], "san_pham": title[:90],
                    "nhom": GAN.get(jid, "?"), "nhom_ten": NHOM.get(GAN.get(jid, ""), "?"),
                    "stage": STAGES.get(st, st), "stage_id": st,
                    "ngay_kt": d.get("ngay_kt", "")[:10], "mo_ta": MOTA.get(jid, ""),
                    "loai_sai": "; ".join((y.get("loai") or "—").strip() for y in d.get("loai_sai", [])),
                    "cv_chua_xong": [c["ten"] for c in d.get("cong_viec", []) if c["trang_thai"] != "Hoàn thành"]})
json.dump(out, open(os.path.join(D, "phan_tich_39_vu.json"), "w", encoding="utf-8"), ensure_ascii=False, indent=1)

print("=== THỐNG KÊ THEO NHÓM SỰ VỤ ===")
cnt = collections.Counter(v["nhom"] for v in out)
for k in sorted(cnt, key=lambda x: -cnt[x]):
    print(f"  {NHOM.get(k,k):62} {cnt[k]:>2} vụ  ({cnt[k]/len(out)*100:.0f}%)")
print(f"  TỔNG: {len(out)} vụ")

print("\n=== THEO CỘT TRẠNG THÁI ===")
for k, v in collections.Counter(x["stage"] for x in out).most_common():
    print(f"  {k:38} {v:>2} vụ")

print("\n=== THEO KHÁCH HÀNG / NHÀ MÁY (≥2 vụ) ===")
for k, v in collections.Counter(x["ten_vu"] for x in out).most_common():
    if v >= 2:
        print(f"  {k:34} {v:>2} vụ")

print("\n=== THEO THÁNG ===")
for k, v in sorted(collections.Counter(x["ngay_kt"][3:10] for x in out).items()):
    print(f"  {k:9} {v:>2} vụ")
