逻辑层工厂类StockEbiFactory:
package cn.hncu.bookStore.stock.business.factory; import cn.hncu.bookStore.stock.business.ebi.StockEbi; import cn.hncu.bookStore.stock.business.ebo.StockEbo; /** * 库存逻辑层工厂类 * @author 陈浩翔 * * @version 1.0 2016-4-20 */ public class StockEbiFactory { /** * 工厂方法 * @return---new一个逻辑层实现类 */ public static StockEbi getStockEbi(){ return new StockEbo(); } }
值对象StockModel:
package cn.hncu.bookStore.stock.vo; import java.io.Serializable; /** * 库存封装值对象 * @author 陈浩翔 * * @version 1.0 */ public class StockModel implements Serializable{ //库存编号 private String uuid; //图书编号 private String bookUuid; //库存数量 private int sumNum; //为显示给用户看而补的 private String bookName; public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getBookUuid() { return bookUuid; } public void setBookUuid(String bookUuid) { this.bookUuid = bookUuid; } public int getSumNum() { return sumNum; } public void setSumNum(int sumNum) { this.sumNum = sumNum; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; StockModel other = (StockModel) obj; if (uuid == null) { if (other.uuid != null) return false; } else if (!uuid.equals(other.uuid)) return false; return true; } @Override public String toString() { return "库存编号:"+uuid + ", 《" + bookName + "》, 库存数量:" + sumNum+"本"; } }
查询值对象StockQueryModel:
package cn.hncu.bookStore.stock.vo; /** * 库存查询值对象封装 * @author 陈浩翔 * * @version 1.0 */ public class StockQueryModel extends StockModel{ //最大的图书库存数量 private int sumNum2; public int getSumNum2() { return sumNum2; } public void setSumNum2(int sumNum2) { this.sumNum2 = sumNum2; } }
表现层库存列表StockListPanel:
/* * StockListPanel.java * * Created on __DATE__, __TIME__ */ package cn.hncu.bookStore.stock.ui; import java.util.List; import javax.swing.JFrame; import cn.hncu.bookStore.stock.business.factory.StockEbiFactory; import cn.hncu.bookStore.stock.vo.StockModel; /** * * @author 陈浩翔 * * @version 1.0 2016-4-20 */ public class StockListPanel extends javax.swing.JPanel { private JFrame mainFrame = null; /** Creates new form StockListPanel */ public StockListPanel(JFrame mainFrame) { this.mainFrame = mainFrame; initComponents(); myInitData(); } public StockListPanel(JFrame mainFrame, List<StockModel> results) { this.mainFrame = mainFrame; initComponents(); jListStocks.setListData(results.toArray()); } private void myInitData() { List<StockModel> lists = StockEbiFactory.getStockEbi().getAll(); jListStocks.setListData(lists.toArray()); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ //GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jListStocks = new javax.swing.JList(); btnQuery = new javax.swing.JButton(); setMinimumSize(new java.awt.Dimension(800, 600)); setLayout(null); jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 48)); jLabel1.setForeground(new java.awt.Color(255, 0, 0)); jLabel1.setText("\u5e93\u5b58\u5217\u8868"); add(jLabel1); jLabel1.setBounds(280, 0, 220, 90); jListStocks.setFont(new java.awt.Font("微软雅黑", 1, 18)); jListStocks.setForeground(new java.awt.Color(0, 0, 153)); jListStocks.setModel(new javax.swing.AbstractListModel() { String[] strings = { "" }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } }); jScrollPane1.setViewportView(jListStocks); add(jScrollPane1); jScrollPane1.setBounds(120, 100, 520, 320); btnQuery.setFont(new java.awt.Font("Dialog", 1, 36)); btnQuery.setForeground(new java.awt.Color(255, 0, 51)); btnQuery.setText("\u67e5\u8be2\u5e93\u5b58"); btnQuery.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnQueryActionPerformed(evt); } }); add(btnQuery); btnQuery.setBounds(270, 440, 190, 90); }// </editor-fold> //GEN-END:initComponents private void btnQueryActionPerformed(java.awt.event.ActionEvent evt) { mainFrame.setContentPane(new StockQueryPanel(mainFrame)); mainFrame.validate(); } //GEN-BEGIN:variables // Variables declaration - do not modify private javax.swing.JButton btnQuery; private javax.swing.JLabel jLabel1; private javax.swing.JList jListStocks; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration//GEN-END:variables }
表现层库存查询StockQueryPanel:
/* * StockQueryPanel.java * * Created on __DATE__, __TIME__ */ package cn.hncu.bookStore.stock.ui; import java.util.List; import javax.swing.JFrame; import javax.swing.JOptionPane; import cn.hncu.bookStore.book.business.factory.BookEbiFactory; import cn.hncu.bookStore.book.vo.BookModel; import cn.hncu.bookStore.stock.business.factory.StockEbiFactory; import cn.hncu.bookStore.stock.vo.StockModel; import cn.hncu.bookStore.stock.vo.StockQueryModel; /** * * @author 陈浩翔 * * @version 1.0 2016-4-20 */ public class StockQueryPanel extends javax.swing.JPanel { private JFrame mainFrame = null; /** Creates new form StockQueryPanel * @param mainFrame */ public StockQueryPanel(JFrame mainFrame) { this.mainFrame = mainFrame; initComponents(); myInitData(); } /** * 初始化图书box */ private void myInitData() { List<BookModel> books = BookEbiFactory.getBookEbi().getAll(); for(BookModel book:books){ combBook.addItem(book.getName()); } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ //GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); tfdStockUuid = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); combBook = new javax.swing.JComboBox(); jLabel8 = new javax.swing.JLabel(); tfdStockNum = new javax.swing.JTextField(); jLabel11 = new javax.swing.JLabel(); tfdStockNum2 = new javax.swing.JTextField(); btnQuery = new javax.swing.JButton(); btnBack = new javax.swing.JButton(); setMinimumSize(new java.awt.Dimension(800, 600)); setLayout(null); jLabel1.setFont(new java.awt.Font("Dialog", 1, 48)); jLabel1.setForeground(new java.awt.Color(255, 0, 0)); jLabel1.setText("\u5e93\u5b58\u67e5\u8be2"); add(jLabel1); jLabel1.setBounds(270, 0, 230, 90); jLabel7.setFont(new java.awt.Font("微软雅黑", 0, 18)); jLabel7.setText("\u5e93\u5b58\u7f16\u53f7:"); add(jLabel7); jLabel7.setBounds(80, 160, 80, 30); add(tfdStockUuid); tfdStockUuid.setBounds(180, 160, 150, 30); jLabel5.setFont(new java.awt.Font("微软雅黑", 0, 18)); jLabel5.setText("\u56fe\u4e66:"); add(jLabel5); jLabel5.setBounds(430, 150, 50, 30); combBook.setFont(new java.awt.Font("Dialog", 1, 18)); combBook.setModel(new javax.swing.DefaultComboBoxModel( new String[] { "查询所有" })); add(combBook); combBook.setBounds(490, 150, 190, 30); jLabel8.setFont(new java.awt.Font("微软雅黑", 0, 18)); jLabel8.setText("\u5e93\u5b58\u6700\u5c0f\u6570\u91cf:"); add(jLabel8); jLabel8.setBounds(50, 270, 140, 30); add(tfdStockNum); tfdStockNum.setBounds(180, 270, 150, 30); jLabel11.setFont(new java.awt.Font("微软雅黑", 0, 18)); jLabel11.setText("\u5e93\u5b58\u6700\u5927\u6570\u91cf:"); add(jLabel11); jLabel11.setBounds(360, 270, 120, 30); add(tfdStockNum2); tfdStockNum2.setBounds(490, 270, 190, 30); btnQuery.setFont(new java.awt.Font("Dialog", 1, 24)); btnQuery.setForeground(new java.awt.Color(255, 0, 51)); btnQuery.setText("\u67e5\u8be2"); btnQuery.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnQueryActionPerformed(evt); } }); add(btnQuery); btnQuery.setBounds(140, 410, 120, 70); btnBack.setFont(new java.awt.Font("Dialog", 1, 24)); btnBack.setForeground(new java.awt.Color(255, 0, 51)); btnBack.setText("\u8fd4\u56de"); btnBack.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnBackActionPerformed(evt); } }); add(btnBack); btnBack.setBounds(490, 410, 120, 70); }// </editor-fold> //GEN-END:initComponents private void btnQueryActionPerformed(java.awt.event.ActionEvent evt) { // 1收集参数(且验证输入有效性) //库存编号 String uuid = tfdStockUuid.getText(); //图书编号 String bookUuid = null; if (combBook.getSelectedIndex() > 0) { bookUuid = BookEbiFactory.getBookEbi() .getBookByName(combBook.getSelectedItem().toString()) .getUuid(); } //库存最小数量 int sumNum = 0; if (tfdStockNum.getText() != null && tfdStockNum.getText().trim().length() > 0) { try { sumNum = Integer.parseInt(tfdStockNum.getText()); if (sumNum < 0) { throw new NumberFormatException(); } } catch (NumberFormatException e) { JOptionPane.showMessageDialog(mainFrame, "库存最小数量必须输入正整数!"); return; } } //库存最大数量 int sumNum2 = 0; if (tfdStockNum2.getText() != null && tfdStockNum2.getText().trim().length() > 0) { try { sumNum2 = Integer.parseInt(tfdStockNum2.getText()); if (sumNum2 < 0) { throw new NumberFormatException(); } } catch (NumberFormatException e) { JOptionPane.showMessageDialog(mainFrame, "库存最大数量必须输入正整数!"); return; } } // 2组织参数----StockQueryModel StockQueryModel sqm = new StockQueryModel(); sqm.setUuid(uuid); sqm.setBookUuid(bookUuid); sqm.setSumNum(sumNum); sqm.setSumNum2(sumNum2); // 3调用逻辑层 List<StockModel> results = StockEbiFactory.getStockEbi() .getByCondition(sqm); // 4返回到结果页面 mainFrame.setContentPane(new StockListPanel(mainFrame, results)); mainFrame.validate(); } private void btnBackActionPerformed(java.awt.event.ActionEvent evt) { back(); } private void back() { mainFrame.setContentPane(new StockListPanel(mainFrame)); mainFrame.validate(); } //GEN-BEGIN:variables // Variables declaration - do not modify private javax.swing.JButton btnBack; private javax.swing.JButton btnQuery; private javax.swing.JComboBox combBook; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JTextField tfdStockNum; private javax.swing.JTextField tfdStockNum2; private javax.swing.JTextField tfdStockUuid; // End of variables declaration//GEN-END:variables }
进货模块:
进货模块的逻辑层接口,在写了库存模块之后改了一点,增加了和库存模块的串接:
逻辑层接口InMainEbo:
package cn.hncu.bookStore.in.business.ebo; import java.util.List; import java.util.Map; import java.util.TreeMap; import cn.hncu.bookStore.book.business.ebi.BookEbi; import cn.hncu.bookStore.book.business.factory.BookEbiFactory; import cn.hncu.bookStore.common.UuidModelConstance; import cn.hncu.bookStore.common.uuid.dao.dao.UuidDao; import cn.hncu.bookStore.common.uuid.dao.factory.UuidDaoFactory; import cn.hncu.bookStore.in.business.ebi.InMainEbi; import cn.hncu.bookStore.in.business.factory.InMainEbiFactory; import cn.hncu.bookStore.in.dao.dao.InDetailDao; import cn.hncu.bookStore.in.dao.dao.InMainDao; import cn.hncu.bookStore.in.dao.factory.InDetailDaoFactory; import cn.hncu.bookStore.in.dao.factory.InMainDaoFactory; import cn.hncu.bookStore.in.vo.InDetailModel; import cn.hncu.bookStore.in.vo.InDetailQueryModel; import cn.hncu.bookStore.in.vo.InMainModel; import cn.hncu.bookStore.in.vo.InMainQueryModel; import cn.hncu.bookStore.stock.dao.dao.StockDao; import cn.hncu.bookStore.stock.dao.factory.StockDaoFactory; import cn.hncu.bookStore.stock.vo.StockModel; import cn.hncu.bookStore.stock.vo.StockQueryModel; /** * * @author 陈浩翔 * * @version 1.0 */ public class InMainEbo implements InMainEbi{ //注入dao InMainDao inMainDao = InMainDaoFactory.getInMainDao(); InDetailDao inDetailDao = InDetailDaoFactory.getInDetailDao(); UuidDao uuidDao = UuidDaoFactory.getUuidDao(); BookEbi bookEbi = BookEbiFactory.getBookEbi(); @Override public boolean create(InMainModel inMain, List<InDetailModel> inDetails) { //1存储inMain信息/// //补全inMain中的数据 //需要:inUuid,inDate,inUserUuid 已组织:inUserUuid //还缺(需补):inUuid,inDate String inUuid = uuidDao.getNextUuid(UuidModelConstance.IN_MAIN); inMain.setUuid(inUuid); inMain.setInDate(System.currentTimeMillis()); inMainDao.create(inMain); //2存储inDetail信息/// for(InDetailModel model:inDetails){ //补全每一个inDetail中的数据 //需要:inDetailUuid,inMainUuid,bookUuid,sumNum,sumMoney 已组织:bookUuid,sumNum //还缺(需补):inDetailUuid,inMainUuid,sumMoney model.setUuid(uuidDao.getNextUuid(UuidModelConstance.IN_DETAIL)); model.setInId(inUuid); double sumMoney = model.getSumNum() * bookEbi.getSingle(model.getBookId()).getInPrice(); model.setSumMoney(sumMoney); inDetailDao.create(model); //※※※3 图书入库--到库存表格/// putInStock(model.getBookId(),model.getSumNum()); } return true; } /** * 入库动作 * @param bookId * @param bookName */ private void putInStock(String bookId, int sumNum) { //注入Stock模块的dao StockDao dao = StockDaoFactory.getStockDao(); //查询库存,看看是否已经存在该bookUuid所对应的书,如果没有则库存数据为sumNum,否则为在原有基础上再加上sumNum StockQueryModel sqm = new StockQueryModel(); sqm.setBookUuid(bookId); List<StockModel> lists = dao.getByCondition(sqm); //库存中没有这种书 if(lists==null||lists.size()==0){ //表现层只负责组织进货模块的值对象,库存模块我们在逻辑层自己补 StockModel stock = new StockModel(); //补:库存编号 uuid stock.setUuid(UuidDaoFactory.getUuidDao().getNextUuid(UuidModelConstance.STOCK)); //补: bookName 专为显示给用户看的书名 stock.setBookName(BookEbiFactory.getBookEbi().getSingle(bookId).getName()); stock.setBookUuid(bookId); stock.setSumNum(sumNum); dao.create(stock); }else{//库存中已经存在该图书对应的库存记录 StockModel stock = lists.get(0); stock.setSumNum( stock.getSumNum()+sumNum ); dao.update(stock); } } @Override public Map<InMainModel, List<InDetailModel>> getAll() { Map<InMainModel,List<InDetailModel>> map = new TreeMap<InMainModel, List<InDetailModel>>(); List<InMainModel> inMains = inMainDao.getAll(); for(InMainModel inMain: inMains ){ //查询条件值对象的创建 InDetailQueryModel idqm = new InDetailQueryModel(); String inUuid = inMain.getUuid(); idqm.setInId(inUuid); List<InDetailModel> details = inDetailDao.getbyCondition(idqm); map.put(inMain, details); } return map; } @Override public Map<InMainModel, List<InDetailModel>> getByCondition( InMainQueryModel imqm, InDetailQueryModel idqm) { Map<InMainModel, List<InDetailModel>> map = new TreeMap<InMainModel, List<InDetailModel>>(); List<InMainModel> list = inMainDao.getbyCondition(imqm); for(InMainModel inMain : list){ idqm.setInId(inMain.getUuid()); List<InDetailModel> details = inDetailDao.getbyCondition(idqm); if(details.size()!=0){ map.put(inMain, details); } } return map; } }
销售模块:
销售模块的逻辑层接口也增加了和库存模块的串接:
逻辑层接口OutMainEbo:
package cn.hncu.bookStore.out.business.ebo; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.swing.JOptionPane; import cn.hncu.bookStore.book.business.ebi.BookEbi; import cn.hncu.bookStore.book.business.factory.BookEbiFactory; import cn.hncu.bookStore.common.UuidModelConstance; import cn.hncu.bookStore.common.uuid.dao.dao.UuidDao; import cn.hncu.bookStore.common.uuid.dao.factory.UuidDaoFactory; import cn.hncu.bookStore.out.business.ebi.OutMainEbi; import cn.hncu.bookStore.out.dao.dao.OutDetailDao; import cn.hncu.bookStore.out.dao.dao.OutMainDao; import cn.hncu.bookStore.out.dao.factory.OutDetailDaoFactory; import cn.hncu.bookStore.out.dao.factory.OutMainDaoFactory; import cn.hncu.bookStore.out.vo.OutDetailModel; import cn.hncu.bookStore.out.vo.OutDetailQueryModel; import cn.hncu.bookStore.out.vo.OutMainModel; import cn.hncu.bookStore.out.vo.OutMainQueryModel; import cn.hncu.bookStore.stock.business.factory.StockEbiFactory; import cn.hncu.bookStore.stock.dao.dao.StockDao; import cn.hncu.bookStore.stock.dao.factory.StockDaoFactory; import cn.hncu.bookStore.stock.vo.StockModel; import cn.hncu.bookStore.stock.vo.StockQueryModel; /** * * @author 陈浩翔 * * @version 1.0 */ public class OutMainEbo implements OutMainEbi{ //注入dao OutMainDao outMainDao = OutMainDaoFactory.getOutMainDao(); OutDetailDao outDetailDao = OutDetailDaoFactory.getOutDetailDao(); UuidDao uuidDao = UuidDaoFactory.getUuidDao(); BookEbi bookEbi = BookEbiFactory.getBookEbi(); @Override public boolean create(OutMainModel outMain, List<OutDetailModel> outDetails) { //※※※库存操作1:在添加销售信息之前要进行防护:检查库存,看是否可能库存不够。如果不够,本次添加直接失败,不进行数据存储---return false; //检查库存----用明细单(outDetail)中的bookUuid //注入Stock模块的dao StockDao stockDao = StockDaoFactory.getStockDao(); for(OutDetailModel detail : outDetails){ StockQueryModel sqm = new StockQueryModel(); sqm.setBookUuid(detail.getBookId()); List<StockModel> lists = stockDao.getByCondition(sqm); if(lists==null||lists.size()==0){//库存中没有该图书信息 JOptionPane.showMessageDialog(null, "库存中不存在《"+detail.getBookName()+"》,本次销售添加失败!"); return false; }else { StockModel sm = lists.get(0); if(sm.getSumNum()<detail.getSumNum()){ JOptionPane.showMessageDialog(null, "库存中《"+detail.getBookName()+"》数量不足,本次销售添加失败!"); return false; } } } //1存储outMain信息/// //补全outMain中的数据 //需要:inUuid,inDate,inUserUuid 已组织:inUserUuid //还缺(需补):inUuid,inDate String outUuid = uuidDao.getNextUuid(UuidModelConstance.OUT_MAIN); outMain.setUuid(outUuid); outMain.setOutDate(System.currentTimeMillis()); outMainDao.create(outMain); //2存储inDetail信息/// for(OutDetailModel model:outDetails){ //补全每一个inDetail中的数据 //需要:inDetailUuid,outMainUuid,bookUuid,sumNum,sumMoney 已组织:bookUuid,sumNum //还缺(需补):inDetailUuid,outMainUuid,sumMoney model.setUuid(uuidDao.getNextUuid(UuidModelConstance.OUT_DETAIL)); model.setOutId(outUuid); double sumMoney = model.getSumNum() * bookEbi.getSingle(model.getBookId()).getSalePrice(); model.setSumMoney(sumMoney); outDetailDao.create(model); //※※※库存操作2:更新库存---把对应的每种图书的数量 减去 这次销售的数量 StockQueryModel sqm = new StockQueryModel(); sqm.setBookUuid(model.getBookId()); List<StockModel> stocks = StockEbiFactory.getStockEbi().getByCondition(sqm); //经过之前的防护,list里面一定有一个值,而且库存一定可以更新成功 StockModel stock = stocks.get(0); stock.setSumNum(stock.getSumNum()-model.getSumNum()); StockDaoFactory.getStockDao().update(stock); } return true; } @Override public Map<OutMainModel, List<OutDetailModel>> getAll() { Map<OutMainModel,List<OutDetailModel>> map = new TreeMap<OutMainModel, List<OutDetailModel>>(); List<OutMainModel> outMains = outMainDao.getAll(); for(OutMainModel outMain: outMains ){ //查询条件值对象的创建 OutDetailQueryModel odqm = new OutDetailQueryModel(); String inUuid = outMain.getUuid(); odqm.setOutId(inUuid); List<OutDetailModel> details = outDetailDao.getbyCondition(odqm); map.put(outMain, details); } return map; } @Override public Map<OutMainModel, List<OutDetailModel>> getByCondition( OutMainQueryModel imqm, OutDetailQueryModel odqm) { Map<OutMainModel, List<OutDetailModel>> map = new TreeMap<OutMainModel, List<OutDetailModel>>(); List<OutMainModel> list = outMainDao.getbyCondition(imqm); for(OutMainModel outMain : list){ odqm.setOutId(outMain.getUuid()); List<OutDetailModel> details = outDetailDao.getbyCondition(odqm); if(details.size()!=0){ map.put(outMain, details); } } return map; } }