Ò»¡¢Ç°ÑÔ
Ìáµ½¹¤×÷Á÷ºÜ¶àÈ˾ͻáÏëµ½OA£¬µÄÈ·OA¾ÍÊǵäÐ͵Ť×÷Á÷µÄÓ¦Ó㬵«Êǹ¤×÷Á÷²¢²»½ö½ö¾ÖÏÞÓÚOA£¬¹¤×÷Á÷Ó¦¸ÃËãÊÇ»ù´¡¿ò¼ÜÈí¼þ£¬Ö÷ÒªÓÃÓÚÁ÷³ÌµÄÖØ×éºÍÓÅ
»¯£¬ËüÓйãÀ«µÄÓ¦ÓÃÁìÓò¡£ÔÚjavaÏÂÓкܶàÓÅÐãµÄ¿ªÔ´¹¤×÷Á÷¿ÉÒÔÑ¡Ôñ±ÈÈçactivit5¡¢jpbm4µÈ£¬ÔÚ.netÏÂÈ´¼¸ºõÕÒ²»µ½ÁîÈËÂúÒâµÄ¹¤×÷Á÷Òý
Çæ¿ÉÓᣵ±È»²»ÊÇ˵.netÏÂûÓпªÔ´µÄÖ»ÊÇÓÐЩ¹ú²ú¿ªÔ´µÄµ«¿´ÁË´úÂëºó¾ÍÒ»µãÐËȤ¶¼Ã»ÓÐÁË£¬ÇÒ²»Ëµ´úÂëÖÊÁ¿ÈçºÎ£¬»¹ÒýÈëÁËÒ»´ó¶ÑµÄ¶«Î÷£¬ÏëÔÚÏîÄ¿ÖÐÓ¦ÓÃ
Ò²ÊǷdz£À§ÄÑ¡£¼øÓÚ´ËÎÒ»¹ÊǾö¶¨×Ô¼º¿ª·¢Ò»¿î.NET΢Ð͹¤×÷Á÷ÒýÇæ¡£
¶þ¡¢»ù±¾ËµÃ÷
Ϊʲô½Ð΢Ð͹¤×÷Á÷ÒýÇæ£¿¾ÍÊdz¬ÇáÁ¿¼¶£¬ÒÔ·½±ãÔÚÏîÄ¿ÖÐÇá±ãµÄʹÓ㬱ÈÈçÖ»ÓÐÒ»¸öÀà¿âdll£¬´óСҲ¾Í¼¸°Ùkµ½1M×óÓÒ£¬²»¹ýÎÒÃÇÒªÏȻعýÍ·À´¿´¿´¹¤×÷Á÷ϵͳ£¬ËüʵÔÚÊÇÌ«´óÁË£¬ËüÓ¦¸Ã°üÀ¨£º
1¡¢¹¤×÷Á÷ÒýÇæ 2¡¢¹¤×÷Á÷Éè¼ÆÆ÷ 3¡¢¹¤×÷Á÷¹ÜÀíϵͳ 4¡¢±íµ¥Éè¼ÆÆ÷
ĿǰÀ´ËµµÄÎÒֻʵÏÖÁ˺ËÐÄÒýÇæ£¬Á÷³Ì¶¨ÒåÒ²Ö»ÄÜÏÈÔÚxmlÖбà¼È»ºó¶ÁÈ¡µ½ÒýÇæÖлòÕßÖ±½Ó¶¨Òåµ½Êý¾Ý¿âÖУ¬µ«Õû¸öÁ÷³ÌÊÇÄܹ»Õý³£Á÷ת¡£ÖÁÓÚÁ÷³ÌÉè¼ÆÆ÷¡¢±í
µ¥Éè¼ÆÆ÷¡¢¹¤×÷Á÷¹ÜÀíϵͳÕâ¸öÎÒÓо«Á¦ÁËÔÙÂýÂý¿ª·¢¡£ÕâÀïÎÒÍê³ÉµÄÖ»ÊǺÜСµÄÒ»¿é£¬µ«ÊÇÊǹ¤×÷Á÷µÄºËÐÄ£¬¿ÉÒԺܷ½±ãµÄǶÈëµ½ÒµÎñϵͳÖÐÓ¦Óá£
ÒýÇæÖ÷ÒªÌṩÁ˶ÔÓÚ¹¤×÷Á÷¶¨ÒåµÄ½âÎöÒÔ¼°Á÷³ÌÁ÷תµÄÖ§³Ö¡£¹¤×÷Á÷¶¨ÒåÎļþÃèÊöÁËÒµÎñµÄ½»»¥Âß¼£¬¹¤×÷Á÷ÒýÇæÍ¨¹ý½âÎö´Ë+¹¤×÷Á÷¶¨ÒåÎļþ°´ÕÕÒµÎñµÄ½»»¥Âß¼
½øÐÐÒµÎñµÄÁ÷ת£¬¹¤×÷Á÷ÒýÇæÍ¨³£Í¨¹ý²Î¿¼Ä³ÖÖÄ£ÐÍÀ´½øÐÐÉè¼Æ£¬Í¨¹ýµ÷¶ÈËã·¨À´½øÐÐÁ÷³ÌµÄÁ÷ת(Á÷³ÌµÄÆô¶¯¡¢ÖÕÖ¹¡¢¹ÒÆð¡¢»Ö¸´µÈ)£¬Í¨¹ý¸÷ÖÖ»·½Úµ÷¶ÈËã·¨À´
ʵÏÖ¶ÔÓÚ»·½ÚµÄÁ÷ת(»·½ÚµÄºÏ²¢¡¢·Ö²æ¡¢Ñ¡Ôñ¡¢Ìõ¼þÐÔµÄÑ¡ÔñµÈ)¡£
Èý¡¢³õ²½Ó¡Ïó
1¡¢´Ó¸ÅÄʼ½âÊ͹À¼Æ´ó¼Ò¶¼»á¿´²»ÏÂÈ¥ÁË¡£ÎÒÃÇÏÈÄÃÒ»¸ö¼òµ¥ÊµÀýÀ´¿´¿´£¬Ð½¨Ò»¸öÏîÄ¿£¬ÒýÓÃÎҵŤ×÷Á÷ÒýÇæÀà¿â£¨Chitu.Bpm.dll£¬È¡ÃûΪ³àÍã©¡£
ÔÚÏîÄ¿Æô¶¯Ê±ÅäÖÃÁ÷³ÌÒýÇæ£¨Global.asax.csÖУ©£¬ÈçÏ£º
//³õʼ»¯Á÷³ÌÒýÇæ BpmConfiguration .Instance() .Config(@"C:\Configration\BpmConfig.xml") .Start(); |
ÔÚÏîÄ¿ÖÐʹÓÃʱ£¬±ÈÈçн¨Á÷³Ì¶¨Ò壺
//È¡µÃ¹¤×÷Á÷ÉÏÏÂÎÄ var bpm = new BpmContext() .UseTransaction(true) .SetActor("ÏôÇØ"); //ÐÂÔöÁ÷³Ì¶¨Òå bpm.NewProcessDefinition("Çë¼ÙÁ÷³Ì") .SetXmlFile(@"C:\Definition\demo1.xml") .SetCategory("·ÖÀà1") .SetEffectDate(DateTime.Now) .SetExpireDate(DateTime.Now.AddDays(180)) .SetMemo("memo1") .Create() //´´½¨Á÷³Ì¶¨Ò壬ֻÉú³Ébpm_definition_process±í .Parse() //½âÎöxml .Deploy(); //·¢²¼Á÷³Ì |
Æô¶¯Á÷³Ì£º
//Æô¶¯Á÷³Ì var process = bpm.NewProcessIntance("Çë¼ÙÁ÷³ÌID", "ÏôÇØ£¨ÒµÎñID£©"); //´´½¨Á÷³ÌʵÀý process.SetVariable("Á÷³Ì±äÁ¿1", "Öµ1"); //ÉèÖÃÁ÷³Ì±äÁ¿ process.Start(); |
È˹¤ÈÎÎñ½Úµãת½»ÏÂÒ»²½£º
//ÈÎÎñÍê³É var task = bpm.LoadTaskInstance("ÈÎÎñID"); task.SetVariable("ÈÎÎñ±äÁ¿2", "xx"); task.Signal(); //´¥·¢ÁîÅÆÁ÷ת |
2¡¢½ÓÏÂÀ´ÎÒÃÇÏÈ¿´¿´Á÷³Ì¶¨ÒåµÄXML£¬ÒÔÏÂÊÇÎÒÄóÔìµÄÒ»¸öÁ÷³Ì£¬ÒÔ±ã°Ñ¸÷Öֽڵ㶼·Å½øÈ¥ÁË¡£
<?xml version="1.0" encoding="UTF-8"?> <process name="Ñù°å·¿×°ÐÞÁ÷³Ì"> <start name="×°ÐÞÉêÇë"> <transition to="×°ÐÞ·½°¸Éè¼Æ" > <action class="Namespace.MyActionHandler"></action> </transition> </start> <task name="×°ÐÞ·½°¸Éè¼Æ"> <transition to="×°ÐÞ·½°¸ÉóºË"> <action script="log.Debug('×°ÐÞ·½°¸ÉóºË action test');"></action> </transition> </task> <decision name="×°ÐÞ·½°¸ÉóºË"> <transitions> <transition to="×°Ð޳ﱸ" condition-expression="variable.pass == true"></transition> <transition to="×°ÐÞ·½°¸Éè¼Æ" condition-expression="variable.pass != true"></transition> </transitions> <events> <action event="enter" class="enterHandlerClass"></action> <action event="leave" class="leaveHandlerClass"></action> </events> <assignments> <assignment owner="{process.starter}"></assignment> </assignments> <variables> <variable type="boolean" name="IsPass" access="read,required"></variable> </variables> </decision> <fork name="×°Ð޳ﱸ"> <transition to="×°ÐÞºÏͬǩ¶¨"></transition> <transition to="µÈ´ý×°ÐÞ¹¤È˵½Î»"></transition> <transition to="×°ÐÞ²ÄÁÏÔ¤Ëã"></transition> </fork> <sign name="×°ÐÞºÏͬǩ¶¨" necessary="false" async="true"> <transition to="×°ÐÞÊ©¹¤"></transition> </sign> <wait name="µÈ´ý×°ÐÞ¹¤È˵½Î»"> <transition to="×°ÐÞÊ©¹¤"></transition> </wait> <task name="×°ÐÞ²ÄÁÏÔ¤Ëã"> <transition to="²ÄÁϲɹº×ÓÁ÷³Ì"></transition> </task> <subflow name="²ÄÁϲɹº×ÓÁ÷³Ì"> <transition to="×°ÐÞÊ©¹¤"></transition> </subflow> <join name="×°ÐÞÊ©¹¤"> <transition to="Ê©¹¤ÑéÊÕ/¸¶¿î"></transition> </join> <auto name="Ê©¹¤ÑéÊÕ/¸¶¿î"> <transition to="×°ÐÞÍê³É"></transition> </auto> <end name="×°ÐÞÍê³É"> </end> <events> <action event="process-start" class="TestStartHandler"></action> <action event="process-end" class="TestEndHandler"></action> </events> <variables> <variable type="string" name="start_id" access="readonly,required"></variable> <variable type="string" name="start_person"></variable> </variables> </process> |
¶¨ÒåµÄ¸ù½ÚµãΪÁ÷³Ì£¨process£©£¬Á÷³ÌÏÂΪ¸÷¸öÈÎÎñ½Úµã£¨node£©£¬ÈÎÎñ½Úµã·ÖΪ£º
start ¿ªÊ¼½Úµã auto ×Ô¶¯½Úµã task È˹¤½Úµã decisioin ¾ö²ß½Úµã fork
·¢É¢½Úµã join ¾ÛºÏ½Úµã sublfow ×ÓÁ÷³Ì½Úµã sign »áÇ©½Úµã wait µÈ´ý½Úµã end
½áÊø½Úµã
ÈÎÎñ½ÚµãÏ¿ÉÒÔ°üÀ¨Â·ÓÉ£¨transition£©¶¯×÷£¨action£©¼°ÈËÔ±·ÖÅ䣨assignment£©±äÁ¿¶¨Ò壨variable)
ÆäÖÐaction°üÀ¨¼¸ÖÖÀàÐÍ£º1¡¢class 2¡¢script 3¡¢sql 4¡¢webservice
5¡¢expression ÔÚscript»òexpressionÖпÉÒÔÖ±½Ó·ÃÎÊprocess.xxxÊôÐÔ»òtask.xxxÊôÐÔ»òvariable.xxx¼ò»¯Á˶¯Ì¬c#Óï¾äµÄʹÓá£
µ±È»XML¶¨ÒåÖл¹ÓкܶàÆäËüµÄÊôÐÔ¶¨ÒåÎÒÕâÀïҲûÓж¼ÁгöÀ´£¬ÒÔºóÓõ½ÁËÔÙ×Ðϸ˵¡£
3¡¢¹ØÓÚÊý¾Ý¿âÉè¼Æ£¬ÕâÀï½ö½öÊÇÁ÷³ÌÁ÷תºËÐÄËùÐèÒªµÄ±í£¬±íÖ®¼ä¶¼Ã»ÓÐÀ¹ØÏµ

