from pathlib import Path
import csv, re, json
from copy import copy
from html import escape
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
BASE=Path(__file__).resolve().parent
ROOT=BASE.parents[3]
rows=[
('2026年9月','国康项目','已回访1次','孙海琴','补采购动因、效果数据及首访报告'),
('2026年9月','国康项目','原表未填写','孙海琴','重复行待确认是否二访；不重复计项目数'),
('2026年9月','滨州项目','已有初步反馈；正式回访状态待确认','李潇','核对决策链与产教融合实际落地'),
('2026年10月','金斯瑞项目','原表未填写','李潇','待交付协助预约'),
('2026年10月','机场项目','原表未填写','李潇','待交付协助预约'),
('2026年10月','网信办项目','原表未填写','王朔','待交付协助预约'),
('2026年11月','首通智城3个学校','原表未填写','王朔','3校名单、独立点位口径待确认；建议11月访2校，12月访1校'),
('2026年11月','中央美院项目','原表未填写','孙海琴','待交付协助预约'),
('2026年12月','赛迪项目','原表未填写','李潇','待交付协助预约'),
('2026年12月','国信项目','原表未填写','孙海琴','待交付协助预约'),
('2026年1月','四方达项目','日期待确认','孙海琴','位于2026年12月后；建议核对是否2027年1月，未自动修改'),
('2027年','三全项目','月份待排','李潇','具体月份待确认'),
('2027年','保康中学','月份及负责人待定','待确认','待交付协助补负责人'),
('原表未填写','江西206','已有初步反馈；正式回访状态待确认','待确认','与反馈中的206暂关联，项目全称待确认；优先补核70%'),
('原表未填写','无锡新吴区政府','待排期','待确认','待明确月份与负责人'),
('原表未填写','西康宾馆','待排期','待确认','待明确月份与负责人'),
('原表未填写','重庆环卫','待排期','待确认','待明确月份与负责人'),
('原表未填写','中央国债','待排期','待确认','待明确月份与负责人'),
('原表未填写','建宁中学','待排期','待确认','待明确月份与负责人'),
('原表未填写','哈尔滨膳质舍','待排期','待确认','待明确月份与负责人'),
('原表未填写','北京市城市副中心','待排期','待确认','待明确月份与负责人')]
headers=['序号','原计划时间','项目名称','当前状态','负责人','报告链接','下一步/待确认']
data=[[i,*r[:4],'待补',r[4]] for i,r in enumerate(rows,1)]
with (BASE/'visit-register.csv').open('w',encoding='utf-8-sig',newline='') as f:
 w=csv.writer(f);w.writerow(headers);w.writerows(data)
