from pathlib import Path
from collections import Counter
from datetime import datetime
import json,shutil,hashlib,math,unicodedata,re,csv
import openpyxl,xlsxwriter
R=Path(__file__).resolve().parent
ROOT=Path('/Users/jack/code/010-cpt/008-zhct/zhctprompt')
P=Path('/Users/jack/Desktop/交付进度表.xlsx')
shutil.copy2(P,R/'source/交付进度表.xlsx')
original=openpyxl.load_workbook(P,data_only=True).active
raw=[[original.cell(i,c).value for c in range(1,14)] for i in range(1,39)]
(R/'source/original-rows.json').write_text(json.dumps(raw,ensure_ascii=False,indent=2,default=str))
logs=json.loads((ROOT/'outputs/2026-10-08-team-work-log-analysis/source/logs.json').read_text())
items=json.loads((ROOT/'outputs/2026-10-08-team-work-log-analysis/source/items.json').read_text())
delivery={x['name'] for x in logs if '/交付实施部' in x['department']}
assert delivery=={'赵野','张帅A','侯世伟','柴玉龙','王金洋'}
T=[]
def add(code,phase,label,title,result,owner,candidate,partner,deps,node,condition='适用所选业务/设备时执行',note='确认与执行证据留存'):
 T.append([code,phase,label,title,result,owner,candidate,partner,deps,node,condition,note])

add('P01','0 售前技术前置','SV01','确认选购业务、设备与服务范围','选购模块/设备/服务明确，虚拟服务项的包含与排除一致','售前/销售','侯世伟/赵野（交付核对）','产品、客户决策人','','报价/签约前','所有项目','项目级金额、税、服务次数不预设')
add('P02','0 售前技术前置','SV02','采集规模、点位、利旧与现场条件','点位/容量/电网/网络/进场条件清单和现场图','交付现场负责人','赵野/张帅A','客户现场方、售前','P01','报价/进场计划前')
add('P03','0 售前技术前置','WK17','确认安全、等保、测评及审批要求','客户确认适用要求、责任主体、材料/测评/整改范围和费用计划','客户安全负责人＋我方技术/产品','赵野（协调）','客户IT/安全、测评方','P01','报价/签约前','客户提出安全/认证或环境要求时；未涉及写明原因','不按部队/政府/国央企身份默认指定等保等级；交付人员不代出认证结论')
add('P04','0 售前技术前置','WK14','确认操作系统、数据库及信创适配','目标版本/许可/兼容差异、验证方案、投入与计划明确','研发技术负责人','柴玉龙（部署协同）','产品、客户IT、相关厂商','P01,P03','报价前评估；部署前验证','非标准环境、信创、高可用或数据库适配时','不能把安装成功代替业务兼容通过')
add('P05','0 售前技术前置','SV04','确认网络、域名、端口及远程作业条件','入口、外部依赖、申请方和开通条件清单','技术/客户IT','柴玉龙/赵野','客户网络/安全','P02,P03','报价/进场前','所有项目按实际环境确认','纯内网时逐项核对支付、短信、小程序、厂商服务依赖')
add('P06','0 售前技术前置','SV05','确认小程序、商户、收款及短信主体','我方/客户入口选择、备案适用性、申请人、费用承担和审核依赖明确','售前/客户商户主体','赵野（协同）','商务、技术、客户财务','P01,P05','报价/上线排期前','涉及小程序、支付、验证码时','只登记状态和证据位置，不在共享表保存账号口令或敏感申请资料')
add('P07','0 售前技术前置','SV09','确认接口、协议、SDK和双方分工','接口清单、字段样例、测试环境、第三方时间和验收方式明确','研发技术负责人','柴玉龙（对接协同）','客户IT/厂商/产品','P01,P05','报价/研发排期前','对接一卡通、财务/ERP/监管/设备等时','新增实现回研发任务，交付计划仅接收经过验证的版本')
add('P08','0 售前技术前置','SV02','核对旧卡、旧设备与样机兼容','利旧型号、协议、样机测试结果和替换方案','硬件/产品/技术','张帅A/王金洋','客户设备管理、厂家','P02,P07','选型与报价前','有利旧或特殊卡/设备时','新卡供应、制作周期和设备授权范围提前明确')
add('P09','0 售前技术前置','SV07','冻结初始化/余额/库存/历史迁移范围','数据模板、质量、切换窗口、核对人与回退方案','技术/交付＋客户数据/财务负责人','柴玉龙/王金洋','食堂、客户IT/财务','P01,P07','报价前评估；切换前冻结','所选系统有基础数据或存量迁移','专项历史库迁移关联WK14；不能默认全量清洗均属标准服务')
add('P10','0 售前技术前置','SV01','冻结实施计划、人员、验收与服务边界','负责人、里程碑、前置条件和范围版本确认','交付负责人（待指定）','侯世伟/赵野（建议）','售前、技术、商务、客户','P02,P03,P04,P05,P06,P07,P08,P09','报价/签约前','所有项目','非适用前置项必须经确认标不适用；不能默认为完成')

