傳智播客jbpm學習,詢價採購的流程

   今天湯老師講了比較典型的jbpm流程,並在jbpm插件上對它進行實現。來鞏固前面所學的jbpm,有助於更熟練的使用和掌握jbpm,湯老師主要講了詢價採購的流程。
    詢價採購是指對幾個供貨商(通常至少三家)的報價進行比較以確保價格具有競爭性的一種採購方式。
    採購詢價工作流程,以政府採購爲例。
    一、詢價準備
    1 、計劃整理。採購代理機構根據政府採購執行計劃,結合採購員的急需程度和採購物品的規模,編制月度詢價採購計劃。
    2 、組織詢價小組。詢價小組由採購人的代表和有關專家共三人以上單數組成,其中專家人數不得少於成員總數的三分之二,以隨機方式確定。詢價小組名單在成交結果確定前應當保密。
    3 、編制詢價文件。詢價小組根據政府採購有關法規和項目特殊要求,在採購執行計劃要求的採購時限內擬定具體採購項目的採購方案、編制詢價文件。
    4 、詢價文件確認。詢價文件在定稿前需經採購人確認。
    5 、收集信息。根據採購物品或服務等特點,通過查閱供應商信息庫和市場調查等途徑進一步瞭解價格信息和其他市場動態。
    6 、確定被詢價的供應商名單。詢價小組通過隨機方式從符合相應資格條件的供應商名單中確定不少於三家的供應商,並向其發出詢價通知書讓其報價。
     二、詢價
    1 、詢價時間告知市招標辦、資金管理部門等有關部門。
    2 、遞交報價函。被詢價供應商在詢價文件限定的時限內遞交報價函,工作人員應對供應商的報價函的密封情況進行審查。
    3 、詢價準備會。在詢價之前召集詢價小組召開詢價預備會,確定詢價組長,宣佈詢價步驟,強調詢價工作紀律,介紹總體目標、工作安排、分工、詢價文件、確定成交供應商的方法和標準。
    4 、詢價。詢價小組所有成員集中開啓供應商的報價函,作報價記錄並簽名確認,根據符合採購需求、質量和服務相等且報價最低的原則,按照詢價文件所列的確定成交供應商的方法和標準,確定一至二名成交候選人並排列順序。
    5 、詢價報告。詢價小組必須寫出完整的詢價報告,經所有詢價小組成員及監督員簽字後,方爲有效。
    三、確定成交人
    1 、採購人根據詢價小組的書面談判報告和推薦的成交候選人的排列順序確定成交人。當確定的成交人放棄成交、因不可抗力提出不能履行合同,採購人可以依序確定其他候選人爲成交人。採購人也可以授權詢價小組直接確定成交人。
    2 、成交通知。成交人確定後,由採購人向成交人發出《成交通知書》,同時將成交結果通知所有未成交的供應商。
    3 、編寫採購報告。詢價小組應於詢價活動結束後在規定時間內,就詢價小組組成、採購過程、採購結果等有關情況,編寫採購報告
  
    通過這個流程的學習,也鞏固了前面所學的知識,這個流程中重要的部分就是對定時器的應用。
   Timer
  定時器,指定到期時間和動作,在到期後指行相應的動作。配置定時器是使用timer元素,在timer中可以使用(一個)action或script子元素指定一個動作,這個動作在定時器觸發後被執行。執行Timer的任務需要一個timer runner(任務執行者)。他的作用是定期的(默認爲5秒鐘)檢查數據庫中的jbpm_job表,查看有沒有已到期的job,如果有,就執行之,並刪除已執行完的job。  Create Timer就是向jbpm_job中添加一個job。Timer可以在node(節點)中或task(任務)中定義。如果在節點中定義,定時器就會在進入節點的時候被啓動,在離開節點的時候被取消; 如果是在任務中定義,定時器就會在創建任務的時候被啓動,在完成任務的時候被取消。

任務執行者的啓動方式分別爲:
  1> 在程序中使用:JbpmConfiguration.startJobExecutor();
  2> 在web項目中的web.xml中配置JobExecutorServlet這個servlet,
     並設置隨系統啓動而初始化,如下:
      <servlet >
           <servlet-name>JobExecutorServlet</servlet-name>
           <servlet-class>
               org.jbpm.job.executor.JobExecutorServlet
           </servlet-class>
           <load-on-startup>1</load-on-startup>
      </servlet>
Timer有以下可以配置的屬性:
  duedate    :多長時間之後觸發,觸發後將會執行指定的動作;
  repeat     :觸發後多長時間重複執行一次指定的動作;
  transition :如果設置了,在定時器觸發後就會使用他離開節點;
  爲duedate和repeat的指定時間的語法是:<quantity> [business] <unit>
每個Timer要有一個唯一的名字。如果沒有給定時器元素指定名字,將會使用
Timer所在的元素的名字作爲定時器的名字。
定義Timer要注意兩點:
1> 如果指定了動作,又指定了transition,則動作會在離開節點之前被執行;
2> 如果指定了transition又指定了repeat,則repeat是沒有意義的,因爲離開節
   點後timer就被取消了;
定義了Timer,卻沒有執行相應的動作,則可能是以下原因造成的:
a) 沒有啓動JobExecutor;
b) 離開了Timer所在的節點(比如在TaskNode中做完了所有任務);
c) Timer所在的任務實例已結完成了;

任務分配
任務分派有兩種模式,分別是推(push)模式和拉(pull)模式。
 a) 推模式(個人任務):是在任務分派的時候,直接將任務實例分派給一個指定的用戶,任務實例進入這個用戶的個人任務列表中。
  分配任務的方式:
  1> 在流程定義中定義任務時,用actor-id指定(一個固定值或表達式);
  2> 在程序代碼中使用TaskInstance.setActorId(String)指定;
  3> 使用AssignmentHandler,方法爲assignable.setActorId(String);
  查詢個人任務列表的方法爲:
  TaskMgmtSession.findTaskInstances(String actorId);
 b)  拉模式(組任務):是將任務實例分派給一組用戶,這個任務實例會出現在(這個組中用戶的)組任務列表中。執行組任務時,需要首先將任務實例拉到自己的個人任務列表中,然後執行此任務。當有一個組任務被某個組用戶取出後,該任務實例就會從組任務列表中移除。(任務競爭的機制)
   分配任務的方式:
  1> 在流程定義中定義任務時,用pooled-actors指定(多個參與者用逗號隔開);
  2> 在程序代碼中使用TaskInstance.setPooledActors(String[])指定;
  3> 使用AssignmentHandler,方法爲assignable.setPooledActors(String[]);
  查詢組任務列表的方法爲:
  TaskMgmtSession.findPooledTaskInstances(String actorId);
   對於一個組任務,如果他的actorId爲null,組中所有的用戶都可以在組任務列表
中看到這個任務。如果使用TaskInstance.setActorId(String)方法設置這個任務
由指定的acrorId來辦理,這時pooledActors中的其他人就看不到這個任務了,就
是說actorId會屏蔽pooledActors; 當這個用戶因某些原因不能辦理任務時,應
該把這個任務再退回到組任務列表中,方法是調用TaskInstance.setActorId()設
置actorId爲null,這時pooledActors中的所有人又都可以看到這個任務了。
   這兩種分配任務的模式都可以使用任務分派接口AssignmentHandler來實現。任務在定義的時候指定對應的AssignmentHandler接口實現類。引擎在創建任務實例的時候會調用接口中的assign方法。其實現應該調用參數assignable的方法對任務進行分派。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章