吳濤,曹紀(jì)慧
(海洋石油工程(青島)有限公司,青島 266000)
眾所周知,浮體建造過程中結(jié)構(gòu)專業(yè)的原材料主要為板材或者型材,當(dāng)原材料下料后到模塊或者船體總裝搭載前,每個(gè)建造階段所產(chǎn)生的結(jié)構(gòu)體統(tǒng)稱為半成品。本文概述了浮體建造過程中對(duì)半成品的管理方案,此方案主要用于浮體制造的下料、預(yù)制和裝配三個(gè)階段。下料工單完成工作量反饋后,通過半成品管理功能可篩選出具備下一階段建造條件的桿件,并根據(jù)工作階段和類型將數(shù)據(jù)進(jìn)行合并或拆分,自動(dòng)導(dǎo)出半成品材料清單,并能為下一階段的工單中進(jìn)行材料預(yù)測(cè)預(yù)留,最終實(shí)現(xiàn)半成品管理。
PCMS(Project Construction Management System)即工程項(xiàng)目建造管理系統(tǒng),是基于鷹圖公司SmartYard 軟件系列產(chǎn)品,在數(shù)據(jù)標(biāo)準(zhǔn)化和規(guī)范的基礎(chǔ)上,結(jié)合海洋石油工程股份有限公司建造事業(yè)部個(gè)性化的工程項(xiàng)目管理需求,定制開發(fā)的一套用于海洋工程類項(xiàng)目建造全生命周期管理的信息集成系統(tǒng)。系統(tǒng)以三個(gè)軟件SPF(基礎(chǔ)數(shù)據(jù)平臺(tái))、SPC(施工管理模塊)、SPM(材料管理模塊)為基礎(chǔ),以工單為載體,打通設(shè)計(jì)、計(jì)劃、物資和生產(chǎn)的信息瓶頸,以符合行業(yè)內(nèi)AWP(Advanced Work Package)管理體系標(biāo)準(zhǔn),提高建造施工組織效率。
根據(jù)AWP 管理體系標(biāo)準(zhǔn),PCMS 系統(tǒng)的工單是一個(gè)IWP(Installation Work Packages)級(jí)別施工范圍,可動(dòng)態(tài)展現(xiàn)該IWP 計(jì)劃、材料、設(shè)計(jì)、進(jìn)度等信息。工單最重要的功能之一是實(shí)現(xiàn)材料預(yù)測(cè)預(yù)留,系統(tǒng)根據(jù)加工設(shè)計(jì)的材料需求和現(xiàn)場(chǎng)材料入庫(kù)情況進(jìn)行精確匹配。在項(xiàng)目建造階段,每個(gè)專業(yè)的工單分為多種類型。以企鵝項(xiàng)目浮體專業(yè)為例,工單類型分別為下料、一級(jí)預(yù)制、二級(jí)預(yù)制、裝配、總裝。工單類型對(duì)應(yīng)著不同的施工階段。
從下料階段開始到總裝階段結(jié)束,每一個(gè)建造階段都會(huì)產(chǎn)生半成品。半成品建造完成后會(huì)存放在預(yù)制場(chǎng)地,不會(huì)進(jìn)行入庫(kù),因此下一建造階段的工單包含該半成品材料時(shí),需要明確該半成品是否已經(jīng)完成建造并且檢驗(yàn)釋放。通過PCMS 系統(tǒng)工單執(zhí)行情況,從而判別出半成品材料的建造狀態(tài),實(shí)現(xiàn)半成品管理,使各個(gè)建造階段都可以進(jìn)行材料預(yù)測(cè)預(yù)留是本文研究的重點(diǎn)。
半成品完成狀態(tài)跟蹤報(bào)表是通過用戶定義含有Schema 數(shù)據(jù)結(jié)構(gòu)的XML 文件在SmartPlant Foundation軟件中進(jìn)行定制,此報(bào)表可導(dǎo)出當(dāng)前生產(chǎn)項(xiàng)目工單執(zhí)行的完成量、完成時(shí)間等基本信息,并以xls 格式存儲(chǔ)。報(bào)表每行以該項(xiàng)目所有工單的工藝步驟為單位,表結(jié)構(gòu)如表1 所示。
表1 半成品完成狀態(tài)跟蹤報(bào)表的表結(jié)構(gòu)
Schema 數(shù)據(jù)結(jié)構(gòu)的核心定義如下所示:
由于報(bào)表作用域?yàn)檎麄€(gè)Site,所有專業(yè)和工作階段的工單基本信息都會(huì)導(dǎo)出,為了過濾出浮體專業(yè)信息,在SmartPlant Foundation 中查找到半成品完成狀態(tài)跟蹤報(bào)表,編輯其定義,通過篩選條件過濾不必要的數(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 的屬性值為一個(gè)列表,包含本張鋼板下料后的所有桿件及數(shù)量信息,我們稱之為Nesting,每個(gè)Nesting 以“,”作為分隔。Nesting 的結(jié)構(gòu)為“桿件名稱”+“:”+“桿件數(shù)量”,即某下料方案下唯一的桿件名稱(TAG_ID)和該桿件數(shù)量(QTY)。某下料方案下的所有工藝步驟完成意味著此鋼板即具備下一階段建造即一級(jí)預(yù)制的條件。程序?qū)⒁韵铝戏桨柑?hào)(DWG_ID)作為篩選條件,補(bǔ)充其他信息,導(dǎo)出下料后半成品。此鋼板下料后會(huì)產(chǎn)生余料,即屬性ExcessMaterialList 的值,與NestingList處理方式一樣,補(bǔ)充其他信息,作為下料半成品導(dǎo)出。除下料階段外,其他建造階段半成品管理是通過TagID實(shí)現(xiàn)的。例如一級(jí)預(yù)制工單,TagID 同為101_CS01_T1的桿件完成比全部達(dá)到100%,則將101_CS01_T1 作為下一階段建造的半成品導(dǎo)出。
根據(jù)半成品管理需求,功能實(shí)現(xiàn)通過開發(fā)插件讀取半成品狀態(tài)跟蹤報(bào)表,分析報(bào)表處理數(shù)據(jù)后,導(dǎo)出SmartPlant Material 軟件能夠識(shí)別的半成品入庫(kù)清單。插件引入pandas 庫(kù)進(jìn)行xlsx 文件的讀寫操作,使用dataframe 數(shù)據(jù)結(jié)構(gòu)按工單類型篩選半成品狀態(tài)跟蹤報(bào)表進(jìn)行數(shù)據(jù)分組。浮體專業(yè)半成品管理分為下料、預(yù)制、裝配和總裝四個(gè)階段,某些階段會(huì)根據(jù)工作小類型進(jìn)一步細(xì)分。 例如下料階段分為板材下料(ST_Plate_Cut)和型材下料(ST_Shape_Cut),預(yù)制階段分為針對(duì)于T 型梁、組合梁、立柱、拉筋、舾裝預(yù)制件和其他結(jié)構(gòu)附件的一級(jí)預(yù)制(ST_1st_Fabr)和針對(duì)于船體板片和組塊甲板片的二級(jí)預(yù)制(ST_2ed_Fabr)。裝配階段分為船體分段裝配(ST_Block_Asse)和上部模塊裝配(ST
_Module_Asse)。在插件程序中數(shù)據(jù)分組代碼如下:
df=pd.read_excel(excel_path,sheetname=0)
# 按照不同的建造階段篩選數(shù)據(jù),使用dataframe 進(jìn)行存儲(chǔ)
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ù)存儲(chǔ)在list 中
l_result=[]
針對(duì)于不同數(shù)據(jù)分組,其數(shù)據(jù)處理方式也會(huì)有區(qū)別,本文以一級(jí)預(yù)制和板材下料為例,將其核心代碼進(jìn)行演示。
一級(jí)預(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)站進(jìn)行報(bào)表上傳和入庫(kù)清單下載。插件語(yǔ)言選型為Python,網(wǎng)站框架選型為Django+HTML5。
圖1 網(wǎng)站頁(yè)面截圖
本文給出了基于PCMS 系統(tǒng)的海洋工程浮體專業(yè)半成品管理功能實(shí)現(xiàn)的原理和應(yīng)用方法的演示,該功能可用于解決PCMS 系統(tǒng)推廣應(yīng)用中的一些相關(guān)問題,具有一定的實(shí)際意義。用Python 語(yǔ)言實(shí)現(xiàn)的插件程序則有助于讀者更好地理解和把握該功能的實(shí)現(xiàn)過程。用網(wǎng)站界面實(shí)現(xiàn)的半成品材料數(shù)據(jù)管理流程有助于用戶操作易懂,簡(jiǎn)化操作步驟,對(duì)管理員來說易于維護(hù)。