add('S01','1 启动与交接','SV01','召开项目启动会并对齐责任','项目范围、双方负责人和计划版本确认','交付负责人','侯世伟/赵野','销售、客户、技术','P10','签约后/实施启动前','所有项目')
add('S02','1 启动与交接','SV10','接收已验证发布包、SQL与回退材料','版本/制品、依赖、配置说明、验证与恢复步骤齐全','研发技术负责人','柴玉龙（接收协同）','测试、交付','S01,P04,P07','部署前','所有项目','开发未完成或有阻断缺陷时不要求现场人员直接推进上线')
add('S03','1 启动与交接','SV02','确认设备物流、批次与进场窗口','型号数量、到货/搬运/安装窗口、食堂开餐安排清楚','交付负责人/采购','侯世伟/张帅A','客户现场方、厂家','S01,P08','发货与进场前','有硬件交付时')

add('E01','2 环境与访问','SV03','准备服务器和基础环境','与已确认资源匹配，基础服务检查通过','技术负责人','柴玉龙','客户IT','S02,P04','设备进场前优先完成','自建/客户云环境时；SaaS仅核对租户资源')
add('E02','2 环境与访问','SV04','完成网络、域名、访问与授权开通','应用、设备、支付/接口必要链路可达并有记录','技术/客户IT','柴玉龙/赵野','客户网络/安全','P05,E01','平台部署/联调前','所有项目按确认方式执行')
add('E03','2 环境与访问','WK14','关闭特殊适配与环境验收差异','目标环境关键接口、数据、任务/客户端经专项验证并确认','研发技术负责人','柴玉龙（部署协同）','测试、客户IT','P04,S02,E01,E02','现场联调前','适配/高可用等分支触发时','待整改项必须说明是否阻断，不将行业类型本身当适配通过证据')

add('D01','3 平台与数据','SV06','部署所选标准软件与业务配置','营养/食安/采购对应入口、角色、参数可用','技术/交付','柴玉龙','产品、客户IT','S02,E02,E03','设备联调前','按合同选购业务线执行')
add('D02','3 平台与数据','SV05','部署并验证小程序/H5与支付账号配置','使用入口、登录和必要商户配置验证记录','技术/客户账号主体','柴玉龙/赵野','客户IT/财务、产品','D01,P06','业务联调前','按实际入口执行，不一律强制小程序')
add('D03','3 平台与数据','SV07','导入部门、人员、账号基础资料','人员/组织字段及开户数量、差异项核对完成','客户数据负责人＋交付/技术','柴玉龙/王金洋','客户人事/IT','D01,P09','账户测试前','营养及需要人员数据的系统','原表人员任务输出写余额，新版改为人员与开户核对')
add('D04','3 平台与数据','SV07','迁移/初始化账户余额并财务核对','冻结时点、人数/账户、余额合计与逐项差异经财务确认','客户财务＋技术负责人','王金洋/柴玉龙（协同）','客户财务、IT','D03,P09','切换前约定窗口','有余额迁移时','不填实际金额、不自动执行生产写入；切换/回退需另获项目授权')
add('D05','3 平台与数据','SV07','采集/同步人脸资料并核对','所选合法来源与授权方式、同步结果及异常清单确认','客户负责资料，技术/交付协同','张帅A/王金洋','客户人事/IT','D03,D02','身份测试前','选用人脸身份功能时','不在计划表存原始人脸或人员敏感明细')
add('D06','3 平台与数据','SV07','确认卡片供应并绑定旧/新卡','供应方和制作时间确认，样卡、批次绑定与核对记录','客户/销售＋交付','张帅A/王金洋','硬件、客户IT','P08,D03','刷卡测试前','选用刷卡功能时')
add('D07','3 平台与数据','SV05','完成短信及收款渠道配置核验','主体、余额/充值流向、短信场景、费用责任和测试记录','客户财务/账号主体＋技术','柴玉龙/赵野','商务、客户IT','P06,D02','充值/登录测试前','选用短信或支付时')
add('D08','3 平台与数据','SV06','建立食堂、餐厅和档口业务结构','名称、点位、权限、角色与报表范围核对记录','客户运营＋交付','赵野/王金洋','产品、食堂','D01','设备绑定前','所选业务线需要结构配置时')
add('D09','3 平台与数据','SV07','初始化菜品、食材、供应商与库存','模板/价格/营养/库存等按选购范围核对，责任人确认','客户食堂/供应商＋交付','王金洋/赵野','产品、技术','P09,D08','称重/采购测试前','营养、采购数据按实际需要执行')

