金蝶EASBOS工作流开发_第1页
金蝶EASBOS工作流开发_第2页
金蝶EASBOS工作流开发_第3页
金蝶EASBOS工作流开发_第4页
金蝶EASBOS工作流开发_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、金蝶EAS BOS工作流开发1. 流程配置基本知识及示例1.1. 重要概念1.1.1 流程变量 流程变量是工作流引擎和业务系统的数据交互的桥梁。 工作流承载业务,驱动业务流程,但是不会执行业务。工作流中的业 务执行,全部都会委托给具体的业务模块执行。那么,这些被工作流 分割的业务功能, 在工作流中被调用执行的时候, 如何保证做操作的 数据的一致性?通过流程变量, 在每一步的业务功能执行的过程中, 将业务数据保存 在流程变量中,那么整个流程的后续活动中, 都可以引用该流程变量, 来完成业务功能,保证业务数据的一致性。例如:在凭证的审批流程中,新增凭证审批,审批的时候为什么可以 正确定为到刚刚提交

2、的那张凭证, 而不是别的凭证?流程变量起到了 重要的作用。在凭证新增之后,将可唯一标示凭证的 ID 保存到流程 变量中,在审批的时候将流程变量中的值传递给凭证, 就可以根据这 个 ID 获取到一张凭证了。流程变量在流程实例的生命周期内都是有效的。1.1.2 任务输入输出 任务输入:在业务发生之前,有工作流传递给业务的数据。以凭证的过账为例, 某个用户收到一条凭证过账的消息, 双击消息处理。 在双击之后、 凭证的界面弹出之前, 工作流会把定义的入口参数变量 中的值传递给凭证, 凭证根据这个值来展现特定的单据, 展现特定的 功能。任务输出:在业务发生之后,由业务系统传递给工作流,需要 保存在流程变

3、量中的数据。 仍以凭证过账为例, 在用户操作完凭证过 账之后,工作流继续流转之前,如果流程定义中定义了任务的输出, 那么,就会将凭证对应的属性的数据,保存在流程变量中。已备在后 续的流程活动中使用。1.2. 注意事项l 绘画工作流图之前一定要先将业务流整理清楚,分析业务流的特 性,提取可以抽象出来公用的东西,分析是否可以进行优化等,好的 业务流程可以直接映射为工作流流程。l 利用 “流程变量 ”的威力,建立单据和流程之间数据交换的桥梁。 输入输出参数用来在流程和单据之间进行数据的传递。 输入输出参数 和流程变量搭建了流程和单据之间的数据联系通道。l 流程变量赋值时需注意:变量是否在另外地方被改

4、变,有子流程 时变量关系如何匹配, 对应的是否正确, 每个节点对应的变量是否正 确,不同的节点可能对应不同的单据 id ,给变量赋值时需特别细心。l 如存在一些系统预定义功能无法满足的需求,可以采用自己开发 功能,根据输入参数和输出参数来与工作流交互,如在单据中增加 function ,绑定到自动节点执行,或者是利用脚本节点,获取一些有 用的信息输出到流程变量中在工作流中使用。 还可以利用工作流的一 些新增功能,比如利用函数节点,BOTP节点等来执行特殊需求。l 参与人动态变化或根据条件变化时,可以充分利用 “参与人变量 作为动态值,变量的值可以通过各种方式获取,比如脚本式(后置脚 本或脚本活

5、动)、或者任务输出属性方式等。 (流程变量中可以定义类 型为参与人的变量)l 利用条件参与人设置一些动态的参与人场景。比如当某条件满足 时,设置为某些参与人,当条件不满足或为另外情况时,设置为另外 的参与人,通过条件参与人和参与人变量可以满足大部分复杂的参与 人场景。条件参与人的参与人范围还可以做为运行期指定下一步活动 的参与人范围。l 善于利用路由节点,除了可设置模式外,还可以对流程图进行美 化。l 一些公用的业务逻辑可以单独抽取出来配置为子流程给其他流程 共用,减少维护的流程数量,比如一些常用的审批流程等。1.3. 基本流程的配置示例1.3.1 单流程说明:流程只有一个人工型活动,完成凭证

