# 2026-09-20

## v2.8 郑州业务共享版上线
- 技术支持岗工作地点扩展至郑州（甲方关联公司经营地：郑州市，业务视同甲方安排，报酬由甲方统一结算）
- 新增跨市（郑州）出差规则：①差旅全包（城际交通+工作餐+确需过夜住宿公司统一安排；自行前往经同意城际交通实报实销+餐补50元/日）②当日保底计薪4小时（实际服务时长超过4小时的按实际计）③派单提前2-3天通知
- 表①现场服务记录表加服务地点字段（□新乡市区 □周边县市 □郑州）
- 表④保密协议客户资源归属扩展至"甲方及甲方关联公司（含郑州关联公司）"
- 表⑤确认单加郑州出行行
- 顺手修复v2.7漏改：合同脚本版ctTech和内嵌表单f3的"独立胜任时薪建议：30"统一改回25（双副本同步，"建议：30"残留=0）
- 修改脚本：update_zhengzhou.py（25条锚点全部命中，断言通过：郑州×25、保底计薪4小时×9、建议25×2）
- 部署脚本：deploy_zhengzhou.py；备份 bak_zz_20260919_recruit-sales.html / bak_zz_20260919_recruit-forms.html
- 服务器：recruit-sales.html (255702B) / recruit-forms.html (71999B)，curl 200

## 校徽项目投资合作协议 v2 上线
- 投资额 10000→20000元（大写贰万元整）
- 封顶金额 20000→40000元（约5714枚）
- 7.1条 36个月未回本补足余额基线同步更新
- 签订地点：新增"□ 河南省郑州市"二选一
- 测算表全部重算：1校纯补办回本约19年、3校6.3年、3校补办+新生约2.4年（✓）、5校补办+新生约1.4年（✓）；谈判提示改为"建议对应≥5所学校铺设计划"
- 部署：服务器 https://aizhifeng.com/workbuddy/school-badge-invest.html 12224B

## 本地文件同步
- Boss直聘-JD-技术支持岗-最终版.txt：地点/工作内容4/任职要求8/外出保障/你将获得2/Boss提示3 全部更新
- 非全日制用工合同-技术支持岗.md：工作内容(4)/工作地点/工时定义/交通餐补C款 全部更新

## v3.1 上线（投稿箱面板，公司↔家异步协作）
- 背景：用户明确要求"家里和公司分不同时间处理，不可能老在公司或家里"，必须把"上传→面板可见→我整合→文件归档"做成异步队列
- 新增接口：`/workbuddy-upload/api/inbox`（列出 uploads/inbox/ 下所有非隐藏文件，按时间倒序，自动跳过 .archive/ 子目录）
- 主页 recruit-sales.html hero 区下加 📥 投稿箱面板（深色风格）：JS 拉 inbox，显示文件名/大小/时间/预览/下载，空状态显示使用指引；每 60 秒自动刷新
- 顺手清理 v3.0 entry-card 重复（v2.9 残留的 row+tip 段）
- **归档协议**：我整合完文件后，SSH 把文件 mv 到 uploads/inbox/.archive/ → 主页下次刷新该文件从面板消失（文件保留以备查询）
- 端到端测试通过：上传"学校食堂签到案例.md"+"招聘进展-更新.txt"到 inbox → 面板正确列出2条 → 中文文件名可下载 → mv 到 .archive/ 后面板剩1条 → 原 URL 仍可访问（HTTP 200）
- 部署：服务器 recruit-sales.html 285292B（备份 bak_v31_20260920）；upload_server.py 升级到 v3（增加 inbox endpoint）
- 用户使用流程：①公司电脑打开 https://aizhifeng.com/workbuddy-upload/ → ②子目录填 inbox → ③上传 HTML/MD/TXT 片段 → ④刷新 https://aizhifeng.com/workbuddy/recruit-sales.html 看到📥投稿箱自动列出 → ⑤用户告知我"我传了X文件"或让我自查 → ⑥我读文件整合到主页 → ⑦mv 到 .archive/ → ⑧主页投稿箱减少

