5. Nhiệm vụ nghiên cứu
4.2. Triển khai Activiti 5.9 để mô hình hóa quy trình nghiệp vụ bằng BPMN 2.0
BPMN 2.0
Sau khi download và cài đặt công cụ Activiti 5.9 ta có thể mô hình hóa các quy trình nghiệp vụ cụ thể. Activiti cho phép ngƣời sử dụng có thể vẽ mô hình các quy trình nghiệp vụ trƣớc sau đó có thể thực thi các quy trình đó một cách tự động. Các luồng dữ liệu, các công việc sẽ đƣợc hệ thống tự động chuyển giao tới các ngƣời sử dụng trong hệ thống theo mô hình nghiệp vụ chúng ta đã xây dựng trƣớc đó.
Ví dụ nhƣ mô hình nghiệp vụ xin nghỉ học của một học sinh: Học sinh gửi đơn xin phép nghỉ học tới giáo viên. Giáo viên nhận đƣợc đơn xin phép của học sinh đó sẽ gửi lại thông báo cho phép học sinh đó đƣợc nghỉ học hoặc không.
Ta có thể sử dụng nhiều phƣơng pháp để mô hình hóa, nhƣng tiện dụng nhất có thể sử dụng trình cắm thêm Activiti dành cho Eclipse.
Sau khi đã cài đặt, ta tiến hành mô hình hóa quy trình sử dụng các ký pháp của BPMN 2.0 trên Eclipse:
73
Hình 4.5 Mô hình hóa quy trình bằng BPMN 2.0 trên Eclipse
Sau khi đã có quy trình đƣợc mô hình hóa sẽ tự động sinh ra file dạng *.bpmn20.xml. Ta sẽ sử dụng file này để thực thi tự động quy trình trên bằng công cụ Activiti Explorer.
Đăng nhập vào Activiti Explorer bằng user thuộc nhóm có quyền “security- role” ( user mặc định là kermit cùng với password tƣơng ứng).
74
Hình 4.6 Đăng nhập bằng quyền quản trị hệ thống
Sau đó chọn Manager Deployments Upload new
Hình 4.7 Tải thêm quy trình vào Activiti Explorer
Chúng ta tìm đến file *.bpmn20.xml đã tạo ra lúc trƣớc. Activiti sẽ tự động phân tích nội dung và đƣa quy trình đó vào danh sách các quy trình hiện có. Ngoài
75
ra Activiti tự phân tích và tạo ra file ảnh của quy trình dạng *.png ( trong phần Resources)
Hình 4.8 Màn hình quản lý các quy trình hiện có
Để tiến hành khởi động một quy trình, khi chạy chƣơng trình Activiti Explorer và đăng nhập vào màn hình chính chúng ta chọn menu “Process” (đối với tất cả các user ). Chƣơng trình sẽ hiển thị các quy trình nghiệp vụ mà ta đã mô hình trƣớc đó. Để thực thi các mô hình đó tự động chúng ta nhấp chuột chọn “Start process” tƣơng ứng với quy trình nghiệp vụ mà ta muốn thực thi tự động.
76
Hình 4.9 Màn hình khởi động quy trình đã mô hình hóa bằng BPMN 2.0
4.3. Sử dụng công cụ Activiti tự động hóa một số quy trình nghiệp vụ
4.3.1. Quy trình nghiệp vụ xin nghỉ phép cho giáo viên
77
Nội dung các event, user task chính trong file XinNghiPhep.bpmn20.xml
<startEvent id="yeucau" activiti:initiator="TenGV"> <extensionElements>
<activiti:formProperty id="SoNgayNghi" name="Số ngày nghỉ" type="long" value="1" required="true"/>
<activiti:formProperty id="NgayBatDau" name="Ngày bắt đầu nghỉ (dd-MM-yyy)" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" />
<activiti:formProperty id="LyDoNghi" name="Lý do" type="string" />
</extensionElements> </startEvent>
<sequenceFlow id="flow1" sourceRef="yeucau" targetRef="XuLyYeuCau" />
<userTask id="XuLyYeuCau" name="Xử lý yêu cầu xin nghỉ phép" > <documentation>
${TenGV} muốn nghỉ ${SoNgayNghi} ngày phép (Lý do: ${LyDoNghi}).
</documentation> <extensionElements>
<activiti:formProperty id="ChoPhep" name="Bạn có cho phép nghỉ" type="enum" required="true">
<activiti:value id="true" name="Cho phép" />
<activiti:value id="false" name="Không cho phép" /> </activiti:formProperty>
<activiti:formProperty id="LyDoChoPhep" name="Lý do" type="string" /> </extensionElements> <potentialOwner> <resourceAssignmentExpression> <formalExpression>bangiamhieu</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask>
<sequenceFlow id="flow2" sourceRef="XuLyYeuCau" targetRef="QuyetDinhChoPhep" />
<exclusiveGateway id="QuyetDinhChoPhep" name="Cho phép?" /> <sequenceFlow id="flow3" sourceRef="QuyetDinhChoPhep"
targetRef="ThongBaoChoPhep">
<conditionExpression xsi:type="tFormalExpression">${ChoPhep == 'true'}</conditionExpression>
</sequenceFlow>
<task id="ThongBaoChoPhep" name="Gửi Email thông báo đã cho phép nghỉ" />
<sequenceFlow id="flow4" sourceRef="ThongBaoChoPhep" targetRef="KetThuc1" />
<endEvent id="KetThuc1" />
78
<sequenceFlow id="flow5" sourceRef="QuyetDinhChoPhep" targetRef="SuaYeuCauXinNghi">
<conditionExpression xsi:type="tFormalExpression">${ChoPhep == 'false'}</conditionExpression>
</sequenceFlow>
<userTask id="SuaYeuCauXinNghi" name="Thay đổi yêu cầu nghỉ phép">
<documentation>
Ban giám hiệu không đồng ý cho bạn nghỉ ${SoNgayNghi} ngày.
Lý do: ${LyDoChoPhep} </documentation>
<extensionElements>
<activiti:formProperty id="SoNgayNghi" name="Số ngày nghỉ" value="${SoNgayNghi}" type="long" required="true"/>
<activiti:formProperty id="NgayBatDau" name="Ngày bắt đầu nghỉ (dd-MM-yyy)" value="${NgayBatDau}" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" />
<activiti:formProperty id="LyDoNghi" name="Lý do" value="${LyDoNghi}" type="string" />
<activiti:formProperty id="GuiLaiYeuCau" name="Gửi lại yêu cầu xin nghỉ phép?" type="enum" required="true">
<activiti:value id="true" name="Có" /> <activiti:value id="false" name="Không" /> </activiti:formProperty> </extensionElements> <humanPerformer> <resourceAssignmentExpression> <formalExpression>${TenGV}</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask>
Sau khi mô hình hóa quy trình bằng BPMN 2.0, chúng ta đƣa vào hệ thống Activiti Explorer. Trong hệ thống đã đƣợc cài đặt sẵn các user gồm:
Hiệu trƣởng (hieutruong); Hiệu phó 1 (hieupho1); Hiệu phó 2 (hieupho2) nằm trong group Ban giám hiệu (bangiamhieu).
Giáo viên 1(giaovien1); Giáo viên 2 (giaovien2) nằm trong group Giáo viên(giaovien).
Giáo vụ 1 (giaovu1) nằm trong group Giáo vụ (giaovu)
79
Giáo viên 2 muốn xin nghỉ phép 5 ngày để đi công tác Sài Gòn, việc đầu tiên là đăng nhập vào hệ thống.
Hình 4.11 Giáo viên đăng nhập để xin nghỉ phép
Hình 4.12 Màn hình chính Activiti Explorer
Sau khi đã đăng nhập vào hệ thống, chọn Process để tìm quy trình Xin nghỉ phép
80
Chọn quy trình Xin nghỉ phép và bấm nút Start process
Khi đó, một form sẽ hiện ra yêu cầu nhập các thông tin về Số ngày muốn nghỉ, Ngày bắt đầu, lý do xin nghỉ.
Hình 4.14 Hoàn thiện thông tin xin nghỉ
Khi nhập các thông tin xong, Giáo viên 2 sẽ bấm nút Start process.
Nhƣ trong quy trình xin nghỉ phép, khi quy trình bắt đầu, thông tin xin nghỉ phép sẽ đƣợc kiểm duyệt bởi Ban giám hiệu. Do đó, công việc tiếp theo là của group Ban giám hiệu (bangiamhieu)
81
Hình 4.15 Người quản lý đăng nhập
Hiệu trƣởng/ Ban giám hiệu xét duyệt:
Khi thành viên trong Ban giám hiệu đăng nhập vào hệ thống (ở đây là Hiệu trƣởng)
Trong mục Queued: Tiến trình đang chờ xử lý
Hình 4.16 Màn hình chính Activiti Explorer của người quản lý
Vì Hiệu trƣởng nằm trong 2 nhóm nên sẽ hiển thị công việc xử lý theo từng nhóm:
82 Hiển thị các công việc đang chờ đƣợc nhận xử lý
Hình 4.18 Nhận việc xử lý yêu cầu xin nghỉ phép
Để nhận xử lý công việc này, Hiệu trƣởng bấm vào nút Claim, khi đó công việc sẽ đƣợc chuyển sang Inbox.
83
Hình 4.19 Xử lý yêu cầu và hoàn thành
Nếu BGH không đồng ý, kèm thêm lý do, giaovien2 sẽ nhận đƣợc công việc là thay đổi yêu cầu của mình.
Hình 4.20 Nhận lại yêu cầu thay đổi
84
Hình 4.21 Gửi lại yêu cầu
Tiếp theo quy trình, BGH lại nhận đƣợc một yêu cầu xin nghỉ mới
Hình 4.22 GV gửi lại yêu cầu đã sửa
85
4.3.2. Quy trình nghiệp vụ xin miễn giảm học phí
Hình 4.23 Quy trình nghiệp vụ xin miễn giảm học phí
Nội dung các event và user task chính trong file XinMienGiamHocPhi.bpmn20.xml <startEvent id="HSYeuCau" activiti:initiator="TenHS">
<extensionElements>
<activiti:formProperty id="HotenHS" name="Họ tên đầy đủ" type="string" required="true"/>
<activiti:formProperty id="Lop" name="Lớp" type="string" required="true"/>
<activiti:formProperty id="NgaySinh" name="Ngày sinh" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" /> <activiti:formProperty id="Doituong" name="Đối tượng miễn giảm" type="string" required="true" />
</extensionElements> </startEvent>
<userTask id="GVCNXuLyHSYeuCau" name="GVCN Xử lý yêu cầu xin miễn giảm học phí" >
<documentation>
Học sinh ${HotenHS} tại lớp ${Lop} muốn xin miễn giảm học phí theo diện đối tượng ${Doituong}.
</documentation> <extensionElements>
<activiti:formProperty id="GVCNDuyet" name="GVCN Duyệt" type="enum" required="true">
<activiti:value id="true" name="Duyệt" />
<activiti:value id="false" name="Không Duyệt" /> </activiti:formProperty>
<activiti:formProperty id="LyDoGVCNDuyet" name="Lý do" type="string" />
86
<activiti:formProperty id="TenGVDuyet" name="Họ tên GVCN duyệt" type="string" required="true"/>
</extensionElements> <potentialOwner> <resourceAssignmentExpression> <formalExpression>GVCN</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask>
<userTask id="BGHXuLyGVYeuCau" name="BGH Xử lý yêu cầu xin miễn giảm học phí" >
<documentation>
Học sinh ${HotenHS} tại lớp ${Lop} muốn xin miễn giảm học phí theo diện đối tượng ${Doituong} (Đã được GVCN ${TenGVDuyet} phê duyệt với lý do: ${LyDoGVCNDuyet}).
</documentation> <extensionElements>
<activiti:formProperty id="BGHDuyet" name="BGH Duyệt" type="enum" required="true">
<activiti:value id="true" name="Duyệt" />
<activiti:value id="false" name="Không Duyệt" /> </activiti:formProperty>
<activiti:formProperty id="LyDoBGHDuyet" name="Lý do" type="string" /> </extensionElements> <potentialOwner> <resourceAssignmentExpression> <formalExpression>bangiamhieu</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask>
Sau khi mô hình hóa quy trình bằng BPMN 2.0, chúng ta đƣa vào hệ thống Activiti Explorer.
Quy trình thực hiện nhƣ sau:
Học sinh 1 muốn làm hồ sơ xin miễn giảm học phí, việc đầu tiên là đăng nhập vào hệ thống
87
Hình 4.24 Học sinh đăng nhập vào hệ thống
Trong màn hình cá nhân, vào mục Process và khởi động quy trình Xin miễn giảm học phí:
Hình 4.25 Chọn quy trình Xin miễn giảm học phí
88
Hình 4.26 Điền đầy đủ thông tin vào form khởi động
Sau khi bấm nút Start process, quy trình đƣợc bắt đầu.
Hình 4.27 Quy trình đã được khởi động
89
Hình 4.28 GVCN nhận phần việc của mình
Để xử lý, GVCN bấm vào nút Claim. Khi đó công việc sẽ chuyển vào Inbox của GVCN. GVCN sẽ điền vào form bên dƣới để hoàn thành phần nhiệm vụ của mình trong quy trình. Có thể tải thêm tài liệu đính kèm trong phần Related content.
Hình 4.29 GVCN Xử lý công việc
Bƣớc cuối trong quy trình là Ban giám hiệu duyệt:
90
Hình 4.30 Quy trình chuyển tiếp công việc đến BGH
Thông tin đƣợc mô tả cụ thể qua từng bƣớc của quy trình. Để xử lý, Hiệu phó 1 bấm vào nút Claim.
Hình 4.31 BGH Xử lý công việc
Bƣớc cuối của quy trình, Hiệu phó quyết định Duyệt và hoàn thành công việc của mình.
91
4.3.3. Quy trình đề nghị thanh toán Dạy trung tâm
Hình 4.32 Quy trình đề nghị thanh toán tiền dạy trung tâm
Một vài event và user task chính trong quy trình:
<startEvent id="ThanhToanTrungTam" name="Start" activiti:initiator="IDGV">
<extensionElements>
<activiti:formProperty id="TenGV" name="Tên Giáo viên" type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="TenTrungTam" name="Tên Trung tâm" type="string" required="true"></activiti:formProperty> <activiti:formProperty id="MonHoc" name="Môn"
type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="SoTiet" name="Số tiết đã thực hiện" type="long" required="true"></activiti:formProperty>
<activiti:formProperty id="Lop" name="Lớp dạy" type="string" required="true"></activiti:formProperty> <activiti:formProperty id="TuNgay" name="Từ ngày" type="date" datePattern="dd-MM-yyyy"
required="true"></activiti:formProperty>
<activiti:formProperty id="DenNgay" name="Đến ngày" type="date" datePattern="dd-MM-yyyy"
required="true"></activiti:formProperty> </extensionElements>
</startEvent>
<userTask id="GiaoVuXuLy" name="Giáo vụ xử lý yêu cầu" activiti:candidateGroups="giaovu">
<documentation>Giáo viên ${TenGV} yêu cầu thanh toán tiền dạy trung tâm ${TenTrungTam}.
Thời gian: Từ ${TuNgay} đến ${DenNgay} Môn học: ${MonHoc}
Lớp: ${Lop}
92 <extensionElements>
<activiti:formProperty id="ChuyenDaoTao" name="Đồng ý chuyển Đào tạo" type="enum" required="true">
<activiti:value id="true" name="Đồng ý"></activiti:value>
<activiti:value id="false" name="Chưa đủ thông tin"></activiti:value>
</activiti:formProperty>
<activiti:formProperty id="GiaoVuLyDo" name="Lý do" type="string" required="true"></activiti:formProperty> </extensionElements>
</userTask> <userTask id="usertask1" name="Giáo vụ yêu cầu nhập lại" activiti:candidateUsers="${IDGV}">
<documentation>Yêu cầu của bạn bị trả về.
Lý do đưa ra của Giáo vụ: ${GiaoVuLyDo}</documentation> <extensionElements>
<activiti:formProperty id="TenGV" name="Tên Giáo viên" type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="TenTrungTam" name="Tên Trung tâm" type="string" required="true"></activiti:formProperty> <activiti:formProperty id="MonHoc" name="Môn"
type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="SoTiet" name="Số tiết đã thực hiện" type="long" required="true"></activiti:formProperty>
<activiti:formProperty id="Lop" name="Lớp dạy" type="string" required="true"></activiti:formProperty> <activiti:formProperty id="TuNgay" name="Từ ngày" type="date" datePattern="dd-MM-yyyy"
required="true"></activiti:formProperty>
<activiti:formProperty id="DenNgay" name="Đến ngày" type="date" datePattern="dd-MM-yyyy"
required="true"></activiti:formProperty> </extensionElements>
</userTask>
<userTask id="usertask2" name="Đào tạo xử lý" activiti:candidateGroups="QLDaoTao">
<documentation>Giáo viên ${TenGV} yêu cầu thanh toán tiền dạy trung tâm ${TenTrungTam}.
Thời gian: Từ ${TuNgay} đến ${DenNgay} Môn học: ${MonHoc}
Lớp: ${Lop}
Số tiết: ${SoTiet}</documentation> <extensionElements>
<activiti:formProperty id="KiemTra" name="Kiểm tra đối chiếu với thời khóa biểu, lịch dạy" type="enum" required="true"> <activiti:value id="true" name="Dạy đúng,
đủ"></activiti:value>
<activiti:value id="false" name="Có sai sót"></activiti:value>
</activiti:formProperty>
<activiti:formProperty id="DaoTaoLyDo" name="Lý do" type="string"></activiti:formProperty>
93 </extensionElements>
</userTask>
<userTask id="usertask4" name="Đào tạo yêu cầu nhập lại" activiti:candidateUsers="${IDGV}">
<documentation>Yêu cầu của bạn bị trả về.
Lý do đưa ra của phụ trách Đào tạo: ${DaoTaoLyDo}</documentation> <extensionElements>
<activiti:formProperty id="TenGV" name="Tên Giáo viên" type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="TenTrungTam" name="Tên Trung tâm" type="string" required="true"></activiti:formProperty> <activiti:formProperty id="MonHoc" name="Môn"
type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="SoTiet" name="Số tiết đã thực hiện" type="long" required="true"></activiti:formProperty>
<activiti:formProperty id="Lop" name="Lớp dạy" type="string" required="true"></activiti:formProperty> <activiti:formProperty id="TuNgay" name="Từ ngày" type="date" datePattern="dd-MM-yyyy"
required="true"></activiti:formProperty>
<activiti:formProperty id="DenNgay" name="Đến ngày" type="date" datePattern="dd-MM-yyyy"
required="true"></activiti:formProperty> </extensionElements>
</userTask>
Quy trình đƣợc thực hiện nhƣ sau:
Giáo viên cần đề nghị thanh toán đăng nhập vào hệ thống và chọn quy trình
Hình 4.33 GV chọn quy trình Thanh toán Dạy trung tâm
Tại màn hình khởi động quy trình, ngƣời yêu cầu sẽ phải nhập một số thông tin cần thiết liên quan:
94
Hình 4.34 GV nhập các thông tin để tiến hành thanh toán
Sau khi khởi động quy trình, các thông tin này sẽ đƣợc hệ thống gửi đến giáo vụ để soát, đối chứng lần 1:
Hình 4.35 Công việc xuất hiện trong hàng chờ của giáo vụ
95
Hình 4.36 Giáo vụ xử lý yêu cầu
Trong trƣờng hợp này, giáo viên đã gửi thiếu file điểm nên giáo vụ đã yêu cầu gửi lại. Giáo viên sẽ nhận đƣợc yêu cầu này và hoàn thành:
96
Để đính kèm tài liệu, chọn dấu + ở Related content. Sau đó chọn tài nguyên là web link hay file có trong máy:
Hình 4.38 Tải lên tài nguyên đính kèm
Sau đó bấm vào Complete Task để chuyển lại yêu cầu cho giáo vụ.
Giáo vụ sẽ nhận lại yêu cầu, và đã có thêm file mềm nhƣ yêu cầu (ở khu vực Related content):
97
Sau khi giáo vụ đã hoàn thành việc của mình, quy trình tiếp tục với phần việc cuả quản lý đào tạo:
Hình 4.40 Quản lý đào tạo nhận việc
Quản lý đào tạo sẽ hoàn thành việc kiểm tra, đối chiếu và đồng ý phê duyệt để Thủ quỹ thanh toán:
98