add('H01','4 设备安装与联调','SV08','安装消费机与基础配对','设备编号、档口绑定、刷卡/扫码等基础调试记录','交付现场人员','张帅A/侯世伟','技术、客户现场方','S03,D01,D06,D08','到货且电网具备后','配置消费机时')
add('H02','4 设备安装与联调','SV08','安装称重与绑盘设备','安装/校准/配对/餐盘识别、设备配置记录','交付现场人员','张帅A/王金洋','技术、硬件厂家','S03,D08,D09','到货且电网具备后','配置称重与绑盘设备时')
add('H03','4 设备安装与联调','SV08','接入食安摄像头、传感器及留样设备','点位、协议、录像/告警/数据接入及利旧差异检查','交付/技术/硬件','张帅A/赵野','客户IT/现场、厂家','S03,D01,E02','视频网络具备后','智慧食安被选购且含相应设备时')
add('H04','4 设备安装与联调','SV08','安装视觉结算设备并完成学习','样本/餐具/菜品学习与测试条件、识别结果记录','交付＋产品/算法技术','张帅A/王金洋','客户食堂、厂家','S03,D09','设备到货且菜品样本具备后','配置AI视觉结算设备时','准确率、样本量、学习周期与阈值均待项目确认，不能空口保证')
add('H05','4 设备安装与联调','SV08','安装取餐柜/零食柜并调试','设备点位、电网、编号及各门/格口操作记录','交付现场人员','王金洋/张帅A','客户现场、厂家','S03,D01,E02','分批到货/点位就绪后','配置相关柜机时')
add('H06','4 设备安装与联调','SV06','核对柜机编号和手机端展示','柜机/格口编号与移动端一致，异常清单关闭','交付/技术','王金洋','客户运营、产品','H05,D02','柜机启用前','配置柜机与移动端联动时')
add('H07','4 设备安装与联调','SV08','安装叫号屏/叫号盒子','叫号设备与业务配置、提示/队列测试记录','交付现场人员','张帅A/王金洋','客户运营、采购','S03,D01','到货后','配置叫号系统时','采购/发票流程提前确认，不把未付款当已具备到货')
add('H08','4 设备安装与联调','SV08','安装并配置小票打印机','模板、连接、出单与订单明细一致','交付现场人员','王金洋/张帅A','客户运营、技术','S03,D01','到货后','需要小票打印时')
add('H09','4 设备安装与联调','SV08','安装自助点餐终端','入口、菜品/价格和订单流程核对','交付现场人员','张帅A/侯世伟','客户运营、产品','S03,D09','到货后','配置自助点餐机时')
add('H10','4 设备安装与联调','SV06','安装交互大屏与确认展示','版本、分辨率、可见数据与现场设备性能核对','交付/技术','柴玉龙/张帅A','产品、客户现场','D01,S03','到货后','配置交互大屏时','低配设备、页面卡顿等兼容条件在P08提前验证')
add('H11','4 设备安装与联调','SV09','验证电视/NVR播放监控','电视/解码/码流兼容性及可见画面确认','技术/交付','柴玉龙/张帅A','客户IT、厂家','H03,H10','视频测试前','需电视播放监控时','未验证的旧电视不能默认可解码播放；可独立于交互大屏')

add('T01','5 业务验证与切换','SV09','设备、平台和第三方接口联调','通信、数据/事件映射、权限及异常链路记录','技术负责人','柴玉龙（联调协同）','客户IT/厂家、测试','D01,H01,H02,H03,H04,H05,H07,H08,H09,H10,H11,P07','业务测试前','适用设备/接口完成，非适用项确认跳过')
add('T02','5 业务验证与切换','SV10','刷脸/刷卡/扫码支付业务测试','正常/失败/重试等场景、订单与客户资金核对记录','测试/技术＋客户财务','王金洋/张帅A','产品、客户财务','T01,D04,D05,D06,D07','试运行前','仅覆盖选购支付方式；未适用数据步骤经确认不适用')
add('T03','5 业务验证与切换','SV10','称重与视觉结算全流程验证','放盘、取餐、计费、异常提醒、订单及差异记录','测试/技术/交付','王金洋/张帅A','产品、厂家、食堂','T01,D09','试运行前','配置称重/视觉结算时')
add('T04','5 业务验证与切换','SV10','小程序/H5与移动使用测试','登录、绑定、消费/充值/查询、角色与设备链路记录','测试/技术/交付','赵野/王金洋','产品、客户','D02,T01','试运行前','有移动端/H5时')
add('T05','5 业务验证与切换','SV10','食安与采购所选功能业务测试','录像/告警/留样/收发货/库存/供应商等适用流程核对','测试/产品/交付','赵野/张帅A','客户运营/监管/供应商','D09,H03,T01','试运行前','选购食安或采购业务线时')
add('T06','5 业务验证与切换','SV10','审查切换、备份与回退条件','阻断缺陷、数据冻结、责任与回退条件签字确认','技术＋客户IT/财务＋交付负责人','柴玉龙/侯世伟（协同）','测试、客户运营','T02,T03,T04,T05','切换窗口批准前','所有系统上线或重要升级','非适用测试经确认不适用；不带已完成日期/不自动执行生产切换')

