姜秀斌,沈彬,吳濤,劉鎮(zhèn)東
(海洋石油工程股份有限公司,青島266520)
隨著近幾年海洋石油工程股份有限公司走向全球、走向深海的步伐,海工青島公司作為建造板塊的核心公司也迎來了國內(nèi)和國外浮式生成和儲油裝置建造的一個小高峰,同時也加強與煙臺萊佛士船業(yè)有限公司為代表船廠之間的合作。在船體建造過程中,國外業(yè)主會要求每周提交每一個零件的建造狀態(tài),國外業(yè)主稱之為Piece Mark狀態(tài)表,包括下料、零件預制、板片預制、分段預制、涂裝和搭載狀態(tài),并以此為依據(jù)進行建造進度的計算,以及費用QS結(jié)算等業(yè)務(wù)。
由于每一個項目業(yè)主對Piece Mark報表的內(nèi)容和狀態(tài)清單等都可能提出一些特定的要求,因此需要基于項目的特定需求并使用該解決方案和軟件算法為每一個項目的Piece Mark表開發(fā)特定的程序。
PCMS系統(tǒng)是Project Construction Management Sys?tem的縮寫,海工青島公司與鷹圖公司合作開發(fā)的適用于海工青島公司的建造管理系統(tǒng)。該系統(tǒng)的一個優(yōu)點是可以根據(jù)項目的需求實現(xiàn)從加工設(shè)計數(shù)據(jù)、工單類型、工作步驟、報表等環(huán)節(jié)的自定義配置,因此是非常靈活的一個系統(tǒng)。
加工設(shè)計數(shù)據(jù)模板分為下料方案模板類和裝配方案模板類。其中分段下料方案模板包括:分段板材下料方案模板文件和分段型材下料方案模板文件。下料方案模板文件必須包含的信息包括:下料指令號(即圖紙?zhí)枺?、套料零件清單、下料凈總重量等;其中裝配模板文件包括:一級裝配件(包括卷制管、T型梁、K板等)裝配模板文件、板架裝配模板文件和分段裝配模板文件。裝配模板文件必須包含的信息包括:裝配圖紙?zhí)枴⒘慵蘒D、子構(gòu)件ID、零件數(shù)量、零件重量和父構(gòu)件ID等。
工單的類型需要與業(yè)主、項目組和生產(chǎn)車間相關(guān)人員(包括生產(chǎn)負責人和計劃工程師等)一起討論后確定;每一類工單中包含什么Component(工作對象),它應(yīng)該分成哪幾個Work Step(工作步驟)也需要一起討論后確定。這些討論是非常有必要的,因為工作對象和工作步驟直接和項目的四級計劃、權(quán)重分配策略等相關(guān)。
從SPF2016R1版本開始,Smart Plant Foundation軟件提供了Report Administration模塊,通過該模塊可以非常方便并且靈活地配置報表,報表導出格式選擇xlsx文件格式。在本項目中設(shè)計了兩個報表分別是下料進度報表和裝配進度報表,由于xlsx格式數(shù)據(jù)文件的最大行數(shù)約為104萬行,因此合理地分成兩個報表有利于保證在項目后期數(shù)據(jù)報表的總行數(shù)不會突破104萬行限制。
本文采用的編程技術(shù)是VSTO技術(shù)(Visual Studio Tool for Office),編程語言采用Visual Basic.Net,首選通過SPF生成xlsx報表并下載到本地,再通過xlsx數(shù)據(jù)表提取數(shù)據(jù)技術(shù),并采用數(shù)據(jù)字典數(shù)據(jù)結(jié)構(gòu),最后使用零件狀態(tài)分析算法生成業(yè)主需要的Piece Mark報表。
將xlsx文件作為數(shù)據(jù)庫,可以采用如下數(shù)據(jù)庫連接關(guān)鍵字信息:OleDbConnection1.ConnectionString="Provider=Microsoft.Ace.OLEDB.12.0;Extended Proper?ties='Excel 12.0;HDR=yes;IMEX=1';Data Source="&XlsxFullFileName。其中Extended Properties中的屬性‘Excel 12.0’Excel文件擴展名為.xlsx;當IMEX=1時為“匯入模式”,這個模式開啟的Excel檔案只能用來做“讀取”用途;當HDR=Yes,這代表第一行是標題,不作為數(shù)據(jù)使用。
如果整個xlsx文件作為一個數(shù)據(jù)庫,那么xlsx文件中的一個worksheet就作為一個數(shù)據(jù)表,因此讀取數(shù)據(jù)可以使用select語句,select語句的語法采用Jet SQL的語法,唯一的區(qū)別是數(shù)據(jù)庫表名稱的寫法為:FROM["+WorkSheet_CuttingDamp_Data_SheetName+"$]T1,即用‘[SheetName$]’表示數(shù)據(jù)庫表名,T1作為表的別名。那么獲取下料進度狀態(tài)數(shù)據(jù)完整的select語句范例如下所示:Sql_Get_Nest_Plate="SELECT T1.RegisterID,
T1.DrawingID,T1.Component,T1.NestingList,T1.Qty,T1.Units,T1.FinishDate,T1.RowID"+"FROM["+Work?Sheet_CuttingDamp_Data_SheetName+"$]T1 where T1.Class='PCMS_ST_Nest_Plate'and T1.RegisterID like'%SD-CR-DWG-S10-ST-%'"??梢酝ㄟ^select語句的應(yīng)用,可以快速地獲得想要得到的數(shù)據(jù)集合,并可以較為快速地存儲這些數(shù)據(jù)到DataTable對象中。
針對裝配階段的完成情況數(shù)據(jù)表,可以根據(jù)零件和構(gòu)件在不同階段完成裝配工作的情況的分類,對應(yīng)生成如下10種數(shù)據(jù)表:1)零件在一級裝配階段的完成情況數(shù)據(jù)表;2)零件在二級預制階段的完成情況數(shù)據(jù)表;3)零件在三級預制階段的完成情況數(shù)據(jù)表;4)零件在總裝搭載階段的完成情況數(shù)據(jù)表;5)一級結(jié)構(gòu)物在二級預制階段的完成情況數(shù)據(jù)表;6)一級結(jié)構(gòu)物在三級預制階段的完成情況數(shù)據(jù)表;7)一級結(jié)構(gòu)物在總裝搭載階段的完成情況數(shù)據(jù)表;8)二級結(jié)構(gòu)物在三級預制階段的完成情況數(shù)據(jù)表;9)二級結(jié)構(gòu)物在總裝搭載階段的完成情況數(shù)據(jù)表;10)三級結(jié)構(gòu)物在總裝搭載階段的完成情況數(shù)據(jù)表。也同樣將這10張數(shù)據(jù)表存儲到DataTable對象中。
如果通過使用For循環(huán)遍歷DataTable對象中的每一行數(shù)據(jù),去尋找指定零件ID的預制狀態(tài),一定會出現(xiàn)循環(huán)嵌套的情況。由于數(shù)據(jù)表的行數(shù)是幾萬行這樣一個數(shù)量級,因此For循環(huán)的執(zhí)行效率一定會非常低。因此本文考慮使用字典數(shù)據(jù)結(jié)構(gòu),將For循環(huán)嵌套改進為兩個獨立的非嵌套的For循環(huán)。第一個For循環(huán)用于生成數(shù)據(jù)字典,數(shù)據(jù)字典對象的定義如下所示:Dim Dict_ClassPart_1stFabr_Finished As Dictionary(Of String,List(Of String)),該字典用于存儲零件在一級裝配階段完成情況,字典的Key為零件ID,字典的Value為一個List對象,List對象的清單為該零件在預制階段各個工作步驟的完成日期。第二個For循環(huán)用于循環(huán)所有零件ID,根據(jù)零件ID以及指定的字典直接獲得它的各個階段的施工步驟完成日期。采用數(shù)據(jù)字典和兩個獨立的For循環(huán)的方法代替兩層for循環(huán)嵌套的方法,解決了算法效率太慢的問題。
零件的Piece Mark報表中分成兩個部分,第一部分是零件的加工設(shè)計基礎(chǔ)數(shù)據(jù),包括零件號、圖紙?zhí)?、分段號、零件?shù)量、零件重量等。第二部分是零件的各生產(chǎn)階段的狀態(tài)信息,包括下料階段各狀態(tài)點完成日期、一級裝配階段各狀態(tài)點完成日期、分段預制階段各狀態(tài)點完成日期、分段總裝階段各狀態(tài)點完成日期。因此零件的狀態(tài)分析算法應(yīng)該包括對零件的各個階段的狀態(tài)分析過程。
首先下料狀態(tài)日期直接從存儲下料狀態(tài)信息的字典中取值即可,沒有層次關(guān)系直接對應(yīng)即可。接著分析一級裝配件的預制狀態(tài)信息,由于一級裝配件是由零件組成的構(gòu)建,因此需要根據(jù)一級裝配件的類型(例如T型梁、K板、卷制管)再分別分析并獲取該類型零件從一級裝配、板片預制、分段預制和分段總裝全過程的狀態(tài)信息。再接著對于沒有一級裝配階段的零件而直接進入分段預制階段的零件的狀態(tài)進行分析,最后對那些總裝散裝零件的狀態(tài)進行分析。
該算法由一個函數(shù)實現(xiàn),該函數(shù)所包含的參數(shù)如下:零件號,一級裝配構(gòu)件號,板片預制構(gòu)件號,分段預制構(gòu)件號。該類型的零件大多數(shù)在一級裝配階段就完成了預制工作,但存在少量零件在板片預制階段安裝,少量零件直接在分段預制階段安裝,也存在極少量直接在總裝階段安裝。因此該算法首先需判斷該零件是否在一級裝配階段完成了預制,如果該零件在一級裝配階段完成裝配,那么讀取該一級裝配件預制完成日期作為該零件的預制完成日期。接著再判斷該一級裝配件是否在板片預制階段完成了裝配,如果該板片完成了裝配,那么讀取該板片預制完成日期作為該零件的板片預制完成日期。再接著判斷板片構(gòu)件是否完成在分段裝配階段完成了裝配,如果該分段完成了裝配,那么讀取該分段裝配完成日期作為該零件的分段裝配完成日期。最后判斷分段構(gòu)件是否完成了總裝工作,如果該分段完成了總裝,那么讀取該分段總裝完成日期作為該零件的總裝完成日期。對于其他類型的零件的整個建造狀態(tài)的分析過程類似,不在累述。
該解決方案適用于數(shù)據(jù)源文件是Excel進度文件,該Excel文件來自于某一個項目管理系統(tǒng)(例PCMS系統(tǒng))。通過xlsx表提取數(shù)據(jù)技術(shù)、數(shù)據(jù)字典數(shù)據(jù)結(jié)構(gòu)、零件狀態(tài)分析算法,使用VSTO開發(fā)平臺開發(fā)Excel小程序,開發(fā)周期短、開發(fā)環(huán)境和調(diào)試環(huán)境好、Excel小程序用戶體驗好等優(yōu)勢。
PCMS系統(tǒng)使用Smart Plant Foundation,通過SPFAdhocReport類型生成Excel進度文件,當項目后期這個報表的總行數(shù)達到23萬行這個級別,服務(wù)器端生成Excel報表文件的時間約為4分鐘,從服務(wù)器下載到本地的時間約為15秒。
通過xlsx表提取數(shù)據(jù)技術(shù)、數(shù)據(jù)字典數(shù)據(jù)結(jié)構(gòu)和零件狀態(tài)分析算法,在項目后期零件數(shù)達到6萬行這個級別時,經(jīng)過測試從讀取Excel文件(文件數(shù)據(jù)行總數(shù)約23萬行)到最終生成Piece Mark報表共計需要約4分鐘(CPU Intel Core i7 2.2MHz 6核)。
Piece Mark報表有大量的應(yīng)用領(lǐng)域和較高的價值。一方面可用于進度計算,結(jié)構(gòu)專業(yè)的進度計算一般會是使用重量作為工作量統(tǒng)計的單位,該Piece Mark報表可以作為進度計算的數(shù)據(jù)源,編制Excel進度計算表,或者匯總后反饋給P6也是可以的。另一方面,費用結(jié)算時一般會考慮項目進度和完成工作量,該表可以作為QS工作量結(jié)算參考,如果與QS團隊完成每個零件QS結(jié)算重量的校核后可以直接用于QS費用結(jié)算。最后,依據(jù)該Piece Mark報表還可以生成各種各樣基于時間軸的圖表,來反映項目下料工作、預制工作的實際進展曲線,分析出項目的高峰期和低谷期,為未來類似項目的人力計劃編制提供依據(jù)。
結(jié)合FPSO船體建造項目的需求,依據(jù)Smart Plant Foundation軟件生成的Excel報表,使用VSTO工具開發(fā)滿足業(yè)主要求的Piece Mark報表是一條非常靈活和高效的報表開發(fā)解決方案。通過xlsx表提取數(shù)據(jù)技術(shù)、數(shù)據(jù)字典數(shù)據(jù)結(jié)構(gòu)、零件狀態(tài)分析算法,使用匯VSTO開發(fā)平臺完成開發(fā),用戶使用Excel進行工作。顯然的優(yōu)勢如下:Visual Studio開發(fā)和調(diào)試環(huán)境好、程序分發(fā)和部署非常綠色和方便、Excel小程序用戶體驗好。由于該類型的報表的使用頻率并不會太高(一般情況下一周兩次),程序的運行速度前期很快,隨著項目數(shù)據(jù)的增大會慢慢變慢,到項目組的最后生成報表的速度也是可以接受的。