第一篇:北大青鸟第一单元超市收银管理系统(最终版)
包结构
四个包,九个类,一个资源文件
客户端类
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、会员卡按消费金额的累加而自动升级以享受更多优惠,实现人性化管理 面对面科技第二篇:超市收银系统构建
第三篇:超市收银系统培训学习容
第四篇:超市收银系统(流程图 摘要 任务
第五篇:药店收银管理系统