物流成本管理系统设计.doc_第1页
物流成本管理系统设计.doc_第2页
物流成本管理系统设计.doc_第3页
物流成本管理系统设计.doc_第4页
物流成本管理系统设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

物流成本管理子系统1. 物流成本管理子系统概述:为了全面反映企业的物流成本,本子系统率先采用国际上流行的物流ABC法计算包括仓储保管、流通加工、装卸搬运、运输配送、订单处理五个方面的物流成本。同时,还允许企业定义标准成本值,用于真实反映物流配送成本的高低和存在的问题。本子系统的主要功能有: 标准作业成本值设定企业可以定义每项物流作业成本的标准值,用于和实际情况比较。 物流作业成本计算 企业可以计算各成本值。 物流作业成本查询提供随时查询物流作业成本值的功能。 成本分析系统根据选定的成本的标准值和实际值,自动报告当前成本高低,并以图表、报表等多种方式反映企业物流成本状况。2. 物流成本管理子系统的数据库设计:2.1数据库的需求分析根据子系统需求,定义如下实体属性: 成本:客户编号,运输_人工,运输_营运,运输_其它,流通_设备,流通_材料,流通_劳务,流通_其它,包装_材料,包装_机械,包装_技术,包装_辅助,包装_人工,装卸_人工,装卸_运营,装卸_损耗,装卸_其它,仓储_持有,仓储_缺货,仓储_在途; 成本合计:客户编号,运输成本,流通成本,包装成本,装卸成本,仓储成本;标准成本值:行业编号,行业名称, 客户编,运输成本,流通成本,包装成本,装卸成本,仓储成本;2.2后台数据库的配置本系统的开发是在 Windows 系统下开发的,开发数据库使用的是SQL SERVER 2000。具体配置步骤如下: 使用SQL SERVER 2000自带的企业管理器,新建数据库XXXXXX。在XXXXXX库中建表:管理员表 XXXXXX,成本表 table_Cost,成本合计表 table_CostTotal,标准成本值表 table_Standard。 在建表的同时,将表中各字段与域值添加进去。 由于考虑到程序移植的问题,所以本系统利用数据库连接池技术来连接数据库。 具体的表结构设计如下描述所示。2.3数据库表结构设计数据库表结构设计如以下各表所示成本表字段类型意义备注IDint客户编号主键Transit_ManpowerMoney运输_人工Transit_WorkMoney运输_营运Transit_OtherMoney运输_其它Circulation_ equipmentMoney流通_设备Circulation_StuffMoney流通_材料Circulation_WorkMoney流通_劳务Circulation_OtherMoney流通_其它Casing_StuffMoney包装_材料Casing_ MachineMoney包装_机械 Casing_TechMoney包装_技术Casing_ AssistantMoney包装_辅助Casing_ManpowerMoney包装_人工Load_ ManpowerMoney装卸_人工Load_MamageMoney装卸_运营Load_ SpoilageMoney装卸_损耗Load_OtherMoney装卸_其它Storage_ ConceiveMoney仓储_持有Storage_OosMoney仓储_缺货Storage_WayMoney仓储_在途成本合计表字段类型意义备注IDint客户编号主键Cost_TransitMoney运输成本Cost_CirculationMoney流通成本CostCasingMoney包装成本Cost_LoadMoney装卸成本Cost_StorageMoney仓储成本标准成本值表(不知是些什么标准值,自己写)字段类型意义备注IDint行业编号主键Calling Char(50)行业名称Client_IDint客户编号CorpChar(50)公司名称Stand_TransitMoney运输成本Stand_CirculationMoney流通成本Stand_CasingMoney包装成本Stand_LoadMoney装卸成本Stand_StorageMoney仓储成本2.4 E-R模型为了把用户的数据要求清晰明确地表达出来,通常要建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点来对数据和信息建模。它描述了从用户角度看到的数据,它反映了用户的现实环境,且与在软件系统中的实现方法无关。最常用的表示概念性数据模型的方法,是实体联系方法(EntityRelationship Approach)。这种方法用ER图描述现实世界中的实体,而不涉及这些实体在系统中的实现方法。用这种方法表示的概念性数据模型又称为ER模型。ER模型中包含“实体”,“联系”和“属性”。在本子系统中,成本表和成本合计表,成本表和客户表,成本合计表和客户表都为一对一关系(1:1),标准成本表和成本合计表为一对多关系(1:n)如图2.4.1、2.4.2、2.4.3所示。在本子系统数据表中用到的主键都:ID字段(客户编号)图2.4.1成本表和成本合计表E-R没客户没法做图图2.4.2成本表和客户表E-R没客户没法做图图2.4.3客户表和成本合计表E-R图2.4.1标准成本表和成本合计表E-R参照完整性是保证在主键(被参照表中)和外键之间的关系总是得到维护。对两个相关联的表(主表和从表)进行操作数据的插入和删除的时候,通过参照完整性保证它们之间的数据的一致性。用户自定义完整性,不同的数据库系统根据数据应用环境的不同,往往还需要一些特殊的约束条件。它反应某一具体应用所涉及的数据必须满足的语义要求。对于用户自定义完整性可以通过数据库设计,也可以通过程序代码来实现。由于程序设计的灵活性和便捷性,在整个系统的调试过程中对于不完善的地方只需对代码进行修改而不用更改数据库,因此在系统中采用了程序代码来实现数据库用户自定义完整性的约束。3. 物流成本管理子系统详细设计与实现3.1子系统工作原理介绍本子系统采用B/S结构(Browser/Server,浏览器/服务器结构)是一个适用于Internet和局域网络环境下的模型结构。只要用户能连上Internet或者局域网,便可以在任何时间、任何地点查询与修改相关的信息与内容。系统工作原理图如图3.1.1所示:图3.1.1子系统工作原理图子系统的工作流程包括以下一些关键环节:(1)物流作业成本计算。输入成本数值做处理并存储。(2)标准作业成本值设定。输入标准作业成本值并存储。(3)物流作业成本查询。输入要查询的客户编号和公司名称或其中一个进行查询。(4)物流作业成本计算。分析实际物流作业成本与标准物流作业成本,进行对比,做结论并反应出来。以上各个环节相互联系,前后影响。对于用户的每一项操作,系统都会自动读取数据并更新其中的数据,并将更新后的数据保存到数据库中。3.2子系统数据流图数据流图(Data Flow Diagram,简称DFD)能精确地在逻辑上描绘系统的功能、输入、输出和数据存储等,摆脱了物理内容,是描绘系统逻辑模型的最主要的工具。经过系统详细调查分析以及用户需求分析,我们得到了子系统的数据流图。物流作业成本计算:图3.2.1 物流作业成本计算物流作业成本查询:图3.2.2 用公司名称查询作业成本图3.2.3 用客户编号查询作业成本图3.2.4 用客户编号和公司名称查询作业成本标准物流成本值设定图 3.2.5 标准物流成本值设定成析分析图3.2.6 成本分析3.3子系统的实现算法3.3.1 标准物流成本值设定3.3.2. 物流作业成本算法:3.3.3 物流作业成本查询算法:3.3.4 物流作业分析:3.4设计与实现 3.4.1.数据连接池的原理顾名思义,连接池最基本的思想就是建立一些连接放置于内存对象中以备使用。如图所示,一个连接池“拥有”一定数量的连接(Connecton),当客户程序发出数据库连接请求时,连接池会从“池”中取出一个空闲的边接给客户程序,并将该连接状态设置成已占用;当客户程序使用完毕后,不会真下的关闭这个连接,只是将其放回“池”内,同时将其连接状态设置成空闲。如果“池”中没有空闲的连接,连接池可以根据某种策略自动地建立一个或多个连接,供后面的客户程序使用。可见,连接的建立、断开以及一个池可以拥有的最大连接数由连接池自身来管理,客户程序可以不再关心这类事情,这样就实现了连接的共享,提高了每个连接的利用率。3.4.2数据连接实现在本系统中,通过建立一些公用的类,可以方便的建立与数据库的连接或者使用一些功能。如:DBConnect.java、DBConnectionManager.java是数据库操作的线程池类(1) DBConnect.java文件DBConnect.java 文件是对数据库操作的基本类,主要封装了对数据库操作,如通过JDBC连接数据、断开数据库连接、取得数据集等。此文件基本上贯穿了整个系统,它包含在各文件中,是系统的主要部分与精髓。 package mon;import java.sql.*;public class DBConnect private Connection conn = null;private Statement stmt = null;private PreparedStatement prepstmt = null;private DBConnectionManager dcm=null;/*下面是唯一配置数据库连接之处*/private String propertiesfile=/perties;/*配置文件名*/private String connectionName=db;/*连接名*/ void init() dcm = DBConnectionManager.getInstance(propertiesfile,connectionName);conn = dcm.getConnection(); /* * 构造数据库的连接和访问类 */public DBConnect() throws Exception init();stmt = conn.createStatement(); public DBConnect(int resultSetType, int resultSetConcurrency) throws Exception init(); stmt = conn.createStatement(resultSetType, resultSetConcurrency); /* * 构造数据库的连接和访问类 * 预编译SQL语句 * param sql SQL语句 */public DBConnect(String sql) throws Exception init();this.prepareStatement(sql);public DBConnect(String sql, int resultSetType, int resultSetConcurrency) throws Exception init();this.prepareStatement(sql, resultSetType, resultSetConcurrency);/* * 返回连接 * return Connection 连接 */public Connection getConnection() return conn;/* * PreparedStatement * return sql 预设SQL语句 */public void prepareStatement(String sql) throws SQLException prepstmt = conn.prepareStatement(sql);public void prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException prepstmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency);/* * 设置对应值 * * param index 参数索引 * param value 对应值 */public void setString(int index,String value) throws SQLException prepstmt.setString(index, value);public void setInt(int index,int value) throws SQLException prepstmt.setInt(index,value);public void setBoolean(int index,boolean value) throws SQLException prepstmt.setBoolean(index,value);public void setDate(int index,Date value) throws SQLException prepstmt.setDate(index,value);public void setLong(int index,long value) throws SQLException prepstmt.setLong(index,value);public void setFloat(int index,float value) throws SQLException prepstmt.setFloat(index,value);public void setBytes(int index,byte value) throws SQLExceptionprepstmt.setBytes(index,value); public void clearParameters() throws SQLException prepstmt.clearParameters();prepstmt=null; /* * 返回预设状态 */public PreparedStatement getPreparedStatement() return prepstmt;/* * 返回状态 * return Statement 状态 */public Statement getStatement() return stmt;/* * 执行SQL语句返回字段集 * param sql SQL语句 * return ResultSet 字段集 */public ResultSet executeQuery(String sql) throws SQLException if (stmt != null) return stmt.executeQuery(sql);else return null;public ResultSet executeQuery() throws SQLException if (prepstmt != null) return prepstmt.executeQuery();else return null;/* * 执行SQL语句 * param sql SQL语句 */public void executeUpdate(String sql) throws SQLException if (stmt != null)stmt.executeUpdate(sql);public void executeUpdate() throws SQLException if (prepstmt != null)prepstmt.executeUpdate();/* * 关闭连接 */public void close() throws Exception if (stmt != null) stmt.close();stmt = null;if (prepstmt != null) prepstmt.close();prepstmt = null;if (conn!=null)dcm.freeConnection(conn);(2) DBConnectionManager.java 文件DBConnectionManager.java 文件是数据库线程池的操作类,该类实现了数据库线程池的建立、释放,分配等的操作。 package mon;import java.io.*;import java.sql.*;import java.util.*;import java.util.Date;public class DBConnectionManager static private DBConnectionManager instance; /*唯一实例*/ static private int clients;/*客户端连接数*/ private Vector drivers = new Vector(); private PrintWriter log; private Hashtable pools = new Hashtable(); /*这两个字段由getInstance负责初始化*/ private static String propertiesFile=/perties;/*配置文件名*/ private static String connectionName=db;/*连接名*/ /* * 返回唯一实例.如果是第一次调用此方法,则创建实例 * * return DBConnectionManager 唯一实例 */ static synchronized public DBConnectionManager getInstance(String file,String name) propertiesFile=file;connectionName=name; if (instance = null) instance = new DBConnectionManager();/*创建实例*/ clients+;/*累加实例数量*/ return instance; /* * 建构函数私有以防止其它对象创建本类实例 */ private DBConnectionManager() init(); /* * 将连接对象返回给由名字指定的连接池 * * param name 在属性文件中定义的连接池名字 * param con 连接对象 */ public void freeConnection(Connection con) DBConnectionPool pool = (DBConnectionPool) pools.get(connectionName); if (pool != null) pool.freeConnection(con); /* * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数 * 限制,则创建并返回新连接 * * param name 在属性文件中定义的连接池名字 * return Connection 可用连接或null */ public Connection getConnection() DBConnectionPool pool = (DBConnectionPool) pools.get(connectionName); if (pool != null) return pool.getConnection(); return null; /* * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制, * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接. * * param name 连接池名字 * param time 以毫秒计的等待时间 * return Connection 可用连接或null */ public Connection getConnection(long time) DBConnectionPool pool = (DBConnectionPool) pools.get(connectionName); if (pool != null) return pool.getConnection(time); return null; /* * 关闭所有连接,撤销驱动程序的注册 */ public synchronized void release() / 等待直到最后一个客户程序调用 if (-clients != 0) return; Enumeration allPools = pools.elements(); while (allPools.hasMoreElements() DBConnectionPool pool = (DBConnectionPool) allPools.nextElement(); pool.release(); Enumeration allDrivers = drivers.elements(); while (allDrivers.hasMoreElements() Driver driver = (Driver) allDrivers.nextElement(); try DriverManager.deregisterDriver(driver); log(撤销JDBC驱动程序 + driver.getClass().getName()+的注册); catch (SQLException e) log(e, 无法撤销下列JDBC驱动程序的注册: + driver.getClass().getName(); /* * 根据指定属性创建连接池实例. * * param props 连接池属性 */ private void createPools(Properties props) Enumeration propNames = pertyNames(); while (propNames.hasMoreElements() String name = (String) propNames.nextElement(); if (name.endsWith(.url) String poolName = name.substring(0, name.lastIndexOf(.); /*获取数据库路径*/ String url = props.getProperty(poolName + .url); if (url = null) log(没有为连接池 + poolName + 指定URL); continue; String user = props.getProperty(poolName + .user); String password = props.getProperty(poolName + .password); String maxconn = props.getProperty(poolName + .maxconn, 0); int max; try max = Integer.valueOf(maxconn).intValue(); catch (NumberFormatException e) log(错误的最大连接数限制: + maxconn + .连接池: + poolName); max = 0; DBConnectionPool pool = new DBConnectionPool(poolName, url, user, password, max); pools.put(poolName, pool); log(成功创建连接池 + poolName); /* * 读取属性完成初始化 */ private void init() InputStream is = getClass().getResourceAsStream(propertiesFile); Properties dbProps = new Properties(); try dbProps.load(is); catch (Exception e) System.err.println(不能读取属性文件. + 请确保*.properties在CLASSPATH指定的路径中); return; String logFile = dbProps.getProperty(logfile, newslog.txt); try log = new PrintWriter(new FileWriter(logFile, true), true); catch (IOException e) System.err.println(无法打开日志文件: + logFile); log = new PrintWriter(System.err); loadDrivers(dbProps); createPools(dbProps); /* * 装载和注册所有JDBC驱动程序 * * param props 属性 */ private void loadDrivers(Properties props) String driverClasses = props.getProperty(driver); StringTokenizer st = new StringTokenizer(driverClasses); while (st.hasMoreElements() String driverClassName = st.nextToken().trim(); try Driver driver = (Driver) Class.forName(driverClassName).newInstance(); DriverManager.registerDriver(driver); drivers.addElement(driver); log(成功注册JDBC驱动程序 + driverClassName); catch (Exception e) log(无法注册JDBC驱动程序: + driverClassName + , 错误: + e); /* * 将文本信息写入日志文件 */ private void log(String msg) / log.println(new Date() + : + msg); /* * 将文本信息与异常写入日志文件 */ private void log(Throwable e, String msg) / log.println(new Date() + : + msg); / e.printStackTrace(log); /* * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最 * 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性. */ class DBConnectionPool private int checkedOut; private Vector freeConnections = new Vector(); private int maxConn; private String name; private String password; private String URL; private String user; /* * 创建新的连接池 * * param name 连接池名字 * param URL 数据库的JDBC URL * param user 数据库帐号,或 null * param password 密码,或 null * param maxConn 此连接池允许建立的最大连接数 */ public DBConnectionPool(String name, String URL, String user, String password, int maxConn) = name; this.URL = URL; this.user = user; this.password = password; this.maxConn = maxConn; /* * 将不再使用的连接返回给连接池 * * param con 客户程序释放的连接 */ public synchronized void freeConnection(Connection con) / 将指定连接加入到向量末尾 freeConnections.addEl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论