add('R01','6 试运行培训与保障','SV12','开展部分用户试运行','实际操作问题、订单/数据差异、反馈与处理记录','交付负责人＋客户运营','王金洋/赵野','技术、产品、食堂','T06','约定试运行窗口','所有项目按签署范围')
add('R02','6 试运行培训与保障','SV12','批准正式切换与启用','客户/技术批准记录、新系统业务回验与异常恢复记录','交付负责人＋客户IT/财务','侯世伟/柴玉龙（协同）','技术、客户运营','R01,T06','约定正式上线窗口','需切换系统时','实际时间按客户开餐安排与授权填写')
add('R03','6 试运行培训与保障','SV12','现场跟餐与开餐保障','约定天数/餐次、设备及用户操作问题清单和闭环','交付现场人员','王金洋/侯世伟/赵野','技术、厂家、客户运营','R02','上线后约定保障窗口','合同含现场保障时','长期运维不自动由一次虚拟服务项无限包含')
add('R04','6 试运行培训与保障','SV11','培训客户并交付操作资料','档口、管理员、财务等培训记录和约定资料包','交付/产品','张帅A/赵野','客户角色负责人','T01,T02,T03,T04,T05','试运行前/中','按选购功能和客户角色执行','可先教基础消费，再培训分批新增设备；资料是对应已验版本')
add('R05','6 试运行培训与保障','WK15','处理现场网络/卡机等运行问题','原因、影响、解决与复测证据；缺陷转研发，硬件故障转厂家','技术/交付/厂家','柴玉龙/王金洋/张帅A','客户IT、技术/产品','R01','问题发生时','运行中发生问题时','标签WK15与对应SV动作辅助关联；不自动将修复变新增收费')

add('A01','7 验收交接与复盘','SV12','客户逐项验收与范围签收','交付项、客户配合、排除/残余事项及验收证据会签','交付负责人＋客户验收人','侯世伟/赵野','销售、产品、技术','R03,R04,R05','约定验收节点','所有项目；无保障/问题项先确认不适用')
add('A02','7 验收交接与复盘','SV12','移交运维、账号主体与服务期限','运维职责、版本资料、故障通道、备份/续费、期限交接记录','交付负责人/运维＋客户IT','柴玉龙/赵野','商务、客户IT','A01','验收交接时','所有项目','凭据通过受控渠道交接，不写本表或Git')
add('A03','7 验收交接与复盘','WK20','复盘问题与回填售前模板','把后期卡点转成前置确认项，形成可复用说明与案例','交付负责人＋售前/产品','侯世伟/赵野（建议）','交付实施部、技术','A01','交付后复盘','所有项目','复盘是改进建议，不能把未经验证效果写成已降低返工')

