吳濤,曹紀(jì)慧
(海洋石油工程(青島)有限公司,青島 266000)
眾所周知,浮體建造過程中結(jié)構(gòu)專業(yè)的原材料主要為板材或者型材,當(dāng)原材料下料后到模塊或者船體總裝搭載前,每個建造階段所產(chǎn)生的結(jié)構(gòu)體統(tǒng)稱為半成品。本文概述了浮體建造過程中對半成品的管理方案,此方案主要用于浮體制造的下料、預(yù)制和裝配三個階段。下料工單完成工作量反饋后,通過半成品管理功能可篩選出具備下一階段建造條件的桿件,并根據(jù)工作階段和類型將數(shù)據(jù)進行合并或拆分,自動導(dǎo)出半成品材料清單,并能為下一階段的工單中進行材料預(yù)測預(yù)留,最終實現(xiàn)半成品管理。
PCMS(Project Construction Management System)即工程項目建造管理系統(tǒng),是基于鷹圖公司SmartYard 軟件系列產(chǎn)品,在數(shù)據(jù)標(biāo)準(zhǔn)化和規(guī)范的基礎(chǔ)上,結(jié)合海洋石油工程股份有限公司建造事業(yè)部個性化的工程項目管理需求,定制開發(fā)的一套用于海洋工程類項目建造全生命周期管理的信息集成系統(tǒng)。系統(tǒng)以三個軟件SPF(基礎(chǔ)數(shù)據(jù)平臺)、SPC(施工管理模塊)、SPM(材料管理模塊)為基礎(chǔ),以工單為載體,打通設(shè)計、計劃、物資和生產(chǎn)的信息瓶頸,以符合行業(yè)內(nèi)AWP(Advanced Work Package)管理體系標(biāo)準(zhǔn),提高建造施工組織效率。
根據(jù)AWP 管理體系標(biāo)準(zhǔn),PCMS 系統(tǒng)的工單是一個IWP(Installation Work Packages)級別施工范圍,可動態(tài)展現(xiàn)該IWP 計劃、材料、設(shè)計、進度等信息。工單最重要的功能之一是實現(xiàn)材料預(yù)測預(yù)留,系統(tǒng)根據(jù)加工設(shè)計的材料需求和現(xiàn)場材料入庫情況進行精確匹配。在項目建造階段,每個專業(yè)的工單分為多種類型。以企鵝項目浮體專業(yè)為例,工單類型分別為下料、一級預(yù)制、二級預(yù)制、裝配、總裝。工單類型對應(yīng)著不同的施工階段。
從下料階段開始到總裝階段結(jié)束,每一個建造階段都會產(chǎn)生半成品。半成品建造完成后會存放在預(yù)制場地,不會進行入庫,因此下一建造階段的工單包含該半成品材料時,需要明確該半成品是否已經(jīng)完成建造并且檢驗釋放。通過PCMS 系統(tǒng)工單執(zhí)行情況,從而判別出半成品材料的建造狀態(tài),實現(xiàn)半成品管理,使各個建造階段都可以進行材料預(yù)測預(yù)留是本文研究的重點。
半成品完成狀態(tài)跟蹤報表是通過用戶定義含有Schema 數(shù)據(jù)結(jié)構(gòu)的XML 文件在SmartPlant Foundation軟件中進行定制,此報表可導(dǎo)出當(dāng)前生產(chǎn)項目工單執(zhí)行的完成量、完成時間等基本信息,并以xls 格式存儲。報表每行以該項目所有工單的工藝步驟為單位,表結(jié)構(gòu)如表1 所示。
表1 半成品完成狀態(tài)跟蹤報表的表結(jié)構(gòu)
Schema 數(shù)據(jù)結(jié)構(gòu)的核心定義如下所示:
由于報表作用域為整個Site,所有專業(yè)和工作階段的工單基本信息都會導(dǎo)出,為了過濾出浮體專業(yè)信息,在SmartPlant Foundation 中查找到半成品完成狀態(tài)跟蹤報表,編輯其定義,通過篩選條件過濾不必要的數(shù)據(jù)。例如篩選浮體專業(yè)的下料類型的工單,在Criteria一列增加篩選條件 Discipline=“Structural”,Purpose=“ST_Plate_Cut”or“ST_Shape_Cut”。
半成品管理的原理是在不同建造階段,建立原材料和半成品或者半成品和半成品之間的關(guān)聯(lián)關(guān)系。例如,下料工單中名稱為3SD-CR-DWG-S10-ST-0201-VL-A36-10-0003.TXT-01 某鋼板,其 NestingList 的屬性值為一個列表,包含本張鋼板下料后的所有桿件及數(shù)量信息,我們稱之為Nesting,每個Nesting 以“,”作為分隔。Nesting 的結(jié)構(gòu)為“桿件名稱”+“:”+“桿件數(shù)量”,即某下料方案下唯一的桿件名稱(TAG_ID)和該桿件數(shù)量(QTY)。某下料方案下的所有工藝步驟完成意味著此鋼板即具備下一階段建造即一級預(yù)制的條件。程序?qū)⒁韵铝戏桨柑枺―WG_ID)作為篩選條件,補充其他信息,導(dǎo)出下料后半成品。此鋼板下料后會產(chǎn)生余料,即屬性ExcessMaterialList 的值,與NestingList處理方式一樣,補充其他信息,作為下料半成品導(dǎo)出。除下料階段外,其他建造階段半成品管理是通過TagID實現(xiàn)的。例如一級預(yù)制工單,TagID 同為101_CS01_T1的桿件完成比全部達到100%,則將101_CS01_T1 作為下一階段建造的半成品導(dǎo)出。
根據(jù)半成品管理需求,功能實現(xiàn)通過開發(fā)插件讀取半成品狀態(tài)跟蹤報表,分析報表處理數(shù)據(jù)后,導(dǎo)出SmartPlant Material 軟件能夠識別的半成品入庫清單。插件引入pandas 庫進行xlsx 文件的讀寫操作,使用dataframe 數(shù)據(jù)結(jié)構(gòu)按工單類型篩選半成品狀態(tài)跟蹤報表進行數(shù)據(jù)分組。浮體專業(yè)半成品管理分為下料、預(yù)制、裝配和總裝四個階段,某些階段會根據(jù)工作小類型進一步細分。 例如下料階段分為板材下料(ST_Plate_Cut)和型材下料(ST_Shape_Cut),預(yù)制階段分為針對于T 型梁、組合梁、立柱、拉筋、舾裝預(yù)制件和其他結(jié)構(gòu)附件的一級預(yù)制(ST_1st_Fabr)和針對于船體板片和組塊甲板片的二級預(yù)制(ST_2ed_Fabr)。裝配階段分為船體分段裝配(ST_Block_Asse)和上部模塊裝配(ST
_Module_Asse)。在插件程序中數(shù)據(jù)分組代碼如下:
df=pd.read_excel(excel_path,sheetname=0)
# 按照不同的建造階段篩選數(shù)據(jù),使用dataframe 進行存儲
df_1st_Fabr=df[df["Purpose"]=="ST_1st_Fabr"]
df_2ed_Fabr=df[df["Purpose"]=="ST_2ed_Fabr"]
df_Block_Asse=df[df["Purpose"]=="ST_Block_Asse"]
df_Module_Asse=df[df["Purpose"]=="ST_Module_Asse"]
df_Erection=df[df["Purpose"]=="ST_Erection"]
df_Plate_Cut=df[df["Purpose"]=="ST_Plate_Cut"]
df_Shape_Cut=df[df["Purpose"]=="ST_Shape_Cut"]
#獲取關(guān)鍵字集合,預(yù)制和裝配工單關(guān)鍵字為ParentID,下料工單關(guān)鍵字為DrawingID
s_1st_Fabr_pid=set(df_1st_Fabr["ParentID"])
s_2ed_Fabr_pid=set(df_2ed_Fabr["ParentID"])
s_Block_Asse_pid=set(df_Block_Asse["ParentID"])
s_Module_Asse_pid=set(df_Module_Asse["ParentID"])
s_Erection_pid=set(df_Erection["ParentID"])
s_Plate_Cut_dwg=set(df_Plate_Cut["DrawingID"])
s_Shape_Cut_dwg=set(df_Shape_Cut["DrawingID"])
#結(jié)果數(shù)據(jù)存儲在list 中
l_result=[]
針對于不同數(shù)據(jù)分組,其數(shù)據(jù)處理方式也會有區(qū)別,本文以一級預(yù)制和板材下料為例,將其核心代碼進行演示。
一級預(yù)制類型工單數(shù)據(jù)處理核心代碼如下:
for pid in s_1st_Fabr_pid:
df_ass_pid=df_1st_Fabr[df_1st_Fabr["ParentID"]==pid]
df_ass_pid.loc[:,("Units")] = df_ass_pid.loc[:,("Units")].map(lambda x:round(float(x.split("")[0]),1))
df_ass_pid.loc[:,("QuantityComplete")]=df_ass_pid.loc[:,("QuantityComplete")].map(lambda x:round(float(x),1))
s_judge = df_ass_pid.apply(lambda x: judge(x.Units, x.QuantityComplete),axis=1)
if 0 not in s_judge.values:
DISCIPLINE="STRUCTURE"
CONS_PHASE="FAB_TRACK"
SD_DOC=df_ass_pid.iloc[0]["DrawingID"]
DWG_ID="BCP-"+df_ass_pid.iloc[0]["DrawingID"]
ITR="TAG WO MS"
TAG_ID=df_ass_pid.iloc[0]["ParentID"]
QTY=1
UNIT="each"
COMP_TYPE="PART"
WAREHOUSE="ST-BCP-TAG"
LOCATION=df_ass_pid.iloc[0]["WorkPlace"].upper()
s_result=[DISCIPLINE,CONS_PHASE,SD_DOC,DWG_ID,ITR,TAG_ID,QTY,UNIT,COMP_TYPE,WARE -HOUSE,LOCATION]
l_result.append(s_result)
下料類型工單數(shù)據(jù)處理核心代碼如下:
for dwg in s_Plate_Cut_dwg:
df_cut_dwg=df_Plate_Cut[df_Plate_Cut["DrawingID"] ==dwg]
df_cut_dwg.loc[:,("Units")] =df_cut_dwg["Units"].map(lambda x:round(float(x.split("")[0]),1))
df_cut_dwg.loc[:, ("QuantityComplete")] =df_cut_dwg["QuantityComplete"].map(lambda x:round(float(x),1))
s_judge=df_cut_dwg.apply(lambda x:judge(x.Units,x.QuantityComplete),axis=1)
if 0 not in s_judge.values:
nestinglist=set(df_cut_dwg.iloc[0]["NestingList"].split(","))
for nesting in nestinglist:
DISCIPLINE="STRUCTURE"
CONS_PHASE="FAB_TRACK"
SD_DOC=df_cut_dwg.iloc[0]["DocumentID"]
DWG_ID="BCP-"+df_cut_dwg.iloc[0]["DrawingID"]
ITR="TAG WO MS"
TAG_ID=nesting.split(":")[0]
QTY=int(nesting.split(":")[1])
UNIT="each"
COMP_TYPE="PART"
WAREHOUSE="ST-BCP-TAG"
LOCATION=df_cut_dwg.iloc[0]["WorkPlace"].upper()
s_result = [DISCIPLINE, CONS_PHASE, SD_DOC,
DWG_ID, ITR, TAG_ID, QTY, UNIT,COMP_TYPE, WARE
HOUSE,LOCATION]
l_result.append(s_result)
if pd.isnull(df_cut_dwg.iloc[0]["ExcessMaterialList"])==
False:
#if","in df_cut_dwg.iloc[0]["ExcessMaterialList"]:
ExcessMaterialList = set(df_cut_dwg.iloc[0]["Excess-
MaterialList"].split(","))
#else:ExcessMaterialList=set({df_cut_dwg.iloc[0]["Ex
cessMaterialList"]})
for excessmaterial in ExcessMaterialList:
DISCIPLINE="STRUCTURE"
CONS_PHASE="FAB_TRACK"
SD_DOC=df_cut_dwg.iloc[0]["DocumentID"]
DWG_ID="BCP-"+df_cut_dwg.iloc[0]["DrawingID"]
ITR="TAG WO MS"
TAG_ID=excessmaterial
QTY=1
UNIT="each"
COMP_TYPE="PART"
WAREHOUSE="ST-BCP-TAG"
LOCATION = df_cut_dwg.iloc[0]["WorkPlace"].upper()
s_result = [DISCIPLINE, CONS_PHASE, SD_DOC,DWG_ID, ITR, TAG_ID, QTY,UNIT, COMP_TYPE, WAREHOUSE,LOCATION]
l_result.append(s_result)
插件集成在PCMS-PLUS 網(wǎng)站中,該功能用戶通過網(wǎng)站進行報表上傳和入庫清單下載。插件語言選型為Python,網(wǎng)站框架選型為Django+HTML5。
圖1 網(wǎng)站頁面截圖
本文給出了基于PCMS 系統(tǒng)的海洋工程浮體專業(yè)半成品管理功能實現(xiàn)的原理和應(yīng)用方法的演示,該功能可用于解決PCMS 系統(tǒng)推廣應(yīng)用中的一些相關(guān)問題,具有一定的實際意義。用Python 語言實現(xiàn)的插件程序則有助于讀者更好地理解和把握該功能的實現(xiàn)過程。用網(wǎng)站界面實現(xiàn)的半成品材料數(shù)據(jù)管理流程有助于用戶操作易懂,簡化操作步驟,對管理員來說易于維護。