Quay lại blog
ai12 phút đọc

Chúng Tôi Đã Dùng Claude Code Để Tái Thiết Hệ Thống ERP Cũ Trong 6 Tuần Như Thế Nào

Một công ty sản xuất Việt Nam với hơn 500 nhân viên đã thay thế hệ thống ERP VB.NET lỗi thời bằng nền tảng TypeScript/Next.js hiện đại — trong 6 tuần thay vì 6 tháng, với đội 3 người và 85% code do AI tạo ra.

V
Bởi Ventra Rocket Team
·Đăng ngày 7 tháng 4, 2026
#Claude Code#AI#Enterprise#Legacy Migration#ERP

Khi một công ty sản xuất quy mô vừa tại Việt Nam tìm đến chúng tôi với hệ thống ERP VB.NET được xây dựng từ năm 2008, tình hình khá bi đát: 200+ màn hình, tài liệu gần như không có, và các lập trình viên gốc đã rời công ty từ nhiều năm trước. Ước tính thông thường để tái thiết hệ thống này là 6 tháng với đội 8 người. Chúng tôi đã làm trong 6 tuần với 3 người — và Claude Code là yếu tố then chốt.

Vấn Đề: Legacy Code Mà Không Ai Hiểu

Công ty vận hành toàn bộ hoạt động kinh doanh — lập kế hoạch sản xuất, kho hàng, nhân sự, hóa đơn — thông qua hệ thống ERP này. Nó hoạt động, nhưng rất vất vả. Mở rộng quy mô là điều không thể, không có truy cập mobile, và bất kỳ thay đổi nào cũng có thể gây lỗi hàng loạt.

Các thách thức cụ thể:

  • 200+ màn hình Windows Forms viết bằng VB.NET
  • ~180,000 dòng code trải rộng trên 400+ module
  • Cơ sở dữ liệu SQL Server 2005 không có ERD
  • Không có unit test, không có API layer, không có tài liệu
  • Không có kỹ sư nào trong đội từng làm việc với VB.NET

Giải Pháp: Claude Code Như Bộ Não Của Quá Trình Di Chuyển

Thay vì cố hiểu hệ thống legacy theo cách thủ công — điều sẽ mất nhiều tháng — chúng tôi dùng Claude Code như một công cụ phân tích để reverse-engineer toàn bộ codebase.

Giai Đoạn 1: Khảo Cổ Codebase (Tuần 1)

Chúng tôi đưa toàn bộ codebase VB.NET vào Claude Code và chạy phân tích hệ thống. Claude Code tạo ra một tài liệu kiến trúc 47 trang trong 4 giờ — ánh xạ từng màn hình đến mô hình dữ liệu, từng stored procedure đến chức năng nghiệp vụ, và mọi phụ thuộc giữa các module.

Ví dụ kết quả đầu ra:

{
  "entities": {
    "ProductionOrder": {
      "fields": ["order_id", "product_code", "quantity", "planned_date", "status"],
      "relationships": ["BOM", "WorkCenter", "MaterialRequest"],
      "forms": ["frmProdOrder", "frmProdOrderList", "frmProdOrderTracking"],
      "stored_procs": ["sp_CreateProdOrder", "sp_UpdateProdStatus", "sp_GetProdSchedule"]
    }
  }
}

Giai Đoạn 2: Kiến Trúc Di Chuyển (Tuần 1-2)

Sau khi hệ thống được ánh xạ đầy đủ, chúng tôi thiết kế kiến trúc mục tiêu:

| Legacy VB.NET | Stack Hiện Đại | |---|---| | Windows Forms | Next.js 14 (App Router) | | VB.NET business logic | TypeScript services | | SQL Server 2005 | PostgreSQL 16 | | Báo cáo thủ công | React + Recharts dashboards | | Không có API | tRPC + Zod validation |

Claude Code tạo ra toàn bộ schema migration từ SQL được suy luận, bao gồm foreign keys và indexes không tồn tại trong hệ thống cũ.

Giai Đoạn 3: Tạo Code Song Song (Tuần 2-5)

Đây là nơi đòn bẩy thực sự phát huy. Với kiến trúc đã được xác định, Claude Code làm việc đồng thời với 3 kỹ sư của chúng tôi trên các module khác nhau. 85% codebase cuối cùng do AI tạo ra. Nỗ lực của con người tập trung vào review logic nghiệp vụ, viết integration test, và xử lý các trường hợp đặc biệt.

