第一篇:北大青鳥第一單元超市收銀管理系統(最終版)
包結構
四個包,九個類,一個資源文件
客戶端類
package com.supermarket.Client;/**
* 客戶端界面
*/
import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Scanner;
import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.entity.Goods;
public class Client {
//定義掃描器,用于鍵盤輸入
public static Scanner input=new Scanner(System.in);//創建客戶端業務類對象,調用方法
public static ClientB cb=new ClientB();public static void main(String[] args){ do{
System.out.println(“***********歡迎使用青鳥超市系統*************”);System.out.println(“1.登錄”+“n2.退出”);System.out.println(“***********請選擇1/2*************”);
String choice=input.next();
if(choice.equals(“1”)){
//登錄視圖
createLoginView();break;} else if(choice.equals(“2”)){ //退出
System.exit(0);} else{ //輸入有誤,報錯
System.out.println(“無此選項!”);} }while(true);System.out.println(“***********謝謝使用青鳥超市系統*************”);
} /**
* 登錄視圖
* 通過輸入的用戶名與密碼驗證用戶身份,管理員則進入管理界面,收銀員則進入收銀界面,都不是則提示錯誤,并重新進行輸入
*/
public static void createLoginView(){ do { //提示登錄信息
System.out.println(“請輸入用戶名:”);String name = input.next();System.out.println(“請輸入密碼:”);String password = input.next();//調用客戶端登錄方法,接收返回值,判斷登錄者的身份 Datas datas = cb.doLogin(name, password);//判斷是管理員還是收銀員
if(datas.getFlag().equals(SysConstans.SYS_ADMIN)){
createAdminView();
break;
} else if
(datas.getFlag().equals(SysConstans.SYS_CASHIER)){
createCashierView();
break;
} else { System.out.println(“用戶名或密碼有誤,請重新輸入”);
}
} while(true);}
/**
* 管理員菜單 * 實現管理員功能:
* 1.商品入庫 2.商品出庫 3.新增商品 4.查詢全部商品 5.按編號查詢商品 6.退出
*/
private static void createAdminView(){
//循環操作 // 管理員菜單
System.out.println(“管理員登錄成功,進入管理員界面”);do{
System.out.println(“***********歡迎進入青鳥超市庫存管理系統*************”);System.out.println(“1.商品入庫t2.商品出庫t3.新增商品t4.查詢全部商品t5.按序號查詢商品t6.退出”);
//提示用戶選擇
System.out.println(“請輸入您的選擇”);int choice=input.nextInt();switch(choice){ //商品入庫,調入庫方法 case 1:
//提示輸入要入庫的編號
System.out.println(“請輸入入庫商品編號:”);//定義變量接收輸入的編號
String goodnum=input.next();//調用方法判斷庫存中是否有要入庫的商品
if(cb.Find(goodnum).getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“請輸入入庫數量:”);
int count=input.nextInt();
if(count>=0){
Datas datas=cb.RuKu(goodnum,count);
if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“入庫成功!”);
showList(cb.FindAll());}
}else{
System.out.println(“入庫數量必須大于0”);
} }else{ System.out.println(“無此商品,請選擇3新增”);} break;//商品出庫,調出庫方法
case 2: do{
//提示輸入出庫商品編號
System.out.println(“請選擇出庫商品編號:”);//定義變量接收編號
String goodid=input.next();//先查詢是否由此商品
if(cb.Find(goodid).getFlag().equals(SysConstans.SYS_SUCCESS)){
//提示輸入出庫數量
System.out.println(“請輸入出庫數量:”);
int count=input.nextInt();
if(count>0){
Datas datas=cb.ChuKu(goodid,count);
if(datas.getFlag().equals(SysConstans.SYS_LACK)){
System.out.println(“庫存不足!”);
showGood(datas);break;}else{
System.out.println(“出庫成功!”);
showList(datas);
break;
} }else{ }
System.out.println(“出庫數量必須大于0!”);
}else{ System.out.println(“庫存中無此商品,請選擇3新增”);
break;} }while(true);break;case 3: //新增商品,調新增方法
//提示輸入新增商品編號 do{ System.out.println(“請輸入新增商品的編號:”);
String newgoodid=input.next();
if(cb.Find(newgoodid).getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“商品已存在”);break;} else{
System.out.println(“請輸入商品名稱:”);String name=input.next();System.out.println(“請輸入商品單價:”);double price=input.nextDouble();System.out.println(“請輸入商品單位:”);String unit=input.next();System.out.println(“請輸入商品數量:”);
int count=input.nextInt();
Goods good=new Goods(newgoodid,(name+“t”),price,unit,count);
//把要新增的商品通過調用方法傳給業務類,并接收返回值 Datas datas=cb.Add(good);System.out.println(“新增商品成功!”);//打印商品列表
showList(cb.FindAll());
break;} }while(true);break;//查詢全部商品的方法 case 4: //查詢商品,調用showList方法參數為Datas類型,是FindAll傳回來的 showList(cb.FindAll());break;//按編號查詢商品,調按編號查詢方法 case 5:
//提示輸入編號
System.out.println(“請輸入要查詢的編號:”);//定義變量接收輸入
String id=input.next();//判斷庫存中是否存在編號為goodid的商品 Datas datas=cb.Find(id);//如果存在,調用方法,打印商品
if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
showGood(datas);
}else{
System.out.println(“沒有此商品”);} break;case 6: //退出
System.out.println(“管理員退出成功!”);System.exit(0);default :
//提示無此選項
System.out.println(“無此選項,請重新輸入:”);
} }while(true);} /**
* 收銀員管理界面.* 實現收銀員的功能:
* 1.掃描商品 2.修改購買商品的數量
*/
//收銀員管理界面
private static void createCashierView(){
//循環操作收銀界面 while(true){ System.out.println(“收銀員登錄成功,進入收銀員界面”);System.out.println(“***********歡迎進入青鳥超市收銀
3.結賬
4.退出
管理系統*************”);System.out.println(“1.掃描商品t2.修改數量t3.結賬t4.退出”);
//提示用戶輸入操作選項
System.out.println(“請輸入您的選擇:”);int choice=input.nextInt();switch(choice){ case 1:
//調用掃描方法 do{ //提示輸入掃描編號
System.out.println(“請輸入要掃描的商品編號:”);
String scannum=input.next();//如果查詢到編號,說明商品存在,否則商品不存在
if(cb.Find(scannum).getFlag().equals(SysConstans.SYS_SUCCESS)){
//如果商品存在,調用掃描的方法 Datas datas=cb.scan(scannum);//判斷返回的標識
if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
System.out.println(“掃描成功”);
showScan(datas);break;}else{
System.out.println(“掃描失敗”);//
showScan(datas);
break;} }else{
System.out.println(“商品不存在!”);
break;
} }while(true);
break;case 2: //修改數量的方法 //判斷購買列表是否為空
if(cb.result().getFlag().equals(SysConstans.SYS_ERROR)){ System.out.println(“購買列表中還沒有購買物品!”);
continue;}
//循環操作數據 do{ //提示用戶輸入要修改的編號,并判斷購買列表中是否存在此編號
System.out.println(“請輸入要修改的商品編號:”);String changeid=input.next();Datas datas=new Datas();//調用方法判斷是否存在商品編號 if(hasid(changeid)){
//存在,提示修改數量
System.out.println(“請輸入修改后的數量”);
int changenum=input.nextInt();
if(changenum>1){
datas=cb.ChangeCount(changeid,changenum);
if(datas.getFlag().equals(SysConstans.SYS_LACK)){
System.out.println(“數量不足,請確認!”);
showGood(cb.Find(changeid));continue;}else{
System.out.println(“修改成功!”);
showScan(cb.result());
break;}
}else{
System.out.println(“購買數量必須大于0!”);
break;} } //如果包含,提示修改數量
System.out.println(“購買列表中無此商品,請核實”);
continue;}while(true);break;case 3: //調用結賬方法
creatOver();break;case 4: //退出
System.out.println(“收銀員退出系統成功!”);System.exit(0);default: //錯誤提示 System.out.println(“輸入有問題,請重新輸入:”);
}
}
} /**
* 打印商品列表的方法,參數是Datas類型,無返回值 * 通過調用客戶端業務類的方法得到返回值,打印商品列表 * @param datas */ //打印商品列表
private static void showList(Datas datas){
System.out.println(“---”);System.out.println(“商品編號tt商品名稱tttt商品單價tt單位tt數量”);
for(Goods good:datas.getGoodslist()){
System.out.println(good.getGoodid()+“tt”+good.getGoodname()+“tt”+good.getGoodprice()+“tt”+good.getGoodunit()+“tt”+good.getGoodcount());
}
System.out.println(“---”);
} /**
* 按編號查詢商品的方法.得到返回值,直接打印返回值中的商品 * @param datas */
//打印單個商品
private static void showGood(Datas datas){
System.out.println(“---”);System.out.println(“商品編號tt商品名稱tttt商品單價tt單位tt數量”);
System.out.println(datas.getGood().getGoodid()+“tt”+datas.getGood().getGoodname()+“tt”
+datas.getGood().getGoodprice()+“tt”+datas.getGood().getGoodunit()+“tt”+datas.getGood().getGoodcount());
System.out.println(“---”);
} /**
* 收銀員菜單中的掃描商品的方法后打印掃描商品列表的方法 *
* @param datas */
//打印掃描商品列表
private static void showScan(Datas datas){ if(datas.getFlag().equals(SysConstans.SYS_SUCCESS)){
//定義列表接收掃描后的購買列表
ArrayList
System.out.println(“商品編號t商品名稱tttt數量tt單價tt金額”);
System.out.println(“---”);
for(Goods good:scanlist){
System.out.println(good.getGoodid()+“t”+good.getGoodname()+“tt”+good.getGoodcount()+“tt”+good.getGoodprice()+“tt”+
(good.getGoodprice()*good.getGoodcount()));
}
System.out.println(“---”);
} } /**
* 查詢購買列表中是否存在要修改數量的商品
* 參數為商品編號,如果存在,返回true.不存在則返回false * @param id * @return */
//查詢購買列表中是否存在要修改數量商品的編號
private static boolean hasid(String id){ Datas datas=new Datas();datas.setBuylist(cb.result().getBuylist());for(Goods good:datas.getBuylist()){
if(good.getGoodid().equals(id)){
return true;
} }
return false;} /**
* 結賬方法,分為普通結賬和會員結賬
* 普通結賬和會員結賬,分別調用普通結賬方法和會員結賬方法 */ //結賬方法
private static void creatOver(){ //首先打印購買列表,算出總金額.調用普通結賬,或vip結賬 double money=sum(cb.result());System.out.println(“您的消費金額是:”+money);//提示選擇結賬方法 if(money!=0){
System.out.println(“請選擇結賬方法:”);System.out.println(“1.普通結賬t2.會員結賬”);int choice=input.nextInt();if(choice==1){
//普通會員結賬方法
System.out.println(“您的消費金額是:”+money);do{
System.out.println(“請輸入金額:”);int pay=input.nextInt();if(pay<0){
System.out.println(“請輸入正確金額!”);//
}else if(pay System.out.println(“金額不足,請確認!”); // }else if(pay>=money){ System.out.println(); //結賬成功.調用結賬方法,打印小票,并跳出結賬.Over(money, pay);break;}else{ System.out.println(“請輸入正確格式:”); } }while(true);}else if(choice==2){ //vip會員結賬方法,會員卡號2011.System.out.println(“您的消費金額是:”+money);System.out.print(“請輸入您的會員卡號:”);do{ int vip = input.nextInt();if(vip==2013){ System.out.print(“會員卡號正確,請輸入您要支付的金額:”); int vippay=input.nextInt();if(vippay>0){ if(vippay>money){ //金額足夠時調用vip結賬方法 VipOver(money, vippay);break;}else{ System.out.println(“付款金額不足”); } }else{ System.out.println(“付款金額必須大于0!”); } }else{ System.out.println(“您的會員卡號不正確:”);} }while(true);}else{ System.out.println(“無此結賬方法”);} }else { System.out.println(“您還沒有掃描商品”);} } /** * 結賬時用到的計算購買金額的方法,如果buylist不為空,則返回購買金額.否則返回0.* * @param result * @return */ //算出購買總金額的方法 private static double sum(Datas result){ //首先判斷購買列表是否為空,不為空則算出購買金額 if(cb.result().getFlag().equals(SysConstans.SYS_SUCCESS)){ ArrayList double sum=0;//購買總額 for(int i=0;i sum+=list.get(i).getGoodprice()*list.get(i).getGoodcount(); } } return sum;}else return 0; //計算購買數量的方法 private static int sumBuyListCount(Datas result){ if(cb.result().getFlag().equals(SysConstans.SYS_SUCCESS)){ ArrayList int goodscount=0; for(int i=0;i goodscount+=list.get(i).getGoodcount(); } return goodscount; }else{ return 0; } } /** * 普通結賬方法.返回結賬視圖,并清空購買菜單 * @param money * @param pay */ //普通用戶結賬的方法 private static void Over(double money,int pay){ //首先打印,小票的表頭 System.out.println(“***************************************************************************************************”); System.out.println(“tttt青鳥超市”);System.out.println(“收銀員:1001t小票號:” + ticket());//顯示購買列表 showbuylist();//顯示購買金額和購買的數量,結賬提示 System.out.println(“總數量:” + sumBuyListCount(cb.result())+ “ttt應收: ” + money);System.out.println(“實收: ” + pay + “tt找零: ” +(pay-money)); System.out.println(Date());System.out.println(“此小票是您退換貨及核對積分的憑證,請妥善保存!”); System.out.println(“***************************************************************************************************”); //購買列表清空 cb.clear();} /** * Vip會員結賬方法.返回結賬視圖,累計會員積分,并清空購買菜單 * @param money * @param pay */ //vip用戶結賬方法 private static void VipOver(double money,int vippay){ //首先打印,小票的表頭 System.out.println(“***************************************************************************************************”); System.out.println(“tttt青鳥超市”);System.out.println(“收銀員:1001t小票號:” + ticket());//顯示購買列表 showbuylist();//顯示購買金額和購買的數量,結賬提示 System.out.println(“總數量:” +sumBuyListCount(cb.result())+ “ttt應收: ” + money);System.out.println(“實收: ” + vippay + “tt找零: ” +(vippay-money)); //Vip積分提示 System.out.println(“本次累計積分成功tt卡號:2011”);System.out.println(“消費前積分 + 本次消費積分 = 消費后積分”); System.out.println(2000+“+”+(int)money+“=”+(2000+(int)money)); System.out.println(Date());System.out.println(“此小票是您退換貨及核對積分的憑證,請妥善保存!”); System.out.println(“***************************************************************************************************”); //購買列表清空 cb.clear();} /** * 打印購買菜單的方法.*/ //打印購買列表的方法 private static void showbuylist(){ ArrayList tt單價tt金額”); System.out.println(“---”); for(int i=0;i System.out.println((i+1)+“tt(”+buylist.get(i).getGoodid()+“)”+buylist.get(i).getGoodname()+buylist.get(i).getGoodunit()+“ttt”+buylist.get(i).getGoodcount()+“tt”+buylist.get(i).getGoodprice()+“tt”+buylist.get(i).getGoodcount()*buylist.get(i).getGoodprice()); } System.out.println(“---”);} /** * 得到日期的方法,在結賬時顯示日期用 * @return */ //顯示日期的方法 private static String Date(){ Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat(“yyyy/MM/dd/ hh:mm:ss”); String paydate= sdf.format(date); return paydate;} /** * 得到小票號的方法.日期+(1-1000)的隨機數 * @return */ //打印票據的方法 private static String ticket(){ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddhhmm”); String ticket = sdf.format(date)+(int)(Math.random()* 1000); return ticket;} } 客戶端業務類 package com.supermarket.Client;/** * 客戶端業務類.* 功能:客戶端調用業務類的方法,實現和服務器端的數據交互 */ import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.Socket;import java.net.UnknownHostException; import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.Tools.Tools;import com.supermarket.entity.Goods;import com.supermarket.entity.User; public class ClientB { //創建Socket實例 Socket socket=null;//創建輸入輸出流 ObjectOutputStream oos=null;ObjectInputStream ois=null;/** * 初始化輸入輸出流的方法,每次調用方法時都要初始化 輸入輸出流 */ //初始化流的方法 public void initSocket(){ try {//socket=new Socket(localhost,8888) socket=new Socket(Tools.getVlaue(SysConstans.SYS_HOSTNAME),Integer.parseInt(Tools.getVlaue(SysConstans.SYS_LISTENERPORT)));//獲得輸入輸出流 oos=new ObjectOutputStream(socket.getOutputStream()); ois=new ObjectInputStream(socket.getInputStream()); } catch(NumberFormatException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(UnknownHostException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} } /** * 關閉輸入輸出流的方法.* 每次調用方法之后都要關閉輸入輸出流 */ public void closeSocket(){ //關閉流的方法 try { oos.close();ois.close();socket.close();} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} } /** * 客戶端登錄方法.* 接收客戶端發送參數,發送到服務器端驗證,并接收服務器端返回的數據信息 * @param name * @param password * @return */ //登錄方法 public Datas doLogin(String name, String password){ initSocket(); User user=new User(); user.setUsername(name); user.setPassword(password); Datas datas=new Datas(); datas.setFlag(SysConstans.SYS_LOGIN); datas.setUser(user); //寫入流 try { oos.writeObject(datas); //接收服務器返回值 datas=(Datas)ois.readObject(); return datas; } catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); } catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); } finally{ closeSocket(); } return null;} /** * 客戶端查詢全部商品的方法 * @return */ //查詢全部商品的方法 public Datas FindAll(){ initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_FINDALL);try { oos.writeObject(datas); datas=(Datas)ois.readObject(); return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();}finally{ closeSocket();} return null;} /** * 客戶端實現按編號查詢商品的方法 * 功能:接收編號,到服務器查詢,接收返回值 * @param goodid * @return */ //按編號查詢商品的方法 public Datas Find(String goodid){ initSocket();Goods good=new Goods();good.setGoodid(goodid);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_FIND);datas.setGood(good);try { oos.writeObject(datas); datas=(Datas)ois.readObject();return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} finally{ closeSocket();} return null;} /** * 客戶端管理員實現入庫商品的方法 * @param goodid * @param count * @return */ //入庫方法 public Datas RuKu(String goodid,int count){ initSocket();Goods good=new Goods();good.setGoodid(goodid);good.setGoodcount(count);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_RUKU);datas.setGood(good);try { oos.writeObject(datas); datas=(Datas)ois.readObject(); return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} finally{ closeSocket();} return null;} /** * 客戶端管理員實現商品出庫的方法 * @param goodid * @param count * @return */ public Datas ChuKu(String goodid, int count){ initSocket();// 接收參數 Goods good=new Goods();good.setGoodid(goodid);good.setGoodcount(count);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_CHUKU);datas.setGood(good);try { oos.writeObject(datas); datas =(Datas)ois.readObject(); return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();}finally{ closeSocket();} return null;} /** * 客戶端管理員實現商品新增的方法 * @param good * @return */ //新增商品方法 public Datas Add(Goods good){ initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_ADD);datas.setGood(good);try { oos.writeObject(datas); datas=(Datas)ois.readObject();} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();}finally{ closeSocket();} return null;} /** * 客戶端收銀員實現掃描商品的方法 * @param scannum * @return */ //掃描方法 public Datas scan(String scannum){ // TODO 自動生成的方法存根 initSocket();Goods good=new Goods();good.setGoodid(scannum);Datas datas=new Datas();datas.setGood(good);datas.setFlag(SysConstans.SYS_SCAN);try { oos.writeObject(datas);datas =(Datas)ois.readObject();return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();}finally{ closeSocket();} return null;} /** * 客戶端收銀員實現結賬時返回購買列表的方法 * @return */ //結賬方法.返回購買列表 public Datas result(){ initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_RESULT);try { oos.writeObject(datas); datas=(Datas)ois.readObject(); return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();}finally{ closeSocket();} { return null; } /** * 客戶端收銀員實現修改數量的方法 * @param changeid * @param changenum * @return */ //收銀員,修改數量的方法 public Datas ChangeCount(String changeid, int changenum) initSocket();Goods good=new Goods();good.setGoodid(changeid);good.setGoodcount(changenum);Datas datas=new Datas();datas.setFlag(SysConstans.SYS_UPDATA);datas.setGood(good);try { oos.writeObject(datas);datas=(Datas)ois.readObject();return datas;} catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();} catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace();}finally{ closeSocket();} return null; } /** * 客戶端收銀員實現清空購買列表的方法 * @return */ public Datas clear(){ // TODO 自動生成的方法存根 initSocket();Datas datas=new Datas();datas.setFlag(SysConstans.SYS_CLEAR);try { oos.writeObject(datas);datas=(Datas)ois.readObject(); return datas; } catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); } catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); }finally{ closeSocket(); } return null; } } 商品類 package com.supermarket.entity;/** * 商品類 * 實現序列化 * 屬性:String goodid商品編號 * String goodname商品名稱 * String goodprice商品單價 * String goodunit商品單位 * String goodcount商品庫存(數量)* 商品屬性和Set/Get方法 * 有參和無參的構造方法 */ import java.io.Serializable; public class Goods implements Serializable { private String goodid;//商品編號 private String goodname;//商品名稱 private double goodprice;//商品單價 private String goodunit;//商品單位 private int goodcount;//商品數量 //商品無參數構造方法 public Goods(){ } //商品有參數構造方法 public Goods(String goodid,String goodname,double goodcount){ this.goodid=goodid; this.goodname=goodname; this.goodprice=goodprice; this.goodunit=goodunit; this.goodcount=goodcount; } public String getGoodid(){ return goodid;} public void setGoodid(String goodid){ this.goodid = goodid;} public String getGoodname(){ return goodname;} public void setGoodname(String goodname){ this.goodname = goodname;} public double getGoodprice(){ return goodprice;} public void setGoodprice(double goodprice){ if(goodprice>0){ this.goodprice = goodprice; } else{ System.out.println(“價格必須大于0”); } } public String getGoodunit(){ return goodunit;} public void setGoodunit(String goodunit){ goodprice,String goodunit,int this.goodunit = goodunit;} public int getGoodcount(){ return goodcount;} public void setGoodcount(int goodcount){ this.goodcount = goodcount; } } 用戶類 package com.supermarket.entity;/** * 用戶類 * 實現序列化 * 屬性:用戶名和密碼 * 方法:Set和Get方法 */ import java.io.Serializable; public class User implements Serializable { private String username;//用戶名 private String password;//密碼 /* public User(){ //無參數構造方法 } //有參數構造方法 public User(String username,String password){ this.username=username; this.password=password;}*/ //Set和Get方法 public String getUsername(){ return username;} public void setUsername(String username){ this.username = username;} public String getPassword(){ return password;} public void setPassword(String password){ this.password = password;} } 服務器類 package com.supermarket.Server;/** * 服務器 * 繼承線程類,創建ServerService接口,監聽客戶端請求 * 判斷客戶端傳遞的標識,通過標識調用服務端業務類操作數據的方法,并給與客戶端響應 */ import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket; import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.Tools.Tools; public class ServerListener extends Thread{ public static void main(String[] args){ // TODO 自動生成的方法存根 new ServerListener().start();} @Override public void run(){ //服務器啟動 System.out.println(“服務器啟動”); //創建ServerSocket,Socket服務器socket初始化 ServerSocket serversocket = null; Socket socket =null; ObjectOutputStream oos =null; ObjectInputStream ois= null; try {//實例化ServerSocketsocket 端口號8888 serversocket =new ServerSocket(Integer.parseInt(Tools.getVlaue(SysConstans.SYS_LISTENERPORT))); //死循環監聽請求 while(true){ socket=serversocket.accept(); oos=new ObjectOutputStream(socket.getOutputStream()); } ois = new ObjectInputStream(socket.getInputStream());//接受客戶請求的對象 Datas datas =(Datas)ois.readObject();String flag = datas.getFlag();//創建服務器服務類的對象 ServerService ss=new ServerService();//判斷客戶端傳過來的標識是想調用什么方法 if(datas.getFlag().equals(SysConstans.SYS_LOGIN)){ datas=ss.doLogin(datas);}else if(flag.equals(SysConstans.SYS_ADD)){ datas = ss.add(datas);// 商品出庫 } else if(flag.equals(SysConstans.SYS_CHUKU)){ datas = ss.down(datas);// 商品入庫 } else if(flag.equals(SysConstans.SYS_RUKU)){ datas = ss.up(datas);// 編號查看 } else if(flag.equals(SysConstans.SYS_FIND)){ datas = ss.find(datas);// 查看所有 } else if(flag.equals(SysConstans.SYS_FINDALL)){ datas = ss.findAll(datas);// 掃描商品 } else if(flag.equals(SysConstans.SYS_SCAN)){ datas = ss.scan(datas);// 修改商品 } else if(flag.equals(SysConstans.SYS_UPDATA)){ datas = ss.upData(datas);// 商品結賬 } else if(flag.equals(SysConstans.SYS_RESULT)){ datas = ss.result(datas);//商品清空 } else if(flag.equals(SysConstans.SYS_CLEAR)){ datas = ss.clear();}else{ datas.setFlag(SysConstans.SYS_ERROR);} //把datas作為返回值寫入客戶端 oos.writeObject(datas);oos.flush();socket.shutdownOutput(); } catch(NumberFormatException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); } catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); } catch(ClassNotFoundException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); }finally{ //關閉流 try { oos.close(); ois.close(); socket.close(); } catch(IOException e){ // TODO 自動生成的 catch 塊 e.printStackTrace(); } } System.out.println(“服務器終止服務!”);} } 服務器業務類 package com.supermarket.Server; import java.util.ArrayList; import com.supermarket.Tools.Datas;import com.supermarket.Tools.SysConstans;import com.supermarket.entity.Goods;import com.supermarket.entity.User;/** * 服務業務類.* 用來初始化商品列表,創建管理員和收銀員對象 * 存放服務器端調用的方法 * @author Administrator * */ public class ServerService { /** * 初始化管理員對象和收銀員對象 * 管理員對象:用戶名:admin 密碼:admin * 收銀員對象:用戶名:user 密碼:user * 初始化商品列表和購買列表 */ private static User stockman;//庫管對象 private static User cashier;//收銀對象 private static ArrayList private static ArrayList static{ //初始化庫管和收銀 stockman=new User(); stockman.setUsername(“1101”); stockman.setPassword(“1111”); cashier=new User(); cashier.setUsername(“1001”); cashier.setPassword(“0000”); //初始化商品列表 goodslist=new ArrayList goodslist.add(new Goods(“1001”, “吉百芝麻油 t”,9.5,“125ml”,200)); goodslist.add(new Goods(“1002”, “雀巢奶香咖啡t”,1.5,“13g”,200)); goodslist.add(new Goods(“1003”, “脈動水蜜桃 t”,7.0,“1.5l”,500)); goodslist.add(new Goods(“1004”, “旺仔蘋果Q糖t”,2.5,“70g”,700)); goodslist.add(new Goods(“1005”, “桃李熟切片 t”,6.5,“400g”,150)); goodslist.add(new Goods(“1006”, “白玉黃豆芽 t”,2.4,“350g”,200)); goodslist.add(new Goods(“1007”, “白如內酯豆腐t”,1.0,“400g”,100));} /** * 登錄方法驗證客戶端傳過來的信息,判斷登錄人員身份 * 管理員,返回管理員標識 * 收銀員,返回收銀員標識 * 都不是則返回錯誤標識 * @param datas * @return */ //登錄方法.驗證是管理員還是收銀員登錄,如果錯誤,返回錯誤標識 public Datas doLogin(Datas datas){ if(datas.getUser().getUsername().equals(stockman.getUsername())&&datas.getUser().getPassword().equals(stockman.getPassword())){ datas.setFlag(SysConstans.SYS_ADMIN); }else if(datas.getUser().getUsername().equals(cashier.getUsername())&&datas.getUser().getPassword().equals(cashier.getPassword())){ datas.setFlag(SysConstans.SYS_CASHIER); }else{ datas.setFlag(SysConstans.SYS_ERROR); } return datas; } /** * 倉庫管理員的方法 */ /** * 管理員新增商品的方法,* @param datas * @return */ //新增商品 public Datas add(Datas datas){ // TODO 自動生成的方法存根 goodslist.add(datas.getGood()); datas.setFlag(SysConstans.SYS_SUCCESS);// datas.setGoodslist(goodslist); return datas;} /** * 管理員商品出庫的方法 * 判斷商品列表中是否存在,如果存在判斷庫存是否充足,充足,返回成功標識,并操作商品列表中的數量 * 如果庫存不充足,返回缺貨標識 * 如果商品列表中沒有此商品,返回失敗標識 * @param datas * @return */ //出庫方法 public Datas down(Datas datas){ // TODO 自動生成的方法存根 for(int i=0;i if(goodslist.get(i).getGoodid().equals(datas.getGood().getGoodid())){ if(goodslist.get(i).getGoodcount()>=datas.getGood().getGoodcount()){ goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()-datas.getGood().getGoodcount()); datas.setGoodslist(goodslist); datas.setFlag(SysConstans.SYS_SUCCESS); return datas; }else{ datas.setFlag(SysConstans.SYS_LACK); return datas; } } } datas.setFlag(SysConstans.SYS_ERROR); return datas;} /** * 管理員商品入庫方法 * 在商品列表中查詢到商品的位置,并修改數量 * @param datas * @return */ //入庫的方法 public Datas up(Datas datas){ // TODO 自動生成的方法存根 for(int i=0;i if(goodslist.get(i).getGoodid().equals(datas.getGood().getGoodid())){ goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()+datas.getGood().getGoodcount()); datas.setGoodslist(goodslist); datas.setFlag(SysConstans.SYS_SUCCESS); return datas; } } return null;} /** * 管理員按編號查找商品的方法 * 查詢到返回成功標識 * 否則返回錯誤標識 * @param datas * @return */ //按編號查找商品 public Datas find(Datas datas){ // TODO 自動生成的方法存根 for(int i=0;i if(goodslist.get(i).getGoodid().equals(datas.getGood().getGoodid())){ datas.setFlag(SysConstans.SYS_SUCCESS); datas.setGood(goodslist.get(i)); return datas; } } datas.setFlag(SysConstans.SYS_ERROR); return datas;} /** * 管理員查詢全部商品的方法 * @param datas * @return */ //查詢全部商品列表的方法 public Datas findAll(Datas datas){ //設置標識為success,并設置商品列表.返回datas數據 datas.setFlag(SysConstans.SYS_SUCCESS); datas.setGoodslist(goodslist); return datas;} /** * 收銀員調用的方法 * @param datas * @return */ /** * 管理員掃描商品的方法 * 首先查詢購買列表中是否存在掃描的商品,如果沒有則從商品列表中找到,修改數量后添加到購買列表 * 如果購買列表中存在掃描商品,則數量加1,商品列表中相對應的商品數量-1; * @param datas * @return */ //管理員掃描商品的方法 public Datas scan(Datas datas){ // TODO 自動生成的方法存根 for(int i=0;i //如果購買列表中存在商品說明已經掃描過了,數量加一并返回,商品列表中數量-1 if(buylist.get(i).getGoodid().equals(datas.getGood().getGoodid())){ buylist.get(i).setGoodcount(buylist.get(i).getGoodcount()+1); datas.setFlag(SysConstans.SYS_SUCCESS); datas.setBuylist(buylist); goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()-1);// datas.setBuylist(buylist); return datas; } } //遍歷之后如果沒有,說明商品還沒有掃描,在商品列表中掃描,并加入到購買列表 for(int j=0;j //如果編號正確,判斷數量 if(goodslist.get(j).getGoodid().equals(datas.getGood().getGoodid())){ if(goodslist.get(j).getGoodcount()>0){ //如果商品數量大于1,則掃描成功,把掃描的商品加入購買列表,把商品列表中的數量-1,返回datas.Goods good=new Goods(); good.setGoodid(goodslist.get(j).getGoodid()); good.setGoodname(goodslist.get(j).getGoodname()); good.setGoodprice(goodslist.get(j).getGoodprice()); good.setGoodunit(goodslist.get(j).getGoodunit()); good.setGoodcount(1); buylist.add(good); datas.setFlag(SysConstans.SYS_SUCCESS); datas.setBuylist(buylist); goodslist.get(j).setGoodcount(goodslist.get(j).getGoodcount()-1); return datas; }else{ datas.setFlag(SysConstans.SYS_LACK); return datas; } } } datas.setFlag(SysConstans.SYS_ERROR); return datas;} /** * 收銀員修改商品數量的方法 * 首先在商品列表中找到商品,判斷數量是否足夠,夠則操作數量,返回成功標識 * 不夠則返回缺乏標識 * 如果不存在則返回錯誤標識 * @param datas * @return */ public Datas upData(Datas datas){ // 遍歷購買列表得到購買商品id for(int i=0;i if(buylist.get(i).getGoodid().equals(datas.getGood().getGoodid())){//得到id判斷庫存數量是否足夠 if(datas.getGood().getGoodcount()<=goodslist.get(i).getGoodcount()+1){ buylist.get(i).setGoodcount(datas.getGood().getGoodcount()); goodslist.get(i).setGoodcount(goodslist.get(i).getGoodcount()+1-datas.getGood().getGoodcount()); datas.setFlag(SysConstans.SYS_SUCCESS); datas.setBuylist(buylist); return datas; } else{ datas.setFlag(SysConstans.SYS_LACK); return datas; } } }//遍歷購買列表后沒找到商品編號,返回錯誤標識 datas.setFlag(SysConstans.SYS_ERROR); return datas;} /** * 收銀員返回購買列表的方法 * 如果購買列表不為空,返回列表和成功標識 * 如果為空,返回錯誤標識 * @param datas * @return */ //產生購買列表用以查詢 public Datas result(Datas datas){ // TODO 自動生成的方法存根 if(buylist.size()!= 0){ datas.setBuylist(buylist); datas.setFlag(SysConstans.SYS_SUCCESS); return datas; } datas.setFlag(SysConstans.SYS_ERROR); return datas;} /** * 收銀員結賬后清空購買列表的方法 * @return */ //結賬后清空購買列表 public Datas clear(){ // TODO 自動生成的方法存根 buylist.clear(); Datas datas=new Datas(); return datas;} } 傳遞數據類 package com.supermarket.Tools;/** * 數據類.用來傳遞數據 * 屬性:標識符 flag * 用戶 user * 商品 good * 商品列表 goodslist * 購買列表 buylist * 方法:Set和Get方法 */ import java.io.Serializable;import java.util.ArrayList; import com.supermarket.entity.Goods;import com.supermarket.entity.User; public class Datas implements Serializable { private String flag;//傳遞對象 private User user;//傳遞用戶 private Goods good;//傳遞商品 private ArrayList private ArrayList //Set和Get方法 public String getFlag(){ return flag;} public void setFlag(String flag){ this.flag = flag;} public User getUser(){ return user;} public void setUser(User user){ this.user = user;} public Goods getGood(){ return good;} public void setGood(Goods good){ this.good = good;} public ArrayList return goodslist;} public void setGoodslist(ArrayList this.goodslist = goodslist;} public ArrayList return buylist;} public void setBuylist(ArrayList this.buylist = buylist;} } 常量列表類 package com.supermarket.Tools;/** * 常量列表類.用來存放常量 * @author Administrator * */ public class SysConstans { public static final String SYS_PROPERTYNAME =“sys.properties”;public static final String SYS_LISTENERPORT =“PORT”;public static final String SYS_HOSTNAME =“HOST”;public static final String SYS_SUCCESS =“SUCCESS”;public static final String SYS_ERROR =“ERROR”;public static final String SYS_LOGIN =“LOGIN”;//添加一個 管理員常量 public static final String SYS_ADMIN=“ADMIN”;//添加一個收銀常量 public static final String SYS_CASHIER= “CASHIER”;;//查詢商品 public static final String SYS_FIND =“FIND”;//查詢所有 public static final String SYS_FINDALL =“FINDALL”;//添加一個入庫常量 public static final String SYS_RUKU =“RUKU”;//添加一個出庫常量 public static final String SYS_CHUKU =“CHUKU”;//添加一個添加常量 public static final String SYS_ADD=“ADD”;//商品掃描 public static final String SYS_SCAN=“SCAN”;//修改商品數量 public static final String SYS_UPDATA=“UPDATA”; //刪除商品 public static final String SYS_DELETE =“DELETE”;//商品結賬 public static final String SYS_RESULT = “RESULL”;//商品清空 public static final String SYS_CLEAR = “CLEAR”;//庫存缺乏 public static final String SYS_LACK = “LACK”; } 工具類 package com.supermarket.Tools;/** * 工具類.用來調用常量 */ import java.io.IOException;import java.util.Properties;public class Tools { private static Properties p= new Properties(); //讀取properties配置文件信息 static { //加載資源文件 try { p.load(Tools.class.getClassLoader().getResourceAsStream(SysConstans.SYS_PROPERTYNAME)); } catch(IOException e){ // TODO Auto-generated catch block e.printStackTrace(); } } //通過關鍵字取值 public static String getVlaue(String key){ return p.getProperty(key); } } 資源文件 HOST=localhost PORT=8888 超市是一家小型超級市場,由自選商場、倉庫和行政辦公室三部分組成。按照設計規劃,在自選商場門口設兩個收銀點,用兩臺電腦為顧客服務,對顧客所購商品進行計價和收款。在商場后面的倉庫和行政辦公室里再各設一臺電腦,倉庫的電腦用于商場進貨時有關商品數據的錄入,行政辦公室的電腦用于決策支持和退貨商品的數據錄入,兼做文字處理和報表打印。 商場的所有數據都保存在行政辦公室電腦上,同時在倉庫電腦上做一個備份,確保數據安全。4臺電腦上都安裝Windows XP操作系統和數據庫管理系統,組成對等網。為了減少網絡故障對系統的影響,收銀點上的兩臺電腦平時不接入網絡,但其中有操作員庫和商品價格庫的備份,收銀過程中直接調用本地硬盤上的數據,產生的銷售數據也直接保存在本地硬盤中。只有當行政辦公室電腦進行數據查詢匯總或倉庫電腦需要更新商品庫時,才臨時將這兩臺電腦的硬盤映射成網絡驅動器,由后臺電腦對其中的數據進行操作,操作完成后再立即斷開網絡驅動器。 網絡結構 該網絡系統采用星形拓撲結構,以集線器為中心結點,把4臺外圍電腦連接起來,呈輻射狀互聯結構。每臺電腦均配有打印機和手持式紅外線條碼閱讀器。收銀系統對電腦本身的要求并不高,可以使用賽揚兼容機;集線器使用的是D-Link公司的8口10/100M自適應集線器;網卡使用D-Link公司的DE530TX 10/100M自適應網卡;收銀點的打印機使用Epson公司的LQ-300K窄行針式打印機,可以打印復寫紙;行政辦公室和倉庫的打印機使用Epson公司的LQ-1600KⅢ寬行打印機;條碼閱讀器使用的是臺灣產紅外線條碼閱讀器。如果商場同意,在經費充裕的情況下,收銀點可以推薦使用臺式激光條碼閱讀機。 系統結構圖 程序總體設計 筆者使用Delphi 5.0作為主要開發語言,其中系統主要模塊有:操作員登錄模塊、收銀/進貨模塊、查詢模塊、報表/資金管理/數據匯總模塊、操作員管理模塊及操作員密碼修改模塊等。 在整個系統中,客戶使用最多的是收銀模塊,提高收銀的處理速度成為提高整個系統速度的關鍵。經過分析,筆者認為提高收銀速度的瓶頸主要集中在操作員的數據錄入和打印機的數據輸出上。操作員的數據錄入包括商品條碼錄入、顧客所購同一種商品多于一件時商品數量的錄入以及最后一個商品錄入完畢后通知電腦計算總價等。因此,筆者將所有的錄入放在一個輸入框Edit1中,當收銀員按回車鍵確認輸入完畢后,由程序根據輸入數據的長度自動判斷輸入數據的屬性,收銀員只需使用條碼閱讀器和小鍵盤就可以完成所有的操作。為了提高打印機的輸出速度,該系統還在收銀模塊中采用了直接打印的方法,將打印機作為輸出文件,把打印字符直接送到打印機上輸出,避免了使用Windows 98的打印機驅動程序所帶來的時間延遲問題。數據輸入和輸出部分處理過程的主要代碼如下: procedure TForm10.Edit1KeyDown(Sender: TObject;var Key: Word;Shift: TShiftState);…… begin if key=vk_return then begin //計算輸入框中字符的個數 inlength:=length(edit1.text);case inlength of //字符長度為零時,調用計價子模塊 0:begin form11.showmodal; end; //輸入1到3個數字時,作為數量處理 1,2,3:begin //flag為全局變量 if flag then begin dm.table11.Edit;dm.table11[‘shuliang’]:=strtoint(edit1.text); dm.table11[‘chengben’]:=dm.table11[‘cbdanjia’]*dm.table11[‘shuliang’]; dm.table11[‘liangshou’]:=dm.table11[‘lsdanjia’]*dm.table11[‘shuliang’]; dm.table11.post; edit3.text:=floattostr(strtofloat(edit3.text)+(dm.table11[‘shuliang’]-1)*dm.table11[‘lsdanjia’]); edit2.text:=edit1.text; dm.table9.Edit; dm.table9[‘kucheng’]:=dm.table9[‘kucheng’]-strtoint(edit2.text)+1; dm.table9[‘shuliang’]:=dm.table9[‘shuliang’]+strtoint(edit2.text)-1; dm.table9.post; edit1.Clear; edit2.text:=‘1’; flag:=false; //打印購物清單,清單由商品條碼、商品名、單價、數量和小計構成str:= dm.table11[‘tiaoma’]; str:=str+‘’+dm.table11[‘pinming’]; str:=str+‘ ’+floattostr(dm.table11 [‘lsdanjia’]); if inlength=1 then str:=str+‘ ’+ inttostr(dm.table11[‘shuliang’]); if inlength=2 then str:=str+‘ ’+ inttostr(dm.table11[‘shuliang’]); if inlength=3 then str:=str+‘ ’+ inttostr(dm.table11[‘shuliang’]); str:=str+‘ ’+ floattostr(dm.table11[‘liangshou’]); assignfile(f, ‘lpt1’); rewrite(f); try writeln(f,str); finally closefile(f); end else showmessage(‘請您先輸入條碼,然后再輸入數量’); end;//輸入超過4位時,當成條碼處理 else if dm.table9.FindKey([edit1.text])then begin if dm.table11.Active=false then dm.table11.open; //打印購物清單 …… flag:=True; dm.table11.Edit; if dm.table11.recordcount=0 then begin dm.table11.Insert; dm.table11[‘mingxi’]:=strtoint(inttostr(dm.table10[‘danhao’])+‘01’); end else begin dm.table11.Last; i:=dm.table11[‘mingxi’]; dm.table11.Insert; dm.table11[‘mingxi’]:=i+1; end; dm.table11.edit; dm.table11[‘danhao’]:=dm.table10 [‘danhao’];…… dm.table11[‘xsdate’]:=date; dm.table11[‘liangshou’]:=dm.table11 [‘lsdanjia’]*1; dm.table11.post; dm.table9.Edit; dm.table9[‘kucheng’]:= dm.table9 [‘kucheng’]-1; dm.table9[‘shuliang’]:=dm.table9 [‘shuliang’]+1; dm.table9.Post; edit3.text:=floattostr(strtofloat(edit3.text)+dm.table11[‘liangshou’]); edit1.Clear; end else begin showmessage(‘庫存里沒有此商品.請查看輸入的條碼是否正確’); edit1.clear; 易用通管理軟件V9網絡版學習內容 一、商品檔案建立 1、普通商品(貨商) 2.多包裝條碼商品 3.無條碼商品 4.散稱商品(生鮮果蔬食品、計數商品、不定量商品、不定價商品) 5.一碼多品、一品多碼 6.物價簽 條碼打印 7.電子稱下發 8.商品調價 二、商品庫存管理 1.商品出入庫(入庫驗收單、采購退貨單)2.購銷結算、聯營結算 3.庫存查詢 4.盤點 5.報損 三、批發銷售 1.客戶建檔 2.開銷售單 退貨開單 3.客戶結算 四、前臺收銀 1.班次流程 2.功能操作 3.硬件維護 五、賬目報表查看 1.采購報表 2.銷售(零售 批發) 3.庫存進銷存 4.財務結算表 六、活動促銷設置 1.特價 2.買一送一 3.打包 七、會員管理 1.會員建檔 2.會員維護 3.會員報表 八、收銀系統硬件使用及注意事項 1.電子稱的使用 及 裝紙 2.條碼機的使用 及 裝紙 3.收款機的連接 及 裝紙 4.報表 單子打印 九、員工權限分配(前臺后臺) 超市收銀系統(流程圖+摘要+任務書+開題報告+ER圖+源程序) 1.1課題背景及目的隨著社會經濟的迅速發展和科學技術的全面進步,計算機事業的飛速發展,以計算機與通信技術為基礎的信息系統正處于蓬勃發展的時期。隨著經濟文化水平的顯著提高,人們對生活質量及工作環境的要求也越來越高。為了管理大量的超市商品,超市智能化的實現,超市的管理問題也就提上了日程。隨著超市商品的大量增加,其管理難度也越來越大,如何優化超市的日常管理也就成為了一個大眾化的課題。功能簡潔、實用,價格平實:根據客戶功能需要的不同,制定相應的版本、相應的價格,讓客戶最實惠、錢花到實處。 目前,許多連鎖超市企業將總部信息系統與連鎖超市配送中心信息系統合二為一,即以連鎖超市配送中心信息系統為中心與各分店信息系統合起來形成連鎖超市企業的信息系統。總體構成及功能如下:系統的邏輯結構從橫向分為營銷中心、人員管理中心、庫存管理中心和會員管理中心四大模塊,他們之間既緊密聯系,也可相對獨立運作,自成一體。從縱向看,每個模塊又可分為三個層次,即數據管理層、業務處理層和決策分析層。數據管理層有效保存業務有關的所有原始數據,并對這些數據進行有效的分類管理。業務處理層主要支持日常業務,解決遇到的日常業務問題。其主要功能為數據采集、查詢、統計及對數據的適當處理,并對業務過程監控優化。決策分析層主要為業務部門提供決策分析的支持,幫助建立計劃機制及控制機制,輔助業務部門進行決策。 收銀管理系統是小型超市商品銷售及貨物管理的主要控制部分,直接影響銷售的方便性及管理的規范性。隨著信息時代的發展,對效率的要求日益提高,因而軟件控制銷售和管理已經取代了傳統全手工方式。小型超市具有自身的特點:商品要求一般齊全,進出貨關系較為簡單,員工人數種類不多;在軟件角度看,數據較少,對存儲和速度要求不高。但正由于員工較少,使用軟件控制成為必須。 本系統針對商品銷售管理的業務范圍及工作特點,設計了基于智能客戶端架構的超市收銀系統,可以全面實現對商品銷售、付款、收款和庫存等業務的計算機管理,大大減輕了超市收銀工作人員的工作量,全面提高了超市收銀管理的管理效率以及服務質量,使管理水平和業務水平躍上了一個新的臺階。 1.2超市收銀系統及其研究現狀 超市收銀系統在現代社會己深入到各大中小型超市中,由于計算機技術的迅速發展和普及,超市收銀系統已經為超市進行管理商品的進出,已經精確的銷售做出了良好的貢獻。自20世紀80年代以來,超市收銀系統應用日益普及,各超市為了提高經營的效益,都在醞釀、設計或著手建立自己的收銀系統。收銀系統是一個將商場商品和經營中的各種內、外部信息進行收集、加工、整理、傳遞,并有序地存儲,以用于管理和決策,使銷售更方便快捷的系統。它以應用于銷售為目的,并以信息技術為手段達到其目的。收銀系統是一個不斷發展的新理念,其運用隨著計算機技術和網絡技術的進步也在不斷更新。在現階段普遍認為收銀系統是由人和計算機設備或其他信息處理手段組成并用于銷售處理的系統。收銀系統的對象是商品銷售信息,信息是經過加工的數據,信息是對決策者有價值的數據。信息的主要特征是來源分散,數量龐大。信息來源于銷售第一線,來源于銷售市場,信息具有時間性。系統是由相互聯系、相互作用的若干要素按一定的法則組成并具有一定功能的整體。在現代社會,收銀系統已和計算機設備不可分離。收銀系統包括計算機、網絡通訊設備等硬件成份,包括操作系統、應用軟件包等軟件成份。并隨著計算機技術和通訊技術的迅速發展還會出現更多的內容。 1.3論文構成及研究內容 本論文主要由緒論,超市收銀系統主要技術的概述,超市收銀系統的分析和設計,超市收銀系統的實現,超市收銀系統的關鍵技術研究以及結束語等構成。 主要包含課題的背景和意義,超市收銀系統的現狀,智能客戶端技術的學習,以及對這些基礎技術的應用等方面。 第一章是緒論,包括了本設計的研究現狀和背景及研究意義等。 第二章是系統的主要技術概述,包括智能客戶端技術和Click Once技術以及.Net Framework的概要。還對本設計的架構進行了簡要介紹。 第三章是系統的分析和設計,對系統進行了總體的結構設計并展示了系統的邏輯設計模型。同時對系統的功能設計和數據庫設計以及安全性和可靠性設計進行了簡單描述。 第四章是系統的實現部分,包括了運用VS2008和SQL2005來開發的超市收銀系統。詳細的描述了系統實現的各個模塊并作出了各個模塊的實現流程圖和模塊界面截圖。 第五章是系統關鍵技術研究,本課題主要研究了離線應用技術和系統的數據安全問題。 上一頁[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]...下一頁>> 歡迎使用站內搜索 超市收銀系統(流程圖+摘要+任務書+開題報告+ER圖+源程序)下載如圖片無法顯示或論文不完整,請進 上一篇文章: 競聘失敗嚴重心理問題的咨詢案例報告 下一篇文章: 五層辦公樓設計(說明書+施工組織設計+結構圖+英文文獻翻譯) 產品名稱:藥店收銀管理系統本軟件是一套專門針對藥店/藥房而開發的綜合性行業管理軟件。軟件支持散客和會員的消費。會員卡類型可分為儲值卡、折扣卡、計次卡、積分卡、升級卡。根據會員促銷活動可以靈活的設定會員卡的類型。會員的歷史記錄可隨時查看,包括存款記錄、消費記錄、積分記錄、獎勵記錄。這樣大大減少了手工操作的麻煩。 對于零賣藥品項目,可以自由設定,自動生成助記碼,點單時能快速落單。商品的進銷存管理一清二楚,庫存自動扣減。能自動統計商品的消費排行榜、員工的售卡提成、每日營業額收入。對于藥品可以作銷售時段的促銷,可以讓部分要作處理的藥品作特價銷售。記錄操作員有操作日志記錄,可隨時知道操作員對軟件作了何操作。軟件按權限劃分明細,不同職責的操作人員只負責自己的操作管理。對于操作人員離開電腦可鎖定系統,以防止非操作人員進入電腦而誤操作。 軟件有會員生日自動提醒,消費金額的語音提示功能,從而更能讓管理更加人性化,以給顧客留下良好的印象,提升藥店的整體檔次。 軟件功能特點: 1、收銀界面友好美觀,前臺收銀操作方便快捷 2、前一位顧客臨時有事不能馬上買單,可以交帳單掛起再讓后面的顧客結帳,當前面顧客可以結帳時再將上一筆帳單彈出來結帳 3、前臺結帳時直接輸入商品的編號或助記碼進行結帳,也可以按SHIFT鍵彈出所有商品的點單面板,通過對選 中的商品雙擊添加,非常方便 4、可修改單項商品的折扣 5、自動統計導購人員的提成6、可對顧客的消費折扣進行修改 7、靈活的操作權限設置,細化到每一個操作員 8、商品自動生成拼音簡碼,輸入時方便快捷 9、每種商品可設置零售價、促銷價、會員價三種不同的價格 10、可對部分商品進行促銷價的銷售,并可在特定的時間段里特價銷售 11、能對已結帳單進行退單管理 12、各種報表均可導出EXCEL文件進行編輯 13、會員卡類型可設定:儲值卡、折扣卡、積分卡、升級卡 14、獨家引入強大的萬能自定義報表,任意查詢,非常方便,打印格式整齊美觀 15、強大的會員積分功能,積分可換贈品及抵消費 16、支持會員照片顯示 17、會員卡遺失可掛失,補卡,過戶 18、收銀員交接班有統計報表打印 19、支持辦卡優惠活動,比如存800可消費1000元,相當于贈送200元現金 20、會員卡密碼可修改 21、軟件具有自動備份的功能 22、會員生日自動提醒功能 23、快捷鍵彈出/隱藏收銀界面,從而不影響操作電腦做其它事情 24、鎖定軟件功能,防止非法人員進入亂操作 25、會員檔案,歷史消費,存款等記錄永存于電腦 26、商品庫存不足時自動報警 27、可設定最低消費功能,消費金額不足時提示續充值 28、員工檔案管理及提成統計 29、商品按類別統計銷售額,可以自動統計銷售排行榜 30、會員卡按消費金額的累加而自動升級以享受更多優惠,實現人性化管理 面對面科技第二篇:超市收銀系統構建
第三篇:超市收銀系統培訓學習容
第四篇:超市收銀系統(流程圖 摘要 任務
第五篇:藥店收銀管理系統