前言
想开发一个平板点餐系统,研究下陈江根大侠分享的一个很高水准的实例,只是个单机版无实用意义。
实现
本系统后台使用Mysql 数据库+Tomcat WEb服务器实现,Tomcat服务器采用Servlet机制处理App发来的消息,并执行消息的任务;另外采用XE2编程实现管理客户端,用来来处理订单打印、管理菜谱管理等。
app客户端为Android版本,编程工具Eclipse。
难点处理
1.一个订单发送到后台没问题多条怎么就不行了,哦,应该使用线程;
1 /**异步任务:下单 2014-8-28 2 * 3 * @author 吴chunyuan * 4 */ 5 private class XiadTask extends AsyncTask<String, Integer, String> { 6 /**onPreExecute方法用于在执行后台任务前做一些UI操作 */ 7 @Override 8 protected void onPreExecute() { 9 Log.i(TAG, "onPreExecute() called"); 10 // MyUtil.showToast(OrderActivity.this, "数据上传..."); 11 // textView.setText("loading..."); 12 } 13 14 /**doInBackground方法内部执行后台任务,不可在此方法内修改UI*/ 15 @Override 16 protected String doInBackground(String... params) { 17 //totalText = (TextView) findViewById(R.id.total); 18 //params[0] 19 Log.i(TAG, "doInBackground(Params... params) called"); 20 21 String replay ="0"; //定义为 count+"|"已成功下单编号1|2... 22 try 23 { 24 if(mc == null){ 25 mc = new MyConnector(ServerIP, SERVER_PORT); 26 } 27 int count=mData.size(); 28 29 int j=0; 30 int NewcaiCount=0;//统计新菜数量 2014-8-28 31 while( j < count){ 32 if(mData.get(j).getState()==0){ 33 NewcaiCount++; 34 } 35 j++; 36 } 37 40 // replay = String.valueOf(count); 41 int i=0; 42 int bs=0; 43 double Stotal=0.00; //金额 44 while( i < count){ 45 // msg =菜名|ID|数量|价格|状态| 46 //wxd_count=wxd_count+1; 47 48 if(mData.get(i).getState()==0){ 49 //算出金额 50 Stotal=Stotal+Double.parseDouble( String.valueOf(mData.get(i).getPrice()) )*Double.parseDouble( String.valueOf(mData.get(i).getNum()) ); 51 // Double d = Double.parseDouble( s ); 52 53 String GetData = mData.get(i).getName() 54 +"|"+String.valueOf(mData.get(i).get_id()) 55 +"|"+String.valueOf(mData.get(i).getNum()) 56 + "|"+String.valueOf(mData.get(i).getPrice()) 57 // + "|"+String.valueOf(mData.get(i).getState()) 58 +"|"+ String.valueOf(mData.get(i).getRemark()) 59 +"|"+String.valueOf(mData.get(i).getMenuID()) 60 +"|"+table_no 61 +"|"+String.valueOf(Stotal); 62 63 bs++; 64 if ((i==count-1) || (bs==NewcaiCount)) {// 888 \999,做为后台是否修改ordertal tabletal 的判断。 65 if (bs==1) bs=888; //最后一笔且只有1笔 66 else bs=999; 67 } 68 69 70 String [] sa=GetData.split("\\|"); 71 //Bs 记录标志 72 String Bs=String.valueOf(bs) ; 73 74 //标志 菜名 数量 价格 备注 菜单ID 台号 金额 75 String msg_out = "<#ADD_DINGD#>"+Bs+"|"+sa[0] +"|"+sa[1]+"|"+sa[2]+"|"+sa[3]+"|"+sa[4]+"|"+sa[5]+"|"+sa[6]+"|"+sa[7]; 76 77 78 mc.dout.writeUTF(msg_out);//通知数据库增加订单 79 mc.dout.flush();//2014-5-3增加否则无法收到返回信息 80 // Thread.sleep(2000);//!防止客户端无法收到返回信息,出现异常退出 81 //对应服务器数据库处理sql执行后返回消息后暂停1秒,? 82 83 String replay1=mc.din.readUTF()+"|"+sa[1]; 84 85 if (replay1.startsWith("<#ADD_DINGD_SUCCESS#>")){ 86 replay=replay+"|"+sa[1];} 87 }// end if getState()==0 88 i++; 89 90 } 91 return replay; 92 93 } catch (Exception e) { 94 Log.e(TAG, e.getMessage()); 95 96 } 97 return null; 98 } 99 100 /**onProgressUpdate方法用于更新进度信息 */ 101 @Override 102 protected void onProgressUpdate(Integer... progresses) { 103 Log.i(TAG, "onProgressUpdate(Progress... progresses) called"); 104 // MyUtil.showToast(OrderActivity.this,"第"+ progresses[0]+"个菜开始配送"); 105 // progressBar.setProgress(progresses[0]); 106 // textView.setText("loading..." + progresses[0] + "%"); 107 //totalText.setText("ok"); 108 } 109 110 /**onPostExecute方法用于在执行完后台任务后更新UI,根据后台下单结果重新绑定前台订单 */ 111 @Override 112 protected void onPostExecute(String result) { 113 Log.i(TAG, "onPostExecute(Result result) called"); 114 String [] sa =result.split("\\|"); 115 116 int count; 117 count=sa.length;//取长度 118 // count= Integer.valueOf(sa[0]); 119 // MyUtil.showToast(OrderActivity.this, String.valueOf(count)); 120 for(int i=1; i<count; i++){ 121 122 new OrderDetailManager(OrderActivity.this).updateState_new(0,1,Integer.parseInt(sa[i]));//第三参数为记录ID 123 bindOrderDetails(); 124 } 125 126 MyUtil.showToast(OrderActivity.this, "下单完毕"); 127 button_order_submit.setEnabled(true); 128 129 } 130 131 //onCancelled方法用于在取消执行中的任务时更改UI 132 @Override 133 protected void onCancelled() { 134 Log.i(TAG, "onCancelled() called"); 135 // textView.setText("cancelled"); 136 // progressBar.setProgress(0); 137 138 // execute.setEnabled(true); 139 // cancel.setEnabled(false); 140 } 141 } /** end XiadTask*/
2.无wifi网络信号时怎么异常了,哦,提交前应检查网络(代码略);
3.无法更新UI界面,要使用AsyncTask(代码略);
4.菜的图片需要更新怎么办,从后台下载到本地资源文件更新;
5.客户买单结帐处理,后台管理程序处理订单打印、结帐...
6.客户买单后,怎么APP的数据没变,哦,查询时应根据后台数据更新本地数据.....
好了,系统可以交付使用了
app:(台桌订单信息、菜谱更新等功能)
1.登录界面
2.菜谱界面
订单明细
台桌查询界面
二、后台(WebJ2EE服务器、及delphi XE5编写的管理程序)
收银台及订单监控、打印
数据中心
安装
以win7 64机器为例
一、后台
1. 安装sdk ,jdk-8u45-windows-i586.exe(32位)
2. jdk: 环境变量设置
0.) JAVA_HOME jdk1.7.0_25
1.)path -> jdk1.7.0_25\bin;
2.)classpath
.;%Java_home%\jre\lib\rt.jar
3. TOMCAT: 设置环境变量设置
1.)TOMCAT_HOME -》D:\apache-tomcat-6.0.37
2.)webapps 目录放置rmealserv.war
3.)bin目录运行startup.bat
4. 安装32位ODBC mysql-connector-odbc-5.2.6-win32
C:\Windows\SysWOW64\odbcad32.exe 设置odbc,rmealdb
5.安装Mysql 数据库(见本博客)
6. 登录http://127.0.0.1:8080/rmealserv 测试
(完)