天天看點

快餐刷卡消費之觸摸屏實作(含關鍵源碼)

本項目為連鎖店餐飲系統。前台C#,伺服器采用Java開發,oracle資料庫;通過webservice實作前背景的互動,背景以提供服務的方式,供前端調用并進行資料庫操作。

商家根據餐飲副食店實際情況提出了新的需求,希望能夠通過在店内放置觸摸屏的方式,使會員顧客能夠以觸摸屏的方式選擇商品并放入自己的購物車,之後售貨員隻需要讀取卡内的購物車資訊即可刷卡消費,這樣大大節約了顧客挑選商品的時間,使整個購物流程并行化程度提高。由于顧客消費的時間大多集中在早中晚,并行化會使店内的銷售量顯著提高。

經過一周的時間終于完成了子產品的更新,下面我将分4個方面詳細的描述整個流程,并附上關鍵部分源碼,分享給大家共同學習。

1.功能子產品介紹;2,觸屏設定實作(前台、伺服器、資料庫);3,觸屏顯示實作;4,觸屏結算實作

一 功能子產品介紹:

展櫃設定(包括4個子子產品)

1.1 觸屏設定(管理者操作)

本子子產品包括4項功能:

——選擇:根據門店編号mdbh從資料庫消費記錄表和物料表中擷取外賣記錄,顯示在combox中;

——插入:管理者從combox中選取要顯示的商品圖檔,擷取該圖檔的絕對路徑,以記錄的方式插入到config.txt文本中,每個圖檔代表一條記錄

——删除:删除TXT文檔中對應的條目。

——儲存:将目前Imagelistview中的商品圖檔資訊儲存成TXT文檔,存儲在項目的指定目錄下。

1.2 觸屏顯示(顧客操作)

本子產品中,自動加載“觸屏設定”中儲存的TXT文檔,讀取其中的記錄并将對應的圖檔全屏顯示;輕按兩下圖檔會進入商品細節頁面,在本界面,顧客可以選擇”加入購物車“或”傳回“,本頁面能夠顯示庫存量,若庫存量《0,點選傳回後對應圖檔将顯示售罄。

同時設定兩個按鈕“上一頁”,“下一頁”,通過點選可以實作翻頁檢視。

(注:顧客通過本顯示屏可以看到本店内所有的商品資訊,并有選擇的加入到自己卡的購物車中)

1.3 觸屏結算(售貨員操作)

本子產品包括3項功能:

——讀卡:售貨員點選“讀卡”,系統将卡内的購物車資訊顯示在購物車欄中;

——修改:删除菜品:售貨員可以對購物車中的商品調整數量或删除

——結算:對IC卡的購物車商品結算,同時删除資料庫中對應的購物車資訊,執行卡金額操作,并列印發票。

1.4 圖檔下載下傳(管理者操作)

通過FTP的方式,管理者可以從指定的FTP目錄中選擇圖檔,加入本門店的圖檔庫中,供展櫃設定使用。

總體界面設計:

快餐刷卡消費之觸摸屏實作(含關鍵源碼)

1.5 總體流程:

前台:主要是畫界面,寫webservice調用方法,邏輯實作;

