本項目為連鎖店餐飲系統。前台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