ËÄ¡¢²¿·Ö¹¦ÄÜÆÊÎö
a¡¢ÎÒ°ÑËü»®·ÖΪÖ÷ÒªµÄ¼¸´óÄ£¿é: ÒýÇæÅäÖá¢Á÷³Ì¶¨Ò塢ʵÀýÁ÷ת¡¢ÈÕÖ¾´¦Àí¡¢¼Æ»®ÈÎÎñ
ÒýÇæÅäÖãºÅäÖÃÒýÇæÊµÀýµÄÊý¾Ý¿âÁ¬½Ó¡¢ÈÕÖ¾ÅäÖᢲÎÊýÉ趨µÈ¡£ Á÷³Ì¶¨Ò壺ÀûÓÃxmlÀ´ÃèÊöÁ÷³Ì,Ö÷Òª¶¨ÒåÈÎÎñ½Úµã£¬Â·ÓÉ¡¢¶¯×÷ʼþ¡¢±äÁ¿¡¢ÈËÔ±·ÖÅäµÈ
ʵÀýÁ÷ת£º¸ù¾Ý¶¨ÒåÔËÐÐÁ÷³ÌʵÀý ÈÕÖ¾´¦Àí£ºÊä³öÈÕÖ¾ ÈÎÎñ¼Æ»®£º»áÆô¶¯Ò»¸ö·þÎñ£¬ÓÃÓÚ´¦Àí±ÈÈçÑÓʱÆô¶¯£¬ÈÎÎñ¹ýÆÚµÈ
b¡¢Á÷תÖеĹؼüÐÔÀàÉè¼Æ°üÀ¨£º
1¡¢Á÷³Ì¶ÔÏó£¨Process) 2¡¢¹¤×÷ÈÎÎñ£¨Task) 3¡¢Â·ÓÉ£¨Trasition) 4¡¢ÁîÅÆ£¨Token)
5¡¢Ê¼þ×ÜÏßÓ붯×÷´¦Àí (EventBus¡¢ActionHandler) 6¡¢ÈËÔ±·ÖÅ估ίÍлúÖÆ(Assignment¡¢Depute)
7¡¢Á÷³Ì»ØÍË´¦Àí£¨RollbackService) 8¡¢ÏûÏ¢·þÎñ(NotifyService)
c¡¢Í¨³£ÒýÇæ¿ØÖÆÁ÷³Ìµ÷¶ÈÁ÷תºËÐĵĵ÷¶ÈËã·¨Ö÷ÒªÓÐFSMÒÔ¼°PetriNetÁ½ÖÖ£¬»ùÓÚµ÷¶ÈËã·¨À´Íê³ÉÁ÷³ÌµÄÁ÷ת£º
1¡¢FSM(ÓÐÏÞ״̬»ú) FSM µÄ¶¨ÒåΪ°üº¬Ò»×é״̬¼¯£¨states£©¡¢Ò»¸öÆðʼ״̬£¨start
state£©¡¢Ò»×éÊäÈë·ûºÅ¼¯£¨alphabet£©¡¢Ò»¸öÓ³ÉäÊäÈë·ûºÅºÍµ±Ç°×´Ì¬µ½ÏÂһ״̬µÄת»»º¯Êý£¨transition
function£©µÄ¼ÆËãÄ£ÐÍ¡£µ±ÊäÈë·ûºÅ´®£¬Ä£ÐÍËæ¼´½øÈëÆðʼ״̬¡£ËüÒª¸Ä±äµ½ÐµÄ״̬£¬ÒÀÀµÓÚת»»º¯Êý¡£ÔÚÓÐÏÞ״̬»úÖУ¬»áÓÐÓÐÐí¶à±äÁ¿£¬ÀýÈ磬״̬
»úÓкܶàÓ붯×÷£¨actions£©×ª»»(Mealy»ú)»ò״̬£¨Ä¦¶û»ú£©¹ØÁªµÄ¶¯×÷£¬¶àÖØÆðʼ״̬£¬»ùÓÚûÓÐÊäÈë·ûºÅµÄת»»£¬»òÕßÖ¸¶¨·ûºÅºÍ״̬£¨·Ç¶¨ÓÐ
ÏÞ״̬»ú£©µÄ¶à¸öת»»£¬Ö¸Åɸø½ÓÊÕ״̬£¨Ê¶±ðÕߣ©µÄÒ»¸ö»ò¶à¸ö״̬£¬µÈµÈ¡£×ñÑFSMÁ÷³ÌÒýÇæÍ¨¹ý״̬µÄÇл»À´Íê³ÉÁ÷³ÌµÄÁ÷ת¡£
2¡¢PetriNet ÐÅÏ¢Á÷µÄÒ»¸ö³éÏóµÄ¡¢ÐÎʽµÄÄ£ÐÍ¡£Ö¸³öһϵͳµÄ¾²Ì¬ºÍ¶¯Ì¬ÐÔÖÊ¡£PetriNetͨ³£±íʾ³Éͼ¡£×ñÑPetriNetÁ÷³ÌÒýÇæÍ¨¹ýÁîÅÆÀ´¾ö¶¨Á÷³ÌµÄÁ÷ת¡£
ÎÒ²ÉÓõÄÊǵڶþÖÖPetriNetËã·¨¡£ÓÃTokenÀ´±íʾµ±Ç°ÊµÀýÔËÐеÄλÖã¬Ò²ÀûÓÃtokenÔÚÁ÷³Ì¸÷¸öµãÖ®¼äµÄ×ªÒÆÀ´±íʾÁ÷³ÌµÄÍÆ½ø£¬ÈçÏÂͼËùʾ£º
ÁîÅÆÁ÷תÂß¼,ÎÒ°ÑÒÔÏÂÀà·½·¨¶¼×öÒ»¸ö¼ò»¯Ê¡ÂÔÁË·ÓÉÑ¡Ôñ¼°½Úµã´¦Àíϸ½Ú£¬ºÃÈôó¼ÒÃ÷°×ÁîÅÆµÄÁ÷ת£º
//ÁîÅÆTokenÀàÖÐSignal public void Signal() { fromTask.Leave(executeContext); } //ÈÎÎñTaskÀàÖеÄLeave public void Leave(ExecutionContext executionContext) { transition.Take(executionContext); } //·ÓÉTransitionÀàÖеÄTake public void Take(ExecutionContext executionContext) { toTask.Enter(executionContext); } //ÈÎÎñTaskÀàÖеÄEnter public void Enter(ExecutionContext executionContext) { Run(executionContext); } |
ÖÁ´ËÁîÅÆ³É¹¦µÄ´ÓÒ»¸ö½Úµã×ªÒÆµ½ÏÂÒ»¸ö½ÚµãÁË£¬ÁîÅÆµÄÁ÷תÊǹ¤×÷Á÷µÄ¹Ø¼ü£¬µ±È»²»Í¬µÄ½Úµã´¦ÀíÊÇÓÐËù²»Í¬µÄ£¬ÆäÖÐ×Ôӵĵ±Êý·¢É¢½Úµã¼°¾ÛºÏ½ÚµãÁË¡£ÕâÀï¾Í½éÉܵ½ÕâÀ²»ÔÙ¸ø´ó¼ÒÏêϸ½éÉÜÁË¡£
d¡¢Ä¿Ç°ÎÒÒýÇæÖÐʵÏÖµÄÖ÷Òª°üÀ¨ÒÔϹ¦ÄÜ:
1¡¢½âÊ͹ý³Ì¶¨Òå
2¡¢¿ØÖƹý³ÌʵÀý¡ª´´½¨¡¢¼¤»î¡¢¹ÒÆð¡¢ÖÕÖ¹µÈ
3¡¢¿ØÖÆÁ÷³Ìµ÷¶ÈÁ÷ת
4¡¢×Ô¶¨Ò嶯×÷¼°Ê¼þ·¢²¼
5¡¢Á÷³Ì±äÁ¿¼°¹¤×÷±äÁ¿´¦Àí
6¡¢ÈÎÎñ¼Æ»®£¬±ÈÈçÑÓʱÆô¶¯£¬ÈÎÎñ¹ýÆÚµÈ
7¡¢Î¯ÍзþÎñ£¬Î¯Íдú°ì
8¡¢»ØÍË·þÎñ£¬»ØÍ˵½ÈÎÒâ½Úµã»òÕÙ»Ø
9¡¢ÏûÏ¢·þÎñ£¬±ÈÈçÈÏÁì֪ͨ¡¢´ý°ìÌáÐÑ¡¢´ß°ìÏûÏ¢¡
10¡¢Á÷³ÌÈÎÎñ¼à¿Ø·þÎñ 11¡¢ÈÕÖ¾´¦Àí¼°ÀúÊ·¼Ç¼ 12¡¢ÈÎÎñ·ÖÅäÓëÈÏÁì
13¡¢²ÎÓëÕß×é֯ģÐͽӿÚ
Îå¡¢×ܽá
ĿǰÎÒµÄÕâ¿î¹¤×÷Á÷ÒýÇæ»¹ÔÚ¼ÌÐøÍêÉÆµ±ÖУ¬ÎÒ×ܽáÏÂËüµÄÓÅȱµã£º
Óŵ㣺
1¡¢ËüÊÇÒ»¿î³¬ÇáÁ¿¼«»òÕß˵ÊÇ΢Ð͵Ť×÷Á÷ÒýÇæ£¬¶øÇÒÂÌÉ«ÎÞÎÛȾ£¬ËüÖ»ÓÐÒ»¸ödll£¬´óС½ö1M×óÓÒ¡£
2¡¢ËüĿǰ֧³ÖSQL Server¡¢MySql¡¢Oracle¡¢SQLite¡¢PostgreSqlµÈ¶àÖÖÊý¾Ý¿â
3¡¢ÌåÐÍÉÏÀ´ËµËüËäÈ»ÊÇ΢ÐÍ£¬µ«¹¦ÄÜÉϲ¢²»Ëã΢ÐÍ£¬ËüµÄÉè¼Æ½áºÏÁËÏÖ´úµÄOA¼°´«Í³¹¤×÷Á÷¡¢»ù±¾ÉÏ¿ÉÒÔʵÏÖÎÒÃÇ´ó¶àÊýµÄ¹¦ÄÜÐèÒª¡£
4¡¢ËüÆäʵÊÇÃæÏò¿ª·¢ÕßÉè¼ÆµÄ£¬´ÓÉÏÃæ³õʼӡÏóÖеÄʵÀý´úÂëÖдó¼Ò¿ÉÒÔ¿´µ½£¬ËüµÄ½Ó¿ÚÊǺܼ¯ÖС¢¾«¼ò¡¢ÓѺõģ¬Èÿª·¢ÕßÈÝÒ×Àí½â¶øÇÒʹÓÃÆðÀ´¸ü·½±ã¼òµ¥¡£ËùÒÔËü¸üÊʺÏǶÈëµ½ÏîÄ¿Öпª·¢¡£
ȱµã£º
1¡¢ËüÏÖÔÚûÓÐÁ÷³ÌÉè¼ÆÆ÷¡¢¹ÜÀíϵͳ¡¢±íµ¥Éè¼ÆÆ÷µÈ£¬³äÆäÁ¿Ö»ÄÜËãÊÇÒ»¸öÀà¿â£¬²¢²»ÊÇÖ±½ÓÄÃÀ´¾Í¿ÉÒÔʹÓá£
2¡¢Ä¿Ç°¸Õ¸ÕÍê³ÉµÚÒ»¸öÄÚ²¿°æ±¾£¬¶øÇÒĿǰֻÔÚÎÒÃÇÄÚ²¿ÏîÄ¿ÖÐʹÓã¬ËùÒÔËü²»¹»³ÉÊ죬ËäÈ»ÎÒÃÇ»á³ÖÐøµÄ¸Ä½øºÍÍêÉÆ¡£
3¡¢È±·¦³É¹¦Ó¦ÓõݸÀý¡£
¶ÔÓÚÎÒÃÇ×Ô¼ºÀ´Ëµ£¬ÕâЩȱµã¶¼ÊÇÎÒÃÇÐèÒª¼ÌÐøÅ¬Á¦µÄµØ·½£¬¿ÉÄÜ»¹ÐèÒª´óÁ¿µÄʱ¼äÀ´Íê³É¡£Ä¿Ç°À´ËµÎÒÃÇ»¹²»´òË㿪Դ£¬µÈËüÂýÂýÎȶ¨³ÉÊìºóÎÒÃÇ»á
¿¼ÂÇÊDz»ÊÇ¿ªÔ´³öÀ´¡£Èç¹û´ó¼ÒÓкõĽ¨Òé»òÓÐÄÄ·½ÃæµÄÒÉ»óÎÒºÜÀÖÒâ¸ø´ó¼Ò½â´ð£¬»òÕßÄãÒ²ÔÚÉè¼Æ¿ª·¢×Ô¼ºµÄ¹¤×÷Á÷£¬ÎÒÃÇ¿ÉÒÔÏ໥½»Á÷Ï¡£
|