export const productionOrderRouter = router({
  create: protectedProcedure
    .input(z.object({
      productCode: z.string(),
      quantity: z.number().positive(),
      plannedDate: z.date(),
      workCenterId: z.string().uuid(),
    }))
    .mutation(async ({ ctx, input }) => {
      const bom = await ctx.db.bom.findFirst({
        where: { productCode: input.productCode, isActive: true }
      });
      if (!bom) throw new TRPCError({
        code: 'BAD_REQUEST',
        message: 'Không tìm thấy BOM đang hoạt động'
      });

      return ctx.db.$transaction(async (tx) => {
        const order = await tx.productionOrder.create({
          data: { ...input, status: 'PLANNED' }
        });
        await tx.materialReservation.createMany({
          data: bom.components.map(c => ({
            productionOrderId: order.id,
            materialCode: c.materialCode,
            quantity: c.quantityPerUnit * input.quantity,
          }))
        });
        return order;
      });
    }),
});

Giai Đoạn 4: Di Chuyển Dữ Liệu (Tuần 5-6)

Claude Code viết các script di chuyển dữ liệu — suy luận kiểu dữ liệu, xử lý vấn đề mã hóa tiếng Việt (Windows-1258 sang UTF-8), và tạo các thủ tục rollback. Không mất một bản ghi nào trong quá trình di chuyển.

import uuid
from decimal import Decimal

STATUS_MAP = {
    'PL': 'PLANNED', 'IP': 'IN_PROGRESS',
    'DN': 'DONE', 'CX': 'CANCELLED'
}

def migrate_production_orders(legacy_conn, modern_conn):
    legacy_cur = legacy_conn.cursor()
    modern_cur = modern_conn.cursor()

    legacy_cur.execute("""
        SELECT ord_id, prod_code, qty, plan_dt, status_cd
        FROM tbl_prod_order
        WHERE del_flag = 0
    """)

    batch = []
    for row in legacy_cur:
        batch.append({
            'id': str(uuid.uuid4()),
            'product_code': row.prod_code.strip(),
            'quantity': Decimal(str(row.qty)),
            'planned_date': parse_vb_date(row.plan_dt),
            'status': STATUS_MAP.get(row.status_cd, 'UNKNOWN'),
        })
        if len(batch) >= 500:
            modern_cur.executemany(INSERT_SQL, batch)
            modern_conn.commit()
            batch = []

Kết Quả

| Chỉ Số | Trước | Sau | |--------|-------|-----| | Thời gian tái thiết | Ước tính 6 tháng | 6 tuần | | Quy mô đội cần thiết | 8 lập trình viên | 3 lập trình viên | | Code do AI tạo ra | 0% | 85% | | Mất dữ liệu khi di chuyển | — | Không có | | Truy cập mobile | Không có | Responsive đầy đủ | | Thời gian tải trang | Ứng dụng desktop | < 1.2 giây | | Chi phí hosting hàng tháng | Máy chủ on-prem | $180/tháng (cloud) |

Bài Học Quan Trọng

1. Context Window Của Claude Code Là Siêu Năng Lực Với Legacy System

Khả năng nạp cả một module — 5,000+ dòng VB.NET — và hỏi "cái này làm gì?" là một bước ngoặt. Reverse-engineering thủ công sẽ mất nhiều tuần cho mỗi module.

2. Định Nghĩa Pattern Mục Tiêu Trước Khi Tạo Code

Chúng tôi dành 2 ngày để định nghĩa các pattern boilerplate TypeScript/tRPC trước khi tạo bất kỳ thứ gì. Mỗi prompt Claude Code tiếp theo đều bao gồm các pattern đó. Chất lượng đầu ra cao hơn đáng kể.

3. Con Người Review, AI Tạo Code — Đừng Đảo Ngược

Các kỹ sư dành 70% thời gian để review đầu ra AI, không phải viết code. Kỹ sư phát hiện 3 lỗi logic nghiệp vụ quan trọng — các trường hợp đặc biệt mà code VB.NET xử lý đúng nhưng một cách tinh tế.

4. Không Mất Dữ Liệu Đòi Hỏi Xác Minh Kỹ Lưỡng

Chúng tôi chạy song song hệ thống cũ và mới trong 2 tuần, so sánh kết quả trên từng giao dịch. Claude Code hỗ trợ viết harness so sánh. Bước này không thể bỏ qua.

Kết Luận

Một dự án 6 tháng, 8 người trở thành dự án 6 tuần, 3 người. Claude Code xử lý phần nặng nhọc; kỹ sư xử lý phán đoán.

Với các công ty đang ngồi trên hệ thống legacy mà họ ngại đụng vào: các công cụ để hiện đại hóa chúng đã có sẵn. Ventra Rocket thực hiện quy trình này cho khách hàng doanh nghiệp trên khắp Việt Nam và Đông Nam Á. Liên hệ với chúng tôi để thảo luận về dự án hiện đại hóa hệ thống của bạn.

Bài viết liên quan