伺服器端:若無對應的服務,則注冊webservice服務(1.在sun-jaxws.xml 中通過endpoint注冊;2.在對應的服務中加入注解,@webservice和@HandlerChain和@webMethod,注意名字要和xml中對應;注冊完服務之後,通過具體的方法執行Sql語句操作資料庫,回報到前台,顯示。

當思路清晰、宏觀設計之後,具體的實作就是搬磚的過程,我們隻需要一步步的根據需求完成子產品即可。Let’s go!

二 觸屏設定

2.1界面設計:

快餐刷卡消費之觸摸屏實作(含關鍵源碼)

2.2自動加載物料表,Combox顯示

1.通過調用getYLData方法從資料庫中擷取物料資料存入List中

private void initYL(String lb)
        {

            物料編号.Visible = true;
            ylComb.Visible = true;
            ylAddBtn.Visible = true;
            getYLData(lb); //設定物料表ylList

            if (ylList != null)
            {
                foreach (DataBean bean in ylList)
                {
                    //物料清單                  
                    this.ylComb.Items.Add(bean.GetValue("WL_WLBH") + "|" + bean.GetValue("WL_WLMC") + "|" + bean.GetValue("WL_3lMC") + "|" + bean.GetValue("WL_JLDW") + "|" + bean.GetValue("SL"));

                }
            }
        }
           

2.通過webservice調取服務MaterialService中的getDataFromXSJL方法擷取物料資料,存入ArrayList中。

private void getYLData(string ALMC)
        {
            ServiceDelegate serviceDelegate = ServiceDelegateFactory.Instance();
            //ArrayList materialList = new ArrayList();
            try
            {
                ylList = (ArrayList)serviceDelegate.CommonInvoke("MaterialService", "getDataFromXSJL", ALMC);

                
            }
            catch (Exception ex)
            {
                if (ex is WebServiceException)
                {
                    if ((ex as WebServiceException).ExceptionType ==
                        EnumDefine.WebServiceException.ConnectException)
                    {
                        PopMessage.Error("EXC0009E", ConfigUtil.GetItemValue("ErrorMessageTitle"));
                    }
                    else
                    {
                        PopMessage.Error("EXC0006E", ConfigUtil.GetItemValue("ErrorMessageTitle"));
                    }
                }
                else
                {
                    throw ex;
                }
                return;
            }
            if (serviceDelegate.MessageList != null)
            {
                ServiceMessageBean popMessage = (ServiceMessageBean)serviceDelegate.MessageList[0];

                if (popMessage.Parameters != null)
                {
                    PopMessage.Error(popMessage.MessageCode, ConfigUtil.GetItemValue("ErrorMessageTitle"), popMessage.Parameters);
                }
                else
                {
                    PopMessage.Error(popMessage.MessageCode, ConfigUtil.GetItemValue("ErrorMessageTitle"));
                }

                serviceDelegate.MessageList.Clear();
            }
        }
           

3.伺服器代碼

MaterialService中的getDataFromXSJL方法:

public List getDataFromXSJL(String mdbh) throws Exception {
		List<?> resultList = dao.selectDataFromKCDL(mdbh);
		if (resultList == null || resultList.isEmpty()) {
			messages.add(new ServiceMessage(CommonConst.RESULTNULL));
			return null;
		} else {
			return resultList;
		}
	}

@Override
	public List<?> selectDataFromKCDL(String mdbh) throws SysException {
		StringBuffer sb = new StringBuffer();
		List<Object> argsList = new ArrayList<Object>();

		sb.append("select ");
		sb.append(" WL_WLBH,WL_WLMC,WL_3LMC, WL_JLDW,sum(DXFJL_SL) AS SL");
		sb.append(" from  ");
		sb.append("   T_JCZL_WL left join T_KWGL_DXFJL on  ");
		sb.append("   WL_WLBH=DXFJL_CPBH  AND  substr(DXFJL_XFLSH,0,?)=?");
		sb.append(" where ");
		sb.append("   WL_2lMC=?  ");
		sb.append(" group by WL_WLBH,WL_WLMC,WL_3LMC, WL_JLDW ");
//		sb.append("   WL_WLMC ");

		argsList.add(mdbh.length());
		argsList.add(mdbh);
		argsList.add("外賣");
	

		AppLog.logSystemInfo(WlDao.class, "selectDataBy1LMC", sb.toString()
				.replace('\'', '"'));
		List<?> list = (List<?>) sqlRunner
				.executeQuery(sb.toString(),argsList);
		return WsCommon.listConvert(list, sb.toString());
	}
           

2.3 插入和删除

操作和2.2類似.

2.4 儲存

分析:聲明configPic.txt配置檔案和圖檔的存放位置,建立檔案流和位元組流,将2.2中插入的菜品所對應的圖檔的絕對路徑存入txt檔案中,然後将txt檔案中儲存的資訊在觸屏顯示中讀取。

private void saveBtn_Click(object sender, EventArgs e)
        {
            string filePath = Application.StartupPath + "/Pic/used/configPic.txt";
            string imagePath = Application.StartupPath + "/Pic/";

            if (dataGridView1.Rows.Count < 1)
                return;

            imageListView1.Items.Clear();
            FileStream fs = new FileStream(filePath, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                sw.WriteLine(imagePath+row.Cells["WL_WLBH"].Value.ToString() + ".jpg");
            }

            sw.Flush();//保護硬碟
            //關閉流
            sw.Close();
            fs.Close();
            this.toolStripStatusLabel.Text = "儲存成功!";
            String[] fileLines = System.IO.File.ReadAllLines(filePath);
            imageListView1.Items.AddRange(fileLines);//觸屏顯示
        }
           

三 觸屏顯示

分析:1.顯示txt中的圖檔資訊2.增加輕按兩下事件,即輕按兩下圖檔可以檢視其細節資訊,并進入對應的窗體3.在商品細節窗體中可以把其“儲存”進購物車,并傳回。4.本界面顯示庫存餘量,若<=0,點選傳回後将自動将圖檔置換為售罄(通過字元串替換,修改config.txt檔案中的内容)

3.1 按鈕控制滾動條

//導入dll用來控制滑鼠上下移動
        [DllImport("user32.dll")]
        static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
        const int MOUSEEVENTF_WHEEL = 0x800;

        private void btnDown_Click(object sender, EventArgs e)
        {
            this.imageListView1.Focus();
            mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -300, 0);
        }

        private void btnUp_Click(object sender, EventArgs e)
        {
            this.imageListView1.Focus();
            mouse_event(MOUSEEVENTF_WHEEL, 0, 0, 300, 0);
        }
           

