visual studio winform

[c#] 국밥집.ver4

개발로 먹고 살자 2021. 12. 9. 18:29

느낀점

더보기

이번 국밥집을 만들면서 약간의 고민이 있었다. 변경 전 메뉴와 변경 후 메뉴를 출력 해야 하는데 내가 만들어 놓은 쿼리는 메뉴 리스트 자체가 변경되기 때문에 따로 변경 전 메뉴를 보여줄 수 가 없었다. 그래서 테이블을 하나 더 만들어 메뉴 리스트 테이블에 메뉴가 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