NX Lab

Xuất dữ liệu part và BOM sang JSON chuẩn cho hệ thống khác (ERP, MES): ánh xạ trường và kiểm tra schema

#Python#Tích hợp#JSON1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Dữ liệu từ NX phải đưa sang ERP/MES theo định dạng của họ. Cách bền vững: lớp ánh xạ trường tách riêng, kiểm tra schema trước khi gửi, và ghi ra JSON để kiểm thử độc lập với hệ thống nhận.

    Xuất dữ liệu part và BOM sang JSON chuẩn… Xuất dữ liệu part và BOM sang JSON chuẩn…

    Các bước thực hiện

    1. Thu thập dữ liệu thô. Thuộc tính, hộp bao, khối lượng, cấu trúc BOM.
    2. Ánh xạ trường. Bảng tên NX -> tên ERP.
    3. Kiểm tra schema. Trường bắt buộc, kiểu dữ liệu.
    4. Ghi JSON. UTF-8, thụt lề.
    5. Gửi hoặc bàn giao. Qua REST, file hoặc thư mục trao đổi.

    Code tham khảo (Python)

    import json
    import os
    import NXOpen
    
    ANH_XA = {          # tên thuộc tính trong NX -> tên trường ERP
        "MA_CHI_TIET": "item_code",
        "VAT_LIEU": "material",
        "REV": "revision",
        "KHOI_LUONG": "weight_kg",
    }
    BAT_BUOC = ["item_code", "material", "revision"]
    
    def doc_thuoc_tinh(part):
        kq = {}
        for a in part.GetUserAttributes():
            if a.Type == NXOpen.NXObject.AttributeType.Real:
                kq[a.Title.upper()] = a.RealValue
            elif a.Type == NXOpen.NXObject.AttributeType.Integer:
                kq[a.Title.upper()] = a.IntegerValue
            else:
                kq[a.Title.upper()] = a.StringValue
        return kq
    
    def dung_ban_ghi(part):
        tt = doc_thuoc_tinh(part)
        ban_ghi = {truong_erp: tt.get(ten_nx) for ten_nx, truong_erp in ANH_XA.items()}
        ban_ghi["file_name"] = part.Leaf
        return ban_ghi
    
    def kiem_tra_schema(ban_ghi):
        loi = [t for t in BAT_BUOC if not ban_ghi.get(t)]
        if ban_ghi.get("weight_kg") is not None and not isinstance(ban_ghi["weight_kg"], (int, float)):
            loi.append("weight_kg phải là số")
        return loi
    
    def duyet_la(root):
        ngan_xep = list(root.GetChildren())
        while ngan_xep:
            c = ngan_xep.pop()
            con = c.GetChildren()
            if con:
                ngan_xep.extend(con)
            else:
                yield c
    
    def xuat_json(part, duong_dan):
        goc = dung_ban_ghi(part)
        loi = kiem_tra_schema(goc)
        if loi:
            raise ValueError("Thiếu hoặc sai trường: " + ", ".join(loi))
        root = part.ComponentAssembly.RootComponent
        if root is not None:
            dem = {}
            for c in duyet_la(root):
                if c.Prototype is not None:
                    dem[c.Prototype.Leaf] = dem.get(c.Prototype.Leaf, 0) + 1
            goc["children"] = [{"file_name": k, "quantity": v} for k, v in sorted(dem.items())]
        os.makedirs(os.path.dirname(duong_dan), exist_ok=True)
        with open(duong_dan, "w", encoding="utf-8") as f:
            json.dump(goc, f, ensure_ascii=False, indent=2)
        return goc
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        try:
            goc = xuat_json(part, "D:/NXLab_xuat/erp/%s.json" % part.Leaf)
            lw.WriteLine("Đã xuất JSON: " + json.dumps(goc, ensure_ascii=False))
        except ValueError as ex:
            lw.WriteLine("Không xuất được: %s" % ex)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Bảng ANH_XA là nơi duy nhất biết tên trường của hai phía; đổi hệ thống nhận chỉ cần sửa bảng.
    • Kiểm tra schema trước khi ghi giúp lỗi dữ liệu dừng ngay tại nguồn thay vì lan sang ERP.
    • Số lượng con của assembly được gom theo tên file, khớp với BOM phẳng đã học.

    Lỗi thường gặp

    • Tên trường ERP trong ví dụ là giả định; lấy tài liệu giao diện thật từ bộ phận ERP.
    • Gửi dữ liệu sang ERP nên có bước duyệt hoặc chế độ thử (dry-run) trước khi ghi thật.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.