TD={x[0]:x for x in T};assert len(TD)==len(T)
FLOWS=[
['部队内网流程','部队','内网/离线或客户指定访问环境；可含本地部署','优先确认允许的作业/资料方式、网络外部依赖、支付路径、介质与版本交接、设备使用条件','P03/P04/P05/P06/P07/P08优先评估；不能默认可用公网小程序/短信/支付','示例：安庆；具体要求由客户确认，不默认涉密或等保等级'],
['政府政务流程','政府','客户政务云/内外网分区/已有平台等实际组合','安全与审批主体、云资源申请、既有数据库/人脸平台、网络开通、监管/多角色入口','P03/P04/P05/P07前置；环境申请与兼容未明确时不能给无条件上线日期','示例：城市副中心；不将政府身份等同于固定技术方案'],
['国央企集成流程','国央企','内网/客户云/高可用与ERP/一卡通等集成按实际选择','安全规范、变更审批、主数据/财务分工、商户/成本中心、网络和厂商排期','P03/P04/P05/P07/P09前置；新增开发和高可用验证交给研发技术','用户售前表没有单列国央企项目；流程是建议模板'],
['企业标准流程','普通企业','公有云SaaS或标准本地方案','租户/业务范围、客户商户主体、设备点位、基础资料、服务次数和上线窗口','标准环境可简化但不跳过网络、支付、数据和验收确认','示例：哈尔滨；企业项目也可能需要特殊环境分支'],
['学校多账户流程','学校','标准/本地/校园网络；一卡通与访客或多角色按实际选','开学开餐窗口、校园卡和访客账户、余额迁移、多人峰值、营养/食安/采购边界','P06/P07/P08/P09和T02关键；数据/资金核对、混合账户测试不省略','示例：滨州、央美；以实际产品和账户模式为准'],
['医院多部门流程','医院','标准/本地；多部门/院内卡/设备系统按实际选','院内网络、部门人员、收款主体、外部接口、业务时段和健康设备范围','P03/P05/P06/P07/P09按客户要求前置；不作临床/医疗效果承诺','示例：国康；医院身份不代表必然有医疗数据对接']
]
SPECIAL={
 '部队内网流程':[
 ['MY01','0 售前专项前置','SV04','确认客户允许的访问、介质和离线作业路径','客户允许的远程/现场/介质方式及外部依赖验证记录','客户IT/安全＋技术','柴玉龙/赵野','客户、技术','P03,P05','报价与部署前','客户指定内网/离线或作业限制时','不默认涉密；不能用未授权公网工具代替客户允许的路径'],
 ['MY02','0 售前专项前置','SV09','确认内网下身份、支付、同步和备份使用方式','离线/内网业务链路、同步恢复与备份路径的可行性及责任确认','技术＋客户IT/财务','柴玉龙/王金洋','产品、客户','P06,P07,P09','正式上线排期前','相关外部服务受限时','不同军队项目的环境要求以客户确认资料为准']],
 '政府政务流程':[
 ['GV01','0 售前专项前置','SV03','冻结政务云资源申请与网络区域访问','资源申请、网络区划、入口、审批责任及到位条件确认','客户IT/云资源方＋技术','柴玉龙/赵野','客户安全/云平台','P03,P04,P05','正式报价/实施排期前','使用政务云/分区环境时','不把客户已申请视为资源已到位'],
 ['GV02','0 售前专项前置','WK14','评审现有数据库、人脸与监管平台兼容范围','已有平台/版本/字段、对接责任和专项验证边界确认','研发技术＋客户IT','柴玉龙（协同）','产品、现有平台方','P04,P07','研发与联调排期前','接入已有平台/非标准数据库时','不以其他项目曾成功适配替代本项目测试']],
 '国央企集成流程':[
 ['SO01','0 售前专项前置','SV09','冻结主数据、成本中心、财务/一卡通接口分工','企业组织/成本中心/资金规则的字段、权威源、审批与联调窗口确认','客户IT/财务＋技术','柴玉龙/赵野','产品、ERP/卡系统方','P06,P07,P09','正式开发/交付排期前','多系统集成时','新增接口开发是研发交付，现场只联调已验证版本'],
 ['SO02','0 售前专项前置','WK14','确认客户高可用、变更及故障恢复要求','客户变更窗口、主备/集群职责、备份恢复/防重与演练条件明确','技术＋客户IT/运维','柴玉龙（协同）','测试、客户','P03,P04,P05','正式部署与上线排期前','客户提出高可用/变更规范时','不默认所有国央企都必须双机热备']],
 '企业标准流程':[
 ['EN01','0 售前专项前置','SV05','确认SaaS租户/标准本地与商户开通范围','租户、入口、商户主体、费用与账号配置责任一致','售前/客户商户主体＋技术','赵野/柴玉龙','商务、客户','P01,P05,P06','报价与开通前','按实际部署方式执行','标准SaaS不代表客户商户手续或设备网络自动具备'],
 ['EN02','0 售前专项前置','SV12','冻结标准服务量与分批启用验收','设备批次、培训/跟餐服务量、增补边界及验收批次明确','交付负责人＋客户','侯世伟/王金洋','商务、技术','P02,P08,P09','报价与实施计划确认前','所有企业项目按合同范围','虚拟服务项价格可填，服务量不能无限默认']],
 '学校多账户流程':[
 ['SC01','0 售前专项前置','SV09','冻结一卡通、访客与历史账户场景','是否混合账户、消费/充值/余额迁移/异常恢复的场景矩阵和责任确认','产品/技术＋客户财务/卡系统','王金洋/柴玉龙','一卡通方、客户','P06,P07,P09','方案与切换计划确认前','有校园卡/访客/历史账户时','不把一条正常消费测试当全部账户链路验收'],
 ['SC02','0 售前专项前置','SV10','冻结开学开餐窗口与峰值场景','餐线、集中时段、用户流程、峰值/容量目标和测试条件确认','客户运营＋技术/测试','王金洋/张帅A','产品、学校IT','P02,P08','设备规模和切换计划确认前','涉及集中开学/高峰开餐时','性能指标待项目确认，不按人数随意承诺响应时间']],
 '医院多部门流程':[
 ['HC01','0 售前专项前置','SV09','核对院内卡、部门、设备数据与访问角色','接口/数据范围、部门角色与授权责任确认','客户IT/业务负责人＋技术','柴玉龙/赵野','产品、接口方','P03,P06,P07,P09','正式报价/研发排期前','相关接口或数据接入时','不默认包含医疗数据，不保存人员健康明细'],
 ['HC02','0 售前专项前置','SV12','确认业务连续性与分角色培训验收','客户业务窗口、应急方式、管理员/食堂/财务培训与验收责任确认','交付负责人＋客户运营','侯世伟/张帅A','技术、财务、客户','P02,P08,P09','切换与培训计划确认前','按客户实际餐厅业务安排','不由餐厅实施模板作医疗或临床效果承诺']]
}
for rows in SPECIAL.values():T.extend(rows)
TD={x[0]:x for x in T}
PRE=[[x[0],x[3],x[5],x[7],x[9],x[4],x[10],x[2],x[11]] for x in T if x[1].startswith('0')]
STAFF=[
['赵野','多项目客户/现场沟通、网络和设备问题、培训协调','客户条件收集、现场计划、资料/验收协调','技术/认证/许可结论由对应专业负责人确认'],
['张帅A','设备安装调试、客户培训、体测/训练和餐厅设备售后','现场安装、旧设备核对、设备测试、客户培训','软件新开发、数据库专项适配由研发技术负责'],
['侯世伟','现场施工/设备交付、项目进度、设备安装与保障','进场/物流/施工窗口协调、交付计划与验收汇总','“项目负责人”仅是建议安排，不代表已任命'],
['柴玉龙','服务器部署、网络/设备远程保障与接口协同','环境部署协同、访问验证、联调、运维交接','专项兼容、证书结论和真实权限由技术/客户批准'],
['王金洋','跟餐保障、扫码/设备测试、客户操作与数据问题处理','试运行/开餐保障、设备/业务验证、数据核对协同','余额结果须客户财务确认，不由交付单方面签字']
]
for x in STAFF:
 n=sum(z['name']==x[0] and '/交付实施部' in z['department'] for z in logs)
 x.extend([n,'来源：日志汇报人部门；既往工作自述，仅建议候选；本期可用性待确认'])