weekly='将项目客户回访纳入长期产品价值验证，计划每月直接回访1—3个项目，由交付协助联系客户，重点回答“当时为什么采购”和“使用前后有哪些量化变化”，逐步形成可追溯的客户案例，支持产品定位和销售表达。当前国康已回访1次，报告内容待补；已汇总206与滨州两组初步反馈：206关注菜品统计、人工结算、错账与食材浪费，滨州关注营养理念、产教融合、同类园区参考及产品风格。206提及“食材损耗成本降低70%”，尚缺前后报表和统计口径，暂列待核实线索。下一步补齐国康首访报告，推进9月国康、滨州回访及206数据复核，并完善负责人、日期和报告链接。'
findings=[
['206（暂关联江西206）','菜品数据统计、降低人工成本、减少人工结算、错账与浪费','用户提供文字反馈；采购前痛点与使用后感受尚未逐项分开','反馈称食材损耗成本降低70%；未核实','补前后同口径损耗金额、统计周期、就餐人次及其他同期措施；确认全称','效率与成本管控可能是价值方向，属于单项目线索'],
['滨州','营养信息符合学院理念、产教融合；其他园区已有同类产品；领导偏好风格样式、看中营养权威性','用户提供文字反馈；首次办校，无既有食堂问题基线','没有已提供的量化成效数据','核对采购决策人；营养及产教融合是采购期待还是已落地；补课程/实训/使用记录','采购动因也可能是新建目标与理念匹配，不能强行归为旧问题改善'],
['国康','待补首访记录','原表明确已回访1次；第二行含义待确认','未提供','孙海琴补首访纪要、受访角色、结论与下一轮问题','仅能确认回访次数，不能推断客户评价或成效']]
plan='''# 项目客户回访：长期计划与阶段发现

更新：2026-09-11。当前是依据用户文字整理的内部初稿；未取得客户签认、原始录音或前后数据报表。

## 周报第9项（可直接并入）

'''+weekly+'''

## 长期目标与节奏

目的：持续弄清客户为什么购买、实际价值在哪里，形成可追溯的项目案例，为产品取舍、差异价值和销售表达提供依据。

每月直接回访1—3个项目；同一项目的第二次访谈计访谈次数，不重复计覆盖项目。项目与学校点位分别统计，首通3校不能仅用一位渠道人员访谈代表三校客户意见。

以下为建议执行机制，负责人确认后执行：

1. 月初：按排期确定1—3个项目；交付协助联系采购决策参与者与实际运营人员，说明用途并约时间，回访负责人准备项目背景及上次未答问题。
2. 月中：直接与客户开展30—45分钟访谈；先问具体采购经过，再问变化与证据。不预设客户必然存在A/B/C问题，不用产品卖点引导回答。
3. 访后2个工作日内：形成一项目一份回访报告，区分客户原话、转述、分析判断、待补证；向客户核对关键结论。录音与对外引用分别获得同意。
4. 月末：汇总覆盖项目数、访谈次数、已交付报告数、量化证据完整数及未闭环项。没有数字不填0，报告有数据缺口仍可提交，但不得标为量化验证完成。
5. 每季度：比较不同场景的采购动因、实际价值及反例，形成产品改进建议与已核实案例；按证据决定是否更新销售材料。

职责：原表孙海琴/李潇/王朔为回访责任人；交付负责协助客户联系及资料获取，具体对接人待确认。跨项目统筹与报告审核负责人待指定，不把该职责自动指派给某位同事。

## 滚动排期

| 时间 | 原计划 | 执行建议与边界 |
|---|---|---|
| 2026年9月 | 国康两行、滨州 | 覆盖2个项目；国康第二行是否二访待确认。206建议优先数据复核，若安排正式客户回访可作为当月第3个项目，待确认 |
| 2026年10月 | 金斯瑞、机场、网信办 | 3个项目，按原责任人推进 |
| 2026年11月 | 首通智城3校、中央美院 | 按独立点位可能为4个；建议11月2校+中央美院，12月补1校，须确认后调整 |
| 2026年12月 | 赛迪、国信 | 2个项目；可承接首通剩余1校 |
| 时间待核 | 四方达，原填2026年1月 | 按上下文可能意指2027年1月；保留原值，待确认 |
| 2027年 | 三全、保康中学 | 已有年度意向，月份待排；三全负责人李潇，保康负责人待定 |
| 年/月未填 | 江西206及其后7个项目 | 保留为候选池，不擅自归入2027；每季度滚动明确下季度月份、负责人和客户时间 |

完整21行清单见 visit-register.csv 和Excel“回访台账”。首通后续应拆分学校明细，保留父项目映射。

## 已有调研结果

### 206（暂关联江西206，待确认全称）

现有转述：方便菜品数据统计，降低人工成本，无需人工结算，减少浪费，降低食材损耗成本70%，减少人为错账。

初步归纳：采购/使用价值可能集中在统计效率、结算人力、账务准确性和成本控制。当前材料未区分每项是采购前诉求还是已实现效果，需逐项追问。

量化状态：70%仅为用户转述中的线索，尚无基线、周期、金额或数据来源。不能表述为已验证降本成果，也不能扩大为总食材成本降低70%。

下一步：确认损耗成本的定义、分子分母和对比窗口；索取前后报表，核对就餐人数、供餐天数、菜品结构和采购价格变化，并记录同期其他管理措施。保留结论不成立或未改善的反例。

### 滨州

现有转述：营养信息符合学院理念，希望实现产教融合；其他园区已有相同产品；领导偏好产品风格样式，并看中营养方面的权威性。首次办校，无相关既有问题基线。

初步归纳：新建学校场景下，购买动因包含理念、建设目标、参考案例和决策偏好。不能要求每个客户都回答出既有A/B/C问题，也不能将“看中营养权威性”写成已验证的专业认证。

量化状态：未提供数据。产教融合目前是意图/目标，未证明已落地。可核对营养课程次数、实训覆盖学生数、系统用于教学的频次和已建立的营养展示/查询使用记录；仅在客户确认目标与统计方法后跟踪，不虚构上线前数据。

### 国康

清单确认已回访1次，未提供首访内容或报告。孙海琴需补充原记录；第二行保留，待确认是否二访。

## 中性访谈提纲

- 请回忆最初决定要采购系统的那段时间，当时发生了什么？
- 是谁先提出，谁参与比较，最后由谁作决定？
- 当时最希望达成什么？如果是新建项目，原定建设目标是什么？
- 当时还考虑过哪些做法或产品？最终哪个因素最关键？
- 请举一个最近实际使用的例子，使用前后哪里发生了变化？
- 哪些期待没有达到，或者暂时看不出变化？
- 对这个变化，现有记录中能找到什么数据？数据由谁维护？
- 是否还有同期人员、流程、价格或客流变化？下一次适合向谁补证？

## 量化取证模板

每个指标记录：项目/点位、指标定义、单位、上线前周期和值、上线后周期和值、就餐人次或业务量、来源链接、数据维护人、可比性、同期干扰因素、客户确认状态。

成本下降率 =（前期同口径成本－后期同口径成本）÷前期同口径成本。前期为0或缺失时不计算；客流变化较大时同时看每百人次损耗成本。系统上线前后对比只能描述相关变化，归因还要核对其他同期措施。

滨州首次办校无历史基线：以建设目标、验收标准和上线后持续使用记录评估；如采用其他学校参照，需说明差异，不能作为滨州自身Before数据。

## 单项目报告固定内容

回访日期、受访角色/匿名编号、回访人、采购触发与决策链、选择理由、实际使用与未达预期、量化表、证据链接、待补证/责任人/约定期限、下次回访问题。报告链接生成并核对后再填入台账。

## 下次周报要更新的内容

国康首访报告是否补齐；9月预约和真实回访结果；206的70%能否被同口径报表支持；滨州产教融合是否实际发生；待确认日期与负责人的变化。已覆盖项目和已核实量化案例分别统计。
'''
(BASE/'summary.md').write_text(plan)
# Preserve template sheets/columns; remove illustrative March records and amounts.
w=load_workbook('/Users/jack/同步空间/cpt/05_经营管理与会议/005_日常管理/周例会（事业部层面）/2026年/周报模板.xlsx')
for s in w:
 for m in list(s.merged_cells.ranges):s.unmerge_cells(str(m))
 for row in s:
  for c in row:c.value=None
 s.freeze_panes='E6'
