from pathlib import Path
import json
import xlsxwriter
R=Path(__file__).resolve().parent
rows=[
 ['央美','台账开始7/31、计划结束8/20；开始时间不是已核实立项日','9/3主流程测试可用、9/7—8部分端上线，9月底仍整改；正式生产上线日待核','原台账20天，起点和终点口径待核'],
 ['滨州','台账立项/开始日期缺失','8/17已运行保障、9/23日志称收尾；均不是首次正式上线日','待补已批准上线计划'],
 ['四方达','8/20已有部署工作，8/26备案完成；不是立项证据','9/22试运行；9/30余额导入及开餐问题处理；正式上线日待核','待补已批准上线计划'],
 ['哈尔滨膳质舍','8/20有启动会；来源D0要求合同生效且启动会完成，合同生效日期尚未核实','9/3部署、9/20培训；正式生产上线日待核','来源写合同签订后30天交货/安装调试；与立项到上线的指标起终点不同，不能直接套用'],
 ['保康中学','台账开始8/10，仅开始字段，未确认立项审批','9/4日志称整体完成，与9/29仍90%及云端要求冲突；正式上线日待核','待补已批准上线计划'],
 ['三全','当前立项审批日期未读取','9/21食安模块部署验收、9/30部分接口未贯通；不是整个项目首次上线证据','须冻结本期基地、模块和首批上线范围'],
 ['张家港','8/19为对接方案沟通，不是立项证据','9/17打包、10/6—7现场交接安装；不是首次正式上线确认','待补已批准上线计划'],
 ['江苏国信','台账开始1/23，仅开始字段，未确认立项审批','8—9月持续迭代记录，不能当原项目首次上线日','原计划7/1；非核准实际日期'],
 ['国康医院','立项审批日期缺失','台账验收日期6/30；8/26补单上线为存量升级，不是首期系统上线日','待补已批准上线计划']]
p=R/'14人团队_立项到正式上线时间对比_20261008_v02.xlsx'
w=xlsxwriter.Workbook(p)
f=w.add_format({'font_name':'微软雅黑','font_size':12,'text_wrap':True,'valign':'top'});h=w.add_format({'font_name':'微软雅黑','font_size':12,'text_wrap':True,'valign':'top','bold':True,'bg_color':'#173C4A','font_color':'white'});warn=w.add_format({'font_name':'微软雅黑','font_size':12,'text_wrap':True,'valign':'top','bg_color':'#FFF1CE'});inp=w.add_format({'font_name':'微软雅黑','font_size':12,'font_color':'#245BCD','bg_color':'#FFF1CE','num_format':'yyyy-mm-dd'});n=w.add_format({'font_name':'微软雅黑','font_size':12,'num_format':'0','valign':'top'})
s=w.add_worksheet('立项到上线对比');headers=['项目','正式立项日（待确认）','立项日期证据','正式生产上线日（待确认）','上线日期证据','实际总周期/自然日','已批准计划上线日','实际减计划/自然日','可见日期及立项缺口','上线缺口','原计划（另口径）']
s.write_row(0,0,headers,h);s.freeze_panes(1,1);s.set_row(0,58)
for i,ww in enumerate([20,21,32,26,32,20,22,20,58,68,65]):s.set_column(i,i,ww,f)
for i,row in enumerate(rows,1):
 s.write(i,0,row[0],f)
 for c in [1,3,6]:s.write_blank(i,c,None,inp)
 for c in [2,4]:s.write(i,c,'待补',warn)
 s.write_formula(i,5,f'=IF(AND(ISNUMBER(B{i+1}),ISNUMBER(D{i+1}),D{i+1}>=B{i+1}),D{i+1}-B{i+1},"")',n,'')
 s.write_formula(i,7,f'=IF(AND(ISNUMBER(D{i+1}),ISNUMBER(G{i+1})),D{i+1}-G{i+1},"")',n,'')
 s.write_row(i,8,row[1:],f);s.set_row(i,130)