MAP={2:['S01','P10'],3:['P02','P05','E01'],4:['P02','P08'],5:['P04','E01','D01'],6:['P06','D02'],7:['D03'],8:['P09','D04'],9:['D05'],10:['P08','D06'],11:['P06','D07'],12:['P06','D07'],13:['D08'],14:['D09'],15:['H01'],16:['H02'],17:['P08','H03'],18:['H04','T03','R04'],19:['H05'],20:['H07'],21:['H09'],22:['T01'],23:['T02'],24:['T03'],25:['T04'],26:['R01'],27:['T06','R02'],28:['R03'],30:['H05'],31:['H06'],32:['H07'],33:['H08'],34:['P08','H10'],35:['P08','H11'],36:['E02','R05'],37:['R04'],38:['T02','R05']}
assert {i for i in range(2,39) if original.cell(i,3).value}==set(MAP)
oldmap=[]
for row,codes in MAP.items():
 oldmap.append([row,original.cell(row,3).value,'；'.join(codes),'；'.join(TD[c][3] for c in codes),'；'.join(dict.fromkeys(TD[c][2] for c in codes)),'历史源日期/状态保留在原表，不继承为新项目完成事实',original.cell(row,10).value or '',original.cell(row,11).value or ''])

OUT=R/'交付实施计划_分类流程与人员建议_20261008_v02.xlsx'
w=xlsxwriter.Workbook(OUT,{'strings_to_formulas':False,'strings_to_urls':False})
f=w.add_format({'font_name':'微软雅黑','font_size':12,'valign':'top','text_wrap':True});h=w.add_format({'font_name':'微软雅黑','font_size':12,'bold':True,'font_color':'FFFFFF','bg_color':'163B56','valign':'vcenter','text_wrap':True});warn=w.add_format({'font_name':'微软雅黑','font_size':12,'bg_color':'FFF0CD','text_wrap':True})
def safe(v):
 if v is None:return ''
 return str(v)
def table(name,heads,rows,widths={}):
 s=w.add_worksheet(name);s.hide_gridlines(2);s.freeze_panes(1,min(3,len(heads)));s.set_row(0,50);s.set_column(0,len(heads)-1,25,f)
 for c,v in widths.items():s.set_column(c,c,v,f)
 s.write_row(0,0,heads,h)
 for i,row in enumerate(rows,1):
  s.write_row(i,0,[safe(v) if not isinstance(v,(int,float)) else v for v in row],f)
  lc=max(sum(max(1,math.ceil(sum(2 if unicodedata.east_asian_width(c) in 'WF' else 1 for c in z)/max(12,widths.get(j,25)-2))) for z in safe(v).split('\n')) for j,v in enumerate(row))
  s.set_row(i,min(150,max(35,18*lc+8)))
 if rows:s.add_table(0,0,len(rows),len(heads)-1,{'columns':[{'header':x} for x in heads],'style':'Table Style Medium 2'})
 s.set_landscape();s.fit_to_pages(1,0);return s

