0 引言
目前,企業(yè)面臨的挑戰(zhàn)是最大限度地實(shí)施并行工程,發(fā)揮產(chǎn)品上市快的優(yōu)勢(shì),縮短產(chǎn)品上市時(shí)間,提高效率,增強(qiáng)企業(yè)的競(jìng)爭(zhēng)能力。產(chǎn)品數(shù)據(jù)管理(Product Data Management,PDM)是在現(xiàn)代產(chǎn)品開(kāi)發(fā)環(huán)境中成長(zhǎng)發(fā)展起來(lái)的一項(xiàng)管理產(chǎn)品數(shù)據(jù)的新技術(shù),使用PDM技術(shù)可增強(qiáng)產(chǎn)品的應(yīng)變能力,提高產(chǎn)品的質(zhì)量。
在PDM領(lǐng)域處于領(lǐng)先地位、以Internet為核心的Teamcenter系統(tǒng),是SIEMENS公司提供的一種完整、功能強(qiáng)大、經(jīng)過(guò)證實(shí)的且能夠?qū)崿F(xiàn)數(shù)字化全生命周期管理的解決方案。Teamcenter具有強(qiáng)大的功能,例如文檔管理、權(quán)限管理、產(chǎn)品結(jié)構(gòu)和配置管理,以及工作流程管理等,它的領(lǐng)先還體現(xiàn)在提供了強(qiáng)大的二次開(kāi)發(fā)應(yīng)用程序接口,在實(shí)施項(xiàng)目時(shí),可以通過(guò)接口對(duì)產(chǎn)品進(jìn)行訂制和開(kāi)發(fā)。PDM是以產(chǎn)品管理為核心,以資料、過(guò)程和資源為管理信息的三大要素,它進(jìn)行信息管理的兩條主線是靜態(tài)的產(chǎn)品結(jié)構(gòu)和動(dòng)態(tài)的產(chǎn)品形成過(guò)程的管理(靜態(tài)的產(chǎn)品數(shù)據(jù)管理和動(dòng)態(tài)的工作流程管理)。工作流程管理是PDM系統(tǒng)中的一個(gè)重要部分,產(chǎn)品從設(shè)計(jì)到發(fā)布是一個(gè)動(dòng)態(tài)的過(guò)程,在這個(gè)過(guò)程中,工作流程起到至關(guān)重要的作用,它使產(chǎn)品數(shù)據(jù)多態(tài)而不混淆、連貫且可跟蹤。
在Teamcenter系統(tǒng)中提供了企業(yè)級(jí)工作流程。與工作流程關(guān)聯(lián)緊密的主要有以下幾個(gè)概念:過(guò)程(process),是用來(lái)定義工作流程的模板;工作進(jìn)程(jobs),是一個(gè)過(guò)程的實(shí)例化,運(yùn)行一個(gè)過(guò)程相當(dāng)于自動(dòng)創(chuàng)建一個(gè)新的工作進(jìn)程;任務(wù)(tasks),是被用來(lái)在目標(biāo)對(duì)象上執(zhí)行的動(dòng)作;目標(biāo)對(duì)象(target objects),是能由任務(wù)控制的與工作進(jìn)程相關(guān)的數(shù)據(jù);引用數(shù)據(jù)(reference data),是不能由任務(wù)控制的且與工作進(jìn)程相關(guān)的數(shù)據(jù);任務(wù)動(dòng)作(task action),都含有一些動(dòng)作(action)。
每個(gè)任務(wù)動(dòng)作都能使用兩種處理程序,一種是執(zhí)行一定功能的動(dòng)作處理程序(action handler),另一種是核實(shí)或者驗(yàn)證某些狀況的規(guī)則處理程序(rule handler)。處理程序(Handler)是令任務(wù)動(dòng)作按照使用者的思維,根據(jù)實(shí)際業(yè)務(wù)的需要來(lái)安排、執(zhí)行每一個(gè)任務(wù)的關(guān)鍵所在。流程管理任務(wù)模型如圖1所示,正是處理程序使工作流程管理呈現(xiàn)出創(chuàng)造性、多樣化和強(qiáng)大的生命力,所以處理程序技術(shù)是工作流程管理的核心。
圖1 流程管理任務(wù)模型
1 Teamcenter中Handler的實(shí)現(xiàn)原理
現(xiàn)在越來(lái)越多的企業(yè)都使用PDM系統(tǒng)對(duì)企業(yè)產(chǎn)品數(shù)據(jù)進(jìn)行統(tǒng)一管理。由于企業(yè)需求的日益多樣化,過(guò)于單一的工作流程管理已無(wú)法滿足企業(yè)的需求。根據(jù)工作流程管理聯(lián)盟(MWFC)的規(guī)定,工作流程定義為:業(yè)務(wù)流程的全部和部分自動(dòng)化,在此過(guò)程中,文檔、信息或者任務(wù)按照一定的過(guò)程規(guī)則流轉(zhuǎn),實(shí)現(xiàn)組織成員間的協(xié)調(diào)工作,以期達(dá)到業(yè)務(wù)的整體目標(biāo)。
某軸承企業(yè)的電子文件均利用Teamcenter進(jìn)行統(tǒng)一管理,通過(guò)Teamcenter提供的工作流程模塊來(lái)進(jìn)行審簽,該企業(yè)希望能夠在這些文件中看到審簽的信息,而在實(shí)際業(yè)務(wù)中往往需要發(fā)送大量的電子文件,讓審簽人員對(duì)每一份文件進(jìn)行手動(dòng)填入審簽信息不現(xiàn)實(shí),所以需要開(kāi)發(fā)一個(gè)功能,以實(shí)現(xiàn)在流程審簽過(guò)程中能自動(dòng)在技術(shù)文件上填入審簽信息。針對(duì)該應(yīng)用實(shí)例,本文通過(guò)利用Teamcenter進(jìn)行服務(wù)器端Handler技術(shù)的開(kāi)發(fā),從而實(shí)現(xiàn)了流程信息的自動(dòng)收集,并結(jié)合VBA技術(shù)實(shí)現(xiàn)了審簽信息自動(dòng)填人技術(shù)文件。
圖2所示為T(mén)eamcenter工作流程管理對(duì)象模型,該模型是為支持圖1所示模型而設(shè)計(jì)的,兩者在本質(zhì)上關(guān)系緊密,而Handler的實(shí)現(xiàn)就是依賴于工作流程管理。
圖2 Teamcenter工作流程管理對(duì)象模型
下面根據(jù)圖2所示的模型介紹Handler的工作原理。圖2中的任務(wù)是指在Teamcenter的工作流程設(shè)計(jì)器中定制一個(gè)工作流程的模板,里面包含一系列的任務(wù)(即一組圖l所示的任務(wù)的有順序規(guī)則的集合)及每個(gè)任務(wù)的用戶情況,例如組(group)和角色(role)。每個(gè)任務(wù)都可以添加一些動(dòng)作即動(dòng)作處理程序(如圖1中的進(jìn)程)和業(yè)務(wù)規(guī)則即規(guī)則處理程序(即圖1中的控制)。在流程發(fā)起時(shí)正確安排審簽人員,可以在流程模板中添加附件如設(shè)計(jì)的軸承圖樣、工藝文檔和技術(shù)文檔等(即圖1中的輸入和輸出)。
當(dāng)流程發(fā)起時(shí),流程模板出現(xiàn)實(shí)例化(即圖2中的工作進(jìn)程)。在流程進(jìn)行時(shí),系統(tǒng)會(huì)按照任務(wù)的定制順序,如圖3所示的零件圖審批流程,按照設(shè)計(jì)→校對(duì)→審核→發(fā)布的順序,先調(diào)用設(shè)計(jì)任務(wù)中的規(guī)則處理程序,判斷是否符合規(guī)則。例如有一個(gè)規(guī)則處理程序的要求是上一個(gè)任務(wù)未完成之前阻止下一個(gè)任務(wù)的開(kāi)始,所以當(dāng)判斷出規(guī)則未滿足時(shí),規(guī)則處理程序會(huì)返回EPM_nogo值,Teamcenter系統(tǒng)獲取該返回值后會(huì)讓流程停在當(dāng)前任務(wù),無(wú)法進(jìn)入下一個(gè)任務(wù)——校對(duì);反之經(jīng)處理程序判斷出規(guī)則已滿足時(shí),返回EPM_go值,流程可以進(jìn)入下一個(gè)任務(wù),然后按加載到任務(wù)上的動(dòng)作處理程序次序,繼續(xù)順序執(zhí)行第一個(gè)動(dòng)作處理程序,當(dāng)程序完成之后,系統(tǒng)會(huì)返回一個(gè)ITK_ok的值,系統(tǒng)接收之后,再按順序調(diào)用下一個(gè)處理程序。所以Teamcenter工作流程中的處理程序可分為兩類(lèi):一類(lèi)是動(dòng)作處理程序,作用是執(zhí)行某些特定的功能,例如執(zhí)行某一個(gè)程序,轉(zhuǎn)換狀態(tài);另一類(lèi)是規(guī)則處理程序,主要用于核對(duì)或證實(shí)某些狀況,例如檢查任務(wù)的狀態(tài),檢查是否符合某些條件,規(guī)則處理程序一般在動(dòng)作處理程序之前執(zhí)行,如果符合規(guī)則處理程序要求,則執(zhí)行接下來(lái)的動(dòng)作。這兩類(lèi)處理程序(Handler)皆可以在Teamcenter交互式的處理程序面板中與流程進(jìn)行關(guān)聯(lián)。
圖3 零件圖審批流程
2 文件審簽技術(shù)核心
Teamcenter系統(tǒng)屬于管理系統(tǒng),管理系統(tǒng)售后常需要一個(gè)定制過(guò)程,使之適應(yīng)企業(yè)的特殊需求。二次開(kāi)發(fā)是PDM實(shí)施的主要工作之一,因此必須掌握其核心技術(shù)。Teamcenter的開(kāi)發(fā)分客戶端及服務(wù)器端兩種?蛻舳塑浖怯肑AVA語(yǔ)言開(kāi)發(fā)的,同樣,它的二次開(kāi)發(fā)也使用JAVA語(yǔ)言。服務(wù)器端的二次開(kāi)發(fā)要利用二次開(kāi)發(fā)模塊ITK及C語(yǔ)言。文件審簽技術(shù)中的Handler就是為了滿足企業(yè)需求在服務(wù)器端二次開(kāi)發(fā)的。
2.1 Handler技術(shù)
若需要在Teamcenter的工作流程中達(dá)到某項(xiàng)功能,首先需要成功創(chuàng)建Handler,Handler相當(dāng)于是Teamcenter系統(tǒng)與業(yè)務(wù)程序之間的橋梁,在該實(shí)例中,需要一個(gè)獲取審簽信息的業(yè)務(wù)程序和調(diào)用外部VBA技術(shù)進(jìn)行自動(dòng)填入審簽信息的程序,但這些程序都需要一個(gè)載體,即Signoff_Review和Signoff_Replace兩個(gè)應(yīng)用程序。
創(chuàng)建Handler的步驟如下。
第一步:編寫(xiě)Handler,并在客制化的用戶出口進(jìn)行注冊(cè)。需要的兩類(lèi)關(guān)鍵函數(shù)如下。
第一類(lèi)關(guān)鍵函數(shù):
EPM_register_action_handler(char*handlerName,char*handlerDe scnption,EPM_action_handler_t functionPointer)
第二類(lèi)關(guān)鍵函數(shù):
EPM_register_rule_handler(char*handlerName,char*handlerDe scription,EPM_action_handler_t functionPointer)
以上為注冊(cè)處理程序的兩個(gè)關(guān)鍵函數(shù),前者是注冊(cè)動(dòng)作處理程序,而后者是注冊(cè)規(guī)則處理程序,兩者類(lèi)似。handlerName是在Teamcenter交互式的任務(wù)定義界面中處理程序的名字,handlerDescription是可以省略的。functionPointer是一個(gè)函數(shù)的入口指針,如編寫(xiě)Signoff_Review這個(gè)處理程序時(shí),就需要把獲取審簽流程的信息寫(xiě)入functionPointer對(duì)應(yīng)的函數(shù)中。
CUSTOM_register_exit函數(shù)是對(duì)用戶客制化出口的初始化進(jìn)入點(diǎn)注冊(cè)。USER_gs_shell_init_module是一個(gè)用戶初始化的基本函數(shù),它可以使Teamcenter在初始化時(shí)就連接上用戶客制化出口內(nèi)容。而sitename(站點(diǎn)名)就是存儲(chǔ)這個(gè)客制化內(nèi)容的庫(kù),如果想連接成功,這個(gè)庫(kù)還必須在Teamcenter系統(tǒng)中注冊(cè),它可以根據(jù)用戶需要修改,但必須前后統(tǒng)一起來(lái)。而之前注冊(cè)的函數(shù)EPM_register_action_handler和EPM_register_rule_handler都需要作為my_custom_exit_function的函數(shù)體。編譯鏈接生成的動(dòng)態(tài)鏈接庫(kù)(DLL)須以站點(diǎn)名命名,即sitename.dll文件。所生成的DLL必須復(fù)制到Teamcenter安裝路徑根目錄下的bin文件夾里,以便Teamcenter的服務(wù)器去鏈接前述的DLL,從而調(diào)用處理程序。CUSTOM_register_exit函數(shù)如下:
第二步:以管理員身份登陸Teamcenter,在菜單欄選擇編輯一選項(xiàng)一索引,找到首選項(xiàng)TC_customization libraries,并為其添加新值,即sitename。
第三步:在Teamcenter系統(tǒng)的工作流設(shè)計(jì)器中的任務(wù)下會(huì)有顯示任務(wù)處理程序的面板,可以查看到注冊(cè)的Handler是否已經(jīng)存在,若已存在,可直接添加到不同任務(wù)的不同操作狀態(tài)下。Handler的實(shí)現(xiàn)過(guò)程如圖4所示。
圖4 Handler的實(shí)現(xiàn)過(guò)程
2.2 獲取流程信息技術(shù)
Signoff_Review程序主要是用來(lái)獲取流程中審簽的信息,然后存儲(chǔ)在臨時(shí)的文本文檔中,關(guān)鍵步驟及程序語(yǔ)言如下。
步驟1:獲得該job的標(biāo)簽。
EPM_ask*ob(msg.task,&job)
步驟2:獲得審簽任務(wù)的名字。
EPM_ask_review_task_name(msg.task,review_task_name)
步驟3:獲取審簽者的人數(shù)及其標(biāo)簽。
CR_ask_reviewers(job,review_task_name,&reviewer_ctr,&groupmembers)
步驟4:利用循環(huán)找出每個(gè)審簽人的用戶標(biāo)簽。
POM_class_of_instance(groupmembers[ctr],&classld)
POM_name_of_class(classld,&class_name)
SA_ask_groupmemberuser( groupmembers[i],&user_tag)
步驟5:輸入審簽的標(biāo)簽,得到審簽人的名字。
SA_ask_user_identifier(user_tag,user_name)
步驟6:獲取系統(tǒng)中審簽的相關(guān)信息。在如圖5所示的人機(jī)交互審簽界面中審簽完畢,單擊“確定”按鈕后,審簽信息就會(huì)產(chǎn)生并記錄在系統(tǒng)中,審簽信息如審簽人、審簽的決定、審簽的意見(jiàn)和審簽的日期等。
圖5 流程中人機(jī)交互的審簽界面
CR_ask_decision( job,review_task_name,user_tag,&decision,comments,&decision_date);
步驟7:將上述信息存放到一個(gè)臨時(shí)的文本文檔(*.txt)中作為記錄,以便在后續(xù)的流程中,將這些信息自動(dòng)填入電子文件中。記錄審簽信息的臨時(shí)文本文檔如圖6所示。
mail_file=fopen(“*.txt”,a+);fprintf(mail_file,“%s”,審簽信息);
圖6 記錄審簽信息的臨時(shí)文本文檔
Signoff_Replace程序把獲取的審簽信息填入電子文件的程序步驟如下。
step 1:獲得Item下的附件數(shù)量和它們的標(biāo)簽。
EPM_askjob(msg.task,&job);
EPM_ask_root_task(joh,&root_task);
EPM_ask_attachments(root_task,EPM_target_attachment,&nfound,&ftags)
step 2:循環(huán)每一個(gè)附件,判斷其類(lèi)別是否為數(shù)據(jù)集。
POM_class_of_instance( ftags[i],&classjd):
POM_name_of_class(classid.&class_name)
strcmp(class_name,“ Dataset”)==0
step 3:獲得這個(gè)數(shù)據(jù)集的命名引用類(lèi)型,然后判斷是什么類(lèi)型的文件,把文件導(dǎo)出Teamcenter,調(diào)用相應(yīng)的外部VBA程序來(lái)進(jìn)行簽名。
AE_find_dataset_named_ref(ftags[i],0,refname,&reftype,&refobject);
AE_impmt_named_ref(ftagsi],refname,pathname,NULL,SS_BINARY);
step 4:最后把已經(jīng)簽名的文件導(dǎo)入到原數(shù)據(jù)集下的命名引用,保存這個(gè)數(shù)據(jù)集。
AE_remove_dataset_named_ref(ftags[i],refname);
AEjmport_named_ref(ftags[i],refname,pathname,NULL,SS_BINARY);
AOM_save(ftags[i]);
2.3 VBA技術(shù)
Handler本身并不能完成數(shù)據(jù)集的自動(dòng)簽名功能,自動(dòng)簽名是由服務(wù)器端的VBA程序完成。將此ActionHandler與VBA程序的實(shí)現(xiàn)功能分開(kāi),給程序帶來(lái)了很大的擴(kuò)展性。如果需要增加對(duì)新的數(shù)據(jù)集的簽字功能,只需要編寫(xiě)相對(duì)應(yīng)的VBA程序。而選擇VBA技術(shù),是因?yàn)樵S多的電子文件與VBA存在交互開(kāi)發(fā)環(huán)境(VBA IDE)。盡管每種電子文件各有其特點(diǎn),但大部分在VBA環(huán)境行為上都是相似的。VBA工程是代碼模塊、類(lèi)模塊和窗體的集合,而且各種類(lèi)庫(kù)、變量齊全,由它們組合用來(lái)執(zhí)行獨(dú)立的功能方便而且穩(wěn)定。VBA工程可保存在電子文件中,或作為獨(dú)立的文件保存,本文中就是將其生成獨(dú)立的.exe程序,作為外部文件使用。
2.3.1 向Word文件中寫(xiě)入流程信息
1)連接Word軟件,選擇操作的文件(需要指定路徑及文件名),在后臺(tái)打開(kāi),設(shè)可見(jiàn)性屬性(Visible)為False。
Dim wordApp As Object
Dim doc
Set wordApp=CreateObject(“Word.Application”)
wordApp.Visible=False
Set doc=wordApp.Documents.Open(“pathname+filename”)
2)打開(kāi)之前用來(lái)保存簽名信息的臨時(shí)文本文檔,讀取信息。
Dim fs.line
Set fs=CreateObject(“Scripting,F(xiàn)ileSystemObject”)
Set txtFile=fs.OpenTextFile(“pathname+filename”)
line=txtFile.ReadAIl()
3)在文件中定位需要簽名的地方,程序中的***就是一個(gè)自定義的標(biāo)記,當(dāng)搜索到這個(gè)標(biāo)記時(shí),進(jìn)行替換,從審簽信息的文本文檔中讀取相關(guān)信息并將標(biāo)記替換,實(shí)現(xiàn)電子文件的自動(dòng)簽名功能,這一步是簽名的關(guān)鍵。
Selection.Find.Replacement.ClearFormatting
With Selection.Find.Text=“***”
Replacement.Text=審簽信息
2.3.2 向dwg文件中寫(xiě)入流程信息
1)連接CAD,選擇要進(jìn)行操作的文件(需要指定路徑及文件名),在后臺(tái)打開(kāi),設(shè)可見(jiàn)性屬性(Visible)為False。
Public cadApp As AcadApplication,cadDoc As AcadDocument
Set cadApp=CreateObject(“autocad.Application”)
Set cadDoc=cadApp.Documents.Open(“pathname+filename”)
2)再打開(kāi)用來(lái)保存簽名信息的文本文檔,將信息讀。ㄅcWord文件中的方法一樣)。
3)在dwg中定位,找到需要替換簽名信息的標(biāo)記。有兩種常見(jiàn)的可能,一種是需要替換的標(biāo)記存在于圖樣中的文本圖元里,這時(shí)需要?jiǎng)?chuàng)建一個(gè)選擇集,利用Select方法把所有文本圖元篩選出來(lái)并放人選擇集當(dāng)中,然后遍歷選擇集中的每個(gè)文本圖元,獲取其TextString的屬性值,然后利用InStr方法,判斷該屬性值中是否含有預(yù)先設(shè)定的宏,若是找到,便把審簽信息寫(xiě)入,其程序如下:
Dim SSet As AcadSelectionSet
Dim a As String
SSet.Select acSelectionSetAIl,
fType,fData
For Each ent In Sset:a=ent.TextString b=“***”
InStr(1,a,b,1)
ent.TextString=“審簽信息”
另一種可能是,所有需要自動(dòng)簽名的標(biāo)識(shí)都放到一個(gè)塊上,那就需要換一種定位標(biāo)記的方式。采用兩層遍歷的方式來(lái)找到標(biāo)記。首先創(chuàng)建所有塊的一個(gè)集合blockcoll,在里面進(jìn)行遍歷,如果找到想要進(jìn)行簽名的塊,一般用塊的名字進(jìn)行區(qū)分(elem.Name);然后進(jìn)行下一層的遍歷,在審簽塊中遍歷每個(gè)圖元,看哪一個(gè)圖元的TextString屬性值是設(shè)定的標(biāo)識(shí),找到后寫(xiě)入對(duì)應(yīng)的審簽信息,其程序如下:
Set blkcoll=cadDoc. Blocks
For Each elem In blkcoll
If elem.Name=“審簽”Then
For Each subelem In elem
If subelem.TextString=“***”
Then subelem.TextString=“審簽信息”
3 應(yīng)用實(shí)例
筆者在某軸承企業(yè)的PDM實(shí)施工作中,根據(jù)該企業(yè)要求,在設(shè)計(jì)任務(wù)書(shū)評(píng)審流程、零件圖審簽流程、裝配圖審簽流程、套圈工藝審簽發(fā)布流程、保持架工藝審簽發(fā)布流程、快速發(fā)布和工程更改等工作流程中獲取審簽信息并自動(dòng)填入到相應(yīng)的電子文檔中。在流程審核任務(wù)的perform-signoff節(jié)點(diǎn)中,添加前面成功注冊(cè)的Signoff_Review和Signoff_Replace兩個(gè)處理程序,其界面如圖7所示。當(dāng)流程起動(dòng)并運(yùn)行到該任務(wù),按照前述的Handler的工作原理,以及動(dòng)作處理程序次序,在任務(wù)完成的這個(gè)動(dòng)作中,自動(dòng)調(diào)用服務(wù)器端的Signoff_ Review和Signoff_Replace這兩個(gè)動(dòng)作處理程序,實(shí)現(xiàn)提取流程審簽信息,并最終自動(dòng)填入技術(shù)文件中,成功填人審簽信息的技術(shù)文檔如圖8所示。
圖7 添加處理程序界面
圖8 成功填入審簽信息的技術(shù)文檔
目前上述處理程序在企業(yè)運(yùn)行情況良好,滿足了企業(yè)需求。
4 結(jié)語(yǔ)
本文通過(guò)利用Teamcenter進(jìn)行服務(wù)器端Handler技術(shù)的開(kāi)發(fā),結(jié)合其他相關(guān)的計(jì)算機(jī)技術(shù),實(shí)現(xiàn)了從流程中獲取審簽信息,最終把流程中的審簽信息自動(dòng)填入對(duì)應(yīng)的電子文件中。Handler技術(shù)使Teamcenter系統(tǒng)中工作流程的管理適合更多企業(yè)的實(shí)際需要,達(dá)到使企業(yè)用戶使用Teamcenter系統(tǒng)的目的,同時(shí)也提高了企業(yè)的效率。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/
本文標(biāo)題:Teamcenter中基于Handler的文件審簽技術(shù)的研究
本文網(wǎng)址:http://www.oesoe.com/html/solutions/1401939866.html