느낀점
이번 국밥집을 만들면서 약간의 고민이 있었다. 변경 전 메뉴와 변경 후 메뉴를 출력 해야 하는데 내가 만들어 놓은 쿼리는 메뉴 리스트 자체가 변경되기 때문에 따로 변경 전 메뉴를 보여줄 수 가 없었다. 그래서 테이블을 하나 더 만들어 메뉴 리스트 테이블에 메뉴가 insert 될 때 메뉴업데이트 테이블에도 같이 insert가 되었다. 그 후 변경 시 메뉴 업데이트 테이블에서 기존의 메뉴는 변경 전 메뉴로 update후 새로 변경 되는 메뉴를 insert하였다.
기존에 출력하는 메뉴 리스트 테이블은 건들지 않고 독립적으로 만들었다. 그 후 주문 테이블도 주문 내역과 변경 후의 내역을 출력 해야 했는데 주문 변경 시 주문 테이블에 있는 정보 자체가 변경되는 형식이기에 변경 전과 후를 동시에 보여줄 수 가 없었다. 여기에서도 테이블을 하나 따로 만들까 생각을 했지만, 가장 많이 참조되는 테이블이기에 들어 가는 정보가 많아 테이블을 하나 더 만들기엔 비효율적이라 같은 테이블에 주문 내역만을 위한 컬럼을 하나 추가하였다. 그러곤 주문 시 변경 내용을 담을 수 있는, 값이 변해도 되는 행을 insert하고 주문 내역만을 위한 행을 insert하였다. 사실 이 방법도 주문 상태만 달라 출력만 다르게 구분이 가능한 것이고 주문 하나에 두 개의 insert가 들어가 비효율적이라 생각한다. 또 기능이 많아지니 DBManager의 쿼리가 너무 많아졌다. 분명 로직을 잘 짜면 하나로 합칠 수 있는 쿼리가 많을텐데 아직까지 그정도 실력은 되지 않는 것 같다. 좀 더 연습 해야 겠다.
시연영상
테이블

food_order 테이블
주문이 들어올 경우 이 테이블에서 처리가 된다. 음식명, 테이블 번호, 주문 상태로 나뉘는데
주문 상태는 0 : 주문중, 1 : 결제완료, 2: 주문취소, 4: 주문내역으로 나뉘어진다.

food_menuUpdate 테이블
메뉴가 변경이 될 경우 이 테이블에서 처리가 된다.
메뉴 번호와 음식명, 가격, 변경 상태, 변경 시간, 변경한 사람으로 구성이 된다.
변경 상태가 0일 경우 변경 전 메뉴 정보이고, 변경 상태가 1일 경우 변경 후 메뉴 정보이다.
쿼리

현재 메뉴의 key 값과 메뉴명을 select하여 담는 쿼리
메뉴 변경 시 기존 메뉴 정보를 유지하는데 사용

변경 전 메뉴와 변경 후 메뉴의 정보를 담는 쿼리
기존의 메뉴를 위의 쿼리에서 가져온 정보로 변경 전 메뉴로 변경 후
새로운 변경 정보를 받아 변경 후 메뉴 정보로 삽입

주문 정보를 출력하는 쿼리
주문 내역을 전부 보여준다.