ov=w.add_worksheet('先看怎么用');ov.hide_gridlines(2);ov.set_column('A:A',4);ov.set_column('B:H',20,f)
for rg,text,style in [
('B2:H3','分类实施计划 v0.2｜先确认条件，再进场执行',h),
('B5:H8',f'依据：原交付进度表36任务，交付实施部日志5名人员。新版本共{len(T)}个可复用任务（50通用＋12类型专项），6条流程各有2个专项前置节点；任务使用与虚拟服务报价项相同的标签。',f),
('B10:H13','行业类型只提示关注重点，最终仍选择实际部署模式、接口/账户、客户安全要求、设备和业务线。模板不默认部队涉密、不默认政府三级等保、不默认每家国央企都有信创要求。',warn),
('B15:H18','新增前置阶段：范围与服务、规模点位、安全/等保要求、系统/数据库适配、网络/账号、接口/SDK、利旧、数据切换和计划验收。在报价/排期前确认要求与投入，部署/联调前关闭相关差异。',f),
('B20:H23','选流程后保留适用任务，其他任务由负责人说明不适用。每行都有前置ID、产出/验收依据、主责岗位、建议协同人和真实负责人字段。前置项没解决不把后续状态改为已完成。',f),
('B25:H28','所有新计划日期空白、真实负责人待指定、状态待安排；原表三四月和九月的历史日期/完成状态完整另存。候选人来自既往日志，尚未评估当前负荷，不代表实际任命或对外承诺。',warn),
('B30:H33','等保等级、认证审批、价格、服务期、指标和正式切换按客户及我方责任人确认；表格不是安全认证或法律结论。涉及生产写入/切换须项目授权，凭据、余额明细和人脸资料不填本表。',f)]:ov.merge_range(rg,text,style)
for i,n in enumerate(['流程怎么选','前置确认清单','人员建议分工','通用任务库','原计划完整保留','旧新任务对应'],35):ov.write_url(i,1,f"internal:'{n}'!A1",f,n)
heads=['任务ID','阶段','统一标签','任务','交付结果/验收依据','主责岗位','建议交付协同人','客户/跨部门责任','前置任务ID','执行节点','适用条件','说明']
table('通用任务库',heads,T,{3:58,4:105,5:45,6:45,7:55,8:65,10:80,11:100})
table('流程怎么选',['流程','客户类型','实际部署判断','重点提前确认什么','关键前置与门槛','案例/证据边界'],FLOWS,{2:85,3:110,4:110,5:100})
table('前置确认清单',['前置ID','确认事项','主责角色','参与方','必须前置的节点','确认结果/依据','触发条件','统一标签','边界'],PRE,{1:65,4:60,5:110,6:95,8:105})
table('人员建议分工',['交付实施部人员','原日志常见工作','建议承担工作','需要其他角色确认的边界','源汇报份数','人员建议依据'],STAFF,{1:85,2:95,3:95,5:100})
rawheads=[original.cell(1,c).value or '原无表头列'+openpyxl.utils.get_column_letter(c) for c in range(1,14)]
table('原计划完整保留',rawheads,raw[1:],{2:58,3:70,9:110,10:110})
table('旧新任务对应',['源行号','原任务','新任务ID','新任务','统一标签','日期/状态处理','原说明','原K列补充'],oldmap,{1:60,2:45,3:105,5:90,6:110,7:100})
planheads=['任务ID','阶段','统一标签','任务','交付结果/验收依据','主责岗位','建议交付协同人','客户/跨部门责任','前置任务ID','执行节点','计划开始','计划结束','实际负责人','状态','适用条件/流程提示']
for profile in FLOWS:
 name=profile[0]
 rows=[]
 specific_ids={x[0] for x in SPECIAL[name]}
 specific_all={x[0] for v in SPECIAL.values() for x in v}
 selected=[x for x in T if x[0] not in specific_all or x[0] in specific_ids]
 selected.sort(key=lambda x:int(x[1][0]))
 byid={x[0]:x for x in selected};ordered=[];done=set()
 def emit(code):
  if code in done:return
  deps=[z for z in byid[code][8].split(',') if z]
  if code=='P10':deps+=sorted(specific_ids)
  for dep in deps:emit(dep)
  done.add(code);ordered.append(byid[code])
 for x in selected:emit(x[0])
 for x in ordered:
  note=x[10]+'；'+x[11]
  if x[0] in profile[4]:note='本流程优先确认｜'+note
  part=x[:10].copy()
  if x[0]=='P10':part[8]+=','+','.join(sorted(specific_ids))
  rows.append(part+['','','待指定','待安排',note])
 sh=table(name,planheads,rows,{3:58,4:105,5:45,6:45,7:55,8:70,9:55,14:125})
 sh.data_validation(1,13,len(rows),13,{'validate':'list','source':['待安排','待前置条件','进行中','待确认/验收','已完成','不适用']})
 sh.write_comment(0,14,'流程重点：'+profile[3]+'。'+profile[4]+'。'+profile[5])

