工期排程

報告人:王禮恩

簡報目錄

1

何謂排程?為何排程?

解讀甘特圖

排程二三事

1

Excel/python排程實作

何謂排程?

2

何謂排程?

規劃

排程

控管

.將專案劃分為各工項

.估算各工項所需之時間動線/物料/人力及機具需求

.釐清各工項之優先度

.預排工項之起訖時間

.預排工項之施作順序

.持續監管並回報施作進度

.妥善分配資源

排程的重點是「時間」及「順序」

將其整合,可得到「完成日期」

為何排程?

3

為何排程?

.實際進度落後於預訂進度的情況十分常見

氣候災害[2]

工期展延[3]

工安意外[4]

.透過將預定與實際兩者相比較,找出問題的數量及原因將其修正,以求減少兩者差距。

source: 交通部中央氣象局

source: 中華日報

source: 自由時報

為何排程?

4

為何排程?

對廠商:

對業主:

.確認完工日期

.確認廠商妥善安排各工項時間

.管控金流,分析影響

.核對施作進度

.確認完工日期

.確認工項起訖時間,有助於與工班協調

.管控金流,分析影響

.自證施作進度

解讀甘特圖[5]

5

為何排程?

解讀甘特圖

天數

累計數值

工項

資料日期

-亨利.甘特 規劃和控制技術之父[6]

給付價金

完成度

人.工時

source: wiki

解讀甘特圖

6

為何排程?

解讀甘特圖

甘特圖的優缺點

+ 製作簡單且較易解讀,不論背景都可一目瞭然

+ 工項可個別調整,修改簡單

+ 通常按照開始時間序排列

+ 工項佔表長度正比於所費時間,易掌握所需工時

- 過於單純,無法顯示工項間的承繼關係

- 無法直接得知工項是否為影響完工時間之要徑

- 工程案較為複雜時製圖困難

排程二三事

7

為何排程?

解讀甘特圖

看圖找關係

排程二三事

* 6/19 + 13 = 7/3

排程二三事

8

為何排程?

解讀甘特圖

承先啟後

排程二三事

FS

(結束接開始)

最常見之起訖關係

連續性之作業

SS

(開始對開始)

可同時進行之作業

作業開始有先後關係

FF

(結束對結束)

可同時進行之作業

作業結束有先後關係

排程二三事

9

為何排程?

解讀甘特圖

要徑與浮時

排程二三事

要徑:有時程變更,必對完工日期造成影響之工項[7]

浮時:施作延誤也不會影響完工日期之時長

ES 工項 EF
LS 天數 LF
工項 天數 前項
A 2 -
B 7 A
C 3 A
D 5 B、C
0 A 2
0 2 2
2 B 9
2 7 9
9 D 14
9 5 14
2 C 5
6 3 9

浮時:4天

排程二三事

10

為何排程?

解讀甘特圖

旅運要注意

排程二三事

.諸如春節、清明等國定假日,或是大學測驗等重要活動期間,部分工程無法進行,也須納入排程

節日 天數 節日 天數
元旦 5天 端午 6天
春節 13天 大學測驗 2天
二二八 6天 中秋 5天
清明 7天 雙十 6天

排程實作

11

為何排程?

解讀甘特圖

Excel

排程二三事

排程實作

排程實作

12

為何排程?

解讀甘特圖

Python

排程二三事

排程實作

使用模組:Datetime[7], Openpyxl[8]

import datetime as dt
import openpyxl as opx
###導入模組

print("請輸入開始日期「yyyy mm dd」")
d = input().split()
start_date = dt.date(int(d[0]), int(d[1]), int(d[2]))
###取得開始日期

print("請輸入「工作項目 日程」,若輸入完成請輸入「end」")
arrange = True
current_date = start_date
worklist = []
datelist = []
start_list = []
end_list = []
holiday_list = ["清明節", "端午節", "大學測驗", "中秋節", "雙十節", "元旦", "春節", "二二八"]
holiday_date = [7, 6, 2, 5, 6, 5, 13, 6]
holiday_start_date = [dt.date(2023, 3, 31), dt.date(2023, 6, 21), dt.date(2023, 7, 11), dt.date(2023, 9, 28), dt.date(2023, 10, 6), dt.date(2023, 12, 30), dt.date(2024, 1, 18),  dt.date(2024, 2, 24)]
holiday_counter_list = []
counter = 0
holiday_counter = 0
for a in holiday_start_date:
    if a - start_date < dt.timedelta(days = 0):
        holiday_counter += 1
    else:
        break
while arrange:
    work = input().split()
    if work[0] == "end":
        arrange = False
        break
    else:
        start_list.append(current_date)
        worklist.append(work[0])
        datelist.append(work[1])
        current_date = current_date + dt.timedelta(days = int(work[1]) - 1)
        for a in range(len(holiday_list)):
            if holiday_start_date[a] - start_list[-1] < dt.timedelta(days = 0):
                continue
            elif holiday_start_date[a]- start_list[-1] > current_date - start_list[-1]:
                break
            else:
                current_date = current_date + dt.timedelta(days = holiday_date[a])
                holiday_counter_list.append(counter)
        end_list.append(current_date)            
        current_date += dt.timedelta(days = 1)
        counter += 1
###排程

tra_counter = 0
for a in range(len(worklist)):
    tra = False
    for b in holiday_counter_list:
        if a == b:
            tra = True
            break
        else:
            continue
    if tra:
        print(worklist[a], start_list[a], end_list[a], datelist[a], holiday_list[tra_counter + holiday_counter], holiday_date[tra_counter + holiday_counter])
        tra_counter += 1
    else:
        print(worklist[a], start_list[a], end_list[a], datelist[a])
###輸出結果

排程實作

13

為何排程?

解讀甘特圖

Python

排程二三事

排程實作

使用模組:Datetime[7], Openpyxl[8]

schedule = opx.Workbook()
sds = schedule.active
page1 = schedule.worksheets[0]

tra_counter = 0
schedule_data = []
for a in range(len(worklist)):
    tra = False
    for b in holiday_counter_list:
        if a == b:
            tra = True
            break
        else:
            continue
    if tra:
        schedule_data.append([worklist[a], start_list[a], end_list[a], datelist[a], holiday_list[tra_counter + holiday_counter], holiday_date[tra_counter + holiday_counter]])
        tra_counter += 1
    else:
        schedule_data.append([worklist[a], start_list[a], end_list[a], datelist[a]])
for row in schedule_data:
    page1.append(row)
for a in range(1, len(worklist)+1):
    page1.cell(row = a, column = 2).number_format = 'mm-dd'
    page1.cell(row = a, column = 3).number_format = 'mm-dd'
schedule.save('三週進度表.xlsx')

排程實作

14

為何排程?

解讀甘特圖

Python

排程二三事

排程實作

使用模組:Datetime[7], Openpyxl[8]

展望:

.新增模式功能,可選擇工項種類直接排程,不需多次輸入

.新增試算表讀取功能,可直接讀取舊資料建檔

.引入預定進度,新增交叉比對功能,自動化比較進度差異

.格式修整及分類建檔等優化...

參考資料

15

為何排程?

解讀甘特圖

排程二三事

排程實作

實習心得

16

為何排程?

解讀甘特圖

排程二三事

排程實作

感謝聆聽