6、提交的任务,流程结束。 没有具体的业务含义。以凭证提交的业务为例。流程图如下:。3人工1r定义步骤:1、拖入开始、结束活动2、拖入人工型活动,用连接弧连接起来3、定义人工型活动首先,定义人工型活动的任务,选择任务*Jt+ -拒dT±(?功临充陌宇仃纱珂勺»HI |列目訓法用上T老 | H |sSLsJtta桂菁越育s*T Mflt Tj AWET'便奶 *r «w T*ffitwT«*选定任务后,定制任务的输入输出输入参数是由任务定义带出的根据任务输入的意义,指的是在凭证提交之前,由工作流告知凭证的 数据。新建一个流程变量,绑定该输入。这里绑定的

7、意思是:在提交之前,工作流会将 billlD 这个流程变量 中的数据传递给业务。业务拿到这个值之后,会根据业务需要做出判 断。说明所有人工型任务的输入参数,全部是在定义任务的时候 就定义好的。每个任务的输出参数可能不同,是由于各个不同的业务 系统对于业务开始之前,所需要的数据不同导致。但是在EAS系统中, 基本上任务的输入参数只有一个 BOID类型的参数。这是因为一般来 说,通过这样一个类型的值,就可以完全定位一个业务单据,并且拿 到这个业务单据,就可以满足大部分的业务需求了。这里,将ID属性输出,并且选定输出的流程变量是 billlD凭证提交完毕后,将可以唯一标示一张凭证的ID属性保存在流程

8、变量billlD 中,在后续的活动中,如果还需要操作这张凭证,就可以5通过billlD来唯一定位这张凭证,保证业务的一致性。参与人定义中,分为了默认参与人和条件参与人。工作流在获 取执行人的时候,首先根据条件来逐个扫描条件参与人, 发现没有符 合,那么会取默认参与人。这里简单处理,选择任意人-x歎认垂与人-a琴与人单元 S 鼠玄”辰貳C柱意人 筝排除的蛋与人提交就可以匹配到该流程到现在为止,这条简单的流程就已经定义完毕。发布。到EAS中提交凭证,然后到工作流监控中,会发现有一条流程实例,并且状 态是已完成。132 .审批流程 说明:单据提交之后,经过一层审批,流程结束。以凭证为示例。流程图如下

9、7幵児IH|定义步骤:1、同场景1.3.1拖入活动2、增加一个审批活动,如图画连接弧3、 配置提交活动。和场景1.3.1中一样选择任务,参与人也是任 意人。但是任务的输出夺一项。由于在后续的消息中想展现出单据的 编码,所以多输出一个单据编码到一个流程变量 number中94、配置审批活动。为了方便测试,参与人设定为流程发起人的本人这一部分,就是任务输入。对于现在的场景,审批凭证,那么在业务 单据内码这一栏选中billlD 。此时billlD已经在提交之后,保存了刚刚提交的凭证的ID。一旦这个审批任务发生执行,那么,在执行 前,工作流会将billlD这个变量中保存的值传给业务系统。那么审批时就可

10、以唯一定位到一条业务单据。任务输出,选择将审批结果输出到一个枚举型的流程变量审批结果中。定制审批消息消思标题* c健入匹威1咼可殴礙取i珮呈要呈辐勘3流程定义完毕。发布,在EAS中执行提交凭证,在消息中心收到一条消息,审批,通过。然后回到凭证序时簿,察看该流程,发现,凭证的状态还是提交”而不是 审核”这是因为工作流中的多极审批,只是单纯的驱动流程,做一个选择而已,不会修改业务数据。为了能够让凭证打上审批标记,按照如下方式修改流程定义开始t*审批U结束最后的这个自动活动,就完成给凭证打审核标记的功能任务选择如下:保存、发布,再到EAS中执行一下。发现审批状态打上了133 .带分支的审批流程 说明

11、:审批通过,则打审批状态。审批不通过,返回修改仍以凭证为例。流程定义如下:1、提交、审批、自动节点的设置和场景 2中一样。2、增加一个人工型活动,修改。选择的任务和 提交”一样。但是由 于单据的ID和单据的编码是新增的时候就定好的,无法修改。所以只需要定义任务输入就可以了,不需要定义任务输出。谁提交的谁修改,参与人设置为流程发起人本人定制修改消息 13消息标题* C龍入®'或哥可以茯昵療程娈量攜助J I修总凭证*凭证号doribHi肖悬储 < 理入或匕符旳戌联取谎程变量辎助)悽忘瓷证.牠if咅帛讦m- ?-'3、编辑连接弧首先编辑 审批”到自动”的连接弧F?挣&

12、gt;口供rFy 虎 S 氏口粹才!*:w.rtrtw蹲应 纠裡谕胚£Jrv晖如盂 醒 bTITlrlTIrTTTlrlFGTlfiTlFlrf»变量或记较值右number)mBHHI?dfcd窜扌燈果numberjk_建模工具会自动根据之前的定义识别枚举, 然后将枚举的值也会自动列在选择范围内。然后编辑 审批”到修改”的连接弧。按照如下方式设置条件保存。流程定制完毕。发布说明业务单据一旦进入工作流,就要受到工作流的约束。例如,刚刚提交完凭证,流程执行到审批节点。这个时候工作流要求的 行为是 某个人执行审批操作”。如果这个时候修改凭证,会提示:已 在工作流处理中,任务不匹配