3.2 “傳回”按鈕事件

private void rtn_Click(object sender, EventArgs e)
        {        
            if (this.kc.Text == "0") {//判斷目前的庫存量
                string filePath = Application.StartupPath + "/Pic/used/configPic.txt";//配置文本檔案
                string imagePath = Application.StartupPath + "/Pic/Out/" + _picId + "out.jpg";//Out檔案夾存儲售罄圖檔
                string imagePathUsed = Application.StartupPath + "/Pic/used/" + _picId + ".jpg";//目前顯示的圖檔存儲的檔案夾
                string line;
                //通過位元組流操作檔案
                StreamReader sr1 = new StreamReader(filePath);
                string s = sr1.ReadToEnd();
                sr1.Close();

                StreamReader sr = new StreamReader(filePath);
                while ((line = sr.ReadLine()) != null)
                {
                    if (line.Equals(imagePathUsed)) {                     
                        sr.Close();
                        StreamWriter sw = new StreamWriter(filePath);
                        sw.WriteLine(s.Replace(imagePathUsed, imagePath).Trim());
                        sw.Flush();
                        sw.Close();
                        break;
                    }
                }
            }         
            base.MoveToNextForm(typeof(ShowBoxMain));
            this.Close();  
        }
           

四 觸屏銷售

4.1 子產品展示:

分析:本子產品設計的内容較多,主要包括1.讀卡2.結算3.列印發票

快餐刷卡消費之觸摸屏實作(含關鍵源碼)

4.2 讀卡

分析:關鍵點:1. CardOperation和CardDbOperation讀取卡号和卡内資料(具體讀卡操作略過,如有需要可以私信部落客)2.通過方法getDataByGWC(ickh);擷取卡内的購物車資料3.綁定資料源到dgv,注意将dgv中列的NAME屬性和DataPropertyName屬性一一對應,否則綁定失敗。

private void readBtn_Click(object sender, EventArgs e)
        {
            //點餐前檢查是否有IC卡放置好
            DataBean dataTable1 = null;
            CardOperation co = new CardOperation();
            CardDbOperation codb = new CardDbOperation();
            string ickh = co.getICKH();
            this.ickh_txb.Text = ickh;
            if (ickh.Length < 2)
            {
                MessageBox.Show("請放好消費卡!");
                return;
            }
            dataTable1 = codb.getICCard(ickh);
            this.knye_txb.Text = dataTable1.GetValue("IC_CZYE").ToString();
            ///讀卡之後,在購物車籃顯示商品
            ///1.讀取資料庫getAllData傳回map<key,value>
            ///2.将map顯示到dgv上
            getDataByGWC(ickh);
            this.dinnerDetailDgv.DataSource = ServiceDelegate.ListToDataTable(resultList);
            int i = 0;
            foreach (DataGridViewRow row in dinnerDetailDgv.Rows)
            {
                DataGridViewRow dgr = dinnerDetailDgv.Rows[i];
                dgr.Cells["IC_ICKH"].Value = dinnerDetailDgv.Rows[i].Cells["IC_ICKH"].Value.ToString().Trim();
                i++;
            }
            RefreshTotal();
        }
           