config=[['项目名称','待填写'],['项目编号','待填写'],['客户类型','待选择'],['选用流程','待选择'],['所选营养/食安/采购业务线','待确认'],['部署模式/资源提供方','待确认'],['安全/等保/测评要求与责任人','待客户确认'],['操作系统/数据库/信创适配','待技术确认'],['接口/支付/账户模式','待确认'],['点位/设备/利旧清单','待确认'],['数据迁移及财务核对责任','待确认'],['交付负责人','待指定'],['开始/切换/验收日期','待排期'],['服务报价/合同范围版本','待关联'],['服务次数、现场保障/售后期','待确认']]
s=table('项目使用配置',['项目设置','实际值（填写）'],config,{0:65,1:100});s.data_validation(4,1,4,1,{'validate':'list','source':[x[0] for x in FLOWS]})
changes=[['新增阶段0','等保/安全、适配、网络、接口、数据与范围前置','从进场后临时解决改为报价/排期前确认责任与可行性'],['按实际条件选流程','6客户类型只是重点提示，环境/产品决定适用任务','不按行业套固定等保等级或采购要求'],['“康比特”细化责任','主责岗位、建议交付协同人、客户/跨部责任和实际负责人分别填写','交付不包办研发、客户财务或安全审批'],['日期与进度','新流程不继承历史已完成/日期；每行可填真实排期','源表3/4月和9月计划原样保留'],['36任务全部对应','原K列追加说明与分批设备安装细节完整保留','旧任务可能拆分到多个新节点'],['验收更清楚','产出、前置ID、状态、依据与责任人','不填空泛“无问题”替代数据/流程核对'],['与报价日志同标签','所有任务引用SV/WK标签，可与人员日志和虚拟服务项关联','价格独立，标签不分摊金额']]
table('本次改动说明',['改动','新版处理','用途与边界'],changes,{1:110,2:110})
w.close()
manifest={'original':str(P),'snapshot':'source/交付进度表.xlsx','sha256':hashlib.sha256(P.read_bytes()).hexdigest(),'original_tasks':36,'new_tasks':len(T),'flow_count':6,'delivery_staff':sorted(delivery),'date_state_policy':'历史源值保留；新日期空白/待安排/负责人待指定','file':str(OUT)}
(R/'source/manifest.json').write_text(json.dumps(manifest,ensure_ascii=False,indent=2));(R/'source/task-library.json').write_text(json.dumps(T,ensure_ascii=False,indent=2));(R/'source/task-map.json').write_text(json.dumps(MAP,ensure_ascii=False,indent=2))
md=f'''# 分类交付实施计划 v0.2（首版建议）

基于用户《交付进度表.xlsx》36任务，结合日志中交付实施部五名人员形成{len(T)}任务库、6条重点流程和原新任务对应。沿用“虚拟服务报价项与人员工作”22标签。金额没有固定为5000元；实施任务与工作标签不构成金额分摊。

## 前置原则

把范围/验收、安全与等保要求、适配可行性、网络/账号、接口与第三方配合、利旧兼容、数据迁移和切换条件放到报价/签约与排期前确认。正式部署/联调前关闭相关差异并接收已验证版本。客户类型只是提示重点，不据此指定法定等级、认证结论或固定架构。

## 六条流程

'''
for x in FLOWS:md+=f'- **{x[0]}**：{x[3]}。{x[4]}。{x[5]}。\n'
md+='\n## 人员建议\n\n'
for x in STAFF:md+=f'- **{x[0]}**：原日志常见{x[1]}；建议{x[2]}；{x[3]}。\n'
md+='''
实际负责人、可用性和日期由项目排期确认；新计划未替任何人派工或发消息。技术研发、客户IT/财务、安全/测评责任与交付协同分开。每个任务有主责、产出、前置ID、状态和来源；非适用项写原因，经确认再跳过。

## 原表的具体修正

保留源表全部行、两段历史时间表以及原K列说明；新计划不继承源“已完成”。人员组织任务原输出为“原系统余额可正常使用”，新版改为组织/人员/开户数据核对，余额另有财务核对与切换条件。IC卡供应、发票采购、视频/旧电视兼容、视觉识别样本与学习条件、分批设备到货和正式切换均提前写清。视觉准确率等未给定指标保持待项目确认，不承诺具体数值。

## 验收与关联

所有36旧任务至少对应一个新版任务，任务库ID唯一、前置ID有效且无环，全部标签在共享字典中存在。六流程覆盖共用任务但状态为待安排，负责人/日期未编造；五名人员均有原日志部门证据。工程实施、生产切换、客户签署尚未执行。原表项目归属未明确，不擅自命名为某客户的已批准计划。

## UC-DELIVERY-003

角色：交付负责人、现场人员、技术/产品、客户IT/财务/验收人。触发：选择客户类型及实际部署条件生成计划。主流程：采集/前置确认→版本交接→环境→系统数据→设备→业务验证→试运行培训→验收交接复盘。异常：未关闭的前置项阻止相应后续节点；不适用项需理由和确认；新缺陷回研发，新的范围回报价与变更。验收：源36任务完整对应、原文件不变、人员与标签可追溯、前置依赖合法、日期/负责人不编造。生产执行/API/数据库写入：[不适用：仅交付计划模板]。评审READY；实际项目排期和客户确认待完成。
'''
(R/'proposal.md').write_text(md)
print(json.dumps(manifest,ensure_ascii=False))
