2020年對一個運行了20年系統進行了重構,最近功能都開發完了甲方領導又雙叒叕提出了個合理、必要、重要……的需求。
簡單描述一下,系統裡面針對現行業務基層填報的故障表(Excel格式)做了導入,但是發現這個表需要優化,主要目的是解決故障損失時間計算不準的問題。
拋去系統資料庫要加欄位、界面要重做、導入導出要重做等等僅增加工作量的任務不談,更麻煩的是用系統實現計算的話要加一系列的邏輯,各種校驗、計算等等,伴隨需求的變化,邏輯裡面的一些數值最好還得做成可配置……
為了變更管理制度方便,為了用戶錄入方便,為了開發方便,為了維護方便,為了程式設計師的發量,更重要的是為了提升一下Excel水平,我決定換個思路,在Excel裡面算當月損失時間,系統只做計算結果的導入。
通過跟甲方親切友好的溝通和討論,對故障表上報模板進行了一些修改;為了方便寫公式,很奢侈的用了兩個單元格分別記錄年份和月份。其他與公式相關的三個單元格分別是故障發生時間、故障解除時間、故障扣除時間。雖然同樣叫時間,但前兩個是時間點,最後一個是時間段。Excel部分截圖如下:
簡單說一下計算規則:首先,統計周期是上月25日8點到當月25日8點:其次,不考慮扣除的話,總的損失時間為解除的時間點-發生的時間點;第三,扣除時間指的是因不可抗力、油田甲方認可等不計算到故障損失時間中的時間;第四,計算當月損失時間時僅統計在當月統計周期內的損失時間。
窮舉了一下,4種情況4個公式:
當月發生當月解除:損失時間(h)=(解除時間點-發生時間點)×24-扣除時間(h)
當月發生當月未完:損失時間(h)=(統計周期終點-發生時間點)×24-扣除時間(h)
之前發生當月解除:損失時間(h)=(解除點-統計周期起點)×24-扣除時間(h)
之前發生當月未完:損失時間(h)=(統計周期終點-統計周期起點)×24-扣除時間(h)
我花兩秒鐘時間找了一下規律,總結出了以下通用公式:
當月損失時間=(min[統計周期終點\解除時間]-max[統計周期起點\發生時間])×24-扣除時間
然後就是喜聞樂見的構建Excel公式的環節。MIN()和MAX()函數是現成的,發生、解除、扣除時間直接取單元格錄入的值,只需要構造統計周期起點和終點。
構造統計周期終點使用了兩個函數,DATE(年,月,日)和TIME(時,分,秒),直接加即可,年、月分別取兩個錄入的單元格,其他的直接預設好,25日8:00:00。
最後只剩下了「統計周期起點」,這裡從公式列表裡找到了EOMONTH(日期,數字)函數,這個函數返回的是「日期」加上對應「數字」個月份的那個月的最後一天的日期。「數字」填-1就是上個月,用DAY()函數處理下就得到上個月的天數,最後在Excel裡面,統計周期起點 = 統計周期終點-上個月天數
總之在損失時間下面的單元格裡面寫了一行公式:
=(MIN(DATE(B2,D2,25)+TIME(8,0,0),G6)-MAX(DATE(B2,D2,25)+TIME(8,0,0)-DAY(EOMONTH(DATE(B2,D2,25),-1)),F6))*24-B15
然後就實現了自動計算……
相比系統算的好處包括,用戶可以直接看到計算結果、統計時間段變化了好維護、系統不用做複雜的處理……