//擷取門店訂單
        private void getDataByGWC(string ickh)
        {
            ServiceDelegate serviceDelegate = ServiceDelegateFactory.Instance();
            try
            {
                resultList = (ArrayList)serviceDelegate.CommonInvoke("CardService", "GetCaseByICKH", ickh);
            }
            catch (Exception ex)
            {
                return;
            }
            if (resultList == null)
            {
                ServiceMessageBean popMessage = (ServiceMessageBean)serviceDelegate.MessageList[0];

                if (popMessage.Parameters != null)
                {
                    PopMessage.Error(popMessage.MessageCode, ConfigUtil.GetItemValue("ErrorMessageTitle"), popMessage.Parameters);
                }
                else
                {
                    PopMessage.Error(popMessage.MessageCode, ConfigUtil.GetItemValue("ErrorMessageTitle"));
                }

                serviceDelegate.MessageList.Clear();
            }

        }
           

4.3 結算

///1.擷取dgv上面的金額總數 ///2.操作卡内餘額 ///3.删除該IC卡的GWC資料 ///4.列印發票,擷取cgv上的資料

if (dinnerDetailDgv.Rows.Count <= 0)
            {
                MessageBox.Show("購物車中無商品!");
                return;
            }
            //判斷卡中金額是否足夠,是則減掉金額,并作出卡和資料庫的操作
            CardOperation co = new CardOperation();
            try
            {

                ickh = co.getICKH();

            }
            catch (Exception ex)
            {
                MessageBox.Show("讀卡錯誤!");
                return;
            }

            DataBean dataBean = new DataBean();
            dataBean = getICCard(ickh);
            if (dataBean == null)
            {
                MessageBox.Show("該卡不存在!");
                return;
            }

            if (dataBean != null)
            {
                string dqzt = (string)dataBean.GetValue("IC_DQZT");
                if (dqzt != "已開卡")
                {
                    MessageBox.Show("該卡目前狀态為" + dqzt + ",不可消費!");
                    return;
                }
            }
            string a = (string)dataBean.GetValue("IC_CZYE").ToString();

            double knye = NumberUtil.toDouble(dataBean.GetValue("IC_CZYE").ToString());

            //取得datagridview資料 
            ids = new string[dinnerDetailDgv.Rows.Count];
            names = new string[dinnerDetailDgv.Rows.Count];
            counts = new string[dinnerDetailDgv.Rows.Count];
            pricePerUnits = new string[dinnerDetailDgv.Rows.Count];
            prices = new string[dinnerDetailDgv.Rows.Count];

            string kplx = (string)dataBean.GetValue("IC_KPLX");
            xfje = 0;

            for (int i = 0; i < dinnerDetailDgv.Rows.Count; i++)
            {  // 逐條周遊資料
                ids[i] = (string)dinnerDetailDgv.Rows[i].Cells["GWC_CPBH"].Value;
                names[i] = (string)dinnerDetailDgv.Rows[i].Cells["CPML_CPMC"].Value;
                counts[i] = (string)dinnerDetailDgv.Rows[i].Cells["GWC_CPSL"].Value;
                pricePerUnits[i] = (string)dinnerDetailDgv.Rows[i].Cells["CPML_HYJ"].Value;

                if (kplx.Equals("會員卡"))
                {
                    prices[i] = (string)dinnerDetailDgv.Rows[i].Cells["CPML_HYJ"].Value;
                    xfje += NumberUtil.toDouble((string)dinnerDetailDgv.Rows[i].Cells["CPML_HYJ"].Value) * NumberUtil.toDouble(counts[i]);

                }
            }

            //判斷餘額是否足夠
            if (xfje > knye)
            {
                MessageBox.Show("消費金額:" + xfje + " 可用餘額:" + knye + " 。IC卡餘額不足,請充值!");
                return;
            }

            //更改IC卡内的餘額
            dataBean.setValue("IC_CZYE", knye - xfje);
            if (dataBean.GetValue("IC_BZ") == null)
                dataBean.setValue("IC_BZ", "備注資訊");

            DataBean dataBean_MXFJL = new DataBean();
            dataBean_MXFJL.ColumnName = new string[17] { "MXFJL_LSH", "MXFJL_MDLSH", "MXFJL_MDBH", "MXFJL_ICKH", "MXFJL_XSYBH", "MXFJL_XFSJ", "MXFJL_XFJE", "MXFJL_XFBTJE", "MXFJL_XFCZJE", "MXFJL_BTYE", "MXFJL_CZYE", "MXFJL_JEDW", "MXFJL_JSZT", "MXFJL_JSDH", "MXFJL_BZ", "MXFJL_JSFS", "MXFJL_XFLX" };
            string czsj = CommonUtil.formatDateToStrDB(DateTime.Now);
            dataBean_MXFJL.ColumnValue = new string[17] { userInfo.ShopId + czsj, "1001", userInfo.ShopId, ickh, userInfo.UserId, czsj, xfje.ToString(), "0", "0", "0", (knye - xfje).ToString(), "元", "未結算", "0", "0", "1", "0" };

            ArrayList paramList = new ArrayList();
            int n = dinnerDetailDgv.Rows.Count;
            for (int i = 0; i < n; i++)
            {
                DataBean dataBean_detail = new DataBean();
                dataBean_detail.ColumnName = new string[12] { "DXFJL_LSH", "DXFJL_XFLSH", "DXFJL_CPBH", "DXFJL_DJ", "DXFJL_JJDW", "DXFJL_SL", "DXFJL_JLDW", "DXFJL_CPMC", "DXFJL_JE", "DXFJL_CQ", "DXFJL_ZCDJ", "DXFJL_BZ" };
                dataBean_detail.ColumnValue = new string[12] { i.ToString(), userInfo.ShopId + czsj, ids[i].ToString(), prices[i].ToString(), "元", counts[i].ToString(), "JLDW", names[i].ToString(), "0", "0", "0", "b" };
                paramList.Add(dataBean_detail);

            }


            //  卡操作
            //    je = co.CardSettlement(xfje);

            //**更改遠端資料庫*****

            //更新IC卡内餘額,插入消費記錄以及消費明細


            ServiceDelegate serviceDelegate = ServiceDelegateFactory.Instance();
            try
            { //
                serviceDelegate.CommonInvoke("CardService", "cardConsume", new Object[3] { dataBean, dataBean_MXFJL, paramList });

                // MessageBox.Show("員工發夾成功!");
            }
            catch (Exception ex)
            {
                if (ex is WebServiceException)
                {
                    if ((ex as WebServiceException).ExceptionType ==
                        EnumDefine.WebServiceException.ConnectException)
                    {
                        // 警告提示:網絡出現問題,Web服務逾時或無法連接配接
                        PopMessage.Error("COM0002W", ConfigUtil.GetItemValue("MessageTitle"));
                    }
                    else
                    {
                        // 警告提示:連接配接Web服務時發生系統異常
                        PopMessage.Error("COM0003W", ConfigUtil.GetItemValue("MessageTitle"));
                    }
                }
                if (ex is WebServiceException)
                {
                    if ((ex as WebServiceException).ExceptionType ==
                        EnumDefine.WebServiceException.ConnectException)
                    {
                        PopMessage.Error("EXC0009E", ConfigUtil.GetItemValue("ErrorMessageTitle"));
                    }
                    else
                    {
                        PopMessage.Error("EXC0010E", ConfigUtil.GetItemValue("ErrorMessageTitle"));
                    }
                }
                else
                {
                    throw ex;
                }

                return;
            }

            if (serviceDelegate.MessageList != null)
            {

                ServiceMessageBean popMessage = (ServiceMessageBean)serviceDelegate.MessageList[0];

                if (popMessage.Parameters != null)
                {
                    PopMessage.Error(popMessage.MessageCode, ConfigUtil.GetItemValue("ErrorMessageTitle"), popMessage.Parameters);
                }
                else
                {
                    PopMessage.Error(popMessage.MessageCode, ConfigUtil.GetItemValue("ErrorMessageTitle"));
                }

                serviceDelegate.MessageList.Clear();
            }
            double knye_new = knye - xfje;
            MessageBox.Show("歡迎光臨,您此次消費共計" + xfje + "元,卡内餘額為" + knye_new + "元,已結算成功!");
           

