还剩23页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
物流成本管理子系统
1.物流成本管理子系统概述:为了全面反映企业的物流成本,本子系统率先采用国际上流行的物流ABC法计算包括仓储保管、流通加工、装卸搬运、运输配送、订单处理五个方面的物流成本同时,还允许企业定义标准成本值,用于真实反映物流配送成本的高低和存在的问题本子系统的主要功能有•标准作业成本值设定 企业可以定义每项物流作业成本的标准值,用于和实际情况比较 •物流作业成本计算 企业可以计算各成本值 •物流作业成本查询 提供随时查询物流作业成本值的功能 •成本分析 系统根据选定的成本的标准值和实际值,自动报告当前成本高低,并以图表、报表等多种方式反映企业物流成本状况
2.物流成本管理子系统的数据库设计:
2.1数据库的需求分析根据子系统需求,定义如下实体属性●成本{客户编号,运输_人工,运输_营运,运输_其它,流通_设备,流通_材料,流通_劳务,流通_其它,包装_材料,包装_机械,包装_技术,包装_辅助,包装_人工,装卸_人工,装卸_运营,装卸_损耗,装卸_其它,仓储_持有,仓储_缺货,仓储_在途};●成本合计{客户编号,运输成本,流通成本,包装成本,装卸成本,仓储成本};●标准成本值{行业编号行业名称客户编运输成本,流通成本,包装成本,装卸成本,仓储成本};
2.2后台数据库的配置本系统的开发是在Windows系统下开发的,开发数据库使用的是SQLSERVER2000具体配置步骤如下●使用SQLSERVER2000自带的企业管理器,新建数据库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行业编号主键CallingChar50行业名称Client_IDint客户编号CorpChar50公司名称Stand_TransitMoney运输成本Stand_CirculationMoney流通成本Stand_CasingMoney包装成本Stand_LoadMoney装卸成本Stand_StorageMoney仓储成本
2.4E-R模型为了把用户的数据要求清晰明确地表达出来,通常要建立一个概念性的数据模型(也称为信息模型)概念性数据模型是一种面向问题的数据模型,是按照用户的观点来对数据和信息建模它描述了从用户角度看到的数据,它反映了用户的现实环境,且与在软件系统中的实现方法无关最常用的表示概念性数据模型的方法,是实体—联系方法(Entity—RelationshipApproach)这种方法用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子系统数据流图数据流图(DataFlowDiagram,简称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是数据库操作的线程池类1DBConnect.java文件DBConnect.java文件是对数据库操作的基本类,主要封装了对数据库操作,如通过JDBC连接数据、断开数据库连接、取得数据集等此文件基本上贯穿了整个系统,它包含在各文件中,是系统的主要部分与精髓packagecom.common;importjava.sql.*;publicclassDBConnect{privateConnectionconn=null;privateStatementstmt=null;privatePreparedStatementprepstmt=null;privateDBConnectionManagerdcm=null;/*下面是唯一配置数据库连接之处*/privateStringpropertiesfile=/db.properties;/*配置文件名*/privateStringconnectionName=db;/*连接名*/voidinit{dcm=DBConnectionManager.getInstancepropertiesfileconnectionName;conn=dcm.getConnection;}/***构造数据库的连接和访问类*/publicDBConnectthrowsException{init;stmt=conn.createStatement;}publicDBConnectintresultSetTypeintresultSetConcurrencythrowsException{init;stmt=conn.createStatementresultSetTyperesultSetConcurrency;}/***构造数据库的连接和访问类*预编译SQL语句*@paramsqlSQL语句*/publicDBConnectStringsqlthrowsException{init;this.prepareStatementsql;}publicDBConnectStringsqlintresultSetTypeintresultSetConcurrencythrowsException{init;this.prepareStatementsqlresultSetTyperesultSetConcurrency;}/***返回连接*@returnConnection连接*/publicConnectiongetConnection{returnconn;}/***PreparedStatement*@returnsql预设SQL语句*/publicvoidprepareStatementStringsqlthrowsSQLException{prepstmt=conn.prepareStatementsql;}publicvoidprepareStatementStringsqlintresultSetTypeintresultSetConcurrencythrowsSQLException{prepstmt=conn.prepareStatementsqlresultSetTyperesultSetConcurrency;}/***设置对应值**@paramindex参数索引*@paramvalue对应值*/publicvoidsetStringintindexStringvaluethrowsSQLException{prepstmt.setStringindexvalue;}publicvoidsetIntintindexintvaluethrowsSQLException{prepstmt.setIntindexvalue;}publicvoidsetBooleanintindexbooleanvaluethrowsSQLException{prepstmt.setBooleanindexvalue;}publicvoidsetDateintindexDatevaluethrowsSQLException{prepstmt.setDateindexvalue;}publicvoidsetLongintindexlongvaluethrowsSQLException{prepstmt.setLongindexvalue;}publicvoidsetFloatintindexfloatvaluethrowsSQLException{prepstmt.setFloatindexvalue;}publicvoidsetBytesintindexbyte[]valuethrowsSQLException{prepstmt.setBytesindexvalue;}publicvoidclearParametersthrowsSQLException{prepstmt.clearParameters;prepstmt=null;}/***返回预设状态*/publicPreparedStatementgetPreparedStatement{returnprepstmt;}/***返回状态*@returnStatement状态*/publicStatementgetStatement{returnstmt;}/***执行SQL语句返回字段集*@paramsqlSQL语句*@returnResultSet字段集*/publicResultSetexecuteQueryStringsqlthrowsSQLException{ifstmt!=null{returnstmt.executeQuerysql;}elsereturnnull;}publicResultSetexecuteQuerythrowsSQLException{ifprepstmt!=null{returnprepstmt.executeQuery;}elsereturnnull;}/***执行SQL语句*@paramsqlSQL语句*/publicvoidexecuteUpdateStringsqlthrowsSQLException{ifstmt!=nullstmt.executeUpdatesql;}publicvoidexecuteUpdatethrowsSQLException{ifprepstmt!=nullprepstmt.executeUpdate;}/***关闭连接*/publicvoidclosethrowsException{ifstmt!=null{stmt.close;stmt=null;}ifprepstmt!=null{prepstmt.close;prepstmt=null;}ifconn!=null{dcm.freeConnectionconn;}}}2DBConnectionManager.java文件DBConnectionManager.java文件是数据库线程池的操作类,该类实现了数据库线程池的建立、释放,分配等的操作packagecom.common;importjava.io.*;importjava.sql.*;importjava.util.*;importjava.util.Date;publicclassDBConnectionManager{staticprivateDBConnectionManagerinstance;/*唯一实例*/staticprivateintclients;/*客户端连接数*/privateVectordrivers=newVector;privatePrintWriterlog;privateHashtablepools=newHashtable;/*这两个字段由getInstance负责初始化*/privatestaticStringpropertiesFile=/bc.properties;/*配置文件名*/privatestaticStringconnectionName=db;/*连接名*//***返回唯一实例.如果是第一次调用此方法则创建实例**@returnDBConnectionManager唯一实例*/staticsynchronizedpublicDBConnectionManagergetInstanceStringfileStringname{propertiesFile=file;connectionName=name;ifinstance==null{instance=newDBConnectionManager;/*创建实例*/}clients++;/*累加实例数量*/returninstance;}/***建构函数私有以防止其它对象创建本类实例*/privateDBConnectionManager{init;}/***将连接对象返回给由名字指定的连接池**@paramname在属性文件中定义的连接池名字*@paramcon连接对象*/publicvoidfreeConnectionConnectioncon{DBConnectionPoolpool=DBConnectionPoolpools.getconnectionName;ifpool!=null{pool.freeConnectioncon;}}/***获得一个可用的空闲的连接.如果没有可用连接且已有连接数小于最大连接数*限制则创建并返回新连接**@paramname在属性文件中定义的连接池名字*@returnConnection可用连接或null*/publicConnectiongetConnection{DBConnectionPoolpool=DBConnectionPoolpools.getconnectionName;ifpool!=null{returnpool.getConnection;}returnnull;}/***获得一个可用连接.若没有可用连接且已有连接数小于最大连接数限制*则创建并返回新连接.否则在指定的时间内等待其它线程释放连接.**@paramname连接池名字*@paramtime以毫秒计的等待时间*@returnConnection可用连接或null*/publicConnectiongetConnectionlongtime{DBConnectionPoolpool=DBConnectionPoolpools.getconnectionName;ifpool!=null{returnpool.getConnectiontime;}returnnull;}/***关闭所有连接撤销驱动程序的注册*/publicsynchronizedvoidrelease{//等待直到最后一个客户程序调用if--clients!=0{return;}EnumerationallPools=pools.elements;whileallPools.hasMoreElements{DBConnectionPoolpool=DBConnectionPoolallPools.nextElement;pool.release;}EnumerationallDrivers=drivers.elements;whileallDrivers.hasMoreElements{Driverdriver=DriverallDrivers.nextElement;try{DriverManager.deregisterDriverdriver;log撤销JDBC驱动程序+driver.getClass.getName+的注册;}catchSQLExceptione{loge无法撤销下列JDBC驱动程序的注册:+driver.getClass.getName;}}}/***根据指定属性创建连接池实例.**@paramprops连接池属性*/privatevoidcreatePoolsPropertiesprops{EnumerationpropNames=props.propertyNames;whilepropNames.hasMoreElements{Stringname=StringpropNames.nextElement;ifname.endsWith.url{StringpoolName=name.substring0name.lastIndexOf.;/*获取数据库路径*/Stringurl=props.getPropertypoolName+.url;ifurl==null{log没有为连接池+poolName+指定URL;continue;}Stringuser=props.getPropertypoolName+.user;Stringpassword=props.getPropertypoolName+.password;Stringmaxconn=props.getPropertypoolName+.maxconn0;intmax;try{max=Integer.valueOfmaxconn.intValue;}catchNumberFormatExceptione{log错误的最大连接数限制:+maxconn+.连接池:+poolName;max=0;}DBConnectionPoolpool=newDBConnectionPoolpoolNameurluserpasswordmax;pools.putpoolNamepool;log成功创建连接池+poolName;}}}/***读取属性完成初始化*/privatevoidinit{InputStreamis=getClass.getResourceAsStreampropertiesFile;PropertiesdbProps=newProperties;try{dbProps.loadis;}catchExceptione{System.err.println不能读取属性文件.+请确保*.properties在CLASSPATH指定的路径中;return;}StringlogFile=dbProps.getPropertylogfilenewslog.txt;try{log=newPrintWriternewFileWriterlogFiletruetrue;}catchIOExceptione{System.err.println无法打开日志文件:+logFile;log=newPrintWriterSystem.err;}loadDriversdbProps;createPoolsdbProps;}/***装载和注册所有JDBC驱动程序**@paramprops属性*/privatevoidloadDriversPropertiesprops{StringdriverClasses=props.getPropertydriver;StringTokenizerst=newStringTokenizerdriverClasses;whilest.hasMoreElements{StringdriverClassName=st.nextToken.trim;try{Driverdriver=DriverClass.forNamedriverClassName.newInstance;DriverManager.registerDriverdriver;drivers.addElementdriver;log成功注册JDBC驱动程序+driverClassName;}catchExceptione{log无法注册JDBC驱动程序:+driverClassName+错误:+e;}}}/***将文本信息写入日志文件*/privatevoidlogStringmsg{//log.printlnnewDate+:+msg;}/***将文本信息与异常写入日志文件*/privatevoidlogThrowableeStringmsg{//log.printlnnewDate+:+msg;//e.printStackTracelog;}/***此内部类定义了一个连接池.它能够根据要求创建新连接直到预定的最*大连接数为止.在返回连接给客户程序之前它能够验证连接的有效性.*/classDBConnectionPool{privateintcheckedOut;privateVectorfreeConnections=newVector;privateintmaxConn;privateStringname;privateStringpassword;privateStringURL;privateStringuser;/***创建新的连接池**@paramname连接池名字*@paramURL数据库的JDBCURL*@paramuser数据库帐号或null*@parampassword密码或null*@parammaxConn此连接池允许建立的最大连接数*/publicDBConnectionPoolStringnameStringURLStringuserStringpasswordintmaxConn{this.name=name;this.URL=URL;this.user=user;this.password=password;this.maxConn=maxConn;}/***将不再使用的连接返回给连接池**@paramcon客户程序释放的连接*/publicsynchronizedvoidfreeConnectionConnectioncon{//将指定连接加入到向量末尾freeConnections.addElementcon;checkedOut--;notifyAll;}/***从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接*数限制则创建新连接.如原来登记为可用的连接不再有效则从向量删除之*然后递归调用自己以尝试新的可用连接.*/publicsynchronizedConnectiongetConnection{Connectioncon=null;iffreeConnections.size0{//获取向量中第一个可用连接con=ConnectionfreeConnections.firstElement;freeConnections.removeElementAt0;try{ifcon.isClosed{log从连接池+name+删除一个无效连接;//递归调用自己尝试再次获取可用连接con=getConnection;}}catchSQLExceptione{log从连接池+name+删除一个无效连接;//递归调用自己尝试再次获取可用连接con=getConnection;}}elseifmaxConn==0||checkedOutmaxConn{con=newConnection;}ifcon!=null{checkedOut++;}returncon;}/***从连接池获取可用连接.可以指定客户程序能够等待的最长时间*参见前一个getConnection方法.**@paramtimeout以毫秒计的等待时间限制*/publicsynchronizedConnectiongetConnectionlongtimeout{longstartTime=newDate.getTime;Connectioncon;whilecon=getConnection==null{try{waittimeout;}catchInterruptedExceptione{}ifnewDate.getTime-startTime=timeout{//wait返回的原因是超时returnnull;}}returncon;}/***关闭所有连接*/publicsynchronizedvoidrelease{EnumerationallConnections=freeConnections.elements;whileallConnections.hasMoreElements{Connectioncon=ConnectionallConnections.nextElement;try{con.close;log关闭连接池+name+中的一个连接;}catchSQLExceptione{loge无法关闭连接池+name+中的连接;}}freeConnections.removeAllElements;}/***创建新的连接*/privateConnectionnewConnection{Connectioncon=null;try{ifuser==null{con=DriverManager.getConnectionURL;}else{con=DriverManager.getConnectionURLuserpassword;}log连接池+name+创建一个新的连接;}catchSQLExceptione{loge无法创建下列URL的连接:+URL;returnnull;}returncon;}}}
3.5子系统界面
3.
5.1物流作业成本查询界面:
3.
5.2物流作业成本计算界面:
3.
5.3标准物流作业成本值设定界面:
3.
5.4成本分析界面:。