## v2.9 + v3.0 上线（双入口 + Web 上传服务）
- v2.9：在 hero 区（专家标签下、quicknav 上）补双入口卡片 🌍外网 + 🏠内网IP（销售页+表单页双副本）；服务器 sales 266515B / forms 74994B
- v3.0：入口卡片再加一行 📤上传（指向 https://aizhifeng.com/workbuddy-upload/），样式加 .entry-tag 标注；服务器 sales 267602B / forms 76081B

## Web 上传服务（解决公司电脑无法 SSH 的问题）
- 根因：公司网络通常封了 22 端口（SSH），家用电脑 paramiko 部署流程在公司电脑没法走
- 方案：浏览器走 443 → nginx → 127.0.0.1:8400 Python 服务，绕开 SSH 限制
- 服务：wb-upload.service（systemd），监听 127.0.0.1:8400，文件存 /var/www/workbuddy-toolkit/uploads/
- nginx 反代：3 个 server 块（aizhifeng-workbuddy / company-mgr / video-studio）都要加 /workbuddy-upload/；注意 video-studio 不能塞在 /workbuddy/ 块内（会报 outside 错），必须同级
- 口令：默认 wb2026upload（修改：/etc/systemd/system/wb-upload.service 里 Environment=WB_UPLOAD_TOKEN=新口令，再 sudo systemctl restart wb-upload）
- 限制：单文件 ≤ 10MB
- **坑**：Python 3.10 cgi.FieldStorage 的 MiniFieldStorage 不能 `if not fitem`（__bool__ 已禁用，会抛 "Cannot be converted to bool."）；改成自己手动解析 multipart 解决
- 上传页源码：upload_page/upload.html（前端） + upload_page/upload_server.py（后端 165行） + upload_page/wb-upload.service（systemd） + upload_page/install_upload.sh（初始安装脚本）
- 端到端测试通过：传"校徽合同-v1.pdf"中文文件名落地正常，返回 URL https://aizhifeng.com/workbuddy/uploads/test/校徽合同-v1.pdf

## v3.2 上线（资料库 & 记忆镜像，公司电脑一键查看家里内容）
- 背景：用户希望"在公司电脑上能查看记忆和文件，不用每次重复交代"
- 方案：在服务器开两个新目录，把家里电脑本地文件镜像上去
  - `/var/www/workbuddy-toolkit/memory/` — 项目记忆（4 个 md 文件）
  - `/var/www/workbuddy-toolkit/files/` — 本地文档（5 份：JD×2 + 合同 + 校徽协议 + 表单包）
- 主页+表单页 hero 区加 📚 资料库 & 记忆 面板（浅绿色风格，9 个文件链接+描述+大小），公司电脑浏览器直接点开
- 主页：488120B / 表单页：83169B；部署前备份
- 顺手清理表单页 v3.0 残留 entry-card 重复尾巴
- **坑**：服务器 HTML 文件是 `\r\r\n` 怪行尾（不是标准 CRLF），写脚本前必须先 normalize 两次（\r\n→\n，再 \r→\n），否则锚点匹配不上
- **坑**：表单页与主页结构不同（表单页没有 inbox-panel、只有 entry-card），脚本要分两种注入路径
- 修改脚本：update_v32.py；部署脚本：update_v32.py 内联部署

## 部署方法固化（铁律）
- 服务器 HTML 行尾是 `\r\r\n`（CR-CR-LF），不是标准 CRLF；本地脚本必须两次 normalize（先 `\r\n→\n` 再 `\r→\n`），写文件时按原文件行尾还原
- chown 步骤：上传到服务器前 `sudo chown -R ubuntu:ubuntu <dir>` 让 sftp 可写；写完再 `sudo chown -R www-data:www-data <dir>` 让 nginx 可服务
- 每次部署前必备份 bak_vXX_日期；改⑨⑪等表单内容必须两处同步（手册内嵌表单包 + 独立表单页是双副本）