• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于有限狀態(tài)機(jī)的工作流引擎的設(shè)計(jì)

    2018-08-15 08:02:32劉毅敏
    關(guān)鍵詞:狀態(tài)機(jī)引擎可視化

    鄒 晶 劉毅敏

    (武漢科技大學(xué)信息科學(xué)與工程學(xué)院 湖北 武漢 430081)

    0 引 言

    工作流引擎(WorkFlow Engine)是計(jì)算機(jī)集成應(yīng)用系統(tǒng)的一個(gè)重要組成部分,它在企業(yè)信息化辦公領(lǐng)域已經(jīng)被實(shí)踐證明了能大大提高企業(yè)的業(yè)務(wù)管理水平,被廣泛應(yīng)用在業(yè)務(wù)流程較為復(fù)雜的辦公流程(Office Automation)、電子商務(wù)、企業(yè)資源規(guī)劃等領(lǐng)域?;诠ぷ髁饕娴脑O(shè)計(jì)平臺(tái)是在企業(yè)信息化辦公系統(tǒng)開(kāi)發(fā)之上抽象出來(lái)的“信息化平臺(tái)快速開(kāi)發(fā)中間件”,基于模型或消息驅(qū)動(dòng),提供可視化界面工具定制工作流數(shù)據(jù)模型以及流程流轉(zhuǎn)控制組件,實(shí)現(xiàn)中間件生成基礎(chǔ)軟件模塊、支持可擴(kuò)展的快速開(kāi)發(fā)[1]。大多辦公自動(dòng)化系統(tǒng)的內(nèi)核就是工作流引擎,引擎負(fù)責(zé)驅(qū)動(dòng)業(yè)務(wù)流程運(yùn)轉(zhuǎn)、提供解釋器來(lái)解釋各個(gè)工作流節(jié)點(diǎn)的意義[2],實(shí)例并初始化工作流程,執(zhí)行和操作正在運(yùn)行的流程。它的功能大致都包含有定制模型工具、流程調(diào)度器、外部數(shù)據(jù)訪問(wèn)接口等。由于不同業(yè)務(wù)不同工作流程的差異性和復(fù)雜性,一個(gè)可擴(kuò)展且松耦合的工作流引擎是十分必要的,本文以有限狀態(tài)機(jī)建立流程模型以達(dá)到適應(yīng)復(fù)雜業(yè)務(wù)的要求。

    1 相關(guān)工作

    國(guó)內(nèi)外大量相關(guān)人員對(duì)工作流引擎系統(tǒng)技術(shù)進(jìn)行了研究和實(shí)現(xiàn),并取得了較好的成果。至今很多公司和活躍的開(kāi)源社區(qū)也推出了一系列工作流引擎,文獻(xiàn)[3]提出了基于JBPM工作流引擎的實(shí)現(xiàn),它設(shè)計(jì)一種TopBPM工作流引擎并應(yīng)用在金融行業(yè),降低了企業(yè)成本,縮短開(kāi)發(fā)時(shí)間。文獻(xiàn)[4]提出了一種基于petri網(wǎng)理論的工作流引擎,并提出了靈活可重用的網(wǎng)絡(luò)信息系統(tǒng)的快速開(kāi)發(fā)應(yīng)用程序的模塊化的系統(tǒng)模型(RADWIS)。類似的還有基于Activity的工作流引擎等。

    上述工作流實(shí)現(xiàn)的缺點(diǎn)是對(duì)使用者的要求過(guò)高,學(xué)習(xí)成本較大,考慮到實(shí)際企業(yè)中操作人員的計(jì)算機(jī)水平,本文提出一種新型工作流引擎的實(shí)現(xiàn)機(jī)制,即基于有限狀態(tài)機(jī)和消息驅(qū)動(dòng)機(jī)制,采用Winform技術(shù)設(shè)計(jì)可視化界面,操作人員只需要進(jìn)行相關(guān)跳轉(zhuǎn)條件的設(shè)置即可定制工作流模型,然后采用AOP思想增強(qiáng)模型以適應(yīng)多變的業(yè)務(wù)流程,實(shí)現(xiàn)松耦合和高擴(kuò)展性。

    2 工作流與有限狀態(tài)機(jī)

    2.1 工作流

    工作流是對(duì)生產(chǎn)過(guò)程中某些固定步驟的活動(dòng)而抽象出來(lái)的事物。它通過(guò)將日常業(yè)務(wù)流程劃分成特定固定數(shù)量步驟、由特定角色的人員,按照定義好的規(guī)則來(lái)流轉(zhuǎn)這些流程,從而提高辦公效率[5]。工作流相關(guān)技術(shù)的誕生迅速得到了廣泛的研究和應(yīng)用。

    由于業(yè)務(wù)流程在各行業(yè)的區(qū)別很大,工作流基本概念很難達(dá)成共識(shí),所以工作流標(biāo)準(zhǔn)尚未統(tǒng)一,正處于制定階段[6],目前還沒(méi)有一個(gè)標(biāo)準(zhǔn)被大范圍的采用,比較有代表性的規(guī)范有:XPDL、BPML、BPEL、OMG、WSCI等[7]。在這其中,WFMC提出的工作流管理參考模型有著廣泛的研究和拓展應(yīng)用,如圖1所示。

    圖1 工作流管理參考模型

    2.2 有限狀態(tài)機(jī)

    有限狀態(tài)機(jī)(FSM:Finite State Machine)是表示有限多個(gè)狀態(tài)以及在這些狀態(tài)之間遷移和動(dòng)作的數(shù)學(xué)模型。FSM可以被作為對(duì)象行為建模的工具,其作用主要是描述對(duì)象在它的生命周期內(nèi)所經(jīng)歷的狀態(tài)序列,以及如何響應(yīng)來(lái)自外界的各種事件。在計(jì)算機(jī)科學(xué)中也有廣泛的應(yīng)用,例如:計(jì)算機(jī)網(wǎng)絡(luò)中的TCP協(xié)議,在建立可靠傳輸?shù)臅r(shí)候,就使用了有限狀態(tài)機(jī),有LISTEN、ESTABLISHED、WAIT、CLOSED等狀態(tài)。

    可以通過(guò)一個(gè)五元組表示FSM數(shù)學(xué)模型:M=(Q,q0,Σ,δ,F(xiàn)),其中Q為狀態(tài)的非空有限集合。q∈Q,q為M的一個(gè)狀態(tài)。q0∈Q,是M的開(kāi)始狀態(tài)(初始狀態(tài)或者啟動(dòng)狀態(tài))。Σ代表輸入字母表。輸入字符串都是Σ上的字符串。δ為狀態(tài)轉(zhuǎn)移函數(shù)(轉(zhuǎn)換函數(shù)或移動(dòng)函數(shù)),δ:Q×ΣQ,對(duì)任意(q,a)∈Q×Σ,δ(q,a)=p表示:M在狀態(tài)q讀入字符a,將狀態(tài)變成p,并將讀頭指向輸入字符串的下一個(gè)字符。F是M的終止?fàn)顟B(tài)集合,若q∈F,則q稱M的終止?fàn)顟B(tài)。

    為了描述一個(gè)有限狀態(tài)機(jī)的工作狀況,可采用狀態(tài)轉(zhuǎn)換圖[8]。狀態(tài)轉(zhuǎn)換圖是一個(gè)有向圖,如圖2所示。圖中每個(gè)節(jié)點(diǎn)表示一種狀態(tài),一條邊(或弧)表示一個(gè)狀態(tài)遷移關(guān)系。初始狀態(tài)節(jié)點(diǎn)q0用沒(méi)有起點(diǎn)的箭頭指向它來(lái)表示。若q0狀態(tài)的輸入為a,則進(jìn)入狀態(tài)q1,其他狀態(tài)轉(zhuǎn)移同理。終止?fàn)罟?jié)點(diǎn)q3是機(jī)器完成了它程序之后的狀態(tài),通常表示成雙重圓圈。

    圖2 FSM狀態(tài)轉(zhuǎn)換圖

    2.3 工作流與有限狀態(tài)機(jī)的映射

    工作流程是由具體業(yè)務(wù)多環(huán)節(jié)共同組成,每一個(gè)環(huán)節(jié)又都由多個(gè)不同步驟構(gòu)成,過(guò)去對(duì)工作流建模的思想是基于序列化思想來(lái)進(jìn)行的。這種建模方式具體關(guān)注的是業(yè)務(wù)執(zhí)行過(guò)程和順序,無(wú)法滿足一些復(fù)雜多變的業(yè)務(wù),如有分流、聚合、并行、跳轉(zhuǎn)等特點(diǎn)的工作流程[9]。基于上述問(wèn)題,本文提出基于有限狀態(tài)機(jī)的思想建模,將建模重心從業(yè)務(wù)的過(guò)程轉(zhuǎn)移到待處理的業(yè)務(wù)流程實(shí)體上,無(wú)論流程多復(fù)雜,只需為工作流程定義有限個(gè)狀態(tài)[10],初始狀態(tài)統(tǒng)一定為Start,同時(shí)定義業(yè)務(wù)實(shí)體在某個(gè)狀態(tài)上可能接收到的輸入,再限定狀態(tài)之間跳轉(zhuǎn)的條件,每次輸入中包含了跳轉(zhuǎn)條件就發(fā)生狀態(tài)遷移,進(jìn)入新的狀態(tài),直到到達(dá)終止?fàn)顟B(tài)End。圖3是某石化企業(yè)的一個(gè)工作流程:每一個(gè)矩形代表一個(gè)狀態(tài),箭頭代表跳轉(zhuǎn)方向和條件。當(dāng)條件1滿足時(shí),由ZzSubmit狀態(tài)跳轉(zhuǎn)到JwxAdvice狀態(tài);條件2和條件3進(jìn)行了工作流的分流,滿足條件2進(jìn)入CbConfirm狀態(tài),滿足條件3進(jìn)行ConfirmDone狀態(tài) ,同時(shí)滿足則可兩個(gè)狀態(tài)并行;滿足條件4后進(jìn)行聚合。

    圖3 工作流程示例

    從上述具體實(shí)例普及到一般情況就是:無(wú)論流程多復(fù)雜都可以分為有限個(gè)步驟,把一個(gè)業(yè)務(wù)流程的每一個(gè)步驟當(dāng)作有限狀態(tài)機(jī)的某一個(gè)狀態(tài)。一個(gè)狀態(tài)在某一條件下遷移到另一個(gè)狀態(tài)完成的動(dòng)作就是流程的流轉(zhuǎn);當(dāng)一個(gè)狀態(tài)有多個(gè)輸入的時(shí)候,流程肯定存在聚合,從不同狀態(tài)能進(jìn)入同一個(gè)狀態(tài);當(dāng)一個(gè)狀態(tài)有多個(gè)輸出的時(shí)候,流程肯定存在分流或者并行,從當(dāng)前狀態(tài)在某一條件下遷移至不同狀態(tài)。

    借助上述的映射思想,為了使工作流模型更加飽滿并且適應(yīng)性更強(qiáng),利用AOP(Aspect Oriented Programming)面向切面的編程思想(如圖4所示),在狀態(tài)遷移條件滿足后發(fā)生狀態(tài)跳轉(zhuǎn)首先進(jìn)入一個(gè)前置動(dòng)作Beforeaction,執(zhí)行完前置動(dòng)作再進(jìn)入本狀態(tài)。狀態(tài)信息包含相關(guān)輸入?yún)?shù)設(shè)置,定時(shí)功能設(shè)置,權(quán)限認(rèn)證設(shè)置和基本屬性等,狀態(tài)的執(zhí)行動(dòng)作為Currentaction,且在跳出本狀態(tài)后進(jìn)入后置動(dòng)作Afteraction。通過(guò)對(duì)模型的進(jìn)一步完善,使得工作流模型更加具有可擴(kuò)展性和對(duì)復(fù)雜多變流程的適應(yīng)能力。

    圖4 AOP思想映射

    3 具體設(shè)計(jì)與實(shí)現(xiàn)

    3.1 模塊設(shè)計(jì)

    依據(jù)上述的工作流與有限狀態(tài)機(jī)的映射思路,本文將工作流模型劃分為事件、變量、流、權(quán)限等子模塊和流程管理引擎。這些模塊通過(guò).NET平臺(tái)的Winform技術(shù),分別設(shè)計(jì)成可視化的操作控件,可由操作人員(無(wú)需專業(yè)知識(shí))定制工作流模型,下面進(jìn)行各模塊介紹:

    事件Event(流程節(jié)點(diǎn))類。其屬性包含了由有限狀態(tài)機(jī)對(duì)工作流程映射之后的所有流程節(jié)點(diǎn)基本信息。節(jié)點(diǎn)還有對(duì)流程調(diào)度前后的業(yè)務(wù)動(dòng)作執(zhí)行方法。一個(gè)事件代表一個(gè)狀態(tài)機(jī)的狀態(tài),一個(gè)完整流程是一個(gè)狀態(tài)機(jī)。

    變量Param(變量集合)類。其定義著每個(gè)工作流程的變量集合以及每個(gè)流程節(jié)點(diǎn)相關(guān)的變量。業(yè)務(wù)數(shù)據(jù)都保存在變量表中,通過(guò)解析方法可以讀取并持久化到數(shù)據(jù)庫(kù)中。變量表存儲(chǔ)著狀態(tài)機(jī)各狀態(tài)相關(guān)的輸入和輸出數(shù)據(jù)。

    流Flow(流程流轉(zhuǎn))類。這個(gè)類定義著流程流轉(zhuǎn)的規(guī)則,當(dāng)變量表接收到業(yè)務(wù)數(shù)據(jù)輸入時(shí),工作流引擎會(huì)根據(jù)Flow中定義的路由規(guī)則去實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移。每個(gè)流中包含了狀態(tài)機(jī)狀態(tài)遷移的條件。

    權(quán)限Authority(權(quán)限認(rèn)證)類。這個(gè)類通過(guò)RABC(基于角色的訪問(wèn)控制Role-Based Access Control)模型提供了一套權(quán)限認(rèn)證的方法,用于在獲取用戶待處理流程時(shí)篩選與用戶相關(guān)流程。

    流程管理引擎CWorkFlow(流程管理類)。這個(gè)類包含各個(gè)子模塊的增刪查改方法,如添加流程節(jié)點(diǎn)或變量、修改路由規(guī)則等,還包含了流程XML文檔的解析和反解析方法。用戶在可視化界面的相關(guān)操作通過(guò)此類相應(yīng)進(jìn)行對(duì)有限狀態(tài)機(jī)工作流模型的修改。

    通過(guò)OOP面向?qū)ο蟮乃枷朐O(shè)計(jì)的模型主要類及其關(guān)鍵屬性和方法如表1所示。

    表1模型中類的主要信息

    3.2 模型描述

    基于上述的基于有限狀態(tài)機(jī)和AOP建模思想,以及對(duì)工作流模型各模塊的設(shè)計(jì),在可視化界面中定制的工作流模型本文采用可擴(kuò)展的標(biāo)記語(yǔ)言XML對(duì)工作流到有限狀態(tài)機(jī)映射結(jié)果進(jìn)行描述,這種方式方便、直觀且易擴(kuò)展[11]??芍苯哟嫒霐?shù)據(jù)庫(kù)中,然后使用流程管理類中的相關(guān)API進(jìn)行解析等操作。XML映射文檔中共定義了work_flow、item、params等不同節(jié)點(diǎn),其中關(guān)鍵節(jié)點(diǎn)的含義如表2所示。

    表2 XML描述文檔主要節(jié)點(diǎn)

    下文為本模型依據(jù)表2所示的節(jié)點(diǎn)描述的工作流樣例的XML文檔片段:

    車間名稱″>

    ……

    desc=″車間名稱″>

    ……

    ……

    3.3 狀態(tài)轉(zhuǎn)移

    本文采用產(chǎn)生式規(guī)則的方法來(lái)對(duì)XML模型中流程流轉(zhuǎn)狀態(tài)進(jìn)行推理。一種典型的產(chǎn)生式規(guī)則表示方式的模型如下:

    RULE <節(jié)點(diǎn)名>

    IF <條件1> then <結(jié)論1>

    IF <條件2> then <結(jié)論2>

    ……

    IF <條件n> then <結(jié)論n>

    END RULE

    其中的條件即是XML模型中的路由規(guī)則,相關(guān)信息由可視化界面定制保存在Flow類中,由路由規(guī)則能確定有限狀態(tài)機(jī)的下一個(gè)狀態(tài)。條件可以由<、>、=等算術(shù)運(yùn)算符或者AND、OR、NOT等邏輯運(yùn)算符式子組成。

    狀態(tài)遷移模塊的工作過(guò)程可由算法1表示:

    算法1狀態(tài)遷移

    輸入:節(jié)點(diǎn)變量集合: Node_items

    輸出: 下一個(gè)流程節(jié)點(diǎn):NEXT_Node

    1. Node_items input check;

    2. UPDATE XML root node “params”;

    3. ANALYSIS “Rules” From XML nodes;

    4. foreach item in Rules

    5. if item is True then

    6. DO Beforeaction;

    7. GET NEXT_Node And DO Currentaction;

    8. DO Afteraction;

    9. endif

    11. end for

    12. UPDATE DATABASE;

    13. UPDATE XML NEXT_Node;

    14. Return NEXT_Node;

    流程的調(diào)度功能主要是由推理機(jī)來(lái)實(shí)現(xiàn),當(dāng)狀態(tài)機(jī)接收輸入后,推理機(jī)根據(jù)XML模型中的路由規(guī)則來(lái)推理出狀態(tài)機(jī)的下一個(gè)狀態(tài)。狀態(tài)的業(yè)務(wù)邏輯使用URL方式保存,即Currentaction、Beforeaction、Afteraction,它可以是頁(yè)面地址或者接口,如果改變只需修改模型中的這些值,實(shí)現(xiàn)工作流程模型和業(yè)務(wù)的松耦合。同時(shí)AOP的思想保證了高擴(kuò)展性從而適應(yīng)多變的工作流程。

    如圖5所示XML文檔中存儲(chǔ)了工作流的映射信息,其中包含了當(dāng)前狀態(tài)機(jī)數(shù)據(jù)遷移的條件,它是一個(gè)邏輯表達(dá)式,由狀態(tài)機(jī)中的變量,邏輯符號(hào)和對(duì)應(yīng)的值組成,類似SubmitDone=True。如算法1所示過(guò)程:當(dāng)前節(jié)點(diǎn)的相關(guān)變量有更新的時(shí)候,先做輸入檢查,然后更新?tīng)顟B(tài)機(jī)中變量表中相關(guān)變量的值,然后解析邏輯表達(dá)式,根據(jù)產(chǎn)生式規(guī)則推理是否滿足其中的某些跳轉(zhuǎn)條件,滿足則遷移至下一狀態(tài),不滿足則保持當(dāng)前狀態(tài)。狀態(tài)遷移前后執(zhí)行基于AOP思想的Beforeaction和Afteraction業(yè)務(wù)事件,最后更新?tīng)顟B(tài)機(jī)的XML描述到數(shù)據(jù)庫(kù)。

    圖5 狀態(tài)轉(zhuǎn)移

    4 應(yīng)用實(shí)例

    本文設(shè)計(jì)的工作流引擎工作在某石化企業(yè)已經(jīng)得到應(yīng)用。圖6展示的是本課題為本文所述的工作流引擎設(shè)計(jì)開(kāi)發(fā)的一個(gè)可視化模型定制工具整體效果圖。

    圖6 模型定制工具界面

    圖7展示的為定制工具頂上一行的菜單欄,包括新建、打開(kāi),保存工作流模型文件等操作按鈕和工作流模型中添加事件、流、變量和屬性設(shè)置等操作控件,以及保存模型至數(shù)據(jù)庫(kù)的相關(guān)操作。

    圖7 定制工具菜單欄

    由前文所述的工作流到有限狀態(tài)機(jī)的映射和OOP模塊設(shè)計(jì)可以知道,把工作流的每一個(gè)步驟當(dāng)成有限狀態(tài)機(jī)的某一個(gè)狀態(tài),也就是一個(gè)Event流程節(jié)點(diǎn)。工作流的流轉(zhuǎn)、分流、聚合、并行是通過(guò)狀態(tài)機(jī)的遷移來(lái)完成的,也就是流程流轉(zhuǎn)Flow,工作流程的業(yè)務(wù)數(shù)據(jù)都存入Param變量中。所以為了降低使用者的操作難度,在繪制模型的時(shí)候,使用者只需通過(guò)了解業(yè)務(wù)流程,把流程分解成若干步,并通過(guò)界面進(jìn)行每個(gè)步驟的參數(shù)、屬性和步驟跳轉(zhuǎn)條件的設(shè)置。

    下面展示了通過(guò)可視化界面進(jìn)行模型設(shè)計(jì)的具體步驟,如圖8-圖10所示。首先新建工作流,然后通過(guò)點(diǎn)擊新增事件、流、變量等操作按鈕繪制工作流,在輸入界面設(shè)置事件、流、變量等參數(shù)屬性,對(duì)應(yīng)狀態(tài)機(jī)的各個(gè)狀態(tài)數(shù)據(jù)、相關(guān)輸入輸出參數(shù)和狀態(tài)遷移條件,無(wú)需專業(yè)知識(shí)即可保存模型,且可自動(dòng)生成XML文檔,完成工作流的建模映射,也可序列化到數(shù)據(jù)庫(kù)。這樣降低了對(duì)工作人員專業(yè)知識(shí)的要求,工作流引擎作為辦公自動(dòng)化的中間件,高擴(kuò)展的設(shè)計(jì)使得業(yè)務(wù)變動(dòng)帶來(lái)的工作量大量減少。

    圖8 新建工作流模型

    圖9 繪制工作流模型

    圖10 參數(shù)設(shè)置

    5 結(jié) 語(yǔ)

    本文從應(yīng)用出發(fā),以適應(yīng)多變的工作流程和復(fù)雜的業(yè)務(wù)邏輯和降低用戶和開(kāi)發(fā)人員工作流和使用難度為宗旨,設(shè)計(jì)并實(shí)現(xiàn)了如上的一個(gè)基于有限狀態(tài)機(jī)建立工作流模型的工作流引擎。把工作流程的每一步驟當(dāng)成一個(gè)狀態(tài),一個(gè)流程當(dāng)作一個(gè)狀態(tài)機(jī),復(fù)雜業(yè)務(wù)也可以通過(guò)狀態(tài)機(jī)分流、聚合、并行、跳轉(zhuǎn)等操作來(lái)描述。模型節(jié)點(diǎn)中包含了流程基本信息、路由規(guī)則、變量集合等模塊,并基于面向切面的編程思想提高流程節(jié)點(diǎn)的擴(kuò)展性,增加BeforeAction、AfterAction等業(yè)務(wù)URL地址,工作流引擎完成了統(tǒng)一的流程調(diào)度和數(shù)據(jù)調(diào)度。如果從用戶的角度來(lái)看,只需在C/S端的可視化定制工作進(jìn)行業(yè)務(wù)定制,并在Web端界面進(jìn)行工作數(shù)據(jù)輸入,極大地降低了使用難度。如果從程序設(shè)計(jì)人員的角度來(lái)看,當(dāng)業(yè)務(wù)邏輯發(fā)生改變時(shí),工作量也會(huì)大幅減小,業(yè)務(wù)重新定制后大部分工作只是參數(shù)設(shè)置改動(dòng)。本工作流引擎已在某石化企業(yè)獲得了較好的應(yīng)用效果,具有廣闊的應(yīng)用前景。

    猜你喜歡
    狀態(tài)機(jī)引擎可視化
    基于CiteSpace的足三里穴研究可視化分析
    基于Power BI的油田注水運(yùn)行動(dòng)態(tài)分析與可視化展示
    云南化工(2021年8期)2021-12-21 06:37:54
    基于CGAL和OpenGL的海底地形三維可視化
    基于有限狀態(tài)機(jī)的交會(huì)對(duì)接飛行任務(wù)規(guī)劃方法
    “融評(píng)”:黨媒評(píng)論的可視化創(chuàng)新
    藍(lán)谷: “涉藍(lán)”新引擎
    商周刊(2017年22期)2017-11-09 05:08:31
    無(wú)形的引擎
    河南電力(2015年5期)2015-06-08 06:01:46
    基于Cocos2d引擎的PuzzleGame開(kāi)發(fā)
    FPGA設(shè)計(jì)中狀態(tài)機(jī)安全性研究
    基于反熔絲FPGA的有限狀態(tài)機(jī)加固設(shè)計(jì)
    金塔县| 大洼县| 乌拉特中旗| 高邑县| 桑植县| 常德市| 白城市| 肥西县| 巴青县| 新乐市| 永新县| 南皮县| 南充市| 天祝| 马龙县| 大化| 建平县| 南雄市| 荆门市| 安塞县| 平江县| 大连市| 莎车县| 揭东县| 晋中市| 辽源市| 建水县| 连城县| 怀化市| 石狮市| 怀安县| 常宁市| 西充县| 富裕县| 黑河市| 金溪县| 宁都县| 三河市| 邓州市| 周宁县| 昌宁县|