- 14 Oct, 2026 10 commits
-
-
wenwen.tang authored
-
wenwen.tang authored
- ui_verify_runner + ui_verify7/8/9/10/11 + check_scheduler:沙箱配置枚举里补 DRAFT_DIR 指向沙箱 data/drafts —— 不补会让草稿写进真实 data/(同 17 批次泄漏那类坑) - test_round6:删 TestKeepVerify(9 项,服务端不再保留核对),新增 5 项草稿用例 - 新增 tools/smoke_verify_edit.py:核对态编辑 → 确认 → 改动落盘且核对状态保持, 外加「部分核对 ok=True partial=True」共 16 断言,全部跑在沙箱
-
wenwen.tang authored
核对: - 核对模式下表格恢复可编辑,改数据不再影响核对状态(勾选仍由人工决定) - 删除「保存修改」按钮与 saveVerifyEdits();改为 confirmVerify() 先 saveVerifyData() 按批次分组逐张 PUT,再 POST /api/periods/verify,按钮文案「确认核对(存 N 处改动)」 - 脏基线由数组下标改为稳定行号 _rid(ekey/assignRowIds),修掉删行导致的基线漂移 - 退出核对若有未保存改动,提示「退出就丢了」 录入: - 新增「临时保存」按钮:saveElecDraft/clearElecDraft/restoreElecDraft/elecBootFill - 有草稿时不再自动带入上期(以草稿为准),生成成功后自动清除草稿 - td 取值由 children[N] 改为按 data-col 定位 文案:admin.html 同步说明临时保存与「改数据不影响核对状态、确认时一并保存」
-
wenwen.tang authored
- config: 新增 DRAFT_DIR=data/drafts,纳入 ensure_dirs 初始化 - store: 草稿读写删 draft_path/save_draft/load_draft/delete_draft(按账号隔离) - server: 新增 GET|PUT|DELETE /api/drafts/elec;去掉核对 keep_verify 透传 - service: 删除 keep_verify 指纹比对那套(reingest 恢复为「核对一律重置」), 核对状态不再由服务端猜,改由前端「确认核对」时统一提交 - gitignore: data/drafts/ 属运行时状态,不入库 单测 test_rules/test_round6/test_directory/test_rent/test_round5/test_accounts/test_masters 全绿
-
wenwen.tang authored
-
wenwen.tang authored
-
wenwen.tang authored
-
wenwen.tang authored
- 新增 tools/test_round6.py(39 项):覆盖行粒度核对全链路 —— 进度与部分确认、旧 units 展开成行、只核单一类目、确认后取消勾选会撤销确认、 未知行过滤、账期级部分确认放行、批次摘要字段 - 新增 tools/test_masters.py:楼层总表 公共/套内/空调总 的系数与金额口径 - test_rules.py:免租期断言改为与 `rentfree.windows()` 对拍的数据驱动写法, 不再写死「3 段 / 只有 302室」(台账新增 801/802 后会过期) - ui_verify.py/2/3/4/5/6.py:**未设 RENTOS_BASE 时直接拒绝运行**。 此前 ui_verify2 直连 8899 真实服务,往 `data/batches/` 写了 17 个测试批次、 还改脏了台账 2 行。跑这批脚本必须经 `tools/ui_verify_runner.py` 沙箱 - ui_verify2/5/7.py:批次台账改为按账期汇总默认折叠后,脚本改为只点 `.collapsed` 分组(hash 导航不刷新页面,折叠状态会延续) - 新增 tools/ui_verify11.py(85 项):核对按行 + 列显示 + 部分确认全链路
-
wenwen.tang authored
一、核对粒度:房间 → 行 核对从「按房间」改为「按行」,行键 = `单元|类目`(如 `302室|照明`), 于是可以只核照明、或只核空调,也可只核一部分行。 - service: `blank_verify()` 增 rows/scope;新增 `_row_keys()` / `_checked_rows()` (旧 `units` 自动按整室展开,向后兼容) - `verify_summary()` 的 `ok` 由「全勾完」改为「已点过确认核对」, 新增 `partial`(done 且仍有未勾行) - `set_verify()` 确认时把勾选快照存进 `verify.scope`;之后进度保存若勾选集合 少于 scope 就**自动撤销确认**,防止改完数据还挂着「已核对」 - 归一化时 `units` 置空只留 `rows`,否则行级取消勾选会被派生 units 抵消 - `period_summary()` 改行并集:一行算已核对 ⇔ 含它的每张批次都勾了它 二、批次台账:按账期汇总、入口收敛 - 列表按账期(月)汇总成一行,默认折叠,点汇总头展开该账期批次 - 移除列表里的「重新编辑 / 核对」,统一进批次详情 - 详情页展示是否核对状态;部分核对发送前二次提醒 三、核对模式的列显示 - 12 个可显隐列 + 持久化 `localStorage['rentos_vcols']`;「核对」列不可隐藏 - 修:`[hidden]` 被 `.colpick-menu{display:flex}` 顶掉导致菜单收不回来 - 修:`bindVCols()` 每次重渲染往 document 挂新监听导致无限累积 - 开关状态提到模块级 `VCOLS_OPEN`,支持再点按钮/×/点外部/Esc 四种收起方式 四、新增:楼层电费总表(3F/6F/7F) - `rentos/masters.py`:每层拆 公共/套内/空调总,按 用量×电价×系数 算金额 - 口径:**只记账,不出单、不发送**,随批次存档并支持导出 - 接入 `GET /api/masters`、`ingest_elec(masters=…)`、`reingest_elec(masters=…)` -
wenwen.tang authored
口径(巴特菲 2026-10-13):电费通知单全部手动发送,不参与定时自动发送。 - PLANS 增加 `auto` 开关;elec 为 False、rent_parking 为 True - 新增 `plans.AUTO_KEYS` / `plans.is_auto()`:定时器只跑 AUTO_KEYS - `normalize()` 对 `auto=False` 的计划强制 `enabled=False`,历史配置写什么都保持关闭 - `plan_info()` 返回 state="manual",设置页给出「手动发送」说明与理由 - `status()` 增 `auto` / `manual_count`;`enabled` 对手动计划恒为 False - `due_plans()` 只遍历 AUTO_KEYS;`fire()` 不带 plan_key 时同样只跑 AUTO_KEYS (设置页「手动触发」显式指定 plan_key 时才发该张)
-
- 13 Oct, 2026 25 commits
-
-
wenwen.tang authored
-
wenwen.tang authored
能力模型:账号/会话新增 perms(目前只有 elec = 电费通知单)。管理员隐含全部能力;访客按 perms 逐接口放行,perms 为空即纯只读。 写闸门重构:server._write_cap(method,path) 逐接口解析所需能力,_guard_write(user,cap) 按能力判定并给出「账号 X 只能操作:电费通知单」的明确提示。批次类接口再按批次 kind 复核 —— 房租车位费批次的删/重出/发送/收款登记仍只有管理员能动。 前端能力感知:body 加 cap-elec 类,电费页控件由 data-ro 改 data-cap=elec;批次列表/单据表的按钮按 kind 区分;api() 前端拦截改为按能力;顶栏与只读横幅按能力显示「访客 · 仅电费」。 账号管理:新增「权限」列(管理员=全部 / 访客=能力标签 / 空=只读),新增账号可勾选「电费通知单」,已有访客可一键开通/关闭;新增 PUT /api/accounts/{name} 改角色/能力/备注;主账号不可降级且强制清空 perms。 一次性回填:老配置没有 perms 字段 → ensure_default_account 按 guest_perms_seeded 标记补上默认能力(之后管理员关掉不会再被打开)。 guest 落地:密码 guest@2026,perms=['elec'],备注「电费通知单操作员」(本地已改,线上部署后同步)。 修 bug:删除不存在的批次时 service.rollback_receipt_sync(None) 抛 AttributeError → 500;现静默返回 0。 验证:单测 245 项全绿(accounts 60);新增 ui_verify10(69 项,guest/admin/纯只读三方对照)全绿;ui_verify7(访客,改成用纯只读样本 + 新增 guest 段)69/0;ui_verify2 72/0;ui_verify 全绿。 -
wenwen.tang authored
-
wenwen.tang authored
列模型 36 → 31:删 AD~AI(房产六列,RETIRED_TAX_COLS),新增 AK「免租类型」(显示位置插在 L 之后)。 rentfree 重写为两类型:首N月免租 = [I, I+L月);每年8-9月免租 = 合约期 [I,J] 内每个自然年 8-9 月整月(跨年裁剪,J 按含当日)。hit() 按时点、overlaps() 按账单期间交集(年度类型必需)。 账单按免租数据跳过:rent_preview 对每行与每份单据标 rentfree,汇总新增 rentfree_count / rentfree_rows。 台账编辑改批量暂存:改格先高亮暂存(不再逐格弹窗),「保存全部」一次确认后单次 PUT /api/tables/{key}/cells 落盘(带 428 闸门),可在修改记录里整批撤销。 迁移 tools/migrate_rentfree_type.py(幂等):删 6 列 / 165 存量值 → 按代码重建 31 列 → 回填 302/303/315「首N月免租」。 修渲染真 bug:renderGrid() 末尾补 renderPendBar()(否则保存成功后待保存条不消失)。 验证:单测 219 项全绿;UI 回归 ui_verify 1~9 全绿(新增 ui_verify9.py 39 项 + ui_verify_runner.py 沙箱跑需连服务的脚本)。 -
wenwen.tang authored
Co-authored-by: CodeBuddy
-
wenwen.tang authored
按源表自身的公式口径核对(本期抄表数为空 = 未抄表 = 不计费, 与用量列是否残留数字无关);识别合并单元格向下沿用、总表行、摘录表; 并标出用量列「手填常量且本期为空」的可疑格子。 实测:9月批次与源表 20 处不一致(多计 10 行 ¥167,947.41、少计 601B ¥299.67); 8月工作表为摘录,核对到的 8 行 0 差异。 Co-authored-by: CodeBuddy
-
wenwen.tang authored
Co-authored-by: CodeBuddy
-
wenwen.tang authored
沙箱 + 触发日注入,验证: 电费 到点 -> 取已录入批次 -> 发送 房租车位费 到点 -> 自动出单(批次 + PDF 通知书)-> 出单后推进 AC/AJ -> 发送 反例:未到点不触发 发送用桩替代(不发真消息),真实 data/ 零改动。 Co-authored-by: CodeBuddy
-
wenwen.tang authored
Co-authored-by: CodeBuddy
-
wenwen.tang authored
data/config.json 由代码在启动时自动从单账号迁移为 accounts[] 结构 (admin 保留原 salt/hash 未重置 + 播种只读访客 guest,guest_seeded=true)。 本地与线上运行时早已是此结构,只是此前未提交,导致工作区长期显示为已修改。 (data/config.json 为仓库跟踪的配置文件,非运行时业务库,提交无副作用。) Co-authored-by: CodeBuddy
-
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
-
wenwen.tang authored
原文超限被注入层截断。合并同类条目(渲染/模板、名册、数据模型、 业务口径、部署、版本管理、验证脚本),删除已完成的一次性迁移叙述 与冗余时间线,保留全部有效操作知识(列映射、接口、坑位、铁律)。 Co-authored-by: CodeBuddy
-
wenwen.tang authored
-
wenwen.tang authored
-
wenwen.tang authored
-
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 通过 -
wenwen.tang authored
-
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`,并输出当前提交与"落后远端提交数" 便于肉眼确认同步结果。
-
wenwen.tang authored
-
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` 吞掉退出码的问题
-
wenwen.tang authored
- Dockerfile 位于 deploy/ 下,docker build 必须用 -f 指定, 否则报 "failed to read dockerfile: open Dockerfile: no such file or directory" - 原写法 `docker build … | tail` 的退出码来自 tail,会把构建失败**吞掉**; 症状是"构建明明报错,脚本却继续用旧镜像重启容器"。 改为先重定向日志、取真实 rc,再回显尾部
-
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
-
wenwen.tang authored
-
wenwen.tang authored
- 新增 .workbuddy/memory/2026-10-13.md:远端接入过程、三项取舍、换行踩坑、clone 回环验证 - MEMORY.md 增「版本管理(Git)」节:远端地址、纳入/排除清单、LF 策略与 Dockerfile 约束
-
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 项)全部通过
-