1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで3件の納期を試算、順番待ちで2件が遅れる

1
Posted at

3件を別々に計算すると、全部納期内。同じ担当者が順番に進めると、2件が遅れました。

僕は納期を返す前に、既存作業も足して確認したいです。「2日で終わる」と「金曜までに渡せる」は、間にある仕事の分だけ離れます。

納期の前に、1日に使える時間を置く

検証用の入力は3件。開始日は2026年10月1日、木曜。担当者は1人で、上から順に進めます。

案件 残り作業 約束した納期
A 4時間 10月1日
B 8時間 10月2日
C 4時間 10月2日

作業に使えるのは平日1日4時間。会議や問い合わせもあるので、ここに勤務時間の8時間をそのまま入れると予定が楽観的になります。作業は日をまたいで続けられ、途中の空き時間を次の案件に使う前提です。

金曜までの枠は8時間。約束した作業は16時間あります。

全件の納期を守る計画は組めません。担当者を替えるのか、範囲を減らすのか。先に相談する根拠になります。

Pythonで個別計算と順番待ちを比べる

delivery.pyとして保存し、python3 delivery.pyで実行します。追加ライブラリは不要。Python 3.14.6で動作確認済み。時間は正の整数で入力します。

from datetime import date, timedelta

START = date(2026, 10, 1)
DAILY_HOURS = 4
DAYS_OFF = set()  # 祝日・休暇の日付を追加する
jobs = [
    ("A", 4, "2026-10-01"),
    ("B", 8, "2026-10-02"),
    ("C", 4, "2026-10-02"),
]

def finish(hours):
    if hours <= 0 or DAILY_HOURS <= 0:
        raise ValueError("作業時間と1日の枠は正数にする")
    day = START
    while True:
        if day.weekday() < 5 and day not in DAYS_OFF:
            hours -= DAILY_HOURS
            if hours <= 0:
                return day
        day += timedelta(days=1)

total = late = 0
for name, hours, due in jobs:
    total += hours
    alone, queued = finish(hours), finish(total)
    delayed = queued > date.fromisoformat(due)
    late += delayed
    status = "遅れ" if delayed else "納期内"
    print(f"{name}: 個別={alone} 順番={queued} {status}")
print(f"納期遅れ: {late}件")

出力です。

A: 個別=2026-10-01 順番=2026-10-01 納期内
B: 個別=2026-10-02 順番=2026-10-05 遅れ
C: 個別=2026-10-01 順番=2026-10-06 遅れ
納期遅れ: 2件

出力で確認したのは、Bが月曜まで延びるところ。8時間だけなら金曜に終わります。

Aの4時間を足すと3営業日になり、土日を挟む。Cはその後の火曜です。

足すのは作業時間。土日は枠に入れない

finish(hours)は、その時間を消化し終える日を返します。weekday()は月曜が0、日曜が6なので、< 5の日だけ作業時間を引きます。手元のPythonの説明文で値も確認済み。date.weekdayの仕様と合わせて読めます。

finish(total)へ渡すのは、前の案件を含む累計時間です。今回の前提なら、累計を消化した日がその案件の終了日になります。4時間ちょうどを木曜に終えた境界も確認しました。翌日へ余計に送っていません。

祝日は自動取得しません。休暇を含め、DAYS_OFFに日付を入れます。依頼元の確認待ちや、日ごとに違う稼働時間は別に見積もります。

カレンダーの空白って、つい全部使えそうに見えるんですよね。

遅れる2件を、納期の相談に変える

ChatGPTに相談文を頼むなら、計算結果と変更できる条件を渡します。社名や顧客情報は要りません。

担当者1人、平日4時間、A→B→Cの固定順です。
納期と計算上の終了日:A 10/1→10/1、B 10/2→10/5、C 10/2→10/6。
BとCの納期を相談する社内メッセージを150字以内で書いてください。
増員は未承認です。短縮できる作業も未確認です。
日付を変えず、承認済みのような約束を足さないでください。

僕なら依頼が増えるたび、この表を更新します。既存作業を入れて納期を返せるのが、ここ地味に効きます。作業が途中なら、残り時間で再計算します。依頼が増えるほど、担当者に聞く内容も「間に合いますか」から「何時間の枠を移せますか」に変わっていくと見ています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?