TRƯỜNG ĐẠI HỌC MỞ HÀ NỘITRUNG TÂM ĐÀO TẠO ELEARNING ---BÁO CÁO BÀI TẬP LỚN MÔN: LẬP TRÌNH HƯỚNG SỰ KIỆN Xây dựng phần mềm quản lý thu phí cấp nước sạch Sinh viên thực hiện: lớp CDT315 L
Trang 1TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI
TRUNG TÂM ĐÀO TẠO ELEARNING
-BÁO CÁO BÀI TẬP LỚN
MÔN: LẬP TRÌNH HƯỚNG SỰ KIỆN
Xây dựng phần mềm quản lý thu phí cấp nước sạch
Sinh viên thực hiện: lớp CDT315
Lưu Công Bằng Nghiêm Đình Hiệp Hoàng Xuân Thắng Bùi Như Anh
Hà Nội, năm 2022
Trang 2LỜI MỞ ĐẦU
Ngày nay công nghệ phần mềm đã trở nên phổ biến và có ảnh hưởng sâu rộng tới thói quen, sinh hoạt, giải trí và làm việc của nhiều người Cùng với sự phát triển nhanh chóng của công nghệ thì việc số hoá các nghiệp vụ liên quan đến mua và bán hàng hóa, phục vụ giải quyết công việc cho mọi người ngày càng đa dạng và phát triển hơn Các ứng dụng ngày càng trở nên phổ biến Trước nhu cầu đó, cùng
với yêu cầu môn học, nhóm chúng em quyết định chọn đề tài Xây dựng phần mềm quản lý thu phí cấp nước sạch.
Với đề tài và môn học này, nhóm xin chân thành cảm ơn sự giúp đỡ tận tình của các thầy cô Song, do còn nhiều hạn chế đề tài nhóm xây dựng không tránh khỏi những thiếu sót Rất mong được thầy cô và các bạn đóng góp ý kiến để chương trình ngày càng hoàn thiện và được đưa vào sử dụng.
Trân trọng cảm ơn!
Hà Nội, 15/11/2022
Nhóm thực hiện.
2
Trang 3Mục Lục
Chương 1: Giới thiệu chung 5
1 Giới thiệu bài toán 5
a Mô tả 5
b Giải pháp 5
2 Yêu cầu: 5
a CSDL 5
b Phần mềm 6
3 Phân công nhiệm vụ 6
Tuần 1: 6
Tuần 2: 6
Tuần 3: 6
Chương 2: Xác định yêu cầu 7
1 Khảo sát yêu cầu 7
Chương 3: Phân tích & Thiết kế 8
1 Đối tượng của phần mềm 8
Admin 8
User 8
2 Đặc điểm 8
3 Các module 8
a Module nhân viên 8
b Module khách hàng 8
c Module hợp đồng 8
d Module Hoá đơn 9
e Module Báo cáo 9
4 Thiết kế hệ thống 9
a Thông tin đầu vào: 9
b Thông tin đầu ra: 9
5 Tác nhân 9
6 Thiết kế Database 10
Chương 4 Một số chức năng chính 11
1 Mã nguồn 11
a Cấu trúc thư mục 11
b Màn hình đăng nhập 11
c Màn hình chính 12
d Quản lý nhân viên 15
e Quản lý khách hàng 19
f Quản lý hợp đồng 24
g Quản lý Hoá đơn 30
h Báo cáo 35
Chỉ số tiêu thụ 35
Khách hàng sử dụng nhiều nhất 37
2 Giao diện 40
a Màn hình đăng nhập 40
b Màn hình chính 40
c Quản lý nhân viên 41 Page4
3
Trang 4d Quản lý khách hàng 41
e Quản lý hợp đồng 42
f Quản lý Hoá đơn 42
g Báo cáo 43
Chỉ số tiêu thụ 43
Khách hàng sử dụng nhiều nhất 43 Page4
4
Trang 5Chương 1: Giới thiệu chung
1 Giới thiệu bài toán
a Mô tả
Công ty cấp nước X quản lý hồ sơ đăng ký và sử dụng nước của các khách hàng trong địa bàn thành phố Hàng tháng, nhân viên của công
ty sẽ đến từng hộ khách hàng để ghi chỉ số nước khách hàng sử dụng, sau đó lưu trữ vào cơ sở dữ liệu, xuất hóa đơn thu tiền hàng tháng tới các hộ gia đình sử dụng dịch vụ của công ty
- Quản lý thông tin nhân viên.
- Quản lý thông tin khách hàng.
- Cập nhật số liệu tiêu thụ nước hàng tháng của khách
hàng.
- Tìm kiếm, xuất báo cáo thông tin theo các yêu cầu cụ thể
nào đó (Tìm kiếm thông tin khách hàng, hóa đơn thu tiền theo từng tháng, theo khoảng thời gian nào đó,…)
2 Yêu cầu:
Xây dựng phần mềm nhằm giải quyết bài toán trên.
a CSDL
- Thiết kế trên SQL Server.
- Trong CSDL có các bảng trên với các trường, các bảng phục vụ
cho yêu cầu của chương trình (sinh viên có thể thêm bảng/trường nếu cần thiết).
- Các trường trong các bảng khi thiết kế phải thiết lập đầy đủ các
thuộc tính.
- Các bảng phải có quan hệ với nhau.
- Thiết kế các truy vấn cập nhật (thêm, sửa, xóa) thành các
Stored Procedure lưu trữ trong csdl.
Page4
5
Trang 6- Dữ liệu của chương trình phải được kiểm tra chặt chẽ để tránh
lỗi.
- Các báo cáo viết trên Crystal Report và được gọi qua chương
trình.
3 Phân công nhiệm vụ
Phần mềm được thực hiện trong vòng 3 tuần với 3 thành viên của nhóm
Trang 7Chương 2: Xác định yêu cầu
1 Khảo sát yêu cầu
Công ty cấp nước X là một công ty mới thành lập chuyên cung cấp nước cho các hộ gia đình với chất lượng cao và giá thành hợp lý Hiện tại công
ty là đơn vị cung cấp nước sạch trên địa bàn Hà Nội và các tỉnh lân cận
Cơ cấu công ty gồm: Ban quản lí, Bộ phận kế toán, bộ phận maketing, bộ phận quan hệ khách hàng, bộ phận kỹ thuật.
Khách hàng của công ty có 2 loại: khách hàng cá nhân (những hộ gia đình sử dụng lượng nước không nhiều), khách hàng doanh nghiệp (Hộ kinh doanh, cơ sở sản xuất lượng nước sử dụng lớn)
Nhu cầu mở rộng thị trường và nâng cao chất lượng dịch vụ, tăng doanh thu là vấn đề đáng quan tâm của công ty Vì vậy ban quản lí của công ty
có mong muốn xây dựng 1 phần mềm để số hoá các quy trình hiện có của công ty cũng như hỗ trợ nhân viên của công ty làm việc hiệu quả nhất.Page4
7
Trang 8Chương 3: Phân tích & Thiết kế
1 Đối tượng của phần mềm
Phần mềm được xây dựng phục vụ hai đối tượng chính là Admin (quản trị viên) và User (Nhân viên) với các chức năng sau:
Admin
Đăng nhập Phần mềm Xem, cập nhật, xoá thông tin trong hệ thống.
Quản lí nhân viên Xem báo cáo
Xây dựng một hệ thống quản lý thu phí cấp nước đơn giản, thân thiện, dễ
sử dụng, cho phép người dùng xem và quản lý thông tin liên quan, người quản trị quản lý các thông tin chung, xem báo cáo, quản lý người dùng Phần mềm được thiết kế với
Giao diện hài hoà, thân thiện, giúp người dùng dễ dàng sử dụng Nhân viên có thể tra cứu thông tin khách hàng phục vụ công việc dễ dàng, nhanh chóng, thuận tiện.
3 Các module
a Module nhân viên
Hiển thị thông tin và phân loại nhân viên, hỗ trợ tìm kiếm, thêm, sửa xoá các thông tin của nhân viên.
Trang 9d Module Hoá đơn
Hiển thị thông tin hoá đơn, chỉ số tiêu thụ nước, hỗ trợ tìm kiếm, thêm, sửa xoá các thông tin của hoá đơn.
e Module Báo cáo
Xuất báo cáo theo các điều kiện cụ thể như chỉ số tiêu thụ của từng khách hàng trong 1 khoảng thời gian, tổng lượng nước tiêu thụ của khách hàng trong 1 khoảng thời gian.
4 Thiết kế hệ thống
Các thông tin đầu ra đầu vào của hệ thống
a Thông tin đầu vào:
- Thông tin khách hàng
- Thông tin nhân viên
- Thông tin hợp đồng
- Thông tin hoá đơn
b Thông tin đầu ra:
Trang 106 Thiết kế Database
1
Trang 11Chương 4 Một số chức năng chính
1 Mã nguồn
a Cấu trúc thư mục
b Màn hình đăng nhậpusing NuocSach.App_Start;
using NuocSach.Controller;
Trang 12if (!string.IsNullOrEmpty txtUserName Text( )
&& !string.IsNullOrEmpty txtPassword Text( ))
lblMessage Text Message = ;
lblMessage Visible = true ;
}
} }
c Màn hình chínhusing NuocSach.App_Start;
Trang 13label1 Visible = false ;
label2 Visible = false ;
}
private void UsersToolStripMenuItem_Click( object
sender, System.EventArgs e)
mainPanel.Controls Add User Instance ( );
User.Instance.Dock DockStyle= Fill;
User.Instance BringToFront ();
mainPanel.Controls Add Contracts Instance ( );
Contracts.Instance.Dock DockStyle= Fill;
Contracts.Instance BringToFront ();
}
else
Contracts.Instance BringToFront ();
}
private void InvoicesToolStripMenuItem_Click( object
sender, System.EventArgs e)
mainPanel.Controls Add Invoice Instance ( );
Invoice.Instance.Dock DockStyle= Fill;
Invoice.Instance BringToFront ();
Trang 14CustomersToolStripMenuItem_Click( object sender,
mainPanel.Controls Add Customer Instance ( );
Customer.Instance.Dock DockStyle= Fill;
Customer.Instance BringToFront ();
}
else
Customer.Instance BringToFront ();
}
private void ChiSoToolStripMenuItem_Click( object
sender, System.EventArgs e)
mainPanel.Controls Add ChiSo Instance ( );
ChiSo.Instance.Dock DockStyle= Fill;
ChiSo.Instance BringToFront ();
}
else
ChiSo.Instance BringToFront ();
}
private void KHToolStripMenuItem_Click( object
sender, System.EventArgs e)
{
HideControl();
if (!mainPanel Controls Contains KH Instance ( ))
{
mainPanel.Controls Add KH Instance ( );
KH.Instance.Dock DockStyle= Fill;
private void ExitToolStripMenuItem_Click( object
sender, System.EventArgs e)
{
if (AccountAdapter Dispose ( new
Entity User ()).Result)
this Close();
Application.Exit();
}
private void SignoutToolStripMenuItem_Click( object
sender, System.EventArgs e)
Page4
1
Trang 15if (AccountAdapter Dispose ( new
Entity User ()).Result)
{
this Hide();
var signin = new Signin();
signin Closed += (s, args ) => this Close();
signin.Show();
}
}
} }
d Quản lý nhân viênusing NuocSach.App_Start;
using NuocSach.Controller;
using NuocSach.Utilities Helper ;
using NuocSach.Utilities Security ;
using System;
using System.Windows Forms ;
namespace NuocSach.UI UC {
public partialclass User UserControl:
{
private Account account =
AccountAdapter Claim ().Result;
private static User _instance;
private UsersController user;
user = new UsersController();
cbType.Items Insert (0, "User");
cbType.Items Insert (1, "Admin");
cbIsActive.Items Insert (0, "UnActive"); cbIsActive.Items Insert (1, "Active");
Trang 16if (select) {
else btnCancel.Visible = false;
{ DataGrid.DataSource = user.Find(txtCode.Text, txtUserName.Text, txtName.Text, txtPhone.Text).Result; }
Page4
1
Trang 17System.EventArgs e) {
Id = 0;
setControl(false);
btnSubmit.Text = "Save";
txtCode.Text = StringHelper.RandomString(8); }
private void btnSubmit_Click(object sender, System.EventArgs e)
{
if (Id != 0) {
var u = user.Find(Id).Result;
if (u != null) {
u.UserName = txtUserName.Text;
if (!
string.IsNullOrEmpty(txtPassword.Text)) u.Password = txtPassword.Text.SHA1Hash();
u.Phone = txtPhone.Text;
u.Name = txtName.Text;
u.Type = Convert.ToBoolean(cbType.SelectedIndex);
u.IsActive = Convert.ToBoolean(cbIsActive.SelectedIndex);
if (user.Update(u).Result) {
MessageBox.Show("Đã cập nhật bản ghi!");
DataGrid.DataSource = user.Find().Result;
} else MessageBox.Show("Cập nhật thất bại!");
} } else {
if (user.Find(null, txtUserName.Text, null,null).Result.Count == 0)
{
if (user.Create(new Entity.User() {
Code = txtCode.Text, Name = txtName.Text, Phone = txtPhone.Text, UserName = txtUserName.Text, Password =
txtPassword.Text.SHA1Hash(), Type = Convert.ToBoolean(cbType.SelectedIndex),Page4
1
Trang 18Convert.ToBoolean(cbIsActive.SelectedIndex) }).Result)
{ MessageBox.Show("Đã thêm bản ghi!");
DataGrid.DataSource = user.Find().Result;
} else MessageBox.Show("Thêm thất bại!"); }
else { MessageBox.Show("User đã tồn tại!",
"Thất bại");
} } } private void btnCancel_Click(object sender, System.EventArgs e)
{
Id = 0;
setControl();
} private void btnDelete_Click(object sender, System.EventArgs e)
{
if (user.Delete(user.Find(Id).Result).Result) {
clearForm();
DataGrid.DataSource = user.Find().Result; MessageBox.Show("Đã xoá bản ghi!");
Id = 0;
} else MessageBox.Show("Xoá thất bại!");
} private void DataGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0) {
Id = Convert.ToInt32(this.DataGrid.Rows[e.RowIndex].Cells["Id"].Value);
Convert.ToInt16(UserData.Type);
Page4
1
Trang 19} btnSubmit.Text = "Update";
} }}
e Quản lý khách hàngusing NuocSach.App_Start;
using NuocSach.Controller;
using NuocSach.Entity;
using NuocSach.Utilities Helper ;
using System;
using System.Linq;
using System.Windows Forms ;
namespace NuocSach.UI UC {
public partialclass Customer UserControl:
{
private Account account =
AccountAdapter Claim ().Result;
private CustomerController customer;
private int Id;
private static Customer _instance;
publicstatic Customer Instance {
customer = new CustomerController();
cbIsActive.Items Insert (0, "UnActive"); cbIsActive.Items Insert (1, "Active");
txtCode Enabled = true ;
txtName Enabled = true ;
txtPhone Enabled = true ;
txtStreet Enabled = true ;
cbIsActive Enabled = false ;
Page4
1
Trang 20btnCreate Visible = true ;
btnSubmit Visible = false ;
btnDelete Visible = false ;
btnCancel Visible = true ;
btnCancel Text = "Clear";
}
else
{
txtCode Enabled = false ;
txtName Enabled = true ;
txtPhone Enabled = true ;
txtStreet Enabled = true ;
cbIsActive Enabled = true ;
btnSearch Visible = false ;
btnCreate Visible = false ;
btnSubmit Visible = true ;
if Id ( != 0)
btnDelete Visible = true ;
else
btnCancel Visible = false ;
btnCancel Visible = true ;
btnCancel Text = "Cancel";
txtCode Text = null ;
txtName Text = null ;
txtPhone Text = null ;
txtStreet Text = null ;
cbIsActive SelectedIndex = 1;
cbWard DataSource = null ;
cbWard.Items Clear ();
cbDistrict DataSource = null ;
cbDistrict.Items Clear ();
using (var db = new DataContext())
{
cbProvince DataSource =
db provinces Select (x => new { x.code, x.name }).ToList();
cbProvince DisplayMember = "name"; cbProvince ValueMember = "code";
customer Find txtCode Text ( ,
cbWard SelectedValue ToString (), txtName.Text,
txtStreet Text , txtPhone.Text).Result;
}
Page4
2
Trang 21EventArgs e)
{
Id = 0;
setControl( false );
btnSubmit Text = "Save";
txtCode Text StringHelper = RandomString(8);
c Phone txtPhone = Text;
c Name txtName = Text;
c Street txtStreet = Text;
c WardCode =
cbWard SelectedValue ToString ();
c IsActive =
Convert ToBoolean cbIsActive SelectedIndex ( );
if (customer Update c ( ).Result)
Code txtCode= Text,
Name txtName= Text,
Phone txtPhone= Text,
Street txtStreet= Text,
Trang 22customer Find ().Result;
MessageBox.Show("Đã xoá bản ghi!");
var UserData customer= Find Id( ).Result;
txtCode Text UserData = Code;
txtName Text UserData = Name;
txtPhone Text UserData = Phone;
txtStreet Text UserData = Street;
using (var db = new DataContext())
{
cbWard DataSource db = wards Select (x
=> new x code x name { , }).ToList();
cbWard DisplayMember = "name"; cbWard ValueMember = "code";
Trang 23var ward db= wards Find ward_code ( );
cbWard DataSource db = wards Where (x =>
x district_code Equals district_code ( )).Select(x => new
{ x code x name , }).ToList();
cbWard DisplayMember = "name"; cbWard ValueMember = "code";
if province_code ( != null && Id > 0)
{
cbDistrict DataSource =
db districts Where (x =>
x province_code Equals province_code ToString ( ())).Select(x
=> new x code x name { , }).ToList();
Page4
2