iT邦幫忙

DAY 17
5

進程。Processing系列 第 17

[進程。Processing] 17.起始(Initiating)

James Review 了一下過去專案中的 Case,將本次專案會用到的部份擷取出來,準備交給小艾去完成啟動流程的任務。
「小艾,PO Init 這一支程式要由你來負責,將 ERP 待簽核的採購單撈出,同時針對每一個 Item,去產生他的分析資訊,然後再透過 BPM API 去啟動採購電子簽核流程,完成這張採購單的下載。」James 跟小艾講解他接下來的任務。

「可是 BPM API 這一部分,我沒有處理過耶!」小艾有些惶恐。

「其實不會很困難,呼叫 BPM API 去產生流程的程式,我以前處理另外一個案子的時候,已經將相關的呼叫程序寫好了,你只要去呼叫並執行它就可以啟動流程。」

James 開啟之前的專案,跟小艾說明該怎麼組合 BPM API 所需要的 Data。

「我之前寫了一支 initProcess.jsp 的程式(註1),因為執行在 BPM 的 Web Server 上,所以他可以直接呼叫 BPM 的 API,同時會將你傳遞過來的參數,包裝成 Hash Map 丟給流程,你在 Windows Console 程式中將從 ERP 中取得的單頭資料,以 Query String 的方式寫在 URL 中。」

    Dim keyValuePair As NameValueCollection = New NameValueCollection()

    keyValuePair.Add("processID", "PRO00123456789012345")
    keyValuePair.Add("userID",pm_id)
    keyValuePair.Add("pm_id", pm_id)
    keyValuePair.Add("vsr_id", vsr_id)
    keyValuePair.Add("PO_NO", PO_NO)

    Dim url As String = "http://10.2.32.168/WebAgenda/initProcess.jsp"
    Dim result As String = httpPost.RequestHttpPost(url, keyValuePair)


    If "OK".Equals(Left(result, 2)) Then
      Response.Write("True")
    Else
      Response.Write(result)
    End If

「透過我在網路上找到的這一個 Library,將 Hash Map 包裝成 Form Data,就可以很輕易的在程式中去呼叫 URL 並且將參數 POST 過去。」

HttpPostCallWebSite.vb

Public Class HttpPostCallWebSite
  Inherits System.Web.UI.Page
  Public Function RequestHttpPost(ByVal webUrl As String, ByVal keyValuePair As NameValueCollection) As String
    Dim ret As String
    ' Create a request using a URL that can receive a post.
    Dim request As WebRequest = WebRequest.Create(webUrl)
    ' Set the Method property of the request to POST.
    request.Method = "POST"
    'Set Http Post Params
    Dim strParams As String = ""
    Try
      Dim i As Integer
      For i = 0 To keyValuePair.Count - 1
        strParams += keyValuePair.GetKey(i) + "=" + keyValuePair.Get(i) + "&"
      Next i
      strParams = IIf(Right(strParams, 1).Equals("&"), Left(strParams, Len(strParams) - 1), strParams)
      ' Create POST data and convert it to a byte array.
      Dim byteArray As Byte() = Encoding.UTF8.GetBytes(strParams)
      ' Set the ContentType property of the WebRequest.
      request.ContentType = "application/x-www-form-urlencoded"
      ' Set the ContentLength property of the WebRequest.
      request.ContentLength = byteArray.Length
      ' Get the request stream.
      Dim dataStream As Stream = request.GetRequestStream()
      ' Write the data to the request stream.
      dataStream.Write(byteArray, 0, byteArray.Length)
      ' Close the Stream object.
      dataStream.Close()
      ' Get the response.
      Dim response As WebResponse = request.GetResponse()
      ' Display the status.
      ret = CType(response, HttpWebResponse).StatusDescription
      ' Get the stream containing content returned by the server.
      dataStream = response.GetResponseStream()
      ' Open the stream using a StreamReader for easy access.
      Dim reader As New StreamReader(dataStream)
      ' Read the content.
      Dim responseFromServer As String = reader.ReadToEnd()
      ' Clean up the streams.
      reader.Close()
      dataStream.Close()
      response.Close()
      Return ret & "<br />" & responseFromServer
    Catch ex As Exception
      Return "Para:" & strParams & ex.Message
    End Try
  End Function
EndClass

James 解釋著,「在 .Net 中要包裝成 Hash Map 可以透過 NameValueCollection 來達成,其實就是 Key-Value Pair,簡單的說,就是帶有名稱的 List。processID 與 userID 這兩個參數是啟動流程必備的參數,這是告訴 BPM 要啟動哪支流程以及是誰啟動流程用的。其他幾個則是讓流程知道相關的採購資訊,這部份就看在流程中要怎麼運用它。」

小艾邊聽 James 講解,邊看程式,仍然似懂非懂。「沒關係,你先寫寫看,遇到問題再來問我,啟動流程失敗的話會有 Error Message 回傳,你在程式中可以將它 Output 到 Console 看一下是什麼問題。」James 微笑著跟小艾說,要小艾別那麼擔心,一切都在掌握之中。

小艾回去後,開啟了一個新的專案,撰寫一支 Windows Console 程式,這支程式是要用來進行排程,固定的時間去抓取 ERP 的資料,然後開始流程的相關作業。

小艾將 James 傳送過來的程式碼,Copy & Paste到程式區塊中,並開始撰寫 ERP 資料撈取程式。

註1:請參考拙著 [BPM 開發記事]--WFCI 與 自訂表單的相遇

Prev Next

本篇全系列文章


上一篇
[進程。Processing] 16.架構(Architecture)
下一篇
[進程。Processing] 18.流程(Process)
系列文
進程。Processing31
0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-17 09:15:16

又要寫 jsp 又要寫 .Net VB
James 的團隊真是多才多藝
拍手簽名拍手

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-17 09:49:53

iT邦幫忙MVPantijava提到:
James 的團隊真是多才多藝

所以水是一定要多灌的啦~~~XD

0
Albert
iT邦高手 1 級 ‧ 2012-10-17 10:07:15

jamesjan提到:
小艾回去後,開啟了一個新的專案,撰寫一支 Windows Console 程式,這支程式是要用來進行排程,固定的時間去抓取 ERP 的資料,然後開始流程的相關作業。

Adempiere 有的東西
自己用 300 - 3000 小時去開發
除了大大的聰明膽識外
就是
把老闆的時間與空間拿來實驗
造就一群
沒有參照比較過的[高手]

jamesjan iT邦高手 1 級 ‧ 2012-10-17 12:15:36 檢舉

謝謝阿伯大的指教謝謝

我要留言

立即登入留言