伺服器端cardService的cardConsume方法:

// 業務 : 消費
	public void cardConsume(DataBean cardData, DataBean mxfjlData,
			ArrayList<DataBean> xfjlDetailList) {

		ICardDaoIF icDao = new ICardDao();
		MxfjlDaoIF dao = new MxfjlDao();
		DxfjlDaoIF xjjyDao = new DxfjlDao();
		// KeHuDaoIF kehuDao = new KeHuDao();

		int ic = 0;
		int czjl = 0;
		int xjjy = 0;
		int kehu = 0;
		try {
			if (cardData != null) {
				ic = icDao.updateICardData(cardData);
				if (ic != 1) {
					messages.add(new ServiceMessage(CommonConst.UPDATEFAIL));
					return;
				}
			}
			if (mxfjlData != null) {
				czjl = dao.insertDatas(mxfjlData);
				if (czjl != 1) {
					messages.add(new ServiceMessage(CommonConst.INSERTFAIL));
					return;
				}
			}
			if (xfjlDetailList != null && !xfjlDetailList.isEmpty()) {
				for (int i = 0; i < xfjlDetailList.size(); i++) {
					xjjy = xjjyDao.insertDatas(xfjlDetailList.get(i));
					if (xjjy != 1) {
						messages.add(new ServiceMessage(CommonConst.INSERTFAIL));
						return;
					}
				}
			}
		} catch (Exception e) {
			messages.add(new ServiceMessage(CommonConst.SYSTEM_ANOMALY));
			return;
		}
	}