s.autofilter(0,0,len(rows),10)
s.write(12,0,'有效总周期样本数',h);s.write_formula(12,5,'=COUNT(F2:F10)',n,0)
s.write(13,0,'真实平均总周期',h);s.write_formula(13,5,'=IF(COUNT(F2:F10)>0,AVERAGE(F2:F10),"待补")',f,'待补')
s.write(14,0,'中位总周期',h);s.write_formula(14,5,'=IF(COUNT(F2:F10)>0,MEDIAN(F2:F10),"待补")',f,'待补')
s=w.add_worksheet('指标口径');s.set_column('A:A',24,f);s.set_column('B:B',110,f);s.write_row(0,0,['项目','统一规则'],h)
notes=[('目标','用户修正：只统计项目立项到系统上线；交付5、产品3、研发6，销售不纳入人员产能。'),('起点','项目正式立项审批通过/登记生效日期。合同签订、项目启动会、人员进场和日志首次出现不能自动替代。'),('终点','本期已批准范围的客户生产系统正式启用日期。测试环境、安装完成、接口代码完成、模块上线或培训不能自动替代。'),('总周期','正式上线日减正式立项日，按自然日，不含起始日；包含采购、排队、开发、测试、审批、网电和接口等待。'),('等待','等待原因和起止另列，用于解释总周期；总周期不因等待而停表。内部责任与员工效率需另外看工时和责任证据。'),('已上线仍有升级','首期正式上线后新增需求另建变更/升级记录，不无限延长首期周期；若本期必需范围未完成则不能以局部上线冒充全期上线。'),('未上线/日期未证实','立项日期已核实但尚未上线，单列在制项目年龄；不能并入已上线平均。日期缺失保留空白，不用0代替。'),('平均与中位','只统计起终点及范围一致、证据完整的已上线项目。当前9项目没有完整合格日期对，因此真实平均与中位均待补。'),('旧结果处置','v01的1—37天是局部阶段或观察跨度，93.3天是3个历史台账起止均值；全部不能作为立项到上线的平均。原文件保留仅供排障追溯。'),('应交付时间','用立项时已批准的上线目标作对比；没有批准目标时先测算并由负责人确认。v01从条件齐套起算的建议周期不直接换成立项到上线周期。'),('合同区别','哈尔滨来源30天从合同签订/生效条件起算并约束交货安装调试，既不能冒充立项到上线的实际值，也不能擅自覆盖为45天。'),('证据要求','每项目补立项单、正式上线确认或生产启用记录、批准计划、范围与批次。上线不要求等到终验签字，但必须证明生产正式启用。')]
for i,(k,v) in enumerate(notes,1):s.write(i,0,k,h);s.write(i,1,v,warn if k in ['旧结果处置','平均与中位'] else f);s.set_row(i,76)
s.set_landscape();s.fit_to_pages(1,2)
s=w.add_worksheet('来源核查');s.set_column('A:A',35,f);s.set_column('B:B',105,f);s.set_column('C:C',60,f);s.write_row(0,0,['来源','路径/内容','结论与限制'],h)
sources=[('日志及v01证据',str(R.parent/'2026-10-08-team-work-log-analysis/source/items.json'),'支持阶段事实；不支持立项审批和首次正式上线日期。'),('项目总表','work_company_knowledge/online-documents/2026-08-08-deployment-intake/.../2-项目管理总表.csv','快照只有开始/结束、预期上线和验收；开始不能自动视为立项，结束不能自动视为上线。'),('央美项目进度表','企业微盘：2026年立项项目/【2026】中央美术学院智慧餐厅项目/中央美术学院智慧餐厅项目进度表.xlsx','已回读：模板各日期待确认；明确仅建档不代表立项批准。'),('哈尔滨进度计划','企业微盘：2026年立项项目/【2026】哈尔滨膳质舍营养结算项目/【02】交付阶段/01-实施计划/项目启动与交付进度计划.md','已回读：D0仍待确认，来源合同30天工期不可自动转换成自然日期。'),('2025-8-11更新的立项表.xlsx','企业微盘数字技术中心知识库/001产品端/001 产品文档汇总/配合财务管理中心提交的材料/2025-8-11更新的立项表.xlsx','研发产品立项表，非当前客户项目审批时间；不能混用。')]
for i,row in enumerate(sources,1):s.write_row(i,0,row,f);s.set_row(i,110)
w.close()
(R/'summary-v02.md').write_text('''# v02：项目立项到正式生产上线

用户已纠正统计口径。起点：正式立项日期；终点：本期生产系统正式启用；总周期按自然日包含采购、开发、现场、审批、外部等待，不因等待停表；等待另列归因。试运行/局部上线/软件部署/客户培训/签字终验分别标记，签字终验不是本指标终点。

v01阶段数据与93.3天历史台账均值均不能回答本指标，保留仅供追溯。已回读央美进度模板（日期待确认、建档非批准）、哈尔滨合同基线（D0日期未确认）、研发立项表（不是客户项目）。现有9个客户项目没有完整、核实的立项与正式上线日期对，不能算真实平均。

新版Excel统一记录正式立项、上线、批准计划、实际自然日和偏差；已知的开始/部署/培训等只放辅助证据栏，不填正式日期。共21个动态公式，日期不齐时实际周期为空、真实均值/中位待补。

待补：客户项目正式立项登记入口，以及生产正式启用证据。已向用户询问立项日期真源，未操作或向外部发消息。
''')
print(p)
