项目开发中客户提出一个要求:
我只选择商品和数量,完成商品的移库操作
在开发中发现这里商品又有批次的问题,那么计算成本的时候又需要根据批次来计算他的成本,那么这样就产生了几个问题
1.当某个商品的这个批次所对应的库存数量足够他调拨时的数量
2.当某个商品的这个批次不够的他需要调拨的数量,我就必须累加下一个批次的数量在这里又发现几种情况
2.1当两个批次正好够的情况
2.2 当两个批次大于他的情况
这里就涉及到要修改最后一条数据的库存数量
2.3 当两个批次还不够的情况
3.修改库存数量
如果调入仓库没有该批次的商品数量,我会插入一条新纪录
这些所有情况都需要调拨完成之后修改对应的库存信息
下面是具体代码
数据库结构
下面是实现代码
通用的JDBC
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.sql.ResultSetMetaData; public class DBUtil { private static String url = "jdbc:jtds:sqlserver://192.168.1.182:1433/erp"; private static String driverClass = "net.sourceforge.jtds.jdbc.Driver"; private static String userName = "sa"; private static String pwd = "admin"; public static final Connection getConn() { Connection conn = null; try { Class.forName(driverClass); } catch (ClassNotFoundException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } try { conn = DriverManager.getConnection(url, userName, pwd); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return conn; } public static void beginTransaction(Connection conn) throws SQLException{ if(conn == null||conn.isClosed()){ throw new SQLException("数据库连接异常"); } conn.setAutoCommit(false); } public static void commit(Connection conn) throws SQLException{ if(conn == null||conn.isClosed()){ throw new SQLException("数据库连接异常"); } conn.commit(); conn.setAutoCommit(true); } public static boolean update(Connection conn,String sql) throws Exception{ Statement state = conn.createStatement(); int bs = state.executeUpdate(sql); return bs>0; } public static List<Map<String,Object>> query(Connection conn,String sql ){ List<Map<String, Object>> restList = null; try { restList = new ArrayList<Map<String, Object>>(); PreparedStatement prepState = conn.prepareStatement(sql); ResultSet result = prepState.executeQuery(); ResultSetMetaData metaData = result.getMetaData(); int colCount = metaData.getColumnCount(); while(result.next()){ Map<String,Object> map = new HashMap<String,Object>(); for(int i = 1 ; i<=colCount; i++){ String colName = metaData.getColumnName(i); Object value = result.getObject(i); map.put(colName,value); } restList.add(map); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return restList; } }
实现的主函数
package com; import java.sql.Connection; import java.util.List; import java.util.Map; public class WzdpService { public static void main(String args[]){ try { WzdpService wzdp = new WzdpService(); wzdp.one(20,"a","y","x"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void one(int sl,String spmc,String kfmc,String toKf) throws Exception{ int sysl = 0;//剩余物资数量 int dbsl = 0;//调拨数量 //查询总库总数量 String sql1 = "select sum(sl) cnt from test where ck = ‘"+kfmc+"‘ and sp = ‘"+spmc+"‘ order by cnt desc "; Connection conn = DBUtil.getConn(); List<Map<String,Object>> result2 = DBUtil.query(conn, sql1); Map<String,Object> spxx2 = result2.get(0); if(spxx2 == null){ System.out.println("无相关物品!"); return; } int csl = Integer.valueOf(spxx2.get("cnt").toString()); //判断库存数量能否满足调拨数量 if(csl<sl){ System.out.println("物品数量不足"); return; } String sql = "select id,sp,pc,ck,sl from test where ck = ‘" + kfmc + "‘ and sp = ‘" + spmc + "‘ order by sl desc "; List<Map<String, Object>> result = DBUtil.query(conn, sql); Map<String, Object> spxx = result.get(0); if (spxx == null) { System.out.println("无相关物品!"); return; } int zkmxsl = Integer.valueOf(spxx.get("sl").toString()); if (zkmxsl == 0) { return; } String sp = (String) spxx.get("sp"); String pc = (String) spxx.get("pc"); String ck = (String) spxx.get("ck"); DBUtil.beginTransaction(conn); // 1、库房单批次数量满足 mxsl>=sl mxsl - sl = nsl // 2、库当批次数量不满足 mxsl<sl 查询所有批次 if (zkmxsl >= sl) { dbsl = sl; } else { sysl = sl - zkmxsl; dbsl = zkmxsl; } // 入库 String cxsql = "select id,sp,pc,ck,sl from test where ck = ‘" + toKf + "‘ and sp = ‘" + sp + "‘ and pc = ‘" + pc + "‘"; List<Map<String, Object>> result1 = DBUtil.query(conn, cxsql); if (result1.isEmpty()) { String insert = "insert into test(SP,PC,CK,SL) values (‘" + sp + "‘,‘" + pc + "‘,‘" + toKf + "‘,‘" + dbsl + "‘)"; DBUtil.update(conn, insert); } else { Map<String, Object> spxx1 = result1.get(0); int nsl = Integer.valueOf(spxx1.get("sl").toString()); nsl = nsl + dbsl; String update = "update test set sl = " + nsl + " where ck = ‘" + toKf + "‘ and sp = ‘" + sp + "‘ and pc = ‘" + pc + "‘"; DBUtil.update(conn, update); } // 出库 dbsl = zkmxsl - sl; if (dbsl < 0) { dbsl = 0; } String updateZk = "update test set sl = " + dbsl + " where ck = ‘" + kfmc + "‘ and sp = ‘" + sp + "‘ and pc = ‘" + pc + "‘"; DBUtil.update(conn, updateZk); DBUtil.commit(conn); if (sysl <= 0) { return; } one(sysl, spmc, kfmc, toKf); } }