Sơ đồ tổ chức là yếu tố thiết yếu để hình dung cấu trúc của các đội, phòng ban và mối quan hệ báo cáo trong một công ty. Chúng giúp ban quản lý và nhân viên hiểu được cấp bậc và mối quan hệ giữa các vai trò trong tổ chức. Tự động tạo ra các sơ đồ này bằng C# cho phép các nhà phát triển tạo ra hình ảnh một cách động từ cơ sở dữ liệu nhân sự, các đội dự án hoặc danh bạ công ty mà không cần nỗ lực thiết kế thủ công trong Visio hoặc các công cụ vẽ sơ đồ khác.

Tutorial này giải thích cách tạo biểu đồ tổ chức trong C# một cách lập trình bằng cách sử dụng thư viện vẽ sơ đồ. Bạn sẽ học cách thêm các nút phân cấp, kết nối các hình dạng bằng các connector, và tự động bố trí biểu đồ bằng thuật toán CompactTree để có giao diện sạch sẽ và chuyên nghiệp.

Tại sao tạo biểu đồ tổ chức một cách lập trình?

  • Tự động hoá quy trình HR để tạo và cập nhật biểu đồ khi có sự thay đổi về nhân sự hoặc cấu trúc.
  • Tạo ra các sơ đồ phân cấp rõ ràng và tiêu chuẩn mà không cần vẽ thủ công trong Visio.
  • Tiết kiệm thời gian bằng cách tích hợp việc tạo biểu đồ vào các hệ thống hiện có như quản lý nhân viên hoặc bảng điều khiển báo cáo.
  • Đảm bảo thiết kế nhất quán bằng cách áp dụng chương trình các kiểu hình dạng, kết nối và quy tắc bố cục.
  • Xuất biểu đồ trực tiếp sang định dạng Visio (VSDX) để chia sẻ và chỉnh sửa thêm nếu cần.

Tạo biểu đồ tổ chức trong C#

  1. Thêm thư viện vẽ sơ đồ vào dự án C# của bạn để truy cập các API tạo và bố trí Visio.
  2. Khởi tạo một đối tượng Diagram mới và tải các hình dạng cơ bản cùng các kết nối từ tệp mẫu Visio.
  3. Xác định cấu trúc phân cấp hoặc bộ dữ liệu đại diện cho các mối quan hệ tổ chức.
  4. Thêm các hình dạng một cách động cho mỗi nút trong phân cấp và lưu trữ ID của chúng để ánh xạ kết nối.
  5. Sử dụng các kết nối để liên kết các hình dạng con với nút cha của chúng, tạo thành cây phân cấp.
  6. Áp dụng thuật toán bố trí tự động (chẳng hạn CompactTree) để sắp xếp các nút một cách gọn gàng.
  7. Lưu sơ đồ đã tạo ở định dạng Visio VSDX.
// Load masters from any existing diagram, stencil or template
string visioStencil = dataDir + "BasicShapes.vss";
const string rectangleMaster = "Rectangle";
const string connectorMaster = "Dynamic connector";
const int pageNumber = 0;
const double width = 1;
const double height = 1;
double pinX = 4.25;
double pinY = 9.5;

// Define values to construct the hierarchy
List<string> listPos = new List<string>(new string[] { 
    "0", "0:0", "0:1", "0:2", "0:3", "0:4", "0:5", "0:6", 
    "0:0:0", "0:0:1", "0:3:0", "0:3:1", "0:3:2", "0:6:0", "0:6:1" 
});

// Define a Hashtable to map the string name to long shape id
System.Collections.Hashtable shapeIdMap = new System.Collections.Hashtable();

// Create a new diagram
Aspose.Diagram.Diagram diagram = new Aspose.Diagram.Diagram(visioStencil);
diagram.Pages[pageNumber].PageSheet.PageProps.PageWidth.Value = 11;

// Add shapes for each hierarchy node
foreach (string orgnode in listPos)
{
    long rectangleId = diagram.AddShape(pinX++, pinY++, width, height, rectangleMaster, pageNumber);
    Aspose.Diagram.Shape shape = diagram.Pages[pageNumber].Shapes.GetShape(rectangleId);
    shape.Text.Value.Add(new Aspose.Diagram.Txt(orgnode));
    shape.Name = orgnode;
    shapeIdMap.Add(orgnode, rectangleId);
}

// Create connections between parent and child nodes
foreach (string orgName in listPos)
{
    int lastColon = orgName.LastIndexOf(':');
    if (lastColon > 0)
    {
        string parendName = orgName.Substring(0, lastColon);
        long shapeId = (long)shapeIdMap[orgName];
        long parentId = (long)shapeIdMap[parendName];
        Aspose.Diagram.Shape connector1 = new Aspose.Diagram.Shape();
        long connecter1Id = diagram.AddShape(connector1, connectorMaster, pageNumber);
        diagram.Pages[pageNumber].ConnectShapesViaConnector(parentId,
            Aspose.Diagram.Manipulation.ConnectionPointPlace.Right,
            shapeId, Aspose.Diagram.Manipulation.ConnectionPointPlace.Left,
            connecter1Id);
    }
}

// Auto layout CompactTree chart
Aspose.Diagram.AutoLayout.LayoutOptions compactTreeOptions = new Aspose.Diagram.AutoLayout.LayoutOptions
{
    LayoutStyle = Aspose.Diagram.AutoLayout.LayoutStyle.CompactTree,
    Direction = Aspose.Diagram.AutoLayout.LayoutDirection.DownThenRight,
    EnlargePage = false
};

diagram.Pages[pageNumber].Layout(compactTreeOptions);

// Save diagram
diagram.Save(dataDir + "ORGChart_out.vsdx", Aspose.Diagram.SaveFileFormat.Vsdx);

Ví dụ mã này tạo ra một cấu trúc tổ chức, kết nối các nút cha và con bằng các kết nối động, và áp dụng bố cục CompactTree tự động để có cấu trúc sạch sẽ. Mỗi hình dạng đại diện cho một nút tổ chức được gắn nhãn theo danh sách cấp bậc, và kết quả cuối cùng được lưu dưới dạng tệp Visio VSDX.

Kết luận

Tạo biểu đồ tổ chức trong C# cung cấp một cách năng động để trực quan hoá cấu trúc đội ngũ, hệ thống báo cáo và mối quan hệ giữa các phòng ban mà không cần vẽ thủ công trong Visio. Với bố cục tự động và quản lý kết nối, bạn có thể tạo ra các biểu đồ sạch sẽ, dễ đọc trực tiếp từ nguồn dữ liệu. Cách tiếp cận được trình bày ở trên đơn giản hoá báo cáo nhân sự, cải thiện tính nhất quán và cho phép tích hợp với quy trình tự động hoá kinh doanh.

See Also