Tích hợp Odoo với SQL Server: Bước đầu xây dựng hệ thống MES chuyên nghiệp

Tích hợp Odoo với SQL Server: Bước đầu xây dựng hệ thống MES chuyên nghiệp

🚀 Tại sao cần tích hợp Odoo với SQL Server trong sản xuất?

Trong lộ trình chuyển đổi số sản xuất, việc sở hữu một hệ thống ERP như Odoo là chưa đủ. Nút thắt thường nằm ở “khoảng trống thông tin” giữa lệnh sản xuất trên giấy tờ và thực tế dưới xưởng.

Việc đưa dữ liệu từ Odoo sang SQL Server giúp:

  • Số hóa dữ liệu: Thay thế lệnh sản xuất bằng giấy.
  • Tạo vùng đệm (Staging Area): Giúp các hệ thống MES (như Node-RED) truy cập dữ liệu nhanh, an toàn mà không làm chậm Odoo.
  • Tính thời gian thực: Cập nhật tiến độ sản xuất ngay lập tức.

Dưới đây là 3 bước kỹ thuật để thông suốt luồng dữ liệu này.


Bước 1: Khởi tạo Lệnh sản xuất (MO) trên Odoo ERP

Đầu tiên, chúng ta cần dữ liệu “gốc” từ phía quản trị. Trên giao diện Odoo 18:

  1. Truy cập module Manufacturing.
  2. Tạo mới một Manufacturing Order (MO). Ví dụ: Tủ điện Control Panel G3.
  3. Thiết lập số lượng và Scheduled Date (Deadline).
  4. Nhấn Confirm. Lúc này hệ thống sẽ sinh ra mã lệnh như WH/MO/00061.

Đây chính là dữ liệu trả lời cho câu hỏi: “Chúng ta cần sản xuất cái gì và khi nào?”


Bước 2: Thiết lập “Hố chứa” dữ liệu trên SQL Server

Để MES có thể đọc được dữ liệu, chúng ta cần một bảng cấu trúc chuẩn trên SQL Server.

SQL

CREATE TABLE Odoo_Production_Sync (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Order_ID NVARCHAR(50),      -- Mã MO từ Odoo
    Product_Name NVARCHAR(200), -- Tên sản phẩm
    Quantity INT,               -- Số lượng
    Deadline DATETIME,          -- Hạn giao hàng
    Sync_Date DATETIME DEFAULT GETDATE(), 
    Status NVARCHAR(50) DEFAULT N'New' -- Trạng thái cho MES xử lý
);
CREATE TABLE Odoo_Production_Sync (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Order_ID NVARCHAR(50),      -- Mã MO từ Odoo (ví dụ: WH/MO/00001)
    Product_Name NVARCHAR(200), -- Tên tủ điện
    Quantity INT,               -- Số lượng
    Deadline DATETIME,          -- Hạn giao hàng
    Sync_Date DATETIME DEFAULT GETDATE(), -- Thời điểm đồng bộ
    Status NVARCHAR(50) DEFAULT N'New'    -- Trạng thái cho MES xử lý
);

Lưu ý: Việc tách biệt Database giúp bảo mật thông tin và tối ưu hóa tốc độ truy vấn cho các Dashboard dưới xưởng.


Bước 3: Python – “Cầu nối” thông tin hoàn hảo

Thay vì nhập liệu thủ công, chúng ta sử dụng script Python để tự động hóa việc đồng bộ qua giao thức XML-RPC của Odoo và thư viện pyodbc của SQL Server.

Đoạn mã kết nối tiêu biểu:

Python

# Lấy dữ liệu từ Odoo 18
mo_list = models.execute_kw(ODOO_DB, uid, ODOO_PASS, 'mrp.production', 'search_read',
    [[['state', '=', 'confirmed']]], 
    {'fields': ['name', 'product_id', 'product_qty', 'date_start']})

# Đẩy dữ liệu vào SQL Server với logic chống trùng lặp
sql_command = """
    IF NOT EXISTS (SELECT 1 FROM Odoo_Production_Sync WHERE Order_ID = ?)
    BEGIN
        INSERT INTO Odoo_Production_Sync (Order_ID, Product_Name, Quantity, Deadline, Status)
        VALUES (?, ?, ?, ?, N'New')
    END
"""
# ... thực thi lệnh và commit dữ liệu

import xmlrpc.client
import pyodbc
from datetime import datetime

# ==========================================
# 1. CẤU HÌNH THÔNG TIN KẾT NỐI
# ==========================================

# Thông số Odoo (ERP)
ODOO_URL = 'http://localhost:8069'
ODOO_DB = 'Vohauipr' # Thay bằng tên database Odoo của bạn
ODOO_USER = 'admin'
ODOO_PASS = 'HaVaXXX' # Thay bằng mật khẩu đăng nhập Odoo

