2026-09-03 23:32:27 +08:00
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""康尼 APS 计划排产模块 24 周甘特排期表"""
|
|
|
|
|
|
from datetime import date, timedelta
|
2026-09-08 00:07:26 +08:00
|
|
|
|
from pathlib import Path
|
2026-09-03 23:32:27 +08:00
|
|
|
|
from openpyxl import Workbook
|
|
|
|
|
|
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
|
|
|
|
|
from openpyxl.utils import get_column_letter
|
|
|
|
|
|
|
2026-09-08 00:07:26 +08:00
|
|
|
|
OUT = Path(__file__).resolve().with_name("康尼APS计划排产模块甘特排期表.xlsx")
|
2026-09-03 23:32:27 +08:00
|
|
|
|
|
|
|
|
|
|
START = date(2026, 9, 7) # 第1周周一
|
|
|
|
|
|
WEEKS = 26
|
|
|
|
|
|
|
|
|
|
|
|
PHASE_COLORS = {
|
|
|
|
|
|
0: "4472C4", 1: "70AD47", 2: "ED7D31", 3: "FFC000", 4: "C00000", 5: "7030A0",
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# (阶段, 编号, 任务, 责任方, 交付物/验收, 开始周, 结束周)
|
|
|
|
|
|
TASKS = [
|
|
|
|
|
|
(0, "0.1", "排程策略定版(交期/齐套/产能/人员技能优先权重)", "康尼计划组+乙方", "《排程策略与规则说明书》", 1, 2),
|
|
|
|
|
|
(0, "0.2", "锁定规则确认(T+7/日排3天/滚动5天锁定/变更条件)", "康尼计划组", "锁定与变更规则矩阵", 2, 3),
|
|
|
|
|
|
(0, "0.3", "排程颗粒度对齐(小时级 vs 分钟级)", "双方", "颗粒度确认纪要", 2, 2),
|
|
|
|
|
|
(0, "0.4", "计划订单转换权归属(SAP vs MOM)", "康尼IT+SAP顾问", "系统边界确认书", 3, 3),
|
|
|
|
|
|
(0, "0.5", "跨部门待决项闭环(编码/PM码/包装/流水追溯规则)", "康尼牵头", "待决事项闭环清单", 3, 4),
|
|
|
|
|
|
(1, "1.1", "BOM 定额/层级/替代料核查 + 检修订单BOM补齐", "康尼工艺部", "BOM核查报告", 3, 6),
|
|
|
|
|
|
(1, "1.2", "标准工时盘点与缺失工序补测", "康尼工艺+班组", "标准工时库", 4, 8),
|
|
|
|
|
|
(1, "1.3", "工位能力矩阵建模(轨交3线+民品2线新建)", "乙方+康尼生产部", "工序-工位能力匹配矩阵", 4, 7),
|
|
|
|
|
|
(1, "1.4", "弹性人力产能模型(多/少人模式、产值与加班约束参数化)", "乙方", "人力产能模型", 5, 7),
|
|
|
|
|
|
(1, "1.5", "多工厂日历/班组/班次配置", "乙方", "工厂日历配置", 6, 8),
|
|
|
|
|
|
(2, "2.1", "排程约束建模(能力/物料状态/组件时间关联/在制占用)", "乙方", "约束模型配置", 7, 11),
|
|
|
|
|
|
(2, "2.2", "排程功能配置(正倒排/多方案/甘特拖拽/锁定/KPI)", "乙方", "排程功能就绪", 8, 12),
|
|
|
|
|
|
(2, "2.3", "SAP集成(计划订单拉取/齐套检查IFS012/报工IFS202)", "乙方+SAP顾问", "接口联调通过", 9, 14),
|
|
|
|
|
|
(2, "2.4", "预警规则(交期冲突/变更影响仿真/在途物料提醒)", "乙方", "预警规则上线", 11, 14),
|
|
|
|
|
|
(3, "3.1", "近6个月历史订单回测,测定计划准确率基线", "双方", "回测报告(基线95%)", 13, 15),
|
|
|
|
|
|
(3, "3.2", "10%产能预留假设仿真验证", "乙方", "验证报告", 15, 16),
|
|
|
|
|
|
(3, "3.3", "压测:全量排程≤10分钟、插单what-if重算时效", "乙方", "压测报告", 16, 17),
|
|
|
|
|
|
(3, "3.4", "四类场景演练(插单/待料/维修/多-少人切换)", "双方", "场景通关记录", 17, 18),
|
|
|
|
|
|
(4, "4.1", "流水线1双轨运行(Excel vs 系统,偏差<5%)", "康尼计划组+乙方驻场", "双轨比对周报×4", 19, 22),
|
|
|
|
|
|
(4, "4.2", "单轨切换(计划编制4h→1h)", "康尼计划组", "切换确认单", 23, 23),
|
|
|
|
|
|
(4, "4.3", "看板报表上线(缺料表/产能评估/计划完成率)", "乙方", "3类看板可用", 20, 24),
|
|
|
|
|
|
(5, "5.1", "推广至岸电7500/民品7600 + 二期深化衔接", "双方", "推广计划", 25, 26),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
MILESTONES = [
|
|
|
|
|
|
(4, "M1 蓝图冻结", "排程规则说明书签字"),
|
|
|
|
|
|
(8, "M2 数据就绪", "工时/能力矩阵/BOM核查通过"),
|
|
|
|
|
|
(14, "M3 集成贯通", "SAP计划订单自动拉通"),
|
|
|
|
|
|
(18, "M4 模拟达标", "回测与压测指标达标"),
|
|
|
|
|
|
(24, "M5 试点上线", "流水线1单轨运行"),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
HOLIDAYS = {1: "国庆", 22: "春节前", 23: "春节", 24: "春节后"}
|
|
|
|
|
|
|
|
|
|
|
|
def wk_monday(w):
|
|
|
|
|
|
return START + timedelta(weeks=w - 1)
|
|
|
|
|
|
|
|
|
|
|
|
def wk_sunday(w):
|
|
|
|
|
|
return wk_monday(w) + timedelta(days=6)
|
|
|
|
|
|
|
|
|
|
|
|
wb = Workbook()
|
|
|
|
|
|
ws = wb.active
|
|
|
|
|
|
ws.title = "甘特排期"
|
|
|
|
|
|
|
|
|
|
|
|
thin = Side(style="thin", color="BFBFBF")
|
|
|
|
|
|
border = Border(left=thin, right=thin, top=thin, bottom=thin)
|
|
|
|
|
|
|
|
|
|
|
|
# 标题行
|
|
|
|
|
|
ws.merge_cells("A1:G1")
|
|
|
|
|
|
ws["A1"] = "康尼科技 MOM 项目 · APS 计划排产模块 24 周实施排期(V1.0,起点 2026-09-07)"
|
|
|
|
|
|
ws["A1"].font = Font(bold=True, size=14, color="1F4E79")
|
|
|
|
|
|
ws.row_dimensions[1].height = 24
|
|
|
|
|
|
|
|
|
|
|
|
# 表头
|
|
|
|
|
|
HEAD = ["阶段", "编号", "任务", "责任方", "交付物/验收", "起", "止"]
|
|
|
|
|
|
for c, h in enumerate(HEAD, 1):
|
|
|
|
|
|
cell = ws.cell(row=3, column=c, value=h)
|
|
|
|
|
|
cell.font = Font(bold=True, color="FFFFFF", size=10)
|
|
|
|
|
|
cell.fill = PatternFill("solid", fgColor="1F4E79")
|
|
|
|
|
|
cell.alignment = Alignment(horizontal="center", vertical="center")
|
|
|
|
|
|
cell.border = border
|
|
|
|
|
|
|
|
|
|
|
|
for w in range(1, WEEKS + 1):
|
|
|
|
|
|
cell = ws.cell(row=3, column=7 + w, value=f"W{w}")
|
|
|
|
|
|
cell.font = Font(bold=True, color="FFFFFF", size=9)
|
|
|
|
|
|
cell.fill = PatternFill("solid", fgColor="1F4E79")
|
|
|
|
|
|
cell.alignment = Alignment(horizontal="center", vertical="center")
|
|
|
|
|
|
cell.border = border
|
|
|
|
|
|
d = ws.cell(row=4, column=7 + w, value=wk_monday(w).strftime("%m/%d"))
|
|
|
|
|
|
d.font = Font(size=8, color="808080")
|
|
|
|
|
|
d.alignment = Alignment(horizontal="center")
|
|
|
|
|
|
d.border = border
|
|
|
|
|
|
|
|
|
|
|
|
ws.cell(row=4, column=1, value="(周一起始日期)").font = Font(size=8, color="808080")
|
|
|
|
|
|
|
|
|
|
|
|
# 假期提示行
|
|
|
|
|
|
ws.cell(row=5, column=1, value="节假日").font = Font(size=9, bold=True, color="C00000")
|
|
|
|
|
|
for w, name in HOLIDAYS.items():
|
|
|
|
|
|
cell = ws.cell(row=5, column=7 + w, value=name)
|
|
|
|
|
|
cell.font = Font(size=7, color="C00000")
|
|
|
|
|
|
cell.alignment = Alignment(horizontal="center", textRotation=90)
|
|
|
|
|
|
cell.fill = PatternFill("solid", fgColor="FCE4EC")
|
|
|
|
|
|
cell.border = border
|
|
|
|
|
|
|
|
|
|
|
|
# 里程碑行
|
|
|
|
|
|
ws.cell(row=6, column=1, value="★ 里程碑").font = Font(size=9, bold=True, color="C00000")
|
|
|
|
|
|
for w, name, desc in MILESTONES:
|
|
|
|
|
|
cell = ws.cell(row=6, column=7 + w, value="◆")
|
|
|
|
|
|
cell.font = Font(size=12, bold=True, color="C00000")
|
|
|
|
|
|
cell.alignment = Alignment(horizontal="center")
|
|
|
|
|
|
cell.border = border
|
|
|
|
|
|
|
|
|
|
|
|
# 任务行
|
|
|
|
|
|
row = 8
|
|
|
|
|
|
for phase, no, task, owner, deliv, s, e in TASKS:
|
|
|
|
|
|
vals = [f"阶段{phase}", no, task, owner, deliv, f"W{s}", f"W{e}"]
|
|
|
|
|
|
for c, v in enumerate(vals, 1):
|
|
|
|
|
|
cell = ws.cell(row=row, column=c, value=v)
|
|
|
|
|
|
cell.font = Font(size=9)
|
|
|
|
|
|
cell.border = border
|
|
|
|
|
|
cell.alignment = Alignment(vertical="center", wrap_text=(c == 3))
|
|
|
|
|
|
color = PHASE_COLORS[phase]
|
|
|
|
|
|
for w in range(1, WEEKS + 1):
|
|
|
|
|
|
cell = ws.cell(row=row, column=7 + w)
|
|
|
|
|
|
cell.border = border
|
|
|
|
|
|
if s <= w <= e:
|
|
|
|
|
|
cell.fill = PatternFill("solid", fgColor=color)
|
|
|
|
|
|
ws.row_dimensions[row].height = 30
|
|
|
|
|
|
row += 1
|
|
|
|
|
|
|
|
|
|
|
|
# 里程碑说明
|
|
|
|
|
|
row += 1
|
|
|
|
|
|
ws.cell(row=row, column=1, value="里程碑说明:").font = Font(bold=True, size=10)
|
|
|
|
|
|
row += 1
|
|
|
|
|
|
for w, name, desc in MILESTONES:
|
|
|
|
|
|
ws.cell(row=row, column=1, value=f"{name}(W{w},{wk_sunday(w).strftime('%Y-%m-%d')} 前)").font = Font(size=9, bold=True)
|
|
|
|
|
|
ws.cell(row=row, column=3, value=desc).font = Font(size=9)
|
|
|
|
|
|
row += 1
|
|
|
|
|
|
|
|
|
|
|
|
row += 1
|
|
|
|
|
|
notes = [
|
|
|
|
|
|
"注1:W1 含国庆假期(2026-10-01~07),阶段0关键会议建议避开;",
|
|
|
|
|
|
"注2:W22~W24 覆盖 2027 年春节(2027-02-06 除夕前后),双轨末期与单轨切换预留假期缓冲,M5 最迟顺延至 2027 年 3 月上旬;",
|
|
|
|
|
|
"注3:阶段0 五项规则未闭环签字前,阶段2 开发不得开工(计划前置卡点);",
|
|
|
|
|
|
"注4:双轨期严格限定 4 周且仅流水线 1,乙方驻场支持,防止计划员工作量反增。",
|
|
|
|
|
|
]
|
|
|
|
|
|
for n in notes:
|
|
|
|
|
|
ws.cell(row=row, column=1, value=n).font = Font(size=9, color="595959")
|
|
|
|
|
|
row += 1
|
|
|
|
|
|
|
|
|
|
|
|
# 列宽
|
|
|
|
|
|
widths = [7, 6, 46, 18, 24, 5, 5]
|
|
|
|
|
|
for c, wd in enumerate(widths, 1):
|
|
|
|
|
|
ws.column_dimensions[get_column_letter(c)].width = wd
|
|
|
|
|
|
for w in range(1, WEEKS + 1):
|
|
|
|
|
|
ws.column_dimensions[get_column_letter(7 + w)].width = 5
|
|
|
|
|
|
|
|
|
|
|
|
ws.freeze_panes = "H7"
|
|
|
|
|
|
|
|
|
|
|
|
# ---- Sheet2 风险与前置输入 ----
|
|
|
|
|
|
ws2 = wb.create_sheet("风险与前置输入")
|
|
|
|
|
|
ws2.append(["关键风险与对策"])
|
|
|
|
|
|
ws2["A1"].font = Font(bold=True, size=12, color="1F4E79")
|
|
|
|
|
|
risks = [
|
|
|
|
|
|
("风险", "等级", "对策"),
|
|
|
|
|
|
("排程策略/锁定规则跨部门达不成一致", "高", "M1 前组织计划+生产+工艺+市场专题会,逐条签字"),
|
|
|
|
|
|
("标准工时缺失导致排程失真", "高", "阶段1设补测专项,缺失工时按班组经验值+回测修正"),
|
|
|
|
|
|
("民品工位主数据从零建设", "中", "先产线级粗颗粒,后工位级细颗粒"),
|
|
|
|
|
|
("PLM 未上线,工艺数据源头不稳", "中", "一期以 SAP 工艺路线为准,预留 PLM 接口"),
|
|
|
|
|
|
("双轨期计划员工作量反增", "中", "双轨限 4 周+只跑 1 条线,乙方驻场"),
|
|
|
|
|
|
("春节假期压缩双轨窗口", "中", "W22~24 预留缓冲,M5 可顺延至 3 月上旬"),
|
|
|
|
|
|
]
|
|
|
|
|
|
for r in risks:
|
|
|
|
|
|
ws2.append(list(r))
|
|
|
|
|
|
for c in range(1, 4):
|
|
|
|
|
|
ws2.cell(row=2, column=c).font = Font(bold=True, color="FFFFFF")
|
|
|
|
|
|
ws2.cell(row=2, column=c).fill = PatternFill("solid", fgColor="1F4E79")
|
|
|
|
|
|
for rr in range(3, 3 + len(risks) - 1):
|
|
|
|
|
|
for c in range(1, 4):
|
|
|
|
|
|
ws2.cell(row=rr, column=c).border = border
|
|
|
|
|
|
ws2.cell(row=rr, column=c).alignment = Alignment(vertical="center", wrap_text=True)
|
|
|
|
|
|
ws2.column_dimensions["A"].width = 42
|
|
|
|
|
|
ws2.column_dimensions["B"].width = 8
|
|
|
|
|
|
ws2.column_dimensions["C"].width = 56
|
|
|
|
|
|
|
|
|
|
|
|
ws2.append([])
|
|
|
|
|
|
ws2.append(["待康尼确认的前置输入"])
|
|
|
|
|
|
ws2.cell(row=ws2.max_row, column=1).font = Font(bold=True, size=12, color="1F4E79")
|
|
|
|
|
|
for item in [
|
|
|
|
|
|
"1. 蓝图阶段实际启动时间与双方投入人力;",
|
|
|
|
|
|
"2. SAP 价格数据(产值类排程 KPI 核算,8.18 纪要待办);",
|
|
|
|
|
|
"3. 检修订单计划与 BOM(8.18 纪要待办,影响返修排程);",
|
|
|
|
|
|
"4. 试点产线选择是否认可“流水线 1”。",
|
|
|
|
|
|
]:
|
|
|
|
|
|
ws2.append([item])
|
|
|
|
|
|
ws2.cell(row=ws2.max_row, column=1).font = Font(size=10)
|
|
|
|
|
|
|
|
|
|
|
|
wb.save(OUT)
|
|
|
|
|
|
print("saved:", OUT)
|