s=w['项目'];s.delete_rows(9,9);s.merge_cells('A1:R1');s['A1']='周报第9项补充｜项目客户回访（截至2026-09-11）'
s.merge_cells('A2:R3');s['A2']='每月直接回访1—3个项目，交付协助联系；回答采购动因与使用前后变化。本文件为独立补充件，待并入指定周报。'
s.merge_cells('A4:R4');s['A4']='已有状态与近期行动；合同、金额及上线验收状态未提供'
ph=['序号','项目类型','项目阶段','项目名称','关键时间','项目金额','负责人','合同','采购','交付','上线','验收','回款','当前已知进展','本周计划/后续动作','问题与偏差','备注','链接']
for i,v in enumerate(ph,1):s.cell(5,i,v)
for i,idx in enumerate([0,2,13],6):
 r=rows[idx]; vals=[i-5,'客户回访','价值验证',r[1],r[0],'未提供',r[3],*(['未提供']*6),r[2],r[4],'量化证据待补','采购期待与成效分开记录','待补']
 for j,v in enumerate(vals,1):s.cell(i,j,v)
s=w['产品'];s.delete_rows(5,20);s.merge_cells('A1:I1');s['A1']='9、项目客户回访｜长期产品价值验证'
s.merge_cells('A2:I3');s['A2']=weekly
for i,v in enumerate(['序号','一级分类','二级分类','工作内容','对应项目/场景','时间节点','负责人','本次输出/目标','备注'],1):s.cell(4,i,v)
for row in [[9,'产品差异性','采购动因与效果验证','客户直接回访与证据补全','206、滨州、国康','每月1—3个项目','按回访台账','周报补充、回访台账、阶段发现及取证模板','处于验证阶段；未证明量化成效'],[10,'产品标准化','客户案例积累','每次一份报告，月汇总、季度复盘','滚动候选池','长期','统筹人待指定','形成有来源的采购原因、实际价值及反例','交付协助联系；关键引用先核对']]:s.append(row)
def sheet(name,hs,ds):
 s=w.create_sheet(name);s.append(hs)
 for row in ds:s.append(row)
 s.freeze_panes='C2';s.auto_filter.ref=s.dimensions
 return s
