a. Ca sử dụng Cập nhật công việc
Chưa áp dụng mẫu
Hình 3.15: Biểu đồ lớp thiết kế thực thi ca sử dụng Tạo công việc mới Áp dụng mẫu Observer vào ca sử dụng tạo công việc mới
Màn hình giao diện chính có các đối tượng biểu diển các trạng thái xử lý công việc khác nhau. Các đối tượng menu liên kết thể hiện trạng thái cần cập nhật thông tin khi nào có công việc mới, có bao nhiêu công việc đang giải quyết, chưa giải quyết hoặc đã giải quyết xong trong tháng, màn hình thể hiện danh sách và nội dung công việc cần được đồng bộ với cơ sở dữ liệu để luôn thể hiện công việc và nội dung mới nhất. Khi có một công việc mới được tạo ra, hệ thống phải tự động thông báo và đồng bộ thông tin, nội dung, trạng thái trên các đối tượng liên quan của tất cả các máy tính trạm đang kết nối vào hệ thống.
Với việc thiết kế tập trung, để thực hiện được việc này, ta phải tạo các dịch vụ chạy ngầm trên máy chủ, theo định kỳ thời gian dịch vụ này sẽ tiến hành đồng bộ dữ liệu công việc mới nhất trên máy chủ và thể hiện lên các máy trạm. Với giải pháp này, khi không có sự thay đổi hay thêm mới công việc thì hệ thống vẫn tiến hành đồng bộ liên tục, điều này làm giảm thiểu dung lượng và tài nguyên của hệ thống để thực hiện các tác vụ khác.
Giải pháp thiết kế mẫu Observer cho phép giải quyết trường hợp này, khi một đối tượng CongViec thay đổi nội dung hoặc trạng thái thì tất cả các đối tượng liên quan cũng sẽ được thông báo và câp nhật theo. Việc gửi thông báo và cập nhật nội dung cho
các đối tượng liên quan được kiểm soát và thực hiện hoàn toàn chủ động. Sử dụng mẫu Observer, ta có thể thêm vào một hoặc nhiều đối tượng cần cập nhật và đồng bộ dữ liệu mà không cần sửa đổi lại lớp điều khiển.
Cấu trúc mẫu Observer:
Ta gắn các lớp giao diện cần cập nhật và đồng bộ các thay đổi trạng thái công việc cho lớp ConcreteObserver: FormMain, FormThongTinCongViec. Lớp Observer là lớp thuần ảo khai báo giao diện cập nhât trạng thái cho các lớp ConcreteObserver. Lớp CongViec tương ứng với lớp ConcreteSubject.
Hình 3.16. Biểu đồ lớp thiết kế thực thi ca sử dụng Tạo công việc mới áp dụng mẫu thiết kế Observer
Các đối tượng thuộc các lớp ConcreteObserver khi khởi tạo phải dựa trên một đối tượng thuộc lớp CongViec để lấy thông tin trạng thái hiện tại của đối tượng CongViec. Các đối tượng ConcreteObserver sẽ được thông báo để lấy thông tin về nội dung và trạng thái của đối tượng CongViec mỗi khi đối tượng lớp CongViec có sự thay đổi về nội dung và trạng thái.
Ở lớp DK_CongViec, tất cả các phương thức thay đổi nội dung và trạng thái của công việc như TaoMoi_CV(), Sua_CongViec(), Xoa_CongViec(), Xoa_ChiDao(), CapNhat_PhanViec(), Them_ChiDao(), Sua_ChiDao(), ThemND_GiaiQuyet(),
SuaND_GiaiQuyet(), XoaND_GiaiQuyet() đều có lời gọi thủ tục Notify() của lớp cha là Subject. Thủ tục Notify() của lớp Subject thực hiện duyệt tất cả các đối tượng ConcreteObserver thừa kế từ lớp Observer lưu trong mảng con trỏ ArrObserver và gọi hàm Update() để thực hiện cập nhật lại thông tin công việc.
Việc áp dụng mẫu thiết kế thực thi cho các ca sử dụng Sửa nội dung công việc, xoá công việc, Chỉ đạo công việc, Giải quyết công việc được biểu diễn tương tự mô hình trên.
b. Ca sử dụng Phân công việc
Chưa áp dụng mẫu
Biểu đồ lớp thiết kế tham gia thực thi ca sử dụng
Hình 3.19: Biểu đồ lớp thiết kế thực thi ca sử dụng Phân công việc Áp dụng mẫu State vào ca sử dụng Phân công việc
Các tác nhân tương tác vận hành hệ thống quản lý hoạt động giao công việc thuộc bốn cấp quản lý đó là: cấp Giám đốc quản lý và thao tác với công việc trong pham vi toàn công ty, cấp Lãnh đạo phòng/tổ/nhóm quản lý và thao tác với công việc trong pham vi tương ứng phòng/tổ/nhóm mà mình lãnh đạo, cấp Chủ trì công việc quản lý và thao tác với công việc trong pham vi hồ sơ công việc liên quan do mình chủ trì, cấp Nhân viên xem và giải quyết các công việc do lãnh đạo hoặc Chủ trì công việc phân.
Việc khởi tạo các đối tượng thuộc các lớp giao diện và trình diễn thông tin liên quan (FormMain (thực đơn chức năng), FormThongTinCongViec, FormGiaoViec,
FormBaoCaoThongKe, FormHienThiBaoCao) căn cứ vào cấp lãnh đạo tương ứng của tác nhân để hiển thị các thông tin phù hợp với cấp quản lý của tác nhân. Khi khởi tạo hoặc hiển thị thông tin các lớp giao diện này căn cứ vào cấp lãnh đạo của người dùng đang đăng nhập vào hệ thống để hiện thị thông tin và giao diện tương ứng với cấp quản
lý đó. Việc làm này dẫn đến có rất nhiều thủ tục và module có chức năng giống nhau được lặp trên các lớp giao diện khác nhau. Khi cần thay đổi chức năng của một cấp quản lý hay thêm/bớt một cấp quản lý ta phải sửa đổi lại toàn bộ source code của các lớp giao diện liên quan. Điều này làm chương trình không mềm dẽo lúc triển khai áp dụng thực tế, việc nâng cấp và bảo trì gặp nhiều khó khăn.
Giải pháp thiết kế áp dụng mẫu State khắc phục được các nhược điểm trên. Việc áp dụng mẫu State cho phép các đối tượng có thể tự điều chỉnh hành vi khi trạng thái của nó thay đổi.
Cấu trúc mẫu State:
Áp dụng mẫu thiết kế State vào ca sử dụng Phân công việc, ta gán các lớp giao diện FormThongTinCongViec, FormGiaoViec tương ứng với lớp Context ở sơ đồ trên. Lớp NhanVien tương ứng với lớp State ở sơ đồ trên. Các lớp StateLDCongTy,
StateLDPhong, StateChuTriCV, StateNhanVien được tạo ra tương ứng với các lớp ConcreteStateA, ConcreteStateB, ... Việc cài đặt các ứng xử về thao tác và trình diễn nội dung lên giao diện của các lớp thuộc ConText được thực hiện ở lớp trạng thái
ConcreteState tương ứng. Cụ thể phương thức HienThiDS_CongViec của lớp
FormThongTinCongViec khi được gọi nó sẽ gọi phương thức tương ứng của đối tượng trạng thái hiện tại thuộc một trong các lớp LanhDaoCongTy, LanhDaoPhong,
Hình 3.20. Biểu đồ lớp thiết kế thực thi ca sử dụng Phân công việc áp dụng mẫu thiết kế State
Tương tự, ta áp dụng mẫu State cho các ca sử dụng Tạo công việc, Sửa nội dung công việc, Xoá công việc, Chỉ đạo công việc.
3.5.3. Gói ca sử dụng phục vụ tra cứu, báo cáo, thống kê Ca sử dụng Tổng hợp báo cáo công việc
Chưa áp dụng mẫu
Hình 3.23: Biểu đồ lớp thiết kế thực thi ca sử dụng Báo cáo công việc Áp dụng mẫu Composite vào ca sử dụng tổng hợp báo cáo công việc
Mỗi công việc có trạng thái kết thúc và chưa kết thúc, có số lượng ngày, số lượng người giải quyết công việc. Một công việc có thể có nhiều công việc con, do đó để tổng hợp số nhân công, khối lượng thời gian thực hiện xong công việc cần phải duyệt qua từng đối tượng công việc con để tính toán và tổng hợp lên.
Mẫu Composite thực hiện gom các đối tượng vào trong một cấu trúc hình cây để thể hiện được cấu trúc tổng quát của nó. Nó cho phép chúng ta có sự giao tiếp giống nhau với các đối tượng riêng lẻ khác nhau. Ta chia các công việc thành hai loại Công việc đơn và Công việc phức. Công việc đơn là các công việc độc lập, không có công việc con. Công việc phức là các công việc có công việc con. Ta xây dựng thêm hai lớp CongViecDon và lớp CongViecGop, hai lớp này kế thừa từ lớp tổng quát hơn là lớp CongViec. Đối tượng CongViecGop có thể chứa đối tượng CongViecDon và
CongViecGop khác.
Ở biểu đồ cộng tác ca sử dụng báo cáo công việc, thủ tục HienThiBC() sẽ lấy danh sách các công việc thoả mãn điều kiện báo cáo và duyệt với mỗi công việc gọi các thủ tục TongHop_NhanCong(), TongHop_TrangThai (), HienThi_ThongTin().Với đối tượng thuộc lớp CongViecDon các hàm trên sẽ thực hiện và trả về một giá trị cụ thể. Với các đối tượng thuộc lớp CongViecGop các hàm trên sẽ duyệt hết tất cả các công việc con của nó, mỗi công việc con lại gọi hàm tương ứng để thực hiện.
Biểu đồ lớp thiết kế áp dụng mẫu Composite vào lớp CongViec để thực hiện báo cáo công việc như sau:
Hình 3.24: Áp dụng mẫu thiết kế Composite vào lớp CongViec
thực hiện tổng hợp, báo cáo, hiển thị thông tin trong ca sử dụng Báo cáo công việc Tương tự, ta áp dụng mẫu Composite cho các ca sử dụng Sửa nội dung công việc, Xoá công việc,Chỉ đạo công việc, Phân công việc để hiển thị danh sách công việc và thông tin công việc.
3.6. Thiết kế một số lớp
Trong bước này, ta thực hiện thiết kế một số lớp điển hình dựa trên hệ quản trị cơ sở dữ liệu SQLServer 2005.
3.6.1. Lớp giao diện
a. Lớp FormThongTinCongViec
a.1. Bảng thuộc tính
Tên Kiểu dữ liệu Mô tả
FormCha Nvarchar(50) Tên form gọi form này
TrangThai Smallint Trạng thái đang xử lý: 0: đang xem (giá trị mặc định), 1: Đang sửa, 2: Đang xoá, 3: Đang cập nhật bản ghi mới.
a.2. Bảng các phương thức
Tên phương thức Mô tả
HienThi_TT() Hiển thị thông tin chi tiết của một công việc
HienThiNV_GQ() Hiển thị danh sách Nhân viên được phân giải quyết công việc.
KiemTra_TT() Kiểm tra tính hợp lệ của các thông tin trên form chi tiết. Sua_CongViec() Gọi phương thức Sua_CongViec() của lớp DK_CongViec
để sửa nội dung công việc.
KhoiTaoFrmGiaiQuyet() Gọi phương thức KhoiTao() của lớp FrmGiaiQuyetCV để khởi tạo giao diện nhập thông tin giải quyết công việc. KhoiTaoFrmPhanViec() Gọi phương thức KhoiTao() của lớp FrmPhanViec để
khởi tạo giao diện nhập thông tin phân công việc. KhoiTaoFrmChiDao() Gọi phương thức KhoiTao() của lớp FrmChiDaoCV để
khởi tạo giao diện nhập thông tin chỉ đạo công việc.
b. Lớp FormGiaoViec
b.1. Bảng thuộc tính
Tên Kiểu dữ liệu Mô tả
FormCha Nvarchar(50) Tên form gọi form này
TrangThai Smallint Trạng thái đang xử lý: 0: đang xem (giá trị mặc định), 1: Đang sửa, 2: Đang xoá, 3: Đang cập nhật bản ghi mới.
b.2. Bảng các phương thức
Tên phương thức Mô tả
GetTrangThai() Lấy thông tin trạng thái KhoiTao() Khởi tạo giá trị các thuộc tính.
HienThiDS_ChiDao() Hiển thị danh sách các lần chỉ đạo công việc.
KiemTra_TT() Kiểm tra tính hợp lệ của các thông tin trên form trước khi cập nhật.
LayDS_ChiDao() Gọi phương thức LayDS_ChiDao() của lớp DK_CongViec để lấy danh sách các lần chỉ đạo.
Them_ChiDao() Gọi phương thức Them_ChiDao() của lớp DK_CongViec để thêm chỉ đạo mới
Sua_ChiDao() Gọi phương thức Sua_ChiDao() của lớp DK_CongViec để sửa nội dung chỉ đạo.
Xoa_ChiDao() Gọi phương thức Xoa_ChiDao() của lớp DK_CongViec để xoá chỉ đạo.
3.6.2. Lớp điều khiển
Trong bước này, ta thực hiện thiết kế một số lớp điều khiển trên môi trường VisualStudio .NET 2008.
a. Lớp DK_CongViec
a.1. Bảng thuộc tính
Tên Kiểu dữ liệu Mô tả
FormGoi String Tên form gọi form này a.2. Bảng các phương thức
Tên phương thức Mô tả
Set_FormGoi() Đặt giá trị cho thuộc tính FormGoi
TaoMoi_CV() Gọi phương thức TaoMoi_CV() của lớp CongViec để thêm công việc mới.
LayDS_CongViec() Gọi phương thức LayDanhSach() của lớp CongViec để lấy danh sách công việc.
LayTT_CongViec() Gọi phương thức LayThongTin() của lớp CongViec và
phương thức GetTen() của lớp LoaiCongViec để lấy thông tin về công việc. Gọi phương thức HienThi_TT() để hiển thị thông tin công việc lên form tương ứng.
LayDS_ChucDanhQL() Gọi phương thức LayDanhSach() của lớp ChucDanhQuanLy để lấy danh sách chức danh.
LayDS_ChiDao() Gọi phương thức LayDanhSach() của lớp ChiDao để lấy danh sách các lần chỉ đạo.
Them_ChiDao() Gọi phương thức Them() của lớp ChiDao để thêm thông tin lần chỉ đạo mới.
Sua_ChiDao() Gọi phương thức Sua() của lớp ChiDao để sửa thông tin chỉ đạo.
Xoa_ChiDao() Gọi phương thức Xoa() của lớp ChiDao để xoá chỉ đạo. LayND_GiaiQuyet() Gọi phương thức GetNoiDungGQ() của lớp GiaiQuyet để lấy
nội dung giải quyết công việc.
giải quyết mới.
SuaND_GQ() Gọi phương thức Sua() của lớp GiaiQuyet để sửa nội dung giải quyết.
HienThi_TT() Gọi phương thức HienThi_TT() của lớp có tên bằng giá trị của thuộc tính FormGoi.
HienThiNV_GQ() Gọi phương thức LayDS_QuanLyCV() của lớp
QuanLyCongViec, phương thức GetTenNhanVien() của lớp NhanVien, phương thức GetTenPhong() của lớp PhongBan. Gọi phương thức HienThiNV_GQ() của lớp
FrmTT_CongViec để hiển thị danh sách nhân viên được phân giải quyết công việc.
Sua_CongViec() Gọi phương thức Sua() của lớp CongViec để sửa thông tin công việc.
Xoa_CongViec() Gọi phương thức Xoa() của lớp CongViec, phương thức Xoa() của lớp QuanLyCongViec, phương thức Xoa() của lớp
GiaiQuyet, phương thức Xoa() của lớp ChiDao để xoá công việc và các thông tin liên quan.
CapNhat_PhanViec() Gọi phương thức CapNhat_PhanViec() của lớp QuanLyCongViec để cập nhật thông tin phân việc.
b. Lop DK_VeBieuDo
b.1. Bảng thuộc tính
Tên Kiểu dữ liệu Mô tả
TieuDe String Tiêu đề của biểu đồ
KieuBD Interger Kiểu biểu đồ
objCongViec CongViec Đối tượng lưu thông tin công việc tổng hợp trước lúc vẽ biểu đồ.
b.2. Bảng các phương thức
Tên phương thức Mô tả
VeBieuDo() Gọi phương thức LayDS_QuanHeCV() của lớp CongViec, phương thức LayDS_QuanLyCV() của lớp QuanLyCongViec, phương thức GetTenPhong() của lớp PhongBan, phương thức GetTenNhanVien() của lớp NhanVien để tổng hợp thông tin đưa vào biến thuộc tính objCongViec.
HienThiBieuDo() Gọi phương thức HienThiBD() của lớp Frm_HienThiBD để hiển thị biểu đồ.
3.6.3. Lớp thực thể
a. Lớp CongViec
a.1. Bảng thuộc tính
Tên Kiểu dữ liệu Mô tả
MaCongViec Int Mã công việc (trường tự động tăng) TenCongViec Nvarchar(255) Tên công việc
NoiDungCongViec Nvarchar(5000) Nội dung công việc
MaNguoiTao int Mã người tạo
DonViTinhKL Nvarchar(50) Đơn vị tính khối lượng. a.2. Bảng các phương thức
Tên phương thức Mô tả
TaoMoi_CV() + Đầu vào: Giá trị tất cả các thuộc tính của lớp. + Giá trị trả về: boolean
+Ý nghĩa: Tạo mới một công việc.
Sua() + Đầu vào: Giá trị các thuộc tính của lớp và Mã công việc cần sửa.
+Giá trị trả về: boolean
+Ý nghĩa: Sửa thông tin một công việc. Xoa() + Đầu vào: Mã công việc cần xoá
+Giá trị trả về: boolean
+Ý nghĩa: Xoá một công việc. LayThongTin() + Đầu vào: Mã công việc
+Giá trị trả về: Các thông tin của công việc
+Ý nghĩa: Lấy toàn bộ thông tin chi tiết của một công việc. LayDanhSach() + Đầu vào: Danh sách Mã công việc
+ Giá trị trả về: Danh sách công việc.
thuộc danh sách Mã đưa vào. Get_TT_PhanGQ() + Đầu vào: Mã công việc
+ Giá trị trả về: Tình trạng phân giải quyết
+Ý nghĩa: Lấy tình trạng phân giải quyết của công việc Get_TT_GQ() + Đầu vào: Mã công việc
+ Giá trị trả về: Tình trạng giải quyết
+Ý nghĩa: Lấy tình trạng giải quyết công việc Get_TenCV() + Đầu vào: Mã công việc
+ Giá trị trả về: Tên công việc
+Ý nghĩa: Lấy tên công việc có mã bằng đối số Get_DoKhan() + Đầu vào: Mã công việc
+ Giá trị trả về: Độ khẩn của công việc
+Ý nghĩa: Lấy độ khẩn của công việc có mã bằng đối số Get_TienDo() + Đầu vào: Mã công việc
+ Giá trị trả về: Tiến độ thực hiện công việc
+Ý nghĩa: Lấy thông tin tiến độ thực hiện công việc
b. Lớp NhanVien
b.1. Bảng thuộc tính
Tên Kiểu dữ liệu Mô tả
ID Int Số thứ tự Nhân viên(khóa chính)
Ma_NV Int Mã số nhân viên (là trường tự động tăng). HoVaTen Nvarchar(50) Họ và tên nhân viên
MaChucVu int Mã chức vụ công tác
DiaChi Nvarchar(255) Địa chỉ làm việc DienThoai Nvarchar(20) Số điện thoại liên hệ
Ma_Phong Int Mã phòng
b.2. Bảng các phương thức
Tên phương thức Mô tả
+ Giá trị trả về: boolean
+Ý nghĩa: Tạo mới một Nhân viên
Sua() + Đầu vào: Giá trị các thuộc tính của lớp và Mã nhân viên cần sửa.
+Giá trị trả về: boolean
+Ý nghĩa: Sửa thông tin một Nhân viên Xoa() + Đầu vào: Mã Nhân viên cần xoá
+Giá trị trả về: boolean
+Ý nghĩa: Xoá một Nhân viên. Get_TenNV() + Đầu vào: Mã Nhân viên
+Giá trị trả về: boolean
+Ý nghĩa: Tên viết tắt của Nhân viên có Mã số bằng đối số. Get_TenDD() + Đầu vào: Mã Nhân viên
+Giá trị trả về: boolean
+Ý nghĩa: Tên đầy đủ của Nhân viên có Mã số bằng đối số. Get_DinhDanh() + Đầu vào: Mã người dùng
+ Giá trị trả về: định danh của người dùng +Ý nghĩa: Lấy tên định danh của người dùng Get_Domain() + Đầu vào: Mã người dùng
+ Giá trị trả về: Tên domain
+Ý nghĩa: Lấy tên domain của người dùng Get_MatKhau() + Đầu vào: Mã người dùng
+ Giá trị trả về: mật khẩu của người dùng +Ý nghĩa: Lấy mật khẩu của người dùng Set_MatKhau() + Đầu vào: Mã người dùng, mật khẩu
+ Giá trị trả về: boolean
+Ý nghĩa: đặt lại mật khẩu cho người dùng, trả về True nếu đặt thành công, trả về False nếu không đặt được.
LayDanhSach() + Đầu vào: Mã phòng ban
+Ý nghĩa: Lấy toàn bộ danh sách Nhân viên có Mã phòng bằng giá trị đối số đưa vào.
LayThongTin() + Đầu vào: Mã Nhân viên