13、”。14常见的流程配置需求141 .配置参与人kJ开始142 .配置多级审批管理员收到申请单后,传给多个领导。由各领导分别进行审批,审批 不通过的要能够来回进行审批。直到审批通过,也即是多级审批,每 级审批不通过回到相应的审批节点继续进行审批。流程配置面对此种问题首先想到的应该是通过流程变量来设置审批节点的标,在每级审批节点完成后设置一个标志, 标志目前走到那个审批级,如果不通过,根据流程变量上审批标志的值直接回到此审批节点。报那改的产处宙批徐合处rnifc*®17BI后逮脚半Ql * H霰得眦本辅删approveType = r 合处】Z1综合处审批节点后置脚本总结:充分利用流程变

14、量作为流程流转的条件连接孤S称|显示名称I晶处盲批未通S143 .函数节点需要重复使用某些脚本,希望能减低脚本维护的复杂度,同时提高脚 本的复用率和使用效率。解决办法已经内置了函数节点的支持,函数节点本质上和脚本节点没有任何区 别,所处理的任务和职责都是一样,但脚本节点脚本散落在流程中各 个地方,维护和使用非常困难。函数节点的目的就是为了减低流程配 置中脚本维护的复杂度和可重用性低的问题。 具体使用请参考如下的 说明:在工具菜单 窗口 ->显示视图,查找选择工作流视图组-> 函数定义亟艇"鞅理舄4二白茅统雷数自LJ琴与人画数囁 御断昱誓有冒接上软 鞘通过用户取参与人 曰_

15、»参与人相关%我®渗芝八时应的用户1D 務获取養与心I应的用户名称 :|-尊我取爹与人对应的职员JD%获取参£人时短的頑長宮称 s _J职位关Fl ZI取员相关君眼员是否是須妖主管%我取职長的组织的公冒信息3 LJ墓砒资詔国数-J亨符串回数双击点击确定后会出现函数定义的界面, 其中已经内置了一些函数, 选择的某个函数可以打开函数编辑界面仃窃EAS1B240| % 士财务公司2007凭证处理擁阳wf电ig述用户IDS澈参与人处*BQTP.kW回雷数基本信慝国眾裘别菌数色称|我取高鬆苗赫只员厂戴围类矍返回值类型(Performer) 三参載害称1辣僕型|posotio

16、niD拿捋串persontD字符爭#逋回值说明返回参与人救粗巒数说明強据區位ID获取比职位対应的話有人员但不包含传入的/二J1 /煌示按JnsertjaSr “萝鬆按佻師-画戳蒯本在这里镰頤團數信息if null = po&itronlD : F'.equisfpositionfD) | null = personlD i T qual&(personID)return null;cani»kingd0e,eas.bdseddta,perbon,app.PersDnToWFAclapter adapter = new com.kingdee.eas.based

