傅聰 張艷紅 付冬梅 楊燾
【關鍵詞】服務通告;人工工時;Web技術;軟件設計
【中圖分類號】TP393.09;U695.2【文獻標識碼】A【文章編號】1674-0688(2021)06-0053-04
0 引言
服務通告人工工時包括最短施工時間和總?cè)斯すr。最短施工時間是指完成一項工程,在人力資源充足、工人操作嫻熟且沒有發(fā)生特殊狀況的情況下,工程施工周期的最小值。與最短施工時間不同,總?cè)斯すr是指完成一項工程所有工序,在工人操作嫻熟且沒有發(fā)生特殊狀況的情況下,所有工人花費的工時之和。由于工程施工期間可以讓多道工序同時進行,所以最短施工時間一般小于總?cè)斯すr [1]。
目前,服務通告人工工時的制定主要依賴專業(yè)工程技術人員的經(jīng)驗,人為主觀因素影響很大,沒有相對科學的理論依據(jù)作為支撐,而實際的工程工序時長具有一定的時間不確定性,使得這種憑借經(jīng)驗的人工工時的可靠性較低。
本文旨在利用Web等技術 [2-5],通過分析某型飛機制造商已發(fā)布的部分服務通告,借助網(wǎng)絡計劃理論 [6],設計和開發(fā)一套能夠計算服務通告人工工時的軟件,提高服務通告制定效率,減少服務通告人工工時制定過程中受主觀因素的影響,提升服務通告的參考價值。
1 軟件總體功能說明
本文設計開發(fā)的軟件主要具有三大功能:經(jīng)驗數(shù)據(jù)查詢、人工工時計算、數(shù)據(jù)提取更新。用戶可以通過輸入關鍵字和給定精確度查詢數(shù)據(jù)庫中已有的服務通告人工工時統(tǒng)計數(shù)據(jù)、工序數(shù)和文件下載鏈接;通過軟件提供的數(shù)據(jù)提取更新功能,數(shù)據(jù)庫管理者只需要上傳服務通告PDF文件,就可以自動提取并統(tǒng)計數(shù)據(jù);在工序時長和前后關系已知的情況下,用戶通過輸入工序表信息,可以得到理論人工工時計算結(jié)果。軟件功能結(jié)構(gòu)圖如圖1所示。
2 軟件開發(fā)與設計說明
服務器端運行Linux系統(tǒng),使用Nginx作為靜態(tài)服務器,使用uWSGI作為應用程序服務器運行Python程序,軟件采用基于Python語言的Flask后端框架 [7-10]和基于JavaScript [11]語言的Vue前端框架 [12-13]相耦合,前端使用BootStrap實現(xiàn)響應式布局,用戶使用瀏覽器輸入服務器的網(wǎng)址即可使用軟件。
2.1 服務器
服務器的Python CGI腳本作為數(shù)據(jù)I/O模塊,能夠處理不同請求。
(1)請求查詢數(shù)據(jù)時:將收到的關鍵字符串交給Python數(shù)據(jù)庫模塊的查詢接口,使用數(shù)據(jù)搜索算法查找結(jié)果,然后將查詢的結(jié)果發(fā)送給客戶端。
(2)請求下載文件時:根據(jù)請求的文件名將文件發(fā)送給客戶端。
(3)請求上傳文件時:首先將上傳的數(shù)據(jù)轉(zhuǎn)交給Python數(shù)據(jù)提取模塊,借助正則表達式和數(shù)據(jù)提取算法進行字符匹配和提取,然后交給Python數(shù)據(jù)庫模塊的更新接口,使用在線數(shù)據(jù)統(tǒng)計算法更新數(shù)據(jù)庫的數(shù)據(jù),最后將處理成功與否返回給客戶端。
2.2 客戶端
當客戶端請求主頁Html和Javascript文件后,客戶端Vue按Html模板渲染網(wǎng)頁,基于Vue的Javascript腳本數(shù)據(jù)I/O模塊作為客戶端運行的核心,協(xié)調(diào)內(nèi)部數(shù)據(jù),使由Html文件和Bootstrap構(gòu)成的GUI模塊能夠動態(tài)響應用戶輸入。
(1)當用戶輸入時:數(shù)據(jù)I/O模塊自動檢查并更新GUI模塊中的數(shù)據(jù),使用自動糾錯算法糾正錯誤輸入。
(2)當用戶要計算數(shù)據(jù)時:數(shù)據(jù)I/O模塊將GUI模塊中的數(shù)據(jù)交給工時計算模塊,使用樹枝圖算法計算最短施工時間和總?cè)斯すr結(jié)果,將返回的結(jié)果更新到GUI模塊中。
(3)當用戶要查詢或更新數(shù)據(jù)時:數(shù)據(jù)I/O模塊將GUI模塊中的數(shù)據(jù)發(fā)送給服務器數(shù)據(jù)更新接口,將返回的結(jié)果更新到GUI模塊中。
2.3 數(shù)據(jù)庫
在數(shù)據(jù)庫結(jié)構(gòu)方面,軟件使用的數(shù)據(jù)庫由服務通告元數(shù)據(jù)表(命名sb)和統(tǒng)計數(shù)據(jù)表(命名count)組成,其定義如圖2所示。數(shù)據(jù)表sb用來記錄數(shù)據(jù)提取模塊產(chǎn)生的數(shù)據(jù),數(shù)據(jù)表count用來統(tǒng)計數(shù)據(jù)表sb中的數(shù)據(jù)記錄。
2.4 算法設計
2.4.1 樹枝圖算法
算法的輸入:工序表,工序表中每道工序具有名稱、時長、緊前工序3個基本屬性,其中緊前工序的名稱與工序名稱是對應的。算法的輸出:最短施工時間、關鍵工序、總?cè)斯すr。
樹枝圖算法的關鍵是選取可選工序和獲得所有工序路線施工時間的最大值。對于前者,程序應該在每次選擇之前判斷哪些工序可以選擇;對于后者,程序需要找出所有工序路線,比較各條工序路線的施工時間,然后得到所有工序路線施工時間的最大值,作為工程最短施工時間。
算法運行過程:①以一個空數(shù)組和初始時刻0為初始參數(shù)開始,遍歷所有工序表中可選的工序;②每次將一道可選工序的名稱加入數(shù)組,并將初始時刻加上該工序時長得到新的時刻,如果沒有可選工序,則轉(zhuǎn)到過程?譼?訛;③以所得到的數(shù)組和新的時刻為初始參數(shù)開始重復上述過程?譹?訛;④將數(shù)組和時刻作為一條結(jié)果保存在結(jié)果數(shù)組中,由于所有可選工序都遍歷了一遍,所以結(jié)果數(shù)組中保存的就是所有的工序路線;⑤利用基本的排序與求和算法找到最大值和工序時長之和,即可得到最短施工時間和總?cè)斯すr。
圖3是利用樹枝圖算法計算所有路線及其總工時的算法流程圖,其中“能否放入隊列”是一個布爾表達式,“調(diào)用自身”指的是程序遞歸調(diào)用自身,括號部分是調(diào)用時輸入的參數(shù)。
2.4.2 自動邏輯檢測
算法的輸入:當前操作的工序節(jié)點、工序表。算法的輸出:經(jīng)過調(diào)整(禁用錯誤選項)的工序表。
幫助用戶避免錯誤選項的原理是禁用錯誤選項,所以算法的核心是設法得到每道工序需要禁用的選項,每次用戶對緊前工序做出改變時,就可能需要重新設置工序的禁用選項,用戶既能添加緊前工序,也能刪除緊前工序,所以程序既需要能禁用選項,也需要能恢復選項,為了方便理解,以下論述把“緊前工序”稱為“依賴”。
禁用選項:假設工序A增加了一個依賴B,則工序B的依賴不能選擇工序A,所以工序B將A加入禁用選項中,這只解決了部分問題,如果工序C是工序B的依賴,當工序C選擇A作為依賴時,錯誤就會發(fā)生,因為A等待B完成,B等待C完成,C卻等待A完成,解決方法是將A加入B、B的依賴、B的依賴的依賴、B的依賴的依賴的依賴(簡稱B的依賴路徑)……的禁用選項中,可以使用遞歸算法實現(xiàn)。
恢復選項:假設工序A刪除了一個依賴B,這時不能盲目地將B的禁用選項A刪除,因為工序A可能有一個依賴C,而C的依賴是B,根據(jù)禁用選項部分的論述,B依然不能將A作為依賴,即B的禁用選項A不能恢復。這種情況發(fā)生的根源是A存在其他含有B的依賴路徑,所以解決方法是將B的依賴路徑減去A依賴路徑與B依賴路徑的交集,所剩余的依賴為恢復選項,即從禁用選項中刪除。
算法運行過程:①根據(jù)節(jié)點判斷需要禁用還是恢復過程;②遞歸查找禁用(恢復)列表;③根據(jù)禁用(恢復)列表調(diào)整工序表。自動檢測算法流程圖如圖4所示。
2.4.3 自動提取數(shù)據(jù)
算法的輸入:服務通告PDF原件。算法的輸出:服務通告中的最短施工時間、總?cè)斯すr、工序步驟。
PDF文件不便于數(shù)據(jù)提取,所以選擇使用工具將PDF轉(zhuǎn)化為文本文件,這里選擇了Python工具pdftotext,使用layout選項以保留頁面布局,文本轉(zhuǎn)化好之后,可以利用Perl的文本處理功能提取數(shù)據(jù),因為Perl原生支持正則表達式,使用Perl正則表達式進行文本匹配時,程序在循環(huán)中進行,每次只匹配一行,每個文件中關于人工工時部分的信息重復出現(xiàn)了兩次,所以需要設置一個變量作為開關,當匹配了一次結(jié)果后就關閉開關以避免重復。
對于標題部分,原標題是一個用“-”連接的整體,并且使用了不同的編碼表示“-”,這非常不便于數(shù)據(jù)拆分統(tǒng)計,所以標題需要經(jīng)過二次處理,利用正則表達式的替換功能,把各種編碼的“-”替換稱制表符,只有這樣,統(tǒng)計分析模塊才能分析處理。
對于工序部分,服務通告內(nèi)的工序非常復雜,有的工序包含子工序,甚至子工序的子工序,為了處理方便和數(shù)據(jù)簡潔,程序只處理到第一層工序(即不包含子工序),這樣仍然不能正常提取,單行的工序與子工序之間幾乎沒有格式上的差異(即使人工比較單行工序也很難發(fā)現(xiàn)差異),仔細思考人理解文件的方式后發(fā)現(xiàn),人可以進行上下文比對,而程序是單行匹配的,為了讓程序也能上下文比對,而不破壞逐行匹配的模式,程序使用了一些上下文變量以提供上下文比對的功能,匹配前先檢查上下文變量以決定是否匹配當前行,以及上一行匹配結(jié)果是否有效,這樣處理后,程序匹配工序失誤的概率顯著降低。
2.4.4 自動統(tǒng)計數(shù)據(jù)
算法的輸入:新加入的服務通告最短施工時間、總?cè)斯すr,數(shù)據(jù)的原統(tǒng)計結(jié)果。算法的輸出:數(shù)據(jù)的新統(tǒng)計結(jié)果。
數(shù)據(jù)統(tǒng)計可以使用離線算法,也可以使用在線算法,離線算法需要輸入所有數(shù)據(jù),沒有利用已完成的統(tǒng)計結(jié)果,效率低下,所以使用在線算法。
在數(shù)據(jù)庫中,使用一張數(shù)據(jù)表存儲所有數(shù)據(jù),使用另一張數(shù)據(jù)表存儲中間結(jié)果和統(tǒng)計量,其中每一條記錄代表標題屬性相同的同類數(shù)據(jù),為了統(tǒng)計最大值、最小值、平均值、眾數(shù)等統(tǒng)計量,需要在每條記錄中存儲已統(tǒng)計過的數(shù)據(jù),這樣統(tǒng)計時就不用從所有數(shù)據(jù)中搜索同類數(shù)據(jù)。
由于數(shù)據(jù)庫很難存儲復雜的數(shù)據(jù)(比如數(shù)組),所以已經(jīng)統(tǒng)計過的數(shù)據(jù)不能以數(shù)組結(jié)構(gòu)存儲,解決方法是使用一種變通策略,將數(shù)組轉(zhuǎn)化為字符串存儲在數(shù)據(jù)庫中,在使用時將字符串轉(zhuǎn)化為數(shù)組。為了實現(xiàn)這種策略,轉(zhuǎn)化為字符串時應遵循某種規(guī)則,保證這種轉(zhuǎn)化是可逆的。在本程序的轉(zhuǎn)化中,數(shù)組元素之間插入了特殊符號,在解析字符串時以這種符號將字符串分割為數(shù)組,這樣帶來的好處是不需要修改數(shù)據(jù)庫的定義就可以存儲自定義的數(shù)據(jù),而且可以方便地重新定義數(shù)據(jù)。
獲得了已統(tǒng)計過的數(shù)據(jù)后,統(tǒng)計量的計算就變得非常簡單,將新統(tǒng)計的數(shù)據(jù)與原最大值、最小值比較可以獲得新的最大值、最小值,搜索新數(shù)據(jù)的出現(xiàn)頻率與原眾數(shù)出現(xiàn)頻率,然后比較得到新的眾數(shù)值,其他統(tǒng)計量的計算過程類似,此處不再贅述。
2.4.5 數(shù)據(jù)搜索算法
算法的輸入:搜索關鍵字、搜索精確度。算法的輸出:匹配到的相關服務通告最短施工時間、總?cè)斯すr等數(shù)據(jù)。
要實現(xiàn)數(shù)據(jù)搜索,直接使用數(shù)據(jù)庫的查詢功能是不行的,因為SELECT語句擅長根據(jù)其他屬性篩選數(shù)據(jù),所以屬性值必須完全符合才能正確匹配,而數(shù)據(jù)搜索功能更像常用網(wǎng)頁搜索引擎的模糊匹配功能,即使輸入不精確的信息也能得到想要的結(jié)果。
為了實現(xiàn)模糊匹配功能,程序需要對輸入關鍵字進行拆分,由于將關鍵字拆分為單個詞匯在不使用自然語言處理技術的情況下可能比較困難,而使用自然語言處理技術已經(jīng)超出能力范圍,所以程序?qū)㈥P鍵字拆分成字符而非詞匯。
獲得分割好的各級別的字符集(簡稱為源字符)后,程序每次掃描一條數(shù)據(jù)的標題部分,以相同的方式對標題各級別進行分割得到字符集(簡稱目標字符)。每次掃描一個源字符,如果源字符與某一個目標字符相同,稱為一次命中,命中的次數(shù)與源字符個數(shù)之比稱為匹配度,完成源字符掃描后,計算匹配度,如果匹配度超過設定的閾值,則該數(shù)據(jù)匹配成功,否則失敗。
為了更精準地匹配同級關鍵字,同時具有匹配非同級關鍵字的能力,只需對以上算法稍做修改:增加一次對同級別字符的掃描,計算匹配度時將源字符個數(shù)乘2,其他不變,這樣同級匹配權(quán)值為1,不同級匹配權(quán)值為0.5,在閾值較高時,可以排除非同級關鍵字匹配;當閾值較低時,可以匹配非同級關鍵字。當閾值達到100%時,程序?qū)⒉辉龠M行模糊匹配,而只有關鍵字完整連續(xù)匹配時,才能匹配成功,這樣做可以適應更高的匹配需求。
3 軟件界面與應用
基于Python語言開發(fā)了服務器端程序,包括數(shù)據(jù)I/O模塊、數(shù)據(jù)庫模塊、數(shù)據(jù)提取模塊;基于JavaScript語言開發(fā)了瀏覽器端程序,包括數(shù)據(jù)I/O模塊、工時計算模塊、GUI交互模塊,主頁包括頂部導航欄、數(shù)據(jù)輸入欄、表格展示區(qū)、底部裝飾欄4個區(qū)域。
假設已知某服務通告的大致類別為空調(diào)-軟管。在數(shù)據(jù)輸入欄的查詢區(qū)分別輸入“空調(diào)”“軟管”,點擊查詢即可快速獲得參考工時。調(diào)節(jié)查詢精準度:移動數(shù)據(jù)輸入欄的滑塊,重新點擊查詢即可,查詢的結(jié)果中的“詳情”可在點擊后顯示此記錄所統(tǒng)計的服務通告工序數(shù)和文件下載鏈接。
假設當前工程需要3道工序P1、P2、P3,其中P2和P3互不影響,但必須在完成P1后才能開始,在已知每道工序的最小時長、最大時長、平均時長的條件下,計算人工工時。首先,在左側(cè)數(shù)據(jù)輸入欄的計算區(qū)輸入工序數(shù)3,點擊“確定”后在右側(cè)生成工序表,填寫工序表各項數(shù)據(jù)時分別在P2和P3的“緊前工序”中選擇P1,點擊“計算”即可得到人工工時計算結(jié)果。在填寫工序表時,如果左側(cè)數(shù)據(jù)輸入欄中的邏輯檢測功能處于開啟狀態(tài),則會為每道工序的“緊前工序”剔除所有會造成邏輯錯亂的選項,避免因誤填而導致的錯誤。
軟件內(nèi)部數(shù)據(jù)來自已發(fā)布的服務通告文件,可實現(xiàn)文件到數(shù)據(jù)的自動轉(zhuǎn)換。應用內(nèi)的數(shù)據(jù)一般在后端添加和處理,為了方便數(shù)據(jù)更新,本應用還提供了從瀏覽器端更新數(shù)據(jù)的功能,由于上傳行為受網(wǎng)絡狀況影響較大,所以建議不要以此方式更新大量數(shù)據(jù)。
在數(shù)據(jù)輸入欄點擊“選擇文件”按鈕,瀏覽器調(diào)用系統(tǒng)的文件瀏覽器,選擇需要上傳的PDF文件(按住Ctrl可多選),點擊“打開”,按鈕右側(cè)會顯示已選擇了幾個文件,點擊“上傳”按鈕,如果沒有后端正在更新數(shù)據(jù),也沒有其他客戶端正在更新數(shù)據(jù)時,后端會接收文件,提取數(shù)據(jù),添加到數(shù)據(jù)庫,并更新統(tǒng)計數(shù)據(jù)以供查詢,之后瀏覽器提示文件處理情況,后端的所有操作全部自動完成,不需要人為干預。如果有后端正在更新數(shù)據(jù),或者其他客戶端正在更新數(shù)據(jù),瀏覽器會彈出提示,請耐心等待其他數(shù)據(jù)更新完畢。
4 結(jié)語
采用先進的Web應用技術和網(wǎng)絡計劃理論,開發(fā)了服務通告人工工時計算的軟件,實現(xiàn)了一整套數(shù)據(jù)提取、統(tǒng)計、搜索的人工工時數(shù)據(jù)庫系統(tǒng),提供有價值的工時參考數(shù)據(jù),解決了僅憑工程經(jīng)驗估計工時的人為主觀影響和時間不確定性的問題。軟件采用跨平臺用戶界面,在不同需求下都具有良好的交互體驗。
參 考 文 獻
[1]嚴煥迪,邢廣華.民用飛機服務通告編制及管理分析[J].航空工程進展,2019,10(2):194-200.
[2]李寧,吳之明.網(wǎng)絡計劃技術的新發(fā)展——項目關鍵鏈管理(CCPM)[J].公路,2002(10):85-88.
[3]葉鋒.Python最新Web編程框架Flask研究[J].電腦編程技巧與維護,2015(15):27-28.
[4]李廣宏.vue.js前端應用技術分析[J].中國新通信,2019,21(20):115.
[5]劉志洋.ajax技術在web程序開發(fā)中的運用探討[J].輕紡工業(yè)與技術,2020,49(2):169-170.
[6]孫紀周,朱鋒,趙芳,等.基于WEB及APP的設備維修管理系統(tǒng)[J].軟件,2020,41(1):165-169.
[7]牛作東,李捍東.基于Python與flask工具搭建可高效開發(fā)的實用型MVC框架[J].計算機應用與軟件,2019,
36(7):21-25.
[8]李超,徐云龍,華中偉,等.一種基于Python Flask的Web服務器端設計[J].信息與電腦(理論版),2019(8):87-88.
[9]鄧成,孫書會.MVVM設計模式的前端應用[J].電腦知識與技術,2019(29):249-250.
[10]呂英華.漸進式JavaScript框架Vue.js的全家桶應用[J].電子技術與軟件工程,2019(22):39-40.
[11]劉鵬.移動Web3.0時代AJAX技術在個性化開發(fā)中的作用[J].電子技術與軟件工程,2018(22):59-60.
[12]盧愛芬.基于H5中的Bootstrap框架技術的應用與研究[J].電腦知識與技術,2020,16(7):54-56.
[13](美)格林布戈.Flask Web開發(fā):基于Python的Web應用開發(fā)實戰(zhàn)[M].安道,譯.北京:人民郵電出版社,2015.