1. 13 Oct, 2026 19 commits
    • wenwen.tang's avatar
      docs(memory): 记录定时出单/通知书 能力检查结果 · 0ff97a08
      wenwen.tang authored
      Co-authored-by: CodeBuddy
      0ff97a08
    • wenwen.tang's avatar
      test(scheduler): 新增「定时出单/通知书」能力检查脚本 · fdb5148d
      wenwen.tang authored
      沙箱 + 触发日注入,验证:
        电费       到点 -> 取已录入批次 -> 发送
        房租车位费 到点 -> 自动出单(批次 + PDF 通知书)-> 出单后推进 AC/AJ -> 发送
        反例:未到点不触发
      发送用桩替代(不发真消息),真实 data/ 零改动。
      
      Co-authored-by: CodeBuddy
      fdb5148d
    • wenwen.tang's avatar
      7a896646
    • wenwen.tang's avatar
      chore(data): 落库 auth 多账号结构的运行时迁移结果 · 5df2bfbc
      wenwen.tang authored
      data/config.json 由代码在启动时自动从单账号迁移为 accounts[] 结构
      (admin 保留原 salt/hash 未重置 + 播种只读访客 guest,guest_seeded=true)。
      本地与线上运行时早已是此结构,只是此前未提交,导致工作区长期显示为已修改。
      (data/config.json 为仓库跟踪的配置文件,非运行时业务库,提交无副作用。)
      
      Co-authored-by: CodeBuddy
      5df2bfbc
    • wenwen.tang's avatar
      feat(房租出单): 本期出单筛选改为按账期区间(起~止) · bad77032
      wenwen.tang authored
      「房租车位费」本期出单原先按「出单基准日」筛(账单起始日 <= 基准日),
      现改为按账期区间筛:命中 = 该行账期起始日落在 [起, 止] 内,区间取代基准日。
      
      - rent_parser: 新增 in_period() / classify_period()(-> 区间内/区间外/不可出单);
        原 classify(rows, on_date) 保留,定时器 due_for_push 仍走它
      - service: rent_preview(from, to, all) 改用 classify_period,返回 from/to 取代 on;
        later 语义变为「区间外」;新增 _period_label() 生成账期标签(单月/跨月);
        ingest_rent 增 from_date/to_date 三分支选行,批次记 period_filter_from/to
      - server: /api/rent/preview 收 ?from=&to=(?on= 作兼容别名 = to);
        POST /api/rent/batches 透传 from/to
      - web: #rp-on 拆为 #rp-from / #rp-to;「显示未到期」-> 「显示区间外」;
        文案改「按账期区间筛选」
      - 测试: test_rent 新增 21 项(区间端点/空区间/区间外原因/原 classify 不变/出单/账期标签);
        新增 ui_verify8.py(沙箱+Playwright 端到端 30 项);ui_verify5.py 适配新控件
      
      单测 212 项全绿;ui_verify8 30/30;ui_verify5 43/43。
      
      Co-authored-by: CodeBuddy
      bad77032
    • wenwen.tang's avatar
      chore(memory): 重写长期记忆,去重并压回限额内 · 422a556c
      wenwen.tang authored
      原文超限被注入层截断。合并同类条目(渲染/模板、名册、数据模型、
      业务口径、部署、版本管理、验证脚本),删除已完成的一次性迁移叙述
      与冗余时间线,保留全部有效操作知识(列映射、接口、坑位、铁律)。
      
      Co-authored-by: CodeBuddy
      422a556c
    • wenwen.tang's avatar
    • wenwen.tang's avatar
      chore: 去掉 ui_verify7 未用的 import · cc02d713
      wenwen.tang authored
      cc02d713
    • wenwen.tang's avatar
    • wenwen.tang's avatar
      feat(收款+权限): 收款日期同步台账最近收款月份;新增只读访客账户 · a39ca9ca
      wenwen.tang authored
      1) 收款日期 → 台账账期同步
      - set_receipt 登记/修改收款日期时,把该单据覆盖的台账行「最近收款月份」(AB)
        同步为【收款日期所在月】(口径经确认);清空收款日期则退回同步前的值
      - 批次记 receipt_sync 记录,删除批次时一并回滚「最近收款月份」
      - 批次明细快照的 last_paid 同步跟进,页面不会出现两个口径
      - 修:不能拿 service._d()(失败回落"今天")算月份,改用 rent_parser._d()
      
      2) 只读访客账户
      - auth.py 支持多账号 + 角色(admin 可读写 / viewer 只读),首次启动播种
        admin(1989@rent05) 与 guest(guest@2026);未知角色一律降级 viewer;
        主账号不可删;访客被删后不再自动复活
      - server.py 增加写闸门:除 /api/logout 外,viewer 的 POST/PUT/DELETE 一律 403
      - 新增账号管理接口 GET/POST /api/accounts、DELETE /api/accounts/{u}、
        POST /api/accounts/{u}/password(仅管理员)
      - 前端按角色隐藏写入口 + api() 兜底拦截;设置页新增「账号管理」卡片
      
      测试
      - tools/test_accounts.py(新增 34 项,含真 HTTP 写闸门实测)
      - tools/test_round5.py 补 11 项收款同步用例;全量 191 项通过
      - tools/ui_verify7.py(新增,自带沙箱数据目录 + 真浏览器)59/59 通过
      a39ca9ca
    • wenwen.tang's avatar
    • wenwen.tang's avatar
      fix(deploy): 修正 pull 未真正生效 —— fetch 带分支名只更新 FETCH_HEAD · 51c66dbf
      wenwen.tang authored
      `git fetch origin <branch>` 只更新 FETCH_HEAD,**不会**更新
      refs/remotes/origin/<branch>,于是随后的 `git reset --hard origin/main`
      仍指向旧提交。症状是服务器 repo 停在旧版本(实测停在 0f4af2e8,
      落后远端 3 个提交),而 sync 表面上"成功"。
      
      改为不带分支名的 `git fetch origin`,并输出当前提交与"落后远端提交数"
      便于肉眼确认同步结果。
      51c66dbf
    • wenwen.tang's avatar
    • wenwen.tang's avatar
      chore(deploy): 线上部署完成;修正 deploy_docker 的旧布局与管道缺陷 · 22c17fe0
      wenwen.tang authored
      部署(192.168.68.121,容器 rentos,http://192.168.68.121:8899/)
      - 代码改由服务器 git 工作副本 /opt/rentos/repo 提供,镜像 rentos:latest 已重建
      - 线上台账完成两项迁移:AJ「下一账单日」64 行、车位备注 AA 31 条
      - 实测线上 PDF 出单链:生成 302/303/305 室三份中文 PDF(%PDF- 头,
        302 室 22734.00 与本机测试一致),命名符合「{单元}-费用类型-收费通知书」
      - 实测新增接口:批次详情含 receipt(收款/开票统计)、批次导出返回合法 xlsx
      
      数据一致性
      - 线上账期在本机之外推进过(2026-10-09 与 10-12 三次出单,共 44 行),
        本机 AC 落后 11 行;已用线上权威数据覆盖本机台账,两侧现逐格一致
      - 本机台账备份于 data/_snap/20261013-1110-before-online-sync/
      
      deploy_docker.py(降级通道)
      - 适配仓库根构建上下文:APP_ITEMS 精确列出 deploy/Dockerfile、deploy/wheels、
        deploy/wecom/cli-linux-x64.tgz;解包目标改为 REPO_DIR,与 git 通道同目录
      - build 改用 -f deploy/Dockerfile,并修复 `docker build … | tail` 吞掉退出码的问题
      22c17fe0
    • wenwen.tang's avatar
      fix(deploy): 修正构建找不到 Dockerfile 与管道吞掉失败两个问题 · 08dbed4e
      wenwen.tang authored
      - Dockerfile 位于 deploy/ 下,docker build 必须用 -f 指定,
        否则报 "failed to read dockerfile: open Dockerfile: no such file or directory"
      - 原写法 `docker build … | tail` 的退出码来自 tail,会把构建失败**吞掉**;
        症状是"构建明明报错,脚本却继续用旧镜像重启容器"。
        改为先重定向日志、取真实 rc,再回显尾部
      08dbed4e
    • wenwen.tang's avatar
      feat(deploy): 部署改为服务器 Git 同步,Dockerfile 适配仓库根上下文 · 0f4af2e8
      wenwen.tang authored
      - deploy/Dockerfile:构建上下文由 app/ 布局改为**仓库根**布局
        · COPY rentos/ web/ assets/ templates/ build_notices.py
        · 新增 COPY tools/:服务器无 Python 3(yum 仅 3.6.8),台账迁移只能在容器内跑
        · wecom-cli 改为从仓库内 cli-linux-x64.tgz 解压,不再依赖未入库的 wecom/x/
      - .dockerignore:新增。构建上下文变为仓库根,需裁剪 .git / data / output /
        samples / tools/shots* 等无关内容
      - tools/deploy_git.py:新增 Git 同步部署脚本(setup / sync / pull / build / run /
        status / logs)。凭据经 SFTP 直写服务器 ~/.git-credentials(600),不经命令行;
        容器与验证逻辑复用 deploy_docker.py
      0f4af2e8
    • wenwen.tang's avatar
      6538a8b7
    • wenwen.tang's avatar
      docs: 记录 Git 接入、忽略规则与换行策略 · 66561978
      wenwen.tang authored
      - 新增 .workbuddy/memory/2026-10-13.md:远端接入过程、三项取舍、换行踩坑、clone 回环验证
      - MEMORY.md 增「版本管理(Git)」节:远端地址、纳入/排除清单、LF 策略与 Dockerfile 约束
      66561978
    • wenwen.tang's avatar
      chore: 租金通知系统首次纳入 Git 版本管理 · d635a330
      wenwen.tang authored
      纳入范围
      - 应用源码 rentos/(19 个模块)、前端 web/、工具与测试 tools/(63 个脚本)
      - 业务数据:台账 data/tables/rent_parking.json(85 行 × 36 列 A~AJ)、
        播种 data/seed/、配置 data/config.json 与 unit_map.json
      - 版式资源:templates/ 四套模板、samples/ 历史样张、assets/ 中文字体 simhei.ttf
      - 离线部署件:deploy/Dockerfile、deploy/wheels/(Linux wheel)、企微 CLI tgz
      - 验收报告归档 output/*.md
      
      忽略规则
      - 运行时状态:data/sessions.json(含活跃登录 token)、scheduler_state.json、
        send_log.json、data/batches/、data/attachments/、logs/
      - 生成产物:output/(仅保留 *.md 报告)、uploads/
      - 快照与自动备份:data/_snap/、data/tables/.backup/
      - 构建中间产物:deploy/_stage/、deploy/wecom/x/
      - 截图与缓存:tools/shots*/、__pycache__/
      
      换行策略
      - 文本统一以 LF 存储:Dockerfile 的续行符若带 \r 会导致 Linux 构建解析错误
      - *.bat 保持 GBK + CRLF 字节原样;二进制资源不做任何改写
      
      功能现状
      - 房租车位费 / 电费两套出单链,PDF 出单(reportlab 原生绘制,不依赖 Office)
      - 批次收款开票登记、按「下一账单日」定时自动出单、批次数据导出
      - 单元测试 147 项 / 端到端 / UI 回归(29 + 40 项)全部通过
      d635a330