17、 ata.per$on rapp.Pers on To 'iVAdapte rQ;connxingdee.bos.LvorkflovparticiparrLP餌son persons = adapterrgetPositionHofdersLbosCon11 j a va. uti I. A rr ay LI 11 i st = new Java .util Jkr ray Ufit Ojforint i & 0;i<pecansength;i十十 if(SpGrsons'i.getEniploy©eId0.equjlsIgnor&jLperso

18、nIDIhtadd(person5i/二二二帶影煮亍汁馨二 行後驚汀煮為忧密窕讥竇11函数编辑界面,在此可以定义函数的输入输出以及一些描述性的说明, 并可在编辑框内输入具体的代码(目前支持KScript和java代码), 代码其实就是脚本。然后定义工作流,在流程定义中增加一个函数节点23在函数任务界面选择函数定义,会弹出函数定义选择界面,选择合适的函数即可。在函数任务界面配置好函数的输入输出参数即可在流程中使用此函 数的输出值。如需自己定义函数,直接在函数视图中按照右键菜单提示进行操作即%谨总用户Q我氐参与人1Wf打应葩用户D1新建J函数打开重命名mb非本人人员罷找眠职压上所左人员%我取职位上

19、级人员%荻取班位下妙月j j-我取囲位同毁冥他职位人员|“爲软取BH位同级所有人员!%茨取駆唸应的迟欢信息I :I%荻取眼位对应碇耶洋元土 I F 血0*144 .用流程变量配置条件参予人员工提交单据后,进行第一级审批,第一级审批参与人设置条件:如果是提交单据的是财务部员工,则参与人为财务部某一职员进行审批, 如果不是财务部提交的单据,则提交人所在部门(归口部门)的直接上 级进行审批,如果直接上级是部门负责人则上级审批完成流程就继续 往下走,如果直接上级不是部门的负责人则还需要部门的负责人进行 审批。配置步骤:首先画出流程草图,将大致的图形先画出来。在提交单据节点输出提交人的部门到流程变量 归

20、口部门”,并在后置脚本中根据归口部门的值设置流程变量 是否财务部”的值。在审批节点设置条件参与人,根据流程变量是否财务部”来设置相关的条件参与人,并将审批人输出到流程变量 审批人”中。25&站/5-空站人L程療除的盏与人-器条件与人s-S拿与人单元;自曲包含的辱与人&职臬册龜排除的参与人!占虫.条件-E是否财努部=truei条件参与人|目迎券三人单元|目密包詹的参与人& 讎R单元-负憲人-归口部门 ;| 庵阳崇的葬与人I 二丄I i a ggfimaj -= false h fi劉i事敏占.H丢U A白云在审批节点后设置一脚本节点-> 负责人判断,用来判断上级审批

21、的人 员是否是部门负责人。如果是则流程结束。如果不是则继续在部门内 多级审批,直到部门负责人审批完成(循环过程)。负责人判断的脚本内容为: 是否部门负责人二com.ki ngdee.bos.workflow.participa nt.Participa ntHelper.isOr gPri ncipal(bosContext,审批人,归口部门);其中,是否为部门负责人,审批人,归口部门为流程变量29最终流程如下:总结:充分利用了条件参与人与流程变量, 并通过脚本来获取流程必须的信息。2. 工作流脚本2.1 .JAVA 脚本在工作流中经常会需要使用到一些脚本来获取单据的信息或者是执行一些特殊的操

22、作,脚本应如何写?需要注意那些地方?有没有更好的定义和使用方法?解决方法工作流脚本利用的是java语法,所有的java代码都可以被工作流解 析,但所有的类必须是全路径名称(除了 java.lang.*包下的类),如 List必须写成java.util.List。在工作流中内置了一些变量和函数可以进行使用,女口: “_bosCo ntext ”内置变量表示服务端的con text。 在工作流脚本中可以直接使用定义好的流程变量,脚本执行过程中会将脚本的值自动赋值给相应的流程变量。在内置函数节点可以用来封装脚本,减轻脚本维护的复杂度和提高可重用性。工作流中内置的一些函数如下是一些脚本的示例:l根据人

23、获取对应主负责的行政组织脚本:首先新建一个流程变量BOID类型例如orgldString userId =""/获取User对象的远程控制接口iUsercom.kingdee.eas.base.permission.IUser =com.kingdee.eas.base.permission.UserFactory.getLocalInstance(_bosContext);com.kingdee.eas.base.permission.IUser iUser=com.kingdee.eas.base.permission.UserFactory.getLocalInsta

24、nce(_bosContext);com.kingdee.eas.basedata.person.PersonInfo info=iUser.getUserInfo(new com.kingdee.bos.dao.ormapping.ObjectUuidPK(com.kingdee.bos.util.BOSUuid.read(userId).getPerson();if (info != null) String personId = info.getId().toString();.IPositionMemberiPositionMem

25、.PositionMemberFactory.getLocalInstance(_bosContext);.PositionMemberInfopositionMemberInfo = iPositionMember.getPositionMemberInfo("selectposition.adminOrgUnit.id where person.id = '"+personId + "'and isPrimary = 1&quo

26、t;);orgId=positionMemberInfo.getPosition().getAdminOrgUnit().getId() l 根据组织的 id 获取公司的名称, 然后在条件参与人中根据此进行 判断1、增加一个流程变量 adminld、companyld、companyNum 都是字 符串型2、在新增节点的任务输出中,输出组织的 lD 到 adminld 变量中3、增加脚本节点,其中脚本如下:companyld = com.kingdee.eas.basedata.person.app.PersonToWFAdapter.getCo mpanyldByAdminld(_bosCo

27、ntext,adminld);.lNewOrgUnitFacadeiOrg = .NewOrgUnitFacadeFactory.getLoc allnstance(_bosContext);.CompanyOrgUnitlnfofilnfo = (.CompanyOrgUnitlnfo)iOrg.getDelegateUnit(companyld,com.kingdee.

28、 .OrgType.Company);if (filnfo != null) companyNum =filnfo.getNumber(); l 判断有无直接上下级的脚本 首先定义一流程变量,类型为布尔:有直接上级 com.kingdee.bos.workflow.service.ormrpc.IEnactmentServicese rvice = new com.kingdee.bos.workflow.service.ormrpc.EnactmentService(_ bosContext);com.kingdee.bos.workflow.ProcessI

29、nstInfoprocInstInfos = service.getProcessInstanceByHoldedObjectId(billID.toString( );com.kingdee.bos.workflow.ProcessInstInfocurProcInst = null;for (int i = 0, n =procInstInfos.length; i < n; i+) if(procInstInfosi.getState().startsWith("open.run") curProcInst =procInstInfosi;if (curProc

30、Inst != null) initUserId =curProcInst.getInitiatorId();com.kingdee.eas.basedata.person.app.PersonToWFAdapteradapte r = newcom.kingdee.eas.basedata.person.app.PersonToWFAdapter();com.kingdee.bos.workflow.participant.Personpersons = adapter.getSupervisor(_bosContext, initUserId);if (persons != null&am

31、p;& persons.length > 0 && persons0 != null) 有直接上级 = true; else 有直接上级 = false;l 委托时,判断审批人是否是部门负责人判断审批人是否是部门负责人, 如果审批人是委托任务处理人, 则判 断委托人是否是部门负责人变量声明:下述脚本使用了如下变量:_bosContext: 系统内置变量单据 Id :单据内码 , 一般由单据直接输出归口部门 :类型为字符串,为部门 id审批人:类型为字符串 , 为审批任务的处理人,在审批节点中输出审批节点名称 : 类型为字符串,为节点定义名称是否部门负责人 : 类型

32、为布尔, 为返回的结果值, 用来在流程中判断 2。33com.kingdee.bos.workflow.enactment.WfEngineengine = com.kingdee.bos.workflow.enactment.WfEngine.getEngine(_bos Context);com.kingdee.bos.workflow.ProcessInstInfoinfos = engine.getProcessInstanceByHoldedObjectId( 单据 Id);if(infos!= null && infos.length>0)ProcessCon

33、trolDataKScriptAdapteradapter = newProcessControlDataKScriptAdapter(infos0,engine.getL ocale(),engine);String constituentUserId=adapter.getTopConstituent( 审批节点 名称);if(constituentUserId !=null&& !constituentUserId.trim().equ als("")/ 有委托人 ,判断委托人是否是部门负责人是否部门负责人 =com.kingdee.bos.workf

34、low.participant.ParticipantHelper.isO rgPrincipal (_bosContext ,constituentUserId ,"归口部门 ) ;else/ 没有委托人,直接判断审批人是否有直接上级 是否部门负责人=com.kingdee.bos.workflow.participant.ParticipantHelper.isO rgPrincipal (_bosContext , 审批人 , 归口部门 ) ; else是否部门负责人=com.kingdee.bos.workflow.participant.ParticipantHelper.

35、isO rgPrincipal (_bosContext , 审批人 , 归口部门 ) ;l在脚本中执行SQL语句java.lang.StringBuffersql = java.lang.new StringBuffer();/将SQL语句保存到sql对象中java.sql.Connectioncon =com.kingdee.bos.framework.ejb.EJBFactory.getConnection(_b osContext);java.sql.StatementbatchStatement = con.createStatement(); batchStatement.exec

36、ute(sql.toString();com.kingdee.util.db.SQLUtils.cleanup(batchStatement,con);com.kingdee.util.db.SQLUtils.cleanup(con);l 将活动的参与人设为单据对应部门的负责人场景:在单据上有个 “费用的承担部门 ”的属性,现在要将审批活动的 参与人设置为该部门的负责人。1. 声明变量var_principal 外部数据类型var_orgUnitId 内码( BOID)2. 在做业务单据时(审核节点之前)将单据上的 “费用的承担部门 的 ID 关联到 var_orgUnitId 变量中 ,并在

37、该节点的后继脚本中填入 如下内容:.AdminOrgUnitInfo adminInfo =co .AdminOrgUnitFactory.getRemoteIns tance().getAdminOrgUnit(var_orgUnitId);if(adminInfo != null &&adminInfo.getResponPosition != null) .IPosition iPosition = com.k

38、ing .PositionFactory.getRemoteInstance();com.kingdee.eas.basedata.person.PersonCollection pColl =iP osition.getAllPersons(adminInfo.getResponPosition.getId();var_principal = newStringpColl.size();for (int i=0; i<pColl.size(); i+) com.kingdee.eas.basedata.person.PersonInfo pi =

39、 pColl.get(i)5var_principali = pi.getId().toString();3. 在 审 核 节 点 中 定 义 参 与 人 , 选 择 为 参 与 人 变 量 , 并 把 var_princial 添加进去。l 根据分录信息循环发送消息给业务员收集: 脚本一java.lang.String commonStr = data +"," + billNumber + ","+ chauffeur + "," +regnumber + "," + contact + ".&quo

40、t;java.lang.HashMap map = newjava.lang.HashMap();for (int i=0; i<records.size(); i+) / 请替换成出车单的分录对象 com.kingdee.eas.fi.gl.VoucherEntryInforecord = records.get(i);java.lang.String s =record.get("wareName") +"(" + record.get("wareNumber") + ") 已发往" + record.g

41、et("customer") + ""55java.langString op =record.("operator").getId().toString();if (map.get(op) = null) map.put(op, s); else map.put(map.get(op) + s);userList = new java.util.ArrayList(); msgList = new java.util.ArrayList();/ 此段已废弃 beginfor (java.lang.Iterator map.getKe

42、ySet.iterator();i.hasNext();) Object key = i.next();Object msg = map.get(key); userList.add(key); msgList.add(commonStr + msg);/ 此段已废弃 end 修改为:list = new java.util.ArrayList(); list.addAll(map.keySet();for (int i=0; i<list.size(); i+) Object key = list.get(i);Object msg = map.get(key);userList.add(key);msgList.add(commonStr + msg);pos = 0;count = userList.size();if (count > 0) user = userList.get(0);msg = msgList.get(0);2.2. 多 UI 相同实体需要触发不同的流程 , 条件启动流程在EAS中经常碰到这种情形,有两套UI对应一个实体,此两个UI绑 定的功能 (Function) 和操作 (Operate) 是一

温馨提示

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

评论

0/150

提交评论