




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、jbpm5持久化及流转流程剖析1 jbpm5持久化结构图jbpm5实例流程图下面的文档讲解了基丁该流程的步骤流程2第一步启动任务流程吋序图:第一步人工任务执行时序图taskciient(taskciianlhandler1启动taskserver.持久化organizat iona顶层包:外部系统2.启动流出2. 1耕析bpmn2文件;2.2开启事务2. 3 ksession开始执j亍任务2. 3 1 执行startnode,执fbeforenode拦截器尊: _2. 3. 2 执行liumantasknode* 执行beforenode拦 18器等) ! !3.初始化handler3.1初始
2、化client3.2建立minn通佶连絃3.3注册妙件complete3.4注册班件fiii 135注册爭件skip4.调用exculdiorkllea方法匚二4. 1初始化task任务和息ftt调用client添加任务信总!|4 3 addtaskrequest4.5 addtaskresponse;46返回 4.7返回i5关闭事务;ii6 1 ultflhimantaskafternode 拦彊器6. 2 执fistartafternode拦截25i6.3 持久化 process info, work 11i6.3 ksession. dispose02.1 启动 taskserver使用
3、线程丿动taskserver,初始化持久化organizationentity,将流程中需要使用到的 groupld, actorld.全部初始化到表中。2.2启动流程1)根据路径解析*.bpmn2或*.bpmn文件,放入到内存中。在该类注册了相关的对象 org.jbpm.bpmn2.xml.bpmnsemanticmodule addhandler(nprcpercyu r nevz propertyhandler();addhandler(nlanenz new 匚anehandler();addhandler(”弓匸己二匸三匸呂口匸", new starteventhandle
4、r();addhandler(匸"卩 nevz endevenhandler();addhandler(r,exclj3lvegatewayn z new excl3lvega*ewayhaedler();addhandler (n2.nclejslvegatewayn f new zncl3lvega*ewayhaedler (); addhandler(nparallelgaewayr, z new parallelgatewayhandler();addhandler ("刁巴口匚2ei3£dg己匸e讨己了” 营 nevz ezencsasedgaceway
5、handler (); addhandler (ncciriplexgace/7ayn new coir.plexgacewayhandler ();addhandler (nscrlp"ctasknz new scriptaskhandler ();addhandler (r,tasknz new taskhandler ();addhandler (n-jsertaskn f new usertaskhandlex ();addhandler (nrsan j.alzaskn z new man'jaltakhandler ();addhandler (r,ser*7lc
6、eta3knf new serviceia3khandler ();addhandler(n3endta3knr new sendta3khandler();addhandler (nreoe2_veta3kn f new recei*7eta3khadler ();addhadler (,lb j3lr.e33r,j.leta3knz new 33lr.e33r-j±eta3khandler ();addhandler (ncallact2_vitynz new callactivityhandler ();addhandler (n3,.ibproce33nf new sbpro
7、cesshandler ();addhandler(11 adhocsbfrcce33n, new adhoc5bproce3 3andler();addhandler ("二二匸呂二mwci二&匸:ce匸三寸e:n匸”' new znterir.ediatecatcheventhandler (); addhandler ("二二匸呂二mwci二&匸巳二上二c专三寸e:n匸”' new znterir.ediatetr:rcweventhanciler (); addhandler (ribcndaryeventf, a new bcnda
8、ryeventhandler ();addhandler (r,d&taob; ectn r new da*acbjecthandler ();addhandler (r,tran3&ct-cnn f nevz trar.3acticnhand.ler ();addhandler (n3eqj.enceflcwr,z new seqier.ceflowhandler ();addhandler (n-ceidef-n2.tlcnn f new itemdefinitlonhandler ();addhandler (,lir.es3agen, new messagehandle
9、r ();addhandler (,lnterfacer,/ new interfaceandler ();addhandler (,cperatlcnn/ new operationhar,dler ();addhandler (nr2-ie33agerefrr z new inme33agerefhandler ();addhandler (,le3calationn, new e3calationhandler ();addhandler (,lerrcruf new errcrhandler ();addhandler (,ld&t.a5tcreri/ new datastor
10、eandler ();addhandler (,la33ccla*lonnf new a33cclaticnhandler ();handlersbyclass.p-jt (split. class, new splirhandler ();handler33ycla3s.p'jt (jom.classz new joinhandler (); handlerssyclass.put(eventmcde.class, new eventmodehandler(); handlerssyclass.pt(timermcde.class, nevz timernodehandler();h
11、aedlex53yclass .p*jc (endljode. class new endnodehardler (); handlersbyslass(fa二二匸nccie class, new r aul-cmodehaedler ();riancilerssyclass .p-jt (wcrkzcernmcde class, new wcr clterr-iodehandler (); handlers3yclas5.put(acicnncde.class, new acxonncdehandler(); handlersbydass.put (statemcdeclass, nevz
12、staemodehandler ():;riandlersbyslass.p-jt (conxcslteccerexnode.classf new coinposltecontextmodehandler (); handlers3yclass.pt(foreachnode.classz new foreachmcdehandler();2.2.1开启事务222 ksession开始执行任务在 org.drools.persistence.singlesessioncommandservice 中 execute 扌丸彳亍, public synchronized <t>
13、7; execre (conzr:ai:d<t> cczrand) ; try rxm.begln();二匚2.tkse33lon ( this . sessonlnfo . cetld () rthis .rr.ax3halllnchelper cer?cba3e () f this .rr.arsnallinqhelper cetcc匚f ();this. jpin.beginccirir.andscopedentitymanacer ();/thisappscopedentitymanager.jointransaction(); reciscerrollbacksync()
14、;txiu. comml'c ();根据不同的command可以实现ksession的交互return re3ulr;catch (runciir.eexcepclon re) rcllbacktran3action(re);throvz re; catch ( exception zl ) rcllbacktransaction(tl);tbrow nevz r*jinclir.eexceprlon (n?jrapped excepcicn see ca-j3er,/ 1); finally if ( ccirir.and instanceof dbpobeccnuland ) th
15、is. jpm.dispose ();type hi erarchy o£ org drools<=() andl generivgener i cc omm and<?t > 一 org .drools. comm an d. implabortprocessinstancecommand - mandtabortworkltemcommand 一 org drools command .runtimg.addeventlistenercommand - org drools. command .runti_ agendagroupsetfocuscommand
16、一 org.drools. command. r asser tequals 一 org drools command ass er tion,bt chexecu tio ncommandlmpl - org .drools .command. rui cl ear ac ti va tio ngroupcommand 一 org. drools, command, i cle aragendac omm and - org drools. command .runtime, ri cl e ar agendagr oupc omm and - org. drools. command .r
17、un tj clearruleflowgroupcommand 一 org.drools. command, rm completeworkltemcommand - org drools. command .run tj creatancecommand - org. drools, command. di eposecommand - org drools command .runtimewfhess ctrq-i to see the suwztypw hi"aixhy流程实例为 oigjbpm.ruleflow.instance.ruleflowprocessinstance
18、 的对象进入 cess.statlprocesscommand 中执彳亍 excutepublic processxcstance execute(context cccexislaefulkrovledgcsessxon ksession - ( (knowledgecccnndcocexx) coszexr)gezstazeflkcvledesessioc ():if (data nail)(for (ctojecc o: dy <k99910q二匕上匸(0;>froce9匕匕uq匕ee) ::(fzuu电9二d. fatare二色=):(zxe
19、clonkes-lzzrl (<knowledgecczznazicxzex < ocnzexr ez£xecuzionkeslzs( » gezres-lls i 1 puz(th】9ourzdenclfler, w4.看豆了我程启乞方式.执行慕疹久化的szezbeledcesd 賠翔忌縛严> retnrn prccessznjance;223 执行 startnode执行startnode,结点任务public prccesslnsc&nce startprocedalastance(iona proceaszcatancezd) try &l
20、t;kruntiroe startcperation();if ( !jcruntxzie.gecicrioxigene()xaeccy() ) :kruntme.exeuxitequemedact丄ox:9 ():processinstance processinstance gecfxacessinatance(proceslstacceld);return pracesslnstance;1 w8执行“5入克 2开til执行期 finally icrunixe .eudopenno:!();任务流转核心方法public final void rz.gger (mcdelnscance f
21、rom, scrig 匸¥?巳)boolean hidden = false;if (getnode() .getmetadaca ()get (hidden11) != null) hidden true;znterralkncwledcerncirse ic二二二匸二me = gefrocessistance (:cerkncwledcer-ncirr.e (); if (!hidden) (inernalprocessrut-me) krunt-meqe匚ezrocmssr二n匸二u包() 进入结点拦戳器getfrocessevents-pport().flre3eforeno
22、detriggered(tbis, kruntime);i&二二二三qqer (fzruir.p二vp巳);i 流程流转核心揑制器if (!hidden) (znernalfrocessrlmt-me 1 1c二二二匚二me qe匚emocessr二n匸二u乞()getprocessevens-pport () freaferncdetriggered (this, kr-jncime);退岀结点拦截器cermodelsanceconcalner ()1找到结点的出口cermodelsanceconcalner ()protected void triggerccir.pleted(s
23、tring type, boolean remove) if (remove) (orc jbpn:讨o二cf二o讨三二吕匚auug .nude二口3匸&二ceuor:匸ainem : remcvemodelscance(this);node node = getmode();list:<connec<cion> connections = null;if (nod色! null) | coxinec匕丄ons nodegetoacgoingcon0eucions(cype);if (connections = null | connections.isenpcy (
24、) (org bpm>rorcf二o讨二二3匚auue .nude二ns匸&二ceuor:匸aiuem :ncdezns-aceccrnpleced(this, 二ype); else for (ccnneccicn connection: connecc.ons) / stop if this process instance has been aborted / completedif (getfrocessinscance () getsate () ! process instance staflaut 工 ve) return;2.连接结点控制protected voi
25、d triqaercc&ctctioa(cocntction conn«ctio&> < boolean nidden falm; if <q«thod«()q«tx«t«daao' null> hidden true;interaalzncvledgerurtiffic krufitxoe getprccessznstaoe() if (!hldde2> (xntezaalprccessruatmel kruatxsegetproceaseventsppcrt < >
26、幺qtbi.;i2栓否看jl&5用户电/ check fcr exclmive grcxxp first ncdelnszanceccszaxner p®-e"- - qe二nude:ru5=e=ccuy 二二e= > : if (parent instanceof ccczexzzsazaxceccntaxnerli9z<cqszexzis9?«cce> cokzcxzxn3z«scc9 -<cox-exzxnazazcecczzaizexi parexzi -gezcczzexzizazazcea i£xcl
27、axve3xc-p:it (conzexzlnszance ,w null! for (conr«xz:n«z*nc conc<xz:nft«nc«: new xrraylx9<co&z«xz:s二:xaqccu二!(;:!;二uc«)( exciu«iv«group:n«?«nc< groupls«t*sc« iexcl«xv«3rcp:c二cc«>二it <gro;pln.cosifmnoa】匕二)
28、63;ror (ncdelnstanct ncd«lq匸匕c«: grcplc"匕x匕二-sx(门 < if (ncdelnttance ! thit> 1 (osq:bpsvo:rkncv二cc4e:l9ance).cancel(>(contexti&tta&cecoscaintr) paz«&t> s«asv«ccstext:z匸uuao畫复£xc二迂 5rwp, contextxctta&ct):93执行下个虛ire方渣/ trigger next node(0x
29、9:eps.vesrkflo廿ix二made:c®to:ue) < (srg:bp=vorkflcw二匕9=二匸它!<0<1亡:二9=二=亡二0匕:二二©=tetnodelsstaccecostaiser () i fethcdelaatanceiccnbection.gettoq)<trigger(thi», cc&aectioa>gextotyyq >:(i internalfrcceasrnzxrae) jrruu二二n gu=p:ro=es3r:=x=eq).gezfrsceaatvczzs'ippcrz
30、 (» .fizeafzergseleft «xhisr 1ttzzx=c» :4 如:开至 w三 1?*旦岑224 流程执行 humantasknode流程执行到humantask任务结点,引擎会执行org jbpm. workflow . instance . node worki temnode instance 这彳实彳列类(l勺 internal trigger 方法,并持久化 workiteminfopublic void xnternaltriggex(final ncdelnszance frcs. spring type) super匕ype);
31、/ tooo this should be included for ruleflov only, not for bpelif (ozq dtools .process !.:$匸ouce 讨osrlctreno wotklregi); catch (worklcerahandlernocfoundexcepcion wihnfe) (2 4yorkxt«»ss> shsitsikfiznfiftgecfrocestlnstance () . secstate ( prcceiilnicance. sratzasorrzd ):wrkltmthrow wihnfe;
32、if (!workitenirode.iawaxtforcoapletxon()( triggerccnpleced 0 :this.v/oriciuenzci wcrkltemgerhd(): nodeconnectxon_default_type.equalm(type) throw new illegalargusentexception(a worklterenode only accepts default mcomicg connections * *);norkhendcde womk"ercncde ();| uzeete閤orklteruworkxtenhode);
33、| iorkltif (worjcitersitode!,9*bixfo:rh:qple"o:u) adcworklteslxstener():>if (xsinversionofcontrok) (proceaainstance) getproceaazndtance()getknowledgeruatine() update(processlnstance) qetprocesalnstance()gecknowledgeruntirce()gefacthandle<tbis), this>:i else <try (pobxia void interft
34、ixkxecutemorirxtmkvorkxtmi vorirxteii) eavireemst «rv tbit4fvarklvuoco wor*:t«a:&fo n«w yorkxtwzaco <vorkzt«mr an :ex.peraiaz (worirzze&icfo):fersxsenceccntexccxexjfer sx sxezcecc 二 f mamk 二» env.f” i 再久化»arkitei lycrkzesiisii vorklt<ai 9etld<vozlr:tesx
35、l£fcvorirztenzsfc update () j£xvxrs=eztxa=e ) .gex*=ars<:ei5er3i9ezcecexxexx < > ;if (tble.wxtenj nolli (thiaw:匸 n«w k4>nxap<lon9* xorirzcmuctox)j )vorteltes匸nt qwor:resge=xd(), vorirlteainfol:wcric:<=h*!:51«r nadl« iv:ic:z0u4:r) tbit. -t二&二haat,);lazdl
36、er.exerexsricxzeskxsridzez thist :throworicic«n2totfeu&dzmc«pciod( werklttm ): g二 kuo 莒 ldgrnn 二二 () g二前 orkxfrnm:g匕 o ) internaxexecuzeworklten (2.3 初始化 handler官方默认提供了 workltemhandler的实现,com.carefx.workflow.handleccommandbascdwshumantaskhandler。这个 handler 就类似人 工任务的范本,如果业务系统要做其他事情,可以适当
37、的修改这个类就可以,例如:与外 部组织机构交互等。2.3.1 初始化 client初始化taskclient.用于client与 服务端server交互2.3.2建立mina通信连接jbpm5默认以mina作为通信持久化通信桥梁2.3.3 注册事件 complete2.3.4注册事件fail2.3.5注册事件skip初始化commandbasedwshumantaskhandler方法时,山客丿端发起,向服务端中注册任务事件(taskcompletedevent, taskfailedevent, taskskippedevent, taskclaimedevent 等)。 客户端(通过min
38、a发起):public void() if (cl丄色nt null) client = new taskclient (new mxnataslcclieszconnecccr("cr g dxcola .pmuuess .homic 二二 y匸.nshuxartankhandler*1.new misataskclie&tmandler(syateseventliatenerfactory ;ttsys?eszventxutener():boolean ccsn«ct<d cliest.connect (xpaddros, pert):if ("
39、connected) <throw new xllegalarguseszexcepzios( acould not cos&ect task client*);>注册tasiceventicey key new taskeveatkey (taskccnpleedevent-1);tasjrccsqpletedhandler eventresponsehandler new taskccnpletedhandler(client(statefulknowledgesession)ksession); client.zegi.9匸亡匕匸(key. false, eventr
40、eapoasehandler): key new task!venkey(taskfaxled£vent.classr -1);u二二仝二二.reglsterfczlten*(jceyz false, evenxrespc*sehandler):key new taskzvexzey(tasksk-ppei£ven.class. -1);clienz二匸exfu二三y仝二匸(味乞丫, false, evenzresposehanler):服务端(通过mina接收):case rsgistsrforevsntrzqiiqst: response = coirir.andnai
41、r.e. evsntxri r 殳 spxs?;eventkey key = (eventkey) cmd.gerargmenrs().get(o); boolean remove = (boolean) emd. getaraent3 () . get (1);sri匚q h二二d = (string) emd. cezkrcnzs () . cez (2); clients .pj匸(wld, 3e33ion);eventra匚spo二匸 ra匚spo二匸 = nev7 eventranspcrcind. getld () f client3z remove);3erv2.ee cetev
42、entkey3 () reci3ter (key, tra匚匸); break;2.4 调用 excuteworkltem 方法调用excuteworkltem方法,目的初始化任务信息(任务名称、任务优先级、处理任务人员 分配筹),将得到的任务信息一并发送到服务端进行持久化overridepublic void exec*-iteworkltem(wcrkzteir. wcrklten, wcrklterrl-ianacer n;anacer) coe匚eut ();ta3k t&3k = new t&3k();srrz.ng askmair.e = (string) wok二
43、匕em匚etealzmirete二("tasknajre”);2.4.1初始化task任务信息2.4.2调用client添加任务信息2.4.3 addtaskrequest由客户端(taskclicnt)向服务端(taskscrvcr)转发持久化task请求该方法最后一行通过发送addtaskrequest请求,发送到服务端,由服务端持久化 task 和 content 信息client.addtask(task, content, null);2.4.4持久化task服务端(org.jbpm.task.service.taskserverhandler)接收到客户端发送来的消息 a
44、ddtaskrequest,1)持久化 task 信息,插入相关的农(peopleassignments_potowners,peopleassignments_exclowners, peopleassignments_stakeholders, peopleassignments_bas, peopleassignments_recipients,task, 118ntext)2.4.5 addtaskresponse通过addtaskresponse,山服务端(taskserver)发起请求通知客广端(taskclient),通知客 户端(org.jbpm.task. service.t
45、askclienthandler)添加任务完毕,持久化processinstanceln£o, workiteminfo 数据此时路程已经执行到了 humantask任务结点上,同时分配了任务给具体的人。进行了持 久化操作。接着等待人员触发该任务2.4.6返回任务结束返冋sessionld,proceslnstanceld给用八,外部系统保持以便获取持久化信息。2.5关闭事务(提交事务)持久化 processlnfo,workitem 等,并対 sessioninfo 解锁2.6执行流程的后续操作261 执行 humantaskafternode 拦截器2.6.2 执行 starta
46、fternode 拦截器2.6.3 执行 humantaskafternode 拦截器2.6.4 ksession.disponse()释放 ksession3第二步人工任务流程时序图:warkl;lowlnt"facoi; i rm kncr itdskcli ml (taskcl ieiill i in idler)1. jc动tasics、.儿久organization2.说川人工仟务执汀按口a外和系统3解析bjxnn24. ifijiksessionldij;取呛“sion5.知妞化cl iont5. 1建立mimi週侑连接5.2注册珈件conplete5.3汴册爭ftfai
47、l5.3注沏爭件skip5. 4返冋6 registerwork7-发超存询人丄任务谄求7. 1. qtierytnsksassignedpotentinlowncr7. 2. qurryttiksunitfiryrcnpnnsrwa. 4返冋99发虎2诫功完成人.任务i与求(gwlqle7.3返回人丄任务伯息8发拗开始执行任务请求(start)8. 1 operationrequest&2淹程实例狀态改空为inpraccss8.3 ojx?rat ionresponse9. 2 eventtri ggerresponsetw9 3 ojwrat innresppnse9. 4 grt
48、taykrequest9.5 gettaskrespons-fw9.6 getcontentrequestt-9. 7 getcont entresponse9. i oprrat ioncqucst9. 25返冋<-9. 8 w ftjwork 11 emit h! siconp 1 et ework 11 emit 口1-9.9 kgswion幵启爭务9.11开贻结点进转jllunantaskhttnd i or(初始化9 17 executework i ten9. 23返回9.24 1p务提交9. 13 初始化client9. i i 注shepleteevenl9.15 itm
49、failevent9. 16 注mskipevcnt9. 18初妬化下个结点.的tosk9. 19发迖创住任务持久化谓求9.20 addtaskrequest9. 21 adrfrakkcspannc9. 22返|叫3.1 启动 taskservertaskserver保持启动状态,或者至新丿占动一个线程亦可。3.2调用人工任务执行接口外部系统通过该接口实现人工任务的交互3.3 解析 bpmn2读収原來流程的bpmn2文件并解析到jbpm5框架中3.4 通过 kessionld 获取 ksession通过第一步返冋的sessionld.获取到持久化的sessioninfo信息,以及proces
50、sinstance信息。 同时proccsslnstancc流程实体采用数据锁,保证并发女全性f ex»e iicse33icn s ijpakncwledg*service二01:19二3二仝于:;二?(?:二罗二仝么孑仝0仝53二0::(幺9仝99二:二二4"0“9仝"二:二g,仝二:3.5初始化client3.5.1建立mina通信连接初始化taskclient,建立起mina连接3.5.2 注册事件 complete3.5.3注册事件fail3.5.4注册事件skip同时山客八端(taskclient)发起,须向服务端(taskserver)中注册任务事件
51、(taskcompletedevent, taskfailedevent, taskskippedevent, taskclaimedevent)注册儿个事件, 就需要发起儿个mina请求幺户端(通过mina发起):public void ccnnec* « if (cl丄enc null) client = new tasjcclxenr r.ev minatasjccliezconnec'ucr i"erg drccls .emuuenn 肓ur k二二 en =9上二二new hx*&t&sjrcli.enha*dler (syaerzveci
52、iscenerf&cory yersystex£venrlisrer:er( : o ;boolean ccnxecred client.coanecc(xpaddress, port);if ("connected) throw now illegalaxgusenexcefxcn(could net connect task client");>/注册taslceventkey key new taskeventkey(taskccnpxeedevent.cla.】):taskconqpletedhandler eventrespon new t
53、lcccnl<t«dhandl«r (clxeaz, (statefulknowledgesei.on)cs&on); clientzeg丄sterfozeye匕匸(key. false, eventreapondehandler):key new taskeventxeydaskfailedevent .class, -1):client :rg二匸:rfosreveur tfalso, eventresponsehandler):key new taskeve*txey(ta9kskxppedevest.class, -1);client.register
54、forevent(keyr false, eventresponsehandler):服务端(通过mina接收):case rejisterforeventeuest: response = ccirir.andnair.e eventtriggerrzsponsz;eventkey key = (eventkey) cmd. getarcents () .get(o); boo 1 巳an remove = (boolean) emd. cezarcrr.enzs () . cez (1); string id = (string) emd. getaraent3 () . get (2);
55、 cllenr3 .“匸(二二二6 3e33ion);eventtrauspo二匸 trauspo二匸 = nevz eventtransportcmd. geid () f clients, remove);servicegeteventkeys()register(keyr transport);break;3.5.5返回3.6 registerworkltemhandler (容器注册人工任务handler)通过handler注册后,jbpm5会自动实现与业务系统的交互3.7发起查询人工任务请求转发请求査询人工任务请求到taskclient3.7.1 querytasksassigned
56、aspotentialowner客户端(taskclient)向服务端(taskserver)发送请求。发起querytasksassignedaspotentialowner查询请求:查询分配的用户任务列农taskclienc getasksassiqnedaspotentialowner cdserorgro-dpidccnzanzsen ukf re3ponsehandler);:<sresp?r:5ehadler = new 31coklata3k5'jrmaryre3cor.3ehadler :;根据港在用戶查询待处理的任务"结果返回包含在 responsem
57、&ndler312.5*<tasksummary> results = responsehandler .qmtres二二匸s ();responsehandler. waittilldcne (contanzs tilltzle) ;|public void cectaskba33igr.eda3poterlalc77er (string 二se二二d“string language,ta3<s*jrrn:aryrebgonsemaucile二 re3pcn3ehandler) li5t<0b:ecc> args = new arraylist<object>( 2 );args add( us
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学生应急逃生知识培训课件
- 学生层面诊改知识培训课件
- 学条例促养成课件
- 无线通信驱动的智慧仓储方案
- 学会骑自行车的课件
- 二零二五年度雇主责任保险融资担保合同
- 2025版汽车零部件场交易居间服务合同书
- 二零二五年社区食堂厨房承包合作协议书
- 2025版物业管理服务智能化改造合同
- 二零二五年度服装店员工招聘及培训服务合同
- 2023年山东水发集团有限公司招聘笔试题库及答案解析
- SB/T 10941-2012自动制冰机试验方法
- GB/T 6804-2008烧结金属衬套径向压溃强度的测定
- 沙盘游戏治疗(2017)课件
- SY∕T 5280-2018 原油破乳剂通用技术条件
- 苏教版五年级数学下册【全册课件完整版】
- 班组施工任务单
- 职业健康检查结果告知书模板
- 2022年小型发电站设备缺陷管理制度
- 慢性肾衰竭(慢性肾脏病)诊疗指南(内容清晰)
- 钢结构模块化安装施工方案
评论
0/150
提交评论