sheet('回访台账',headers,data)
sheet('已有调研结果',['项目','采购/价值线索','来源与边界','量化状态','下一步','初步判断'],findings)
sheet('长期机制',['阶段','节奏','动作','责任','交付/验收'],[
['选样预约','月初','明确1—3项目；直接客户、决策角色及运营角色','原回访负责人+交付协助','预约时间/角色/资料清单'],
['访谈','月中','采购经过、选择原因、使用变化与未达预期','回访负责人','一项目一份记录；同意后录音'],
['报告与核对','建议访后2工作日','区分原话、判断、待补证','回访负责人；审核人待定','报告链接及补证责任/时间'],
['月度汇总','每月末','去重项目覆盖、访谈次数、报告数、量化完整数','统筹人待指定','周报/月报新增事实、偏差与下一步'],
['案例复盘','每季度','比较不同场景、反例与价值证据','产品/交付共同复核（建议）','经核实案例、产品建议与下季排期']])
sheet('量化取证模板',['项目','指标','单位','前期窗口','前期值','后期窗口','后期值','业务量/就餐人次','数据来源','可比性/干扰项','数据责任人','核实状态'],[
['206','食材损耗成本','元','待补','待补','待补','待补','待补','待补','损耗定义、采购价格、菜品与管理变动','待确认','70%仅为未核实反馈'],
['206','结算投入工时/错账笔数','小时/笔（分别记录）','待补','待补','待补','待补','待补','待补','同口径业务量','待确认','待补证'],
['滨州','课程/实训/实际使用','按客户确认','首次办校无历史基线','不适用','待补','待补','待补','教学和使用记录','区分建设目标与实际完成','待确认','待补证']])
for s in w:
 s.sheet_view.showGridLines=False
 s.sheet_properties.pageSetUpPr.fitToPage=True
 s.page_setup.orientation='landscape';s.page_setup.paperSize=s.PAPERSIZE_A3
 s.page_setup.fitToWidth=1;s.page_setup.fitToHeight=0
 s.print_options.horizontalCentered=True
 s.print_area=s.dimensions
 for row in s:
  for c in row:
   c.font=Font(name='微软雅黑',size=12,color='243B49')
   c.alignment=Alignment(vertical='top',wrap_text=True)
   c.border=Border(bottom=Side(style='hair',color='DCE5E8'))
   c.fill=PatternFill('solid',fgColor='F1F6F7' if c.row%2==0 else 'FFFFFF')
 for col in range(1,s.max_column+1):s.column_dimensions[get_column_letter(col)].width=22
 if s.title=='项目':
  for c in ['N','O','P','Q']:s.column_dimensions[c].width=36
  for c in ['F','H','I','J','K','L','M']:s.column_dimensions[c].width=12
 if s.title=='产品':
  for c in ['D','E','H','I']:s.column_dimensions[c].width=35
 if s.title=='回访台账':s.column_dimensions['G'].width=68;s.column_dimensions['D'].width=38
 if s.title=='已有调研结果':
  for col in ['B','C','D','E','F']:s.column_dimensions[col].width=48
 for row in range(1,s.max_row+1):s.row_dimensions[row].height=90 if s.title=='已有调研结果' else 72
 hr=5 if s.title=='项目' else 4 if s.title=='产品' else 1
 for c in s[hr]:c.fill=PatternFill('solid',fgColor='17676B');c.font=Font(name='微软雅黑',size=12,bold=True,color='FFFFFF')
 s.row_dimensions[hr].height=38
 s.print_title_rows=f'1:{hr}'
 if s.title in ['项目','产品']:
  s['A1'].font=Font(name='微软雅黑',size=12,bold=True,color='17676B');s.row_dimensions[1].height=32
  s.row_dimensions[2].height=95 if s.title=='产品' else 35;s.row_dimensions[3].height=38
