J2EE工作流管理系统jBPM详解(一).doc_第1页
J2EE工作流管理系统jBPM详解(一).doc_第2页
J2EE工作流管理系统jBPM详解(一).doc_第3页
J2EE工作流管理系统jBPM详解(一).doc_第4页
J2EE工作流管理系统jBPM详解(一).doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

一、jBPM入门简介概述工作流业务流程管理技术是基于SOA技术实现的一个核心部分。使用工作流能够在软件开发和业务两个层次受益:1、方便开发 工作流管理系统能够简化企业级软件开发甚至维护。 降低开发风险 - 通过使用状态和动作这样的术语,业务分析师和开发人员使用同一种语言交谈。这样开发人员就不必将用户需求转化成软件设计了。 实现的集中统一 -业务流程经常变化,使用工作流系统的最大好处是:业务流程的实现代码,不再是散落在各种各样的系统中 。 加快应用开发 - 你的软件不用再关注流程的参与者,开发起来更快,代码更容易维护。2、业务流程管理 (BPM)在自动化业务流程之前,分析并将它们规格化是一件艰苦但会有很好回报的工作:提高效率 - 许多流程在自动化过程中会去除一些不必要的步骤较好的流程控制 - 通过标准的工作方法和跟踪审计,提高了业务流程的管理改进客户服务 - 因为流程的一致性,提高了对客户响应的可预见性 灵活 - 跨越流程的软件控制,使流程可以按照业务的需要重新设计。 业务流程改进 - 对流程的关注,使它们趋向于流畅和简单但从长远的角度,工作流流程管理技术的研究可为两个阶段进行:1目前解决华研今后新项目中复杂业务流程如何使用工作流引擎技术进行实现的问题。2上升到面向服务体系架构,实现各个服务之间的业务流程。jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统。jBPM是公开源代码项目,它使用要遵循 Apache License。jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBoss jBPM。随着jBPM加入JBoss组织,jBPM也将进入一个全新的发展时代,它的前景是十分光明的。JBoss jBPM 只有最小的倚赖性,它可以很容易的作为java库来使用.当然它也可以用在访问量很大的J2EE 群应用服务器环境中. JBoss jBPM 可以同任何数据库配置可以部署在任何应用服务器上.jBPM 最大的特色就是它的商务逻辑定义没有采用目前的一些规范,如WfMC XPDL, BPML, ebXML, BPEL4WS等,而是采用了它自己定义的JBoss jBPM Process definition language (jPdl)。jPdl认为一个商务流程可以被看作是一个UML状态图。jPdl就是详细定义了这个状态图的每个部分,如起始、结束状态,状态之间的转换等。jBPM的另一个特色是它使用Hibernate来管理它的数据库。Hibernate是目前Java领域最好的一种数据持久层解决方案。通过Hibernate,jBPM将数据的管理职能分离出去,自己专注于商务逻辑的处理。(具体选型报告可参考工作流技术选型评估报告)。本文档主要是工作流研究小组关于开源工作流引擎jbpm的研究成果总结。内容包括工作流研究场景的介绍、jbpm的环境配置,并包括以下六个研究主题:JBPM同开发如何结合,又如何保持独立性;对应用系统的设计实现有什么样的制约用户/角色如何同应用系统结合,变化又如何处理流程中每个活动,如何动态指定执行者类似传阅功能如何实现子流程如何实现流程执行步骤耗时阀值和自动提醒设置jBPM当前版本的稳定性评估术语、定义和缩略语应用场景本场景是从房地产营销系统的需求中提取出来的,在房地产项目中,客户选户购房的过程是一个非常典型的工作流场景。我们将这一过程提取出来,作为jbpm技术研究的场景。在购房过程中,会有以下人员参与。客户:购房的主体销售人员:在购房过程中指导看房,购房。销售经理:确定认购信息。财务人员:收取定金。客服人员:打印收据,打印客户认购书。客户购房的过程可以描述如下。客户来到售楼中心,销售人员进行接待。客户向销售人员提供预先申请的服务号。销售人员确认服务号是否有效,如果无效现场给出一个新的服务号。销售人员引导客户选房。客户确定户型,房号。销售人员录入客户认购资料。销售人员确认认购资料填写完整。销售人员将认购资料提交给销售经理审批。确定是否可以获得优惠,如果客户是一次交清房款,获得0.1%优惠。交上级经理审批。 销售人员引导客户到财务处交纳定金。交纳定金后,客服人员打印收据。客服人员打印认购书。为了使用研究的场景更有代表性,揉合其他典型的工作流应用场景,将上面的流程作一些删改。客户认购的流程改为:客户确定购房,销售人员录入认购资料。提交认购资料,必须保证录入资料的完整性。提交审核,按总金额进行分类审核。如果金额小于50万销售经理审核即可,大于50万还要上级经理两人同时审核通过。审批完成,客户到财务处交纳定金。客服人员为客户打印收据,打印认购书,认购完成。上面的流程中一些异常情况(流程中的一些分支),在这里先不作考虑,如,客户在交纳定金之前可以随时放弃认购。客户的认购要录入的资料内容包括:客户姓名,房号,定金,总金额,流程号等,这里仅选取几个重要的数据作为保存对象。保存录入资料时自动取得一个流程号,任何时候,可以根据此流程号跟踪流程状态,所以在保存认购资料时要记录流程号。通用的标准规范jBPM 是个功能全面的Workflow Engine,融合了4大功能:Workflow,BPM,BPEL,PageFlow。它自己有个BPEL扩展,采用jboss Hibernate实现,它使用自定义的自定义标准jpdl,不支持目前公开的工作流(业务流程)标准,如:JCPJSR208 Java Business IntegrationJSR207 Process Definition for Java OASISWS-BPELWorkflow Management Coalition(WFMC)WFMC XPDLBusiness Process Management Initiative (BPMI)BPMNObject Management Group (OMG)State Chart XML (SCXML) 处理测试阶段的JBoss jBPM BPEL扩展准备支持BPEL 1.1标准(非标准组织通过的标准)。技术方案由于公司采取的架构是ejb3+tapestry4架构,所以我们的场景实现架构也是基于以上架构进行实现的(tapestry4+ejb3+jbpm3.2),我们所采取的jbpm版本是3.2,这也是目前jbpm最新的版本。这里我们使用jboss作为我们的web服务器开发环境这里我们是采用eclipse3.2开发工具进行开发,Tapestry4+ejb3的开发环境配置和以往的项目配置基本保持一致,这里就不再进行详细介绍,关键就是jbpm3.2的配置方法。我们从jBoss官方网站()上下载jbpm-jpdl-suite-3.2.GA.zip,最新的版本是3.2.GA,这个包括: jbpm-server , 预先配置的jboss 应用服务器. jbpm-designer , jBPM流程图形化设计器的eclipse 插件 . jbpm-db , jBPM 数据库兼容包 (参看下面). jbpm , 核心jbpm组件包括库和用户手册. jbpm-bpel , JBoss jBPM BPEL 扩展参考. 预配置的JBoss 应用服务器有下列安装组件: 核心jBPM 组件 , 打包作为JBoss服务档案 一个包括所有jBPM 表格的完整数据库 : 默认的 hypersonic 数据库包含所有的jBPM 表格和已经定义的流程. jBPM 控制台web应用程序 这个可以用来为jBPM管理员.jBPM调度程序 所有定时器的执行. 调度程序在新手工具箱里配置成了一个servlet.这个Servlet会为产生一个线程来监视每个定时器的执行. 一个流程例子 已经发布进了jBPM 数据库,关于jbpm-jpdl-suite-3.2套件包的具体介绍,可以参考JBoss jBPM Cookbook手册。JBoss jBPM 是一个Java库. 因此,它可以用在任何java环境比如web 应用程序,Swing应用程序,EJB,Web Service等等,JBoss jBPM 核心组件被打包成一个简单的Java库文件.它依赖你所使用的功能性, 库 jbpm-jpdl.jar及一些相关的第三方的库比如 . hibernate3.2, dom4j 等等在我们实现场景中。要使用jbpm,我们首先需要将jbpm3.2的包导入我们的项目当中, jbpm3.2的主要包括两个包jbpm-jpdl.jar和jbpm-identity.jar。而jbpm-jpdl.jar是jbpm的核心包,jbpm-identity.jar则是jbpm自带的用户角色权限管理包。我们将这两个包导入我们的项目中。(具体可参考jbpm的用户手册)在jbpm中,流程的定义主要是编写在xml文件中的,我们需要将具体的业务流程在xml中定义。所以我们需要在项目的根目录上新建一个源目录,这里我们命名为“processes”,在该目录我们可以保存流程定义xml文件。JBoss jBPM 包括一个图形化的流程设计工具. 这个设计器是用来创作商业流程的,该图形设计器是一个Eclipse插件,图形化设计工具最重要的特性是它同时支持业务分析员和技术开发人员. 这样就可以在业务流程建模和实际执行之间平滑转换。使用该插件你可以通过界面来拖拉描绘你的业务流程,而不需要靠手写编码来设计。该插件位于jbpm-jpdl-suite-3.2.GA.zip中,插件的安装方法可以参考elipse插件的安装方法。安装完毕后,我们下面可以通过该插件新建流程设计文件。步骤如下:1、在processes目录中右建选择“New”“other”2、选择“Process Definition”,点击“Next”输入Process name,点击完成。打开设计界面,我们就可以在上面根据我们的业务来设计工作流流程文件。Jbpm本身包含很多自己的jbpm数据库表,jBPM内部使用hibernate来管理它的数据库,通过Hibernate,jBPM将数据的管理职能分离出去,自己专注于商务逻辑的处理,而且我们可以使jBPM移植在不同的数据库.。我们进行的每一步流程操作都保存在jbpm数据表中,通过调用jbpm提供的接口,我们可以对jBPM数据库进行存储,更新和检索流程信息的服务。这里我们使用Mysql5.0数据库,下面我们在项目中新建一个源目录“config.files”,名字可以任意,在该目录建立hibernate.cfg.xml文件:hibernate.cfg.xml?xml version=1.0 encoding=utf-8?!DOCTYPE hibernate-configuration PUBLIC -/Hibernate/Hibernate Configuration DTD 3.0/EN /hibernate-configuration-3.0.dtdhibernate-configurationsession-factory!- hibernate dialect -!-property name=hibernate.dialectorg.hibernate.dialect.HSQLDialect/property-property name=hibernate.dialectorg.hibernate.dialect.MySQLDialect/property!- JDBC connection properties (begin) =property name=hibernate.connection.driver_classorg.hsqldb.jdbcDriver/propertyproperty name=hibernate.connection.urljdbc:hsqldb:mem:jbpm/propertyproperty name=hibernate.connection.usernamesa/propertyproperty name=hibernate.connection.password/property= JDBC connection properties (end) -!- JDBC connection for MySQL database -property name=connection.driver_classcom.mysql.jdbc.Driver/propertyproperty name=connection.urljdbc:mysql:/localhost/myjbpm/propertyproperty name=connection.usernameroot/propertyproperty name=connection.password1234/property!- JDBC connection pool (use the built-in) -property name=connection.pool_size1/propertyproperty name=vider_classorg.hibernate.cache.HashtableCacheProvider/property!- use data source -!- DataSource properties (begin)property name=hibernate.connection.datasourcejava:comp/env/JbpmDS/propertyDataSource properties (end) -!- Drop and re-create the database schema on startup -property name=hbm2ddl.autocreate/property!- JTA transaction properties (begin) =property name=hibernate.transaction.factory_classorg.hibernate.transaction.JTATransactionFactory/propertyproperty name=hibernate.transaction.manager_lookup_classorg.hibernate.transaction.JBossTransactionManagerLookup/property= JTA transaction properties (end) -!- CMT transaction properties (begin) =property name=hibernate.transaction.factory_classorg.hibernate.transaction.CMTTransactionFactory/propertyproperty name=hibernate.transaction.manager_lookup_classorg.hibernate.transaction.JBossTransactionManagerLookup/property= CMT transaction properties (end) -!- logging properties (begin) =property name=hibernate.show_sqltrue/propertyproperty name=hibernate.format_sqltrue/propertyproperty name=hibernate.use_sql_commentstrue/property= logging properties (end) -!- # -!- # mapping files with external dependencies # -!- # -!- following mapping file has a dependendy on -!- bsh-version.jar. -!- uncomment this if you dont have bsh on your -!- classpath. you wont be able to use the -!- script element in process definition files -mapping resource=org/jbpm/graph/action/Script.hbm.xml /!- following mapping files have a dependendy on -!- jbpm-identity.jar, mapping files -!- of the pluggable jbpm identity component. -!- Uncomment the following 3 lines if you -!- want to use the jBPM identity mgmgt -!- component. -!- identity mappings (begin) -mapping resource=org/jbpm/identity/User.hbm.xml /mapping resource=org/jbpm/identity/Group.hbm.xml /mapping resource=org/jbpm/identity/Membership.hbm.xml /!- identity mappings (end) -!- following mapping files have a dependendy on -!- the JCR API -!- jcr mappings (begin) =mapping resource=org/jbpm/context/exe/variableinstanc /JcrNodeInstance.hbm.xml/= jcr mappings (end) -!- # -!- # jbpm mapping files # -!- # -!- hql queries and type defs -mapping resource=org/jbpm/db/hibernate.queries.hbm.xml /!- graph.def mapping files -mappingresource=org/jbpm/graph/def/ProcessDefinition.hbm.xml /mapping resource=org/jbpm/graph/def/Node.hbm.xml /mapping resource=org/jbpm/graph/def/Transition.hbm.xml /mapping resource=org/jbpm/graph/def/Event.hbm.xml /mapping resource=org/jbpm/graph/def/Action.hbm.xml /mapping resource=org/jbpm/graph/def/SuperState.hbm.xml /mapping resource=org/jbpm/graph/def/ExceptionHandler.hbm.xml /mapping resource=org/jbpm/instantiation/Delegation.hbm.xml /!- graph.node mapping files -mapping resource=org/jbpm/graph/node/StartState.hbm.xml /mapping resource=org/jbpm/graph/node/EndState.hbm.xml /mapping resource=org/jbpm/graph/node/ProcessState.hbm.xml /mapping resource=org/jbpm/graph/node/Decision.hbm.xml /mapping resource=org/jbpm/graph/node/Fork.hbm.xml /mapping resource=org/jbpm/graph/node/Join.hbm.xml /mapping resource=org/jbpm/graph/node/State.hbm.xml /mapping resource=org/jbpm/graph/node/TaskNode.hbm.xml /!- context.def mapping files -mappingresource=org/jbpm/context/def/ContextDefinition.hbm.xml /mapping resource=org/jbpm/context/def/VariableAccess.hbm.xml /!- taskmgmt.def mapping files -mappingresource=org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml /mapping resource=org/jbpm/taskmgmt/def/Swimlane.hbm.xml /mapping resource=org/jbpm/taskmgmt/def/Task.hbm.xml /mappingresource=org/jbpm/taskmgmt/def/TaskController.hbm.xml /!- module.def mapping files -mappingresource=org/jbpm/module/def/ModuleDefinition.hbm.xml /!- bytes mapping files -mapping resource=org/jbpm/bytes/ByteArray.hbm.xml /!- file.def mapping files -mapping resource=org/jbpm/file/def/FileDefinition.hbm.xml /!- scheduler.def mapping files -mappingresource=org/jbpm/scheduler/def/CreateTimerAction.hbm.xml /mappingresource=org/jbpm/scheduler/def/CancelTimerAction.hbm.xml /!- graph.exe mapping files -mapping resource=org/jbpm/graph/exe/Comment.hbm.xml /mapping resource=org/jbpm/graph/exe/ProcessInstance.hbm.xml /mapping resource=org/jbpm/graph/exe/Token.hbm.xml /mapping resource=org/jbpm/graph/exe/RuntimeAction.hbm.xml /!- module.exe mapping files -mapping resource=org/jbpm/module/exe/ModuleInstance.hbm.xml /!- context.exe mapping files -mappingresource=org/jbpm/context/exe/ContextInstance.hbm.xml /mappingresource=org/jbpm/context/exe/TokenVariableMap.hbm.xml /mappingresource=org/jbpm/context/exe/VariableInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml /mappingresource=org/jbpm/context/exe/variableinstance/StringInstance.hbm.xml /!- job mapping files -mapping resource=org/jbpm/job/Job.hbm.xml /mapping resource=org/jbpm/job/Timer.hbm.xml /mapping resource=org/jbpm/job/ExecuteNodeJob.hbm.xml /mapping resource=org/jbpm/job/ExecuteActionJob.hbm.xml /!- taskmgmt.exe mapping files -mappingresource=org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml /mapping resource=org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml /mapping resource=org/jbpm/taskmgmt/exe/PooledActor.hbm.xml /mappingresource=org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml /!- logging mapping files -mapping resource=org/jbpm/logging/log/ProcessLog.hbm.xml /mapping resource=org/jbpm/logging/log/MessageLog.hbm.xml /mapping resource=org/jbpm/logging/log/CompositeLog.hbm.xml /mapping resource=org/jbpm/graph/log/ActionLog.hbm.xml /mapping resource=org/jbpm/graph/log/NodeLog.hbm.xml /mappingresource=org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml /mappingresource=org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml /mapping resource=org/jbpm/graph/log/ProcessStateLog.hbm.xml /mapping resource=org/jbpm/graph/log/SignalLog.hbm.xml /mapping resource=org/jbpm/graph/log/TokenCreateLog.hbm.xml /mapping resource=org/jbpm/graph/log/TokenEndLog.hbm.xml /mapping resource=org/jbpm/graph/log/TransitionLog.hbm.xml /mapping resource=org/jbpm/context/log/VariableLog.hbm.xml /mappingresource=org/jbpm/context/log/VariableCreateLog.hbm.xml /mappingresource=org/jbpm/context/log/VariableDeleteLog.hbm.xml /mappingresource=org/jbpm/context/log/VariableUpdateLog.hbm.xml /mappingresource=org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml /mappingresource=org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml /mappingresource=org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml /mappingresource=org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml /mapping resource=org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml /mapping resource=org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml /mapping resource=org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml /mapping resource=org/jbpm/taskmgmt/log/TaskLog.hbm.xml /mapping resource=org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml /mapping resource=org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml /mapping resource=org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml /mapping resource=org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml /mappingresource=org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml / mappingresource=org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml /session-factory/hibernate-configuration我们在web应用项目的web.xml文件中定义JbpmContextFilter过滤类,它用于实现JBPMCONTEXT 的初始化 filter filter-nameJbpmContextFilter/filter-name filter-classorg.jbpm.web.JbpmContextFilter/filter-class /filter filter-mapping filter-nameJbpmContextFilter/filter-name url-pattern/*/url-pattern/filter-mapping 到这里,jbpm的配置已经基本完成,关于jbpm详细资料大家可以参考jbpm用户指南,这里就不多说。J2EE工作流管理系统jBPM详解(二) 子流程的使用成果介绍详细阐述开发成果评审标准:清楚介绍开发成果当一个流程的业务逻辑非常复杂的时候,可以考虑使用子流程。子流程和主流程是相对独立的。设计思路描述主要的设计思路,开发方法以及技术要点评审标准:清晰表达设计思路和技术要点在jbpm中,我们可以将一个复杂的业务流程文件根据业务逻辑的不同划分为父流程和子流程,这样一方面可以令我们的流程定义文件不会设计得太臃肿,二来可以方便我们将来的维护,只对需要修改的流程进行修改,而不影响其他流程。如何使用阐述如何结合项目需要应用成果进行开发。这部分需要详细描述,让其他开发人员按照此成果报告,能够进行一般简单的开发,具有较强的可操作性。评审标准:开发人员按此使用说明基本能应用成果进行开发这里我们介绍下关于jbpm子流程的使用,这里我们定义两个流程定义xml文件,一个是父流程定义文件,一个是子流程定义文件。这里我想当执行完Payfirst任务的时候,jbpm流程能自动去我的子流程文件中去执行那边定义的任务。这里是父流程processdefinition.xml?xml version=1.0 encoding=UTF-8?process-definition xmlns=urn::jpdl-3.2 name=myapp。task-node name=PayFirsttask name=PayFirstTask swimlane=finance/tasktransition name=get house contract to=subprocessaction name=actionclass=com.myapp.action.MessageActionHandlermessageHas pay first bulk of money. Print constract now!/message/action/transition/task-nodeprocess-state name=subprocesssub-process name=subprocessdefinition/transition to=end/transition/process-state task-node name=pass round for perusal signal=last-wait create-tasks=false task name=perusal assignment actor-id=#processStarter/assignment /task event type=node-enter action name=createInstance class=com.myapp.action.CreateTaskInstanceAction/action /event transition name=backto to=OnePersonAudit/transition /task-node/process-definition可以看到,上面我们使用到了,在jbpm中,process-state标签代表的是引用子流程。这里我们接着定义子流程文件。子流程subprocessdefinition定义文件?xml version=1.0 encoding=UTF-8?process-definition xmlns=urn::jpdl-3.2 name=subprocessdefinitionswimlane name=serviceassignment actor-id=service1 /swimlanestart-state name=subStarttransition to=PrintContract/transition/start-statetask-node name=PrintContracttask name=PrintContractTask swimlane=service/tasktransition name=PrintContract to=endaction name=actionclass=com.myapp.action.MessageActionHandlermessageFinish the process instance now./message/action/transition/task-nodeend-state name=end/end-state/process-definition示例实现结合项目需要实现,采用开发成果开发一个简单应用示例。可以链接到其它文档,如示例实现的项目工程评审标准:能简单展示开发成果的开发应用上面我们定义了两个XML文件,一个是父流程,一个是子流程。下面我们说下如何使用这两个文件。首先我们要先部署这两个文件,使用子流程要注意,部署的时候一定要先部署子流程,然后在部署父流程。ProcessDefinition subProcess = ProcessDefinition.parseXmlResource(subprocessdefinition/processdefinition.xml);jbpmContext.deployProcessDefinition(subProcess);ProcessDef

温馨提示

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

评论

0/150

提交评论