@Override
	public int insertICardData(DataBean param) throws SysException {
		// 執行插入的Sql
		StringBuffer sb = new StringBuffer();
		// 放置參數的List
		List<Object> argsList = new ArrayList<Object>();
		// 根據業務組合生成Sql語句
		sb.append("INSERT INTO T_KWGL_IC"
				+ "(IC_ICKH,IC_WLBH,IC_MM,IC_CKRBH,IC_KPLX,IC_FKMDBH,IC_FKRBH,"
				+ "IC_FKSJ,IC_BTYE,IC_CZYE,IC_JEDW,IC_DQZT,IC_BZ,IC_ZK)VALUES");

		sb.append(" (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
		argsList.add(param.getValue("IC_ICKH"));

		argsList.add(param.getValue("IC_WLBH"));

		argsList.add(param.getValue("IC_MM"));

		argsList.add(param.getValue("IC_CKRBH"));

		argsList.add(param.getValue("IC_KPLX"));

		argsList.add(param.getValue("IC_FKMDBH"));

		argsList.add(param.getValue("IC_FKRBH"));

		argsList.add(param.getValue("IC_FKSJ"));

		argsList.add(param.getValue("IC_BTYE"));

		argsList.add(param.getValue("IC_CZYE"));

		argsList.add(param.getValue("IC_JEDW"));

		argsList.add(param.getValue("IC_DQZT"));

		argsList.add(param.getValue("IC_BZ"));

		argsList.add(param.getValue("IC_ZK"));

		AppLog.logSystemInfo(ICardDao.class, "insertICardData", sb.toString()
				.replace('\'', '"'));
		return sqlRunner.executeUpdate(sb.toString(), argsList);
	}
           

4.4 列印發票

分析:在結算之後,自動執行列印發票程式。主要是格式的編排,建立LPTControls對象,傳入待列印字元串,操作發票機

//********列印發票***********
            double spsl = 0;
            LPTControls lpt = new LPTControls();
            //string mycommanglines = System.IO.File.ReadAllText("./print.txt");//print.txt裡寫了條碼機的指令
            String printLines1 = "";
            String printLines2 = "";
            String printLines3 = "";


            printLines1 = "\n                 門店\n";
            printLines1 += "      " + userInfo.ShopId + "          " + userInfo.ShopName + "\n";
            printLines1 += "-------------------------------------\n";
            printLines1 += "    收 款 員: " + userInfo.UserId + "\n";
            printLines1 += "    卡    号:  " + ickh.ToString() + "\n";
            printLines1 += "-------------------------------------\n";
            printLines1 += "    單号 :" + czsj + "\n";
            printLines1 += "    品名       " + "   數量    " + "單價    " + "金額" + "\n";
            printLines1 += "-------------------------------------\n";

            for (int i = 0; i < dinnerDetailDgv.Rows.Count; i++)
            {
                double dj;
                try
                {
                    dj = NumberUtil.toDouble((string)dinnerDetailDgv.Rows[i].Cells["CPML_HYJ"].Value);

                }
                catch (Exception ex)
                {
                    throw ex;
                }
                if (((string)dinnerDetailDgv.Rows[i].Cells["CPML_CPMC"].Value).Length > 6)
                {
                    spsl += NumberUtil.toDouble((string)dinnerDetailDgv.Rows[i].Cells["GWC_CPSL"].Value);
                    int Slength = ((string)dinnerDetailDgv.Rows[i].Cells["CPML_CPMC"].Value).Length;
                    for (int j = 0; j < Slength; j = j + 4)
                    {
                        int addLength = j + 4;
                        if (addLength < Slength)
                        {
                            printLines2 += "  " + ((string)dinnerDetailDgv.Rows[i].Cells["CPML_CPMC"].Value).Substring(j, addLength) + "\n";
                        }
                        else
                        {
                            printLines2 += "  " + (((string)dinnerDetailDgv.Rows[i].Cells["CPML_CPMC"].Value).Substring(j, Slength - j)).PadRight(6, '\u3000');
                        }
                    }
                    printLines2 += "   " + ((string)(dinnerDetailDgv.Rows[i].Cells["GWC_CPSL"].Value)).PadRight(4, '\u3000') + (dj.ToString()).PadRight(8, ' ') + dinnerDetailDgv.Rows[i].Cells["CPML_HYJ"].Value + "\n";
                }
                else
                {
                    spsl += NumberUtil.toDouble((string)dinnerDetailDgv.Rows[i].Cells["GWC_CPSL"].Value);
                    printLines2 += "  " + ((string)dinnerDetailDgv.Rows[i].Cells["CPML_CPMC"].Value).PadRight(6, '\u3000') + "   " + ((string)(dinnerDetailDgv.Rows[i].Cells["GWC_CPSL"].Value)).PadRight(4, '\u3000') + (dj.ToString()).PadRight(8, ' ') + (string)(dinnerDetailDgv.Rows[i].Cells["price"].Value) + "\n";
                } // 其中 \u3000代表全角空格

                //printLines2 += "  "+dinnerDetailDgv.Rows[i].Cells[1].Value + "   " + dinnerDetailDgv.Rows[i].Cells[2].Value + "    " + dj.ToString() + "    " + dinnerDetailDgv.Rows[i].Cells[3].Value + "\n";
            }
            printLines3 += "-------------------------------------\n";
            printLines3 += "    數量合計:" + "  " + spsl.ToString() + "  件" + "\n";
            printLines3 += "    金額合計:" + "  " + xfje.ToString() + "  元" + "\n";
            printLines3 += "    卡内餘額:" + "  " + knye_new.ToString() + "  元" + "\n";
            printLines3 += "-------------------------------------\n";

            printLines3 += "          期待您再次光臨    \n";
            printLines3 += "\n\n\n\n\n\n\n\n";

            RawPrinterHelper.printLines1 = printLines1;
            RawPrinterHelper.printLines2 = printLines2;
            RawPrinterHelper.printLines3 = printLines3;
            RawPrinterHelper.count = 0;
            MessageBox.Show(printLines1 + printLines2 + printLines3);
            lpt.Open();
            lpt.Write(printLines1 + printLines2 + printLines3);
            lpt.Close();
            xfje = 0;
}
           

結算成功:

快餐刷卡消費之觸摸屏實作(含關鍵源碼)

本博文為部落客原創

轉載請注明轉自:blog.csdn.net/mengzhengyu1025

繼續閱讀