out=BASE/'output/项目客户回访_周报补充与长期计划_20260911.xlsx';w.save(out)
# Adapt pakco webpage scaffold and inline reviewed local theme/base styles.
pak=Path('/Users/jack/code/099-github/pakco-html')
t=(pak/'templates/webpage.html').read_text()
css=(pak/'assets/base.css').read_text()+'\n'+(pak/'assets/themes/minimal-white.css').read_text()+'''\n:root{--accent:#17676b;--font-sans:"Microsoft YaHei","PingFang SC",sans-serif;--font-display:var(--font-sans)}body.webpage .page{max-width:1080px}body.webpage .h1{font-size:clamp(32px,6vw,58px)}.table-wrap{overflow:auto}table{border-collapse:collapse;width:100%;font-size:14px}th,td{padding:14px;text-align:left;border-bottom:1px solid var(--border);vertical-align:top}th{color:var(--accent)}.finding{margin:22px 0;padding:22px;border-left:3px solid var(--accent);background:var(--surface-2)}p,li{line-height:1.8}.lede{font-size:18px!important}.dim{color:var(--text-2)}@media(max-width:600px){body.webpage .page{padding:24px 20px}td,th{min-width:115px}.grid{grid-template-columns:1fr!important}}'''
t=re.sub(r'<link[^>]+>', '', t)
t=t.replace('</head>','<style>'+css+'</style></head>').replace('pakco.html · 网页','客户回访｜采购动因与价值验证')
body='<section class="hero"><p class="kicker">康比特 · 客户价值研究 / 2026.09.11</p><h1 class="h1">为什么选择我们？<br>用了之后，改变了什么？</h1><p class="lede">每月直接回访1—3个项目，让采购理由和实际价值逐步有据可查。</p></section><div class="section-break"></div>'
body+='<section><h2 class="h2">本次周报讲清楚这一项</h2><p class="lede">'+escape(weekly)+'</p></section><div class="section-break"></div><section><h2 class="h2">已有的三条项目记录</h2>'
for f in findings:body+='<article class="finding"><h3>'+escape(f[0])+'</h3><p>'+escape(f[1])+'</p><p><b>量化状态：</b>'+escape(f[3])+'</p><p class="dim">下一步：'+escape(f[4])+'</p></article>'
body+='</section><div class="section-break"></div><section><h2 class="h2">长期执行：约访 → 访谈 → 报告 → 补证 → 复盘</h2><p>交付协助联系客户，回访负责人直接访谈采购参与者和实际运营者。建议访后2个工作日形成报告；每月汇总，季度比较不同场景的采购动因、实际成效及反例。</p><p>量化记录必须包含指标定义、前后周期与数值、数据来源和业务量。同一项目多次访谈分别计次数，覆盖项目去重；新建学校没有历史基线时，按建设目标及上线后的实际使用评估。</p></section><div class="section-break"></div><section><h2 class="h2">回访排期与责任人</h2><p class="dim">国康重复行保留待确认；四方达保留原2026年1月。首通3校建议分两月，避免11月独立点位超过3个。空白状态不等于未回访。</p><div class="table-wrap"><table><thead><tr>'+''.join('<th>'+x+'</th>' for x in ['原计划时间','项目','状态','负责人','下一步'])+'</tr></thead><tbody>'
for r in rows:body+='<tr>'+''.join('<td>'+escape(v)+'</td>' for v in r)+'</tr>'
body+='</tbody></table></div></section><div class="page-footer">依据用户提供材料整理 · 内部初稿 · 70%尚未核实 · 客户正式报告链接待补</div>'
t=t[:t.index('<div class="page">')]+ '<div class="page">'+body+'</div></body></html>'
(BASE/'customer-return-visit-plan.html').write_text(t)
print(out)