주문 정보를 출력하는 쿼리
주문 내역 중 메뉴를 변경 / 취소 했던 내역을 보여준다.
DBManager.cs
using gridManager;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
public class DBManger
{
private static DBManger instance = new DBManger();
string strconn = "Server=호스팅주소;Database=데이터베이스명;Uid=아이디;Pwd=비밀번호;Charset=utf8";
string query = "";
public static DBManger GetInstance()
{
return instance;
}
public int selectUser(string nm, string id) {
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select * from food_user";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
if(nm.Equals((string)rdr["user_name"]) || id.Equals((string)rdr["user_id"])) {
return 2;
}
}
rdr.Close();
}
return 1;
}
public void insertUser(string nm, string id, string pw) {
int check = selectUser(nm, id);
if(check != 1) {
return;
}
Encrypt encrypt = new Encrypt();
string encryptPw = encrypt.AES_Enc(pw);
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "insert into food_user (user_name, user_id, user_pw) values ('"+nm+"', '"+id+"', '"+ encryptPw + "'); ";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public void insert_food(int i_user, string food_menu, int food_price, int nowTableNumber)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "insert into food_sale (i_user, food_menu, food_price, food_table) values (" + i_user + ",'" + food_menu + "', '" + food_price + "', "+ nowTableNumber + ")";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public void update_food(string nowName, string changeName, int price) {
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "update food_menu set food_name = '"+changeName+"' , food_price = "+price+" where food_name = '"+nowName+"'";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
string nowMenuName;
int nowI_menu;
int changeI_menu;
public void select_foodState(string nowName) {
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select * from food_menu where food_name = '"+nowName+"'";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
changeI_menu = (int)rdr["i_menu"];
nowMenuName = (string)rdr["food_name"];
}
rdr.Close();
}
}
public void update_foodState(string changeName, int price)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "update food_menuUpdate set food_state = 0 where food_name = '" + nowMenuName + "'";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
query = "insert into food_menuUpdate (food_menuNumber, food_name, food_price, food_state, i_user) values" +
"("+ changeI_menu + ",'" + changeName + "', " + price + ", 1, " + gridManager.Properties.Settings.Default.login_user + ")";
cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public void insert_order(string name, int tableNumber, int state)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "insert into food_order (order_name, order_table, order_state) values ('"+name+"', "+tableNumber+", "+state+")";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
query = "insert into food_order (order_name, order_table, order_state) values ('" + name + "', " + tableNumber + ", 4)";
cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public List<menuInfo> select_nowMenuList(int nowTableNumber) {
List<menuInfo> list = new List<menuInfo>();
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select a.i_order, a.order_name, a.order_state, a.order_table ,b.food_price from food_order a left join food_menu b on a.order_name = b.food_name " +
"where order_table = "+ nowTableNumber + " and order_state = 0;";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
menuInfo menu = new menuInfo();
menu.i_order = (int)rdr["i_order"];
menu.food_name = (string)rdr["order_name"];
menu.food_price = (int)rdr["food_price"];
menu.state = (int)rdr["order_state"];
menu.table = (int)rdr["order_table"];
list.Add(menu);
}
rdr.Close();
}
return list;
}
public int sumPayment(int nowTableNumber) {
int price = 0;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select food_price from food_order a left join food_menu b on a.order_name = b.food_name where order_table = "+ nowTableNumber + " and order_state = 0";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
price += (int)rdr["food_price"];
}
rdr.Close();
}
return price;
}
public void updateSaleState(int nowTableNumber) {
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "update food_order set order_state = 1, m_dt = now() where order_state = 0 and order_table = "+ nowTableNumber + "";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public void updateSaleStateCencel(int i_order,int nowTableNumber)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "update food_order set order_state = 2, m_dt = now() where order_state = 0 and i_order = "+i_order+" and order_table = " + nowTableNumber + "";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public void selectI_menu(string name) {
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select * from food_menu where food_name = '"+name+"'";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
nowI_menu = (int)rdr["i_menu"];
}
rdr.Close();
}
}
public void insert_newMenu(string name, int price) {
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "insert into food_menu (food_name, food_price) values ('" + name + "', " + price + ")";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
conn.Close();
selectI_menu(name);
}
}
public void insert_menuChange(string name, int price)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "insert into food_menuUpdate (food_MenuNumber, food_name, food_price, food_state, i_user) values ("+ nowI_menu + ",'" + name + "', " + price + ", 1, " + gridManager.Properties.Settings.Default.login_user + ")";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
conn.Close();
}
}
public string imgOpen() {
try
{
OpenFileDialog openFileDialog1 = new OpenFileDialog(); // 파일 탐색기 열림
openFileDialog1.Filter = "Image files(*.jpg) | *.jpg |" + // jpg와 png만 선택가능
"이미지 파일(*.png) | *.png";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
return openFileDialog1.FileName; // 선택한 파일명 텍스트박스에 저장
}
}
catch (Exception ex)
{
}
return "";
}
public class menuInfo {
public int i_order;
public string food_name;
public int food_price;
public int state;
public int table;
}
public List<menuInfo> select_menu() {
List<menuInfo> list = new List<menuInfo>();
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select * from food_menu";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
menuInfo menu = new menuInfo();
menu.food_name = (string)rdr["food_name"];
menu.food_price = (int)rdr["food_price"];
list.Add(menu);
}
rdr.Close();
}
return list;
}
public void loginTimeRecord(int i_user)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "update food_user set loginTime = now() where i_user = " + i_user;
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public void logoutTimeRecord(int i_user)
{
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "update food_user set logoutTime = now() where i_user = " + i_user;
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.ExecuteNonQuery();
}
}
public string Login_check(string id, string pw)
{
string user_name = "";
using (MySqlConnection conn = new MySqlConnection(strconn))
{
conn.Open();
query = "select * from food_user";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
Encrypt encrypt = new Encrypt();
string encryptPw = encrypt.AES_Enc(pw);
while (rdr.Read())
{
if (id.Equals((string)rdr["user_id"]) && encryptPw.Equals((string)rdr["user_pw"]))
{
int i_user = (int)rdr["i_user"];
user_name = (string)rdr["user_name"];
gridManager.Properties.Settings.Default.login_check = true;
gridManager.Properties.Settings.Default.Save();
gridManager.Properties.Settings.Default.login_user = i_user;
gridManager.Properties.Settings.Default.Save();
loginTimeRecord(i_user);
}
}
rdr.Close();
}
return user_name;
}
public DataTable dateListBefore(int year, int month, int day) {
List<DataTable> list = new List<DataTable>();
MySqlCommand cmd;
MySqlDataReader rdr;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
DataTable dt = new DataTable();
conn.Open();
query = "select order_name as 메뉴, order_state as 메뉴변경전, order_table as 테이블, r_dt as 주문시간 from food_order where order_state = 4 " +
"and extract(year from r_dt) = " + year + " and extract(month from r_dt) = " + month
+ " and extract(day from r_dt) = " + day + "";
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
dt.Load(rdr);
return dt;
}
}
public DataTable dateList(int check, int year, int month, int day)
{
List<DataTable> list = new List<DataTable>();
MySqlCommand cmd;
MySqlDataReader rdr;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
DataTable dt = new DataTable();
conn.Open();
if (check == 1)
{
query = "select a.i_user, b.user_name as 판매자, count(i_sale) as 일일판매량, sum(food_price) as 일일판매액"
+ " from food_sale a left join food_user b on a.i_user = b.i_user where extract(year from r_dt) = " + year + " and extract(month from r_dt) = " + month
+ " and extract(day from r_dt) = " + day + " group by i_user";
}
else if (check == 2)
{
query = "select food_menu as 메뉴, count(i_sale) as 일일판매량, sum(food_price) as 일일판매액"
+ " from food_sale where extract(year from r_dt) = " + year + " and extract(month from r_dt) = " + month
+ " and extract(day from r_dt) = " + day + " group by food_menu";
}
else if (check == 3)
{
query = "select food_menu as 메뉴, count(i_sale) as 월간판매량, sum(food_price) as 월간판매액"
+ " from food_sale where extract(year from r_dt) =" + year + " and extract(month from r_dt) =" + month
+ " group by food_menu";
} else if(check == 4)
{
query = "select order_name as 메뉴, order_state as 메뉴변경후,order_table as 테이블, r_dt as 주문시간, m_dt as 취소시간" +
"from food_order where order_state = 2 and extract(year from r_dt) = " + year + " and extract(month from r_dt) = " + month
+ " and extract(day from r_dt) = " + day + "";
}
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
dt.Load(rdr);
return dt;
}
}
public DataTable payMentList(int year, int month, int day, int hour, int minute)
{
List<DataTable> list = new List<DataTable>();
MySqlCommand cmd;
MySqlDataReader rdr;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
DataTable dt = new DataTable();
conn.Open();
query = "select order_name, order_table from food_order where order_state = 1 and extract(year from r_dt) = " + year + " and extract(month from r_dt) = " + month
+ " and extract(day from r_dt) = " + day + " and extract(hour from r_dt) = "+hour+ " and extract(minute from r_dt) = "+minute+"";
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
dt.Load(rdr);
return dt;
}
}
public DataTable logList()
{
List<DataTable> list = new List<DataTable>();
MySqlCommand cmd;
MySqlDataReader rdr;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
DataTable dt = new DataTable();
conn.Open();
query = "select user_name as 판매자, loginTime as 로그인시간, logoutTime as 로그아웃시간 from food_user where i_user != 1";
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
dt.Load(rdr);
return dt;
}
}
public DataTable menuChangeListBefore()
{
MySqlCommand cmd;
MySqlDataReader rdr;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
DataTable dt = new DataTable();
conn.Open();
query = "SELECT food_menuNumber as 메뉴번호, food_name as 음식명, food_price as 가격,food_state as 변경전상태, r_dt as 시간 from food_menuUpdate where food_state = 0";
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
dt.Load(rdr);
return dt;
}
}
public DataTable menuChangeListAfter()
{
MySqlCommand cmd;
MySqlDataReader rdr;
using (MySqlConnection conn = new MySqlConnection(strconn))
{
DataTable dt = new DataTable();
conn.Open();
query = "SELECT food_menuNumber as 메뉴번호, food_name as 음식명, food_price as 가격, food_state as 변경후상태, r_dt as 시간 from food_menuUpdate where food_state = 1";
cmd = new MySqlCommand(query, conn);
rdr = cmd.ExecuteReader();
dt.Load(rdr);
return dt;
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace gridManager
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dateTimePicker1.CustomFormat = "yyyy-MM-dd";
dateTimePicker1.Format = DateTimePickerFormat.Custom;
i_user = gridManager.Properties.Settings.Default.login_user;
}
int i_user;
private void admin_logout_Click(object sender, EventArgs e)
{
gridManager.Properties.Settings.Default.login_check = false;
gridManager.Properties.Settings.Default.Save();
gridManager.Properties.Settings.Default.login_user = 0;
login_info.Text = "";
login login = new login();
login.Show();
this.Close();
}
int year;
int month;
int day;
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
if(gridManager.Properties.Settings.Default.login_user != 1) {
return;
}
DateTime dt1 = dateTimePicker1.Value;
year = dt1.Year;
month = dt1.Month;
day = dt1.Day;
}
private void UserSaleBtn_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = DBManger.GetInstance().dateList(1, year, month, day);
dataGridView1.Columns["i_user"].Visible = false;
dataGridView1.AllowUserToAddRows = false;
}
private void menuSaleDayBtn_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = DBManger.GetInstance().dateList(2, year, month, day);
}
private void menuSaleMonthBtn_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = DBManger.GetInstance().dateList(3, year, month, day);
}
private void userLogRecord_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = DBManger.GetInstance().logList();
}
string[] str;
private void menuManagement_Click(object sender, EventArgs e)
{
menu menu = new menu();
DialogResult result = menu.ShowDialog();
// 삽입
if (result == DialogResult.OK)
{
str = menu.menuInfo();
int price = Int32.Parse(str[1]);
DBManger.GetInstance().insert_newMenu(str[0], price);
DBManger.GetInstance().insert_menuChange(str[0], price);
}
// 변경
if (result == DialogResult.Cancel)
{
str = menu.changeMenuInfo();
int price;
try {
price = Int32.Parse(str[2]);
} catch {
return;
}
DBManger.GetInstance().select_foodState(str[0]);
DBManger.GetInstance().update_food(str[0], str[1], price);
DBManger.GetInstance().update_foodState(str[1], price);
}
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
ForUser user = new ForUser();
user.Show();
user.loadBtn(0);
}
private void orderSelectBtn_Click(object sender, EventArgs e)
{
string time = orderSelectText.Text;
string[] hour = time.Split('시');
int hourInt = Int32.Parse(hour[0]);
string temp = hour[1];
string[] minute = temp.Split('분');
int minuteInt = Int32.Parse(minute[0]);
dataGridView1.DataSource = DBManger.GetInstance().payMentList(year, month, day, hourInt, minuteInt);
}
private void selectCencelBtn_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = DBManger.GetInstance().dateListBefore(year, month, day);
dataGridView2.DataSource = DBManger.GetInstance().dateList(4, year, month, day);
}
private void menuChangePrint_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = DBManger.GetInstance().menuChangeListBefore();
dataGridView2.DataSource = DBManger.GetInstance().menuChangeListAfter();
}
}
}
'visual studio winform' 카테고리의 다른 글
[c#] 국밥집.ver3 (0) | 2021.12.02 |
---|---|
[c#] 채팅 프로그램 프로젝트.ver1 (0) | 2021.11.30 |
[c#] 국밥집 포스단말기.ver2 (0) | 2021.11.25 |
[c#] 국밥집 포스단말기.ver1 (0) | 2021.11.20 |
[c#] 학생 관리 프로그램 (0) | 2021.11.17 |