# Thông số SQL Server (Staging/MES Database)
# Server name lấy từ hình 1b7cbd.png
SQL_SERVER = r'DESKTOP-7HV4G4N\SQLEXPRESS'
SQL_DB = 'vohauiprDB'
SQL_USER = 'vohauipr'
SQL_PASS = 'HaVaXXX'

# ==========================================
# 2. KẾT NỐI HỆ THỐNG
# ==========================================

print("--- Đang bắt đầu quá trình đồng bộ ERP-MES ---")

try:
    # Kết nối Odoo qua XML-RPC
    common = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/common')
    uid = common.authenticate(ODOO_DB, ODOO_USER, ODOO_PASS, {})
    models = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/object')
    print("[Odoo] Kết nối thành công.")

    # Kết nối SQL Server qua pyodbc
    conn_str = (
        f'DRIVER={{SQL Server}};'
        f'SERVER={SQL_SERVER};'
        f'DATABASE={SQL_DB};'
        f'UID={SQL_USER};'
        f'PWD={SQL_PASS};'
        'TrustServerCertificate=yes;'
    )
    conn = pyodbc.connect(conn_str)
    cursor = conn.cursor()
    print("[SQL Server] Kết nối thành công.")

    # ==========================================
    # 3. TRUY VẤN DỮ LIỆU TỪ ODOO (ERP)
    # ==========================================
    
    # Tìm các lệnh sản xuất ở trạng thái 'confirmed' (như WH/MO/00061)
    # Các field này lấy theo giao diện Odoo bạn đang dùng
    mo_list = models.execute_kw(ODOO_DB, uid, ODOO_PASS, 'mrp.production', 'search_read',
        [[['state', '=', 'confirmed']]], 
        {'fields': ['name', 'product_id', 'product_qty', 'date_start']})

    if not mo_list:
        print("Không tìm thấy lệnh sản xuất nào mới cần đồng bộ.")
    else:
        print(f"Tìm thấy {len(mo_list)} lệnh cần đồng bộ.")

        # ==========================================
        # 4. ĐẨY DỮ LIỆU VÀO SQL SERVER (MES STAGING)
        # ==========================================
        
        sql_command = """
            IF NOT EXISTS (SELECT 1 FROM Odoo_Production_Sync WHERE Order_ID = ?)
            BEGIN
                INSERT INTO Odoo_Production_Sync (Order_ID, Product_Name, Quantity, Deadline, Status)
                VALUES (?, ?, ?, ?, N'New')
            END
        """

        for mo in mo_list:
            order_id = mo['name']
            product_name = mo['product_id'][1] # product_id là một list [ID, Name]
            quantity = mo['product_qty']
            deadline_raw = mo['date_start']
            
            # Xử lý format ngày tháng nếu cần
            # Odoo gửi về string: '2026-04-20 17:00:07'
            
            params = (order_id, order_id, product_name, quantity, deadline_raw)
            
            cursor.execute(sql_command, params)
            print(f" -> Đã xử lý lệnh: {order_id} ({product_name})")

        # Xác nhận lưu dữ liệu
        conn.commit()
        print("--- Hoàn tất đồng bộ dữ liệu vào SQL Server ---")

except Exception as e:
    print(f"!!! CÓ LỖI XẢY RA: {e}")

finally:
    # Đóng kết nối an toàn
    if 'conn' in locals():
        conn.close()
        print("[SQL Server] Đã đóng kết nối.")

1. Kiểm tra thành quả trên SQL Server

Trước khi sang bước tiếp theo, bạn hãy mở SQL Server Management Studio (SSMS), chuột phải vào database vohauiprDB và chạy câu lệnh này để tận mắt thấy dữ liệu:

SQL

SELECT * FROM Odoo_Production_Sync;

Bạn sẽ thấy dòng lệnh WH/MO/00061 nằm gọn gàng trong bảng với trạng thái New.


2. Bước tiếp theo: Phần 2 – Thiết kế MES Dashboard trên Node-RED

Bây giờ dữ liệu đã sẵn sàng, chúng ta sẽ dùng Node-RED để đưa nó ra cho công nhân (hoặc Henry/Duy) sử dụng. Quy trình như sau:

  • Kết nối: Node-RED sẽ đọc bảng Odoo_Production_Sync.
  • Hiển thị: Hiện danh sách các lệnh sản xuất đang ở trạng thái New lên một bảng (Table) trên trình duyệt web.
  • Tương tác: Tạo nút “Bắt đầu sản xuất” để công nhân bấm vào khi họ bắt đầu lắp ráp tủ điện.

Leave a Reply

Your email address will not be published. Required fields are marked *