Professional Documents
Culture Documents
Diễn giải:
Phục vụ bàn muốn thực hiện gọi món cho khách hàng phải đăng nhập vào hệ thống
=>usecase gọi món include usecase đăng nhập, sau đó để thực hiện gọi món đúng bàn
thì nhân viên phải thực hiện chọn bàn ăn đúng bàn của khác muốn gọi món => usecase
gọi món include usecase chọn bàn, và sau đó phục vụ bàn thực hiện nhập các thông tin
món ăn mà khách hàng yêu cầu như tên món ăn và số lượng món ăn => usecase gọi món
include ác usecase tìm món ăn và usecase nhập số lượng.
Mô tả chi tiết các usecase:
- Usecase đăng nhập : nhân viên phục vụ sử dụng tài khoản của mình để thực hiện đăng
nhập và hệ thống.
- Usecase chọn bàn : nhân viên thực hiện chọn bàn đúng bàn của khách hàng có yêu cầu
gọi món.
- Usecase tìm món ăn: nhân viên thực hiện tìm món ăn mà khách hàng yêu cầu trong hệ
thống và thực hiện chọn đúng món ăn mà khách hàng yêu cầu.
- Usecase nhập số lượng : nhân viên thực hiện nhập số lượng món ăn đúng như yêu cầu
của khách hàng
Kịch bản modul cá nhân và biểu đồ lớp thực thể toàn hệ thống
1. Kịch bản modul cá nhân (Modul gọi món):
Kịch bản chuẩn cho chức năng Gọi Món :
1. Nhân viên phục vụ A muốn thực hiện gọi món cho khách hàng B ở bàn mã số 03.
Nhân viên A click vào chức năng gọi món (sau khi đã đăng nhập vào hệ thống)
2. Giao diện chọn bàn hiện ra với danh sách bàn và số hiệu sổ xuống :
Quan hệ giữa các lớp thực thể được xây dựng như sau:
Một Nhahang có nhiều Ban, một Ban chỉ thuộc về một nhà hàng. Quan hệ giữa
Nhahang và Ban là quan hệ 1-n.
Một KhachHang có thể đặt nhiều Ban tại nhiều thời điểm khác nhau. Một Ban có
thể được đặt bởi nhiều khách hàng tại nhiều thời điểm khác nhau. Quan hệ giữa
KhachHang và Ban là quan hệ n-n. Do đó có thể bổ sung một lớp thực thể liên kết
giữa 2 đối tượng này là TTDatBan ( thông tin đặt bàn). Một KhachHang và một
Ban sẽ được xác định duy nhất một TTDatBan tại một thời điểm nhất định. Liên
kết này sẽ xác định thêm thông tin: giờ đặt, giảm giá.
Một KhachHang có thể có nhiều TTDatBan. Một Ban cũng có thể có nhiều
TTDatBan. Tuy nhiên tại một TTDatBan, KhachHang có thể đặt nhiều Ban( đại
diện khách đoàn). Do đó quan hệ giữa TTDatBan và Ban vẫn còn là n-n. Chúng ta
cần tách thành một lớp trung gian nữa là BanDat( thông tin bàn được đặt). Một
TTDatBan và một Ban xác định duy nhất một BanDat. Liên kết này xác định thêm
các thông tin: giờ đặt, giá đặt, giờ trả.
Một TTDatBan thanh toán 1 lần. Vậy quan hệ giữa TTDatBan và HoaDon là 1-1.
Một nhân viên thu ngân có thể lập nhiều hóa đơn khác nhau cho các TTDatBan
khác nhau. Do đó quan hệ giữa NhanVien và HoaDon là 1-n.
Một MonAn có thể được gọi bởi nhiều KhachHang khác nhau, tại nhiều DatBan
khác nhau. Nhưng một MonAn chỉ được thanh toán một lần( có thể với nhiều
đơn vị) tại một BanDat. Một BanDat có nhiều MonAn khác nhau: quan hệ giữa
BanDat và MonAn là n-n. Do đó đề xuất một lớp trung gian ở giữa là
MonAn_Sudung (thông tin món ăn được đặt). Liên kết này sẽ xác định thêm
thông tin: số lượng, khuyến mãi, tổng tiền.
Một Combo có thể gồm nhiều MonAn và một MonAn có thể thuộc nhiều Combo
khác nhau: quan hệ giữa Combo và MonAn là n-n. Do đó có thể bổ sung một lớp
thực thể hợp thành TTCombo (Thông tin combo).
Một Combo có thể được gọi bởi nhiều KhachHang khác nhau, tại nhiều DatBan
khác nhau. Nhưng một Combo chỉ được thanh toán một lần( có thể với nhiều
đơn vị) tại một BanDat. Một BanDat có nhiều Combo khác nhau: quan hệ giữa
BanDat và Combo là n-n. Do đó đề xuất một lớp trung gian ở giữa là
Combo_Sudung (thông tin món ăn được đặt). Liên kết này sẽ xác định thêm
thông tin: số lượng, khuyến mãi, tổng tiền.
SearchCombo() liên quan đến tham số vào : từ khóa tên combo chứa,
danh sách các combo liên quan đến thực thể Combo chức năng tìm
kiếm món ăn (SearchCombo()) là của lớp MonAn
Giao diện nhập số lượng món đã chọn hiện ra EnterQuantityView: ô nhập số
lượng, nút oke, bảng danh sách các món đã chọn gồm tên + số lượng + số tiền
tạm tính, nút tiếp tục chọn món, nút xác nhận
Lưu danh sách các món ăn/combo đã gọi: SaveFoodOrder()
SaveFoodOrder() liên quan đến các thuộc tính của MonAn và nó được lưu
vào bàn đặt của khách hàng chức năng lưu món ăn đã gọi
(SaveFoodOrder()) là của lớp BanDat
3. Biểu đồ lớp:
4. Kịch bản v.2 cho chức năng gọi món:
1. Nhân viên phục vụ bàn A nhập usename/pasword và click đăng nhập trên giao
diện LoginView. A muốn thực hiện gọi món cho khách hàng ở một bàn
2. Lớp LoginView gửi yêu cầu sang lớp NhanVien để kiểm tra đăng nhập
3. Lớp NhanVien kiểm tra đăng nhập
4. Lớp NhanVien gửi kết quả lại cho lớp LoginView
5. Lớp LoginView gọi lớp WaiterHomeView hiển thị
6. Lớp WaiterHomeView hiển thị cho phục vụ bàn
7. Nhân Viên chọn chức năng gọi món
8. Lớp WaiterHomeView gọi lớp SearchTableView hiển thị
9. Lớp SearchTableView hiển thị cho phục vụ bàn
10. Nhân viên gõ tên bàn và click tìm kiếm
11. Lớp SeachTableView gọi lớp Ban yêu cầu tìm kiếm
12. Lớp Ban thực hiện tìm kiếm
13. Lớp Ban trả lại kết quả cho lớp SeachTableView
14. Lớp SearchTableView hiển thị danh sách bàn cho nhân viên A
15. Nhân viên A click một bàn để gọi món
16. Lớp SearchTableView gọi lớp EnterFoodView hiển thị
17. Lớp EnterFoodView hiển thị
18. Nhân viên A hỏi khách hàng món ăn muốn gọi
19. Khách hàng trả lời danh sách món (kèm số lượng mỗi món) muốn gọi
20. Nhân viên A gõ tên một món ăn và click tìm kiếm
21. Lớp EnterFoodView gọi lớp MonAn yêu cầu tìm kiếm
22. Lớp MonAn thực hiện tìm kiếm
23. Lớp MonAn trả về kết quả cho lớp EnterFoodView
24. Lớp EnterFoodView hiển thị danh sách món ăn cho nhân viên A
25. Nhân viên A chọn một món
26. Lớp EnterFoodView gọi lớp EnterQuantityView hiển thị
27. Lớp EnterQuantityView hiển thị cho nhân viên A
28. Nhân viên A gõ số lượng + click oke
29. Lớp EnterQuantityView hiện thị bảng danh sách các món đã chọn gồm tên + số
lượng + số tiền tạm tính cho nhân viên A
30. Nhâp viên A click tiếp tục chọn món
31. Lớp EnterQuantity gọi lớp EnterFoodView hiển thị
32. Lớp EnterFoodView hiển thị cho nhân viên A ( Lặp lại các bước từ 20 đến 32 cho
đến khi nhập hết món ăn trong danh sách khách hàng gọi thì dừng lại (dừng ở
bước 29 khi nhập hết món) )
33. Nhân viên A đọc lại các món cho khách hàng xác nhận
34. Khách hàng xác nhận đúng
35. Nhân viên A click xác nhận
36. Lớp EnterQuantityView gọi đến lớp BanDat yêu cầu thực hiện lưu lại danh sách
các món đã gọi + số tiền
37. Lớp BanDat thực hiện lưu lại
38. Lớp BanDat trả lại cho lớp EnterQuantityView
39. Lớp EnterQuantityView thông báo gọi món thành công
40. Nhân viên A click nút oke của thông báo
41. Lớp EnterQuantityView gọi lớp WaiterHomeView hiển thị
42. Lớp WaiterHomeView hiển thị cho nhân viên A
Bước 1: Thêm ID cho các lớp thực thể không kế thừa từ lớp khác và chưa có ID gồm các
lớp NhaHang, TTDaBan, BanDat, MonAn_Sudung, Combo_Sudung, TTCombo, HoaDon
Bước 2: Gán kiểu dữ liệu cho các thuộc tính
Bước 3: Chuyển các quan hệ Association sang Aggregation. Ở đây có bốn quan hệ
Assiociation
1. Quan hệ giữa Ban, TTDatBan và BanDat: BanDat chứa thông tin về Ban và
TTDatBan chứa thông tin về BanDat
2. Quan hệ giữa BanDat, MonAn_Sudung, MonAn: MonAn_Sudung chứa thông tin
về MonAn và BanDat chứa thông tin MonAn_Sudung
3. Quan hệ giữa BanDat, Combo_Sudung, Combo: tương tự Combo_Sudung chứa
thông tin về Combo và BanDat chứa thông tin về Combo_Sudung
4. Quan hệ giữa MonAn, TTCombo và Combo: TTCombo chứa thông tin về MonAn
và Combo chứa thông tin về TTCombo
Bước 4 : Bổ sung thuộc tính cho các quan hệ Aggregation và Composition:
Bổ sung Cho NhaHang thuộc tính ban với kiểu dữ liệu là Ban[]
Bổ sung cho TTDatban các thuộc tính là khachhang : KhachHang, nhanvien : NhanVien,
bandat : BanDat[]
Bổ sung cho BanDat các thuộc tính monansd : MonAn_Sudung[], combosd:
Combo_Sudung[], ban: Ban
Bổ sung cho HoaDon các thuộc tính ttbandat : TTDanDat, nhanvien : NhanVien
Bổ sung cho Combo_Sudung các thuộc tính combo : Combo
Bổ sung cho MonAn_Sudung thuộc tính : monan : MonAn
Bổ sung cho TTCombo thuộc tính : monan: Monan
Bổ sung Combo thuộc tính : ttcombo : TTCombo[]
2.Thiết kế cơ sở dữ liệu
Input: biểu đồ lớp thực thể pha thiết kế.
Bước 1: 1 lớp 1 bảng CSDL.
CSDL gồm các bảng: NhaHang, KhachHang, NhanVien, Ban, MonAn, Combo, HoaDon,
TTDatBan, BanDat, MonAn_Sudung, Combo_Sudung, TKMonAn, TTCombo,
TTKhachHang, TKDoanhThu.
Bước 2: Với mỗi lớp, các thuộc tính không đối tượng thì là thuộc tính của bảng.
Bước 3: Chuyển quan hệ giữa số lượng giữa các lớp quan hệ số lượng giữa các bảng.
1 – 1 giữ nguyên/gộp lại.
1 – n giữ nguyên.
n – n tách thành nhiều quan hệ 1 – n.
Bước 4: Thêm khóa chính (PK): bảng có id PK.
Thêm khóa ngoại (FK): tblA – tblB có quan hệ 1 – n thì tblB phải có khóa ngoại tham
chiếu đến PK của tblA.
o tbtNhaHang và tblBan là quan hệ 1 – n tblBan có khóa ngoại là
idNhaHang.
o tblKhachHang và tblTTDatBan là quan hệ 1 - n, tblNhanVien và
tblTTDatBan là quan hệ 1 – n tblTTDatBan có các khóa ngoại là
idKhachHang, idNhanVien.
o tblNhanVien và tblHoaDon là quan hệ 1 – n, tblTTDatBan và tblHoaDon là
quan hệ 1 – n tblHoaDon có các khóa ngoại idNhanVien, idTTDatBan.
o tblBan và tblBanDat có quan hệ 1 – n, tblTTDatBan và tblDatBan có quan
hệ 1 – n tblBanDat có các khóa ngoại idBan, idTTDatBan.
o tblMonAn và tblMonAn_Sudung có quan hệ 1 – n, tblBanDat và
tblMonAn_Sudung có quan hệ 1 – n tblMonAn_Sudung có khóa ngoại
idMonAn, idBanDat.
o tblCombo và tblCombo_Sudung có quan hệ 1 – n, tblBanDat và
tblCombo_Sudung có quan hệ 1 – n tblCombo_Sudung có khóa ngoại
idCombo, idBanDat.
Ở đây ta thực hiện tách bạch thông tin và hành động của các lớp thực thể thành 2 lớp
riêng biệt : lớp thực thể thuần (lớp chỉ chứa các thông tin) và lớp điều khiển truy cập dữ
liệu DAO ( Data Access Object) chỉ chứa các hành động (phương thức). Khi có sự kiện
trên form, lớp giao diện sẽ gọi hàm actionPerformed(), hàm này sẽ tạo ra một đối tượng
lớp thực thể thuần để truyền vào khi gọi phương thức tương ứng của lớp điều khiển để
truy cập CSDL.
Như vậy ta sẽ có các lớp DAO:
- NhanVienDAO : chứa phương thức CheckLogin() của lớp NhanVien
- BanDatDAO: chứa 2 phương thức SearchTable() và SaveFoodOrder của lớp
BanDat
- MonAnDAO : chứa phương thức SearchFood() của lớp MonAn
- ComboDAO : chứa phương thức SearchCombo() của lớp Combo
Các lớp NhanVien, BanDat, MoAn, Combo sẽ chỉ còn chứa các thông tin (thuộc tính)
Các lớp LoginView, WaiterHomeView, SearchTableView, EnterFoodView,
EnterComboView, EnterQuantityView sẽ được đổi thành các lớp LoginFrm,
WaiterHomeFrm, SearchTableFrm, EnterFoodViewFrm, EnterComboViewFrm,
EnterQuantityFrm tương ứng, kế thừa lớp JFrame
Cụ thể ta có biểu đồ lớp phân tích tĩnh như sau:
2. Kịch bản v.3 cho chức năng gọi món
1. Nhân viên phục vụ bàn A nhập username và password và click đăng nhập trên
giao diện LoginFrm. A muốn thực hiện gọi món cho khách hàng
2. Hàm ActionPerformed() của lớp LoginFrm được gọi
3. Hàm ActionPerformed() gọi các phương thức của lớp NhanVien để gói thông tin
đăng nhập thành đối tượng NhanVien
4. Lớp NhanVien thực hiện đóng gói
5. Lớp NhanVien đóng gói xong trả về cho phương thức ActionPerformed()
6. Phương thức ActionPerformed() gửi đối tượng NhanVien đến NhanVienDAO gọi
phương thức CheckLogin()
7. CheckLogin() kiểm tra thông tin đăng nhập
8. CheckLogin() gọi các phương thức của lớp NhanVien để thực hiện đóng gói ( set
tên và chức vụ của nhân viên)
9. Lớp NhanVien thực hiện đóng gói
10. Lớp NhanVien đóng gói xong trả về phương thức CheckLogin()
11. CheckLogin() trả kết quả cho phương thức ActionPerformed()
12. Phương thức ActionPerformed() gọi lớp WaiterHomeFrm
13. Phương thức WaiterHomeFrm() được gọi
14. Giao diện tương ứng hiển thị cho nhân viên A
15. Nhân viên A click chọn chức năng gọi món
16. Phương thức ActionPerformed() được kích hoạt
17. Phương thức ActionPerformed() gọi lớp SearchTableFrm
18. Phương thức SearchTableFrm() được kích hoạt
19. Giao diện tương ứng hiển thị cho nhân viên A
20. Nhân viên A nhập tên bàn và click tìm kiếm
21. Phương thức ActionPerformed() được kích hoạt
22. Phương thức ActionPerformed() gọi phương thức SearchTable() của lớp
BanDatDAO
23. Phương thức SearchTable() thực hiện tìm bàn theo tên
24. Phương thức SearchTable() gọi các phương thức đóng gói của lớp BanDat để
đóng gói kết quả tìm kiếm
25. Lớp BanDat thực hiện đóng gói
26. Lớp BanDat đóng gói xong, trả đối tượng về cho phương thức SearchTable()
27. Phương thức SearchTable() trả kết quả cho phương thức ActionPerformed() của
lớp SearchTableFrm
28. Danh sách kết quả được hiển thị lên cho nhân viên
29. Nhân viên click 1 bàn trong danh sách để thực hiện gọi món
30. Phương thức ActionPerformed() được kích hoạt
31. Phương thức ActionPerformed() gọi lớp EnterFoodFrm
32. Phương thức EnterFoodFrm() được kích hoạt
33. giao diện tương ứng hiển thị cho nhân viên A
34. Nhân viên A hỏi khách hàng món ăn muốn gọi
35. Khách hàng trả lời danh sách món cần gọi (kèm theo số lượng mỗi món)
36. Nhân viên A nhập tên món ăn và click tìm kiếm
37. Phương thức ActionPerformed() được kích hoạt
38. Phương thức ActionPerformed() gọi phương thức SearchFood() của lớp
MonAnDAO
39. Phương thức SearchFood() thực hiện tìm món ăn theo tên
40. Phương thức SearchFood() gọi các phương thức đóng gói của lớp MonAn để
đóng gói kết quả tìm kiếm
41. Lớp MonAn thực hiện đóng gói
42. Lớp MonAn đóng gói xong, trả đối tượng về cho phương thức SearchFood()
43. Phương thức SearchFood() trả kết quả về cho phương thức ActionPerformed()
của lớp EnterFoodFrm
44. Danh sách kết quả được hiển thị cho nhân viên A
45. Nhân viên A click chọn một món
46. Phương thức ActionPerformed() được kích hoạt
47. Phương thức ActionPerformed() gọi đến lớp EnterQuantityFrm
48. Phương thức EnterQuantityFrm() được kích hoạt
49. giao diện tương ứng hiển thị cho nhân viên A
50. Nhân viên A thực hiện nhập số lượng của món tương ứng và click oke
51. Phương thức ActionPerformed() được kích hoạt
52. Danh sách kết quả các món đã gọi được hiển thị
53. Nhân viên click tiếp tục chọn món
54. Phương thức ActionPerformed() gọi lại lớp EnterFoodFrm
55. Lớp EnterFoodFrm hiển thị lại cho nhân viên nhập tiếp món ăn (Lặp các bước 36
đến 55 cho đến khi nhập hết món ăn mà khách hàng cần gọi)
56. Nhân viên đọc lại cho khách hàng xác nhận
57. Khách hàng xác nhận đúng, đủ
58. Nhân viên click confirm
59. Phương thức ActionPerformed() gọi đến phương thức SaveFoodOrder() của lớp
BanDanDAO để lưu lại các món ăn đã gọi
60. Phương thức SaveFoodOrder() thực hiện lưu lại thông tin các món ăn đã được gọi
vào cơ sở dữ liệu
61. SaveFoodOrder() lưu xong, trả lại quyền điều khiển về cho phương thức
ActionPerformed()
62. Phương thức ActionPerformed() hiện thông báo lưu thành công
63. Nhân viên click oke ở thông báo
64. Phương thức ActionPerformed() gọi lớp WaiterHomeFrm
65. Lớp WaiterHomeFrm hiển thị lại cho nhân viên A
3. Biểu Đồ Sequence Diagram: