liuwenxin
|
1e53792ad6
|
feat(T+): 完成数据贯通与自动接入闭环
打通 T+ 快照、业务、发货、回款和核算准备链路,保留来源差异并提供待补状态。
新增业务自动接入任务、跨平台读取服务托管、权限复核、来源关联和前端核对页面。
补充迁移、隔离集成测试、浏览器模拟验收及角色授权边界修复。
|
2026-11-05 18:47:13 +08:00 |
|
liuwenxin
|
1461a8d113
|
feat(后端): 添加授权体系、系统监控与试用期计提
按 2026-11-02 需求补齐计划交付后端能力:
- 角色授权:权限目录化,接口统一准入校验,未登记默认拒绝;
管理员判断改为按数据库角色重新判定,防止权限码持有者绕过
- 系统监控:单进程采集资源、请求与异常指标,分钟级聚合,
阈值配置化;敏感配置增加 repr 保护,Redis 密码 URL 转义
- 试用期计提:按回款日判定并写入快照,年度结清与调整单联动;
人员模型补试用期、离职日期与工资版本历史字段
- 计提模板:公式骨架受控,页面维护名称与参数绑定
- T+ 采集:自动化配置表与进度查询
内置角色禁停用保护对齐模块注释;核算规则版本提为常量并
补充批量核算失败堆栈日志。
影响范围:后端全部模块、数据库迁移 V22-V28
验证:uv run ruff check 通过;922 个单元测试全部通过;
集成测试因本机 MySQL 数据卷被其他容器锁定暂未运行
|
2026-11-03 11:20:55 +08:00 |
|
liuwenxin
|
108bf87225
|
feat(核算)!: 添加 T+ 正式核算与采集托管
补齐源快照、资料预演、正式导入及工资核算的依赖链路。
新增版本化输入、逐段 FIFO、生成锁和结构化当月调整,
并提供默认关闭的周期采集、有限重试及 Windows 托管。
原始客户资料、私有配置及首页改动不纳入本次提交。
BREAKING CHANGE: 升级前需应用新增迁移,并通过
PAYROLL_MAKER_USER_ID 绑定实际工资制作人,否则业务只读。
旧单批次核算默认关闭;历史兼容需显式启用
PAYROLL_ALLOW_LEGACY_CALCULATION。生产启用和真实金额待验收。
|
2026-11-02 09:42:53 +08:00 |
|
liuwenxin
|
4fe5916c2c
|
feat(tplus): 新增 T+ 只读同步服务与同步管理
|
2026-10-28 11:42:15 +08:00 |
|
liuwenxin
|
32b7940067
|
feat(customer): 客户评级并入客户管理并落库
- customers 表新增 rating_score/rating_time(V13 迁移 + V10 SQL + init-dev 同步)
- 新端点 PUT /customers/{id}/rating:评分是档案属性,只存总分与评级时间(五项明细不落库)
- 列表排序 order_by=rating_score,未评分客户升序/降序都垫底,id desc 兜底稳定分页
- 前端 RatingCalculatorDialog 并入客户管理(评分列 + 评级计算按钮),删除独立页与路由
- 测试:评级保存/越界/排序垫底 3 例,test_customers.py 18 passed;schema 同步 216 passed
|
2026-10-23 10:59:33 +08:00 |
|
liuwenxin
|
5ece9f6dab
|
refactor(backend): 仓储层散参数收敛为查询 DTO
仓储层的 list_*/count_* 此前以 keyword/status/offset/limit 四五个散参数
传参,调用点重复铺开、易漏传且不可扩展;按项目「参数 >4 封装 DTO」的
约定统一收敛为各模块的 Query 对象(如 RoleQuery、BusinessQuery),
服务层与测试调用同步调整,行为不变。
- repositories 层查询方法签名改为 (session, query),分页与筛选条件
由 Query 承载,_apply_filters 同步收口
- schemas 层补齐各模块 Query 模型(approval/business_role/report 等)
- services 层调用点同步改为传 Query
- tests 随之调整;新增用例:待办角色流转(财务通过后领导出现待办)、
参数预览顺序稳定
验证:全量 pytest 900 passed(11:08);单元 526 passed;ruff check 绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-22 19:43:20 +08:00 |
|
liuwenxin
|
9964281c14
|
fix(approval): 版本号唯一键兜底 + 取号改当前读防并发重复
- V12 迁移:先重排存量重复 (order_type, ref_id) 分组的 version_no
(V11 把存量一律置 1,而 V11 前重提是新建行),再加
uk_approval_orders_order_type_ref_version;只重排真有重复的分组,
避免改动前端已展示过的历史版本号
- _next_version 改锁读(select version_no ... FOR UPDATE,最大值在
Python 侧算):请求级鉴权的普通 SELECT 已把 REPEATABLE READ 快照
锚定在请求开始时刻,原 MAX 快照读在并发下会算出同一版本号;
聚合 + FOR UPDATE 为 MySQL 明确禁止,故不锁聚合结果
- 编辑与月结提交路径把 1062 收敛为 400「提交冲突(版本号生成重复),
请重试」,其余完整性错误原样上抛;submit_order 内不 catch/rollback
- 驳回清空方案的过时注释改为 V11 起的 append-only 语义(置历史不删行)
- init-dev.sql 同步唯一键与 alembic_version 7f4f7b918bc4,导出 V12 SQL
- 测试:集成 +5(锁读 SQL 形态、两会话快照回归、唯一键 1062、冲突 400、
正常递增)+ 单元 +1;工作台假审批单改用不同 ref_id 适配唯一键
- 全量回归 897 passed;ruff 与前端 type-check 绿
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-22 13:31:01 +08:00 |
|
liuwenxin
|
4c32a556de
|
feat(approval): 审批单内容快照与二次分配方案版本化
补齐 code-review 遗留 2 项:审批单此前只固化 ref_id/refer_no 指针,复核者看到
的是业务当前内容;二次分配方案在编辑替换与驳回清空时一律物理删除,方案事实
无处回溯。
- 审批单加 version_no 与 snapshot_json(信封 schema_version/order_type/
captured_at/data);二次分配、月结、调整单三类提交均固化送审内容,开关关闭
的自动通过路径同样写快照;详情按 snapshot/live/missing 三态回显,历史单
只读回退当前内容并显式告警,不回填历史快照
- 二次分配方案行改 append-only 版本化(version_no/is_active,唯一键扩为
business+version+personnel):编辑替换与驳回清空只置历史,核算与详情默认
只取生效行,业务详情新增 allocation_history
- 送审内容未变不重提、方案未变不新增版本:判据统一为送审内容,两个
version_no 语义解耦(方案版本=内容第几版,审批单版本=第几次送审)
- 审批单列表、工作台待办、审批超时预警三处 defer 快照列,避免整列拉取
- 月结提交取行加 for_update,防并发提交算出重复的审批单版本号
- 修复审批类型筛选上界 le=2(调整单无法筛选)、快照金额把空值写成 0.00
- V11 迁移三件套同步(Alembic / db/migration / init-dev.sql)
测试:单元 +16(方案内容比较 10、审批入参 6)、集成 +12;全量 891 passed。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 18:30:51 +08:00 |
|
liuwenxin
|
0e8c5713fa
|
feat(migration): V8 业务答复口径落实——审批开关默认开启、撤试用期统一参数、经理基数开关、台账分摊唯一键
- #5/#7 答复默认开启:两审批开关 default 翻 1,插 10-19 生效行保时点历史
- #16 答复逐人维护:撤 probation.salary.basic(无业务消费点,月结已读 personnel.salary_standard)
- #12 答复参数化:新增 manager.personal.included(默认 0=不计入聚合基数)
- #1 答复分配绩效铺路:台账 uk 扩为 (receipt_id, calc_version, personnel_id) 支持分摊拆行
- schema_sync 解析器过滤 ADD CONSTRAINT 误捕获
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-19 11:09:05 +08:00 |
|
liuwenxin
|
a5c86640e2
|
feat(migration): V7 核算台账/月结/调整单四表与核算纯函数
- V7 四表:performance_ledgers(append-only 版本行,uk(receipt_id,calc_version)
库级防重兜底)/monthly_settlements(月份 uk,通过即锁定终态)/
settlement_items(按人固化可负工资,uk 三列)/adjustment_orders(TZ 单号)
- registry +1:approval.adjustment.enabled(19 项,BOOL 首组扩至三开关)
- formula 补核算纯函数:clamp_weight_r(从预览内联提取共用)/monthly_salary
三口径/probation_annual_note/manager_team_share(#12 暂口径:基数不含
经理个人户业绩,聚合集中一处答复后只改)
- 迁移 downgrade 只保留 drop_table+alter 回滚+种子行反向 DELETE;
performance_ledgers 表名复数(test_models 红线断言)
- 断言同步:EXPECTED_TABLES 四新表/registry 19/BOOL 三开关/conftest
清理四新表与 ParamValue 边界 22
- schema_sync+全量单测 460 passed
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-16 16:32:32 +08:00 |
|
liuwenxin
|
1c93ea0a4b
|
fix(m3): code-review 15 项修复(13 项落地,2 项依赖分摊语义记待办)
- 审批:删 _flush_order 撞键内部重试(rollback 会回掉同事务业务行造成
静默丢数据,异常改由 create 外层重试整体重来/update 路径审计收敛);
act() 出参固化前置到 commit 之前(commit 后查询失败会把已通过的审批
记成失败审计);驳回/撤回清空方案生效行(防被否决方案进 M3 快照);
keyword 改 contains(autoescape=True) 对齐全库转义口径;撤单抽
withdraw_pending_orders 供编辑清空方案时显式调用
- 业务:删业务遇在途审批单禁删 400、终态审批单随 _hard_delete 清理;
编辑清空方案同步撤回在途单;历史离职参与人编辑放行(冗余姓名固化
语义,仅新增参与人做在职校验)
- 迁移:business_secondary_allocations 补 uk(business_id, personnel_id)
(模型/迁移 py/导出 SQL/init-dev 四方同步,开发库往返重放验证)
- 设置:upload_logo 改同步 def(阻塞操作不卡事件循环)+ file.size 先拦;
company_name schema 剥空白防全空白入库;logo 旧文件清理移到 commit
成功后(防库指旧路径而文件已删断链);uploadLogo 走 request() 解包
(原直发 service.post 不解包信封,logoUrl 会被置 undefined)
- 备份:restore_drill --drop-exec 先清全部历史 drill 库再演练并即删本轮
(原语义永远删错对象,每轮净增一份整库拷贝)
- 测试:conftest 清理补 system_settings 种子行与 uploads/logo 文件;
新增 5 例(驳回清方案/清空撤单/在途禁删终态随删/离职放行/BOOL 边界);
全量回归 701 passed
- 遗留 2 项记 AI_CONTEXT(方案版本承载、审批单快照,依赖 ④ 分摊语义)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-16 14:23:53 +08:00 |
|
liuwenxin
|
8ef26e22fb
|
feat(approval): 审批单/节点状态机与二次分配接入(开关自动通过)
- approval_orders/approval_steps 服务层:submit_order(不 commit 不嵌套
audit,业务写路径统一收口)+ act 节点动作 + 分页/详情
- 开关关闭=提单即两级「自动通过」留痕(action=3,operator 记系统);
开启=财务→领导流转,一驳全驳,驳回必填意见
- 节点准入严格按角色(status=1 仅财务、status=2 仅领导),admin 不代办;
模块准入 require_roles 依赖工厂(admin/finance/leader,营销后勤待
澄清 #6 后放开)
- 业务接入:创建/编辑带方案即提单(空方案不提单);再编辑自动撤回旧
在途单(node=0/action=4 留痕);AP 编号冲突 create 内可重取(外层
重试兜底)、update 直接抛出防静默丢失
- conftest 兜底清理增审批单(AP 前缀)与开关参数种子基线恢复
- 集成 11 例:自动通过/两节点流转/驳回留痕/缺意见 400/节点准入 403/
admin 不代办/重复操作 400/撤旧建新/模块准入
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-15 18:50:38 +08:00 |
|
liuwenxin
|
acf87fdfdc
|
feat(migration): V6 系统设置/二次分配/审批表与角色参数种子
- 新增 system_settings(公司信息单行)/ business_secondary_allocations(二次
分配明细,比例不强制合计满额,分摊计算待澄清另批)/ approval_orders+
approval_steps(三级审批状态机,开关关闭自动通过留痕)
- roles 种子新增营销后勤/财务/领导三职能角色;内置保护改 BUILTIN_ROLE_CODES
白名单(roles 表无 is_builtin 列,不加列)
- PARAM_REGISTRY 首例 BOOL:两个审批开关(16→18 项,种子双写)
- 双轨同步:V6 导出 SQL + init-dev.sql(表/索引/种子/版本号 79bcc5aa98d4)
- 测试同步:EXPECTED_TABLES 四新表、角色种子断言 5 角色、目录断言 18 项
八分组、BOOL 校验边界;迁移 downgrade 修 1553(只保留 drop_table)并补
行级种子反向清理
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-15 17:25:23 +08:00 |
|
liuwenxin
|
60f6af6494
|
refactor(repos): 归属留痕共享数据访问,人员在职校验收口单点
- ownership_log_repository:客户/业务两侧逐行同构的 list/count/add
收口(owner_type 与引用列参数化),双键倒序与被删人员兜底口径
单点维护;两侧 repository 变薄包装,service 层零改动
- PERSONNEL_STATUS_ACTIVE 单点导出于 models/personnel(对照
BUSINESS_STATUS_* 先例);业务/客户两侧的「存在且在职」校验收口
于 personnel_service.ensure_active——此前两份常量+校验仅靠注释
维持同步,在职判定调整时会两入口口径分叉;校验放 service 层遵守
「repositories 不抛业务异常」红线
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-15 09:49:53 +08:00 |
|
liuwenxin
|
20fcf06f51
|
feat(business): 新增业务数据七表及 V5 迁移(业务/明细/状态留痕/发货/回款/评级配置)
- businesses 五项汇总冗余列服务层事务内维护;毛利润不落库(派生值,M3 台账固化)
- 行级 product_category 折算锚点(#14);回款 settlement_status 预置为 M3 防重锚点
- 评级等级种子四条(迁移+init-dev 双写);编号前缀常量 YW/SH/HK
- 双轨 SQL 同步(V4/V5 重导,schema_sync+test_models 164 例全绿)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 11:22:34 +08:00 |
|
liuwenxin
|
f22d14e439
|
feat(base): 新增基础数据六表及 V4 迁移(人员/辐射区域/拓展计划/产品/客户/归属留痕)
- TPlusSyncMixin 统一 T+ 同步预留四列(可空+普通索引,唯一键待 IT 定键后升级)
- 留痕表实体 ID 无外键冗余固化,删除保护由服务层承担
- init-dev.sql 同步六表 DDL,alembic_version 标记更新
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 09:49:05 +08:00 |
|
liuwenxin
|
bc019cadf5
|
feat(system): 新增岗位角色与计提参数四表及 V3 迁移
- business_roles/param_definitions/param_change_batches/param_values 四表 + 种子(3 内置岗位/16 参数定义/19 版本条目/初始批次 P20260101-00)
- 双轨迁移:Alembic bfbda9c3191d + db/migration/V3 导出 + init-dev.sql 同步(schema_sync 校验通过)
- 参数值以 Fraction 可解析字符串存储(4/360 禁 0.011111);企业户 2‰→3‰ 双种子支持按到账日回溯
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 16:13:13 +08:00 |
|
liuwenxin
|
c83287819a
|
feat(system): 完成后端系统管理(审计/角色/操作日志/日志查询)
- 操作日志审计机制:audit 上下文(成功与失败都记、独立提交、操作人标量
固化、commit 后查询前置约定),用户/角色全部写操作接入;request_data
按键名的结构化脱敏 + UTF-8 字节边界截断
- 角色管理:CRUD 与启停;admin 禁删禁停、有绑定禁删(FOR UPDATE 锁行)、
编码创建后不可改、停用角色不可再分配
- 日志查询:操作/登录两端点,列表与详情两段式(详情含已脱敏请求参数);
时间参数统一转本地 naive(修混用时区 500 与偏移丢弃)
- 用户管理:补齐 reset_password 操作人、编辑空串归一 NULL、并发唯一键兜底 400
- 测试 301 例全绿(单元 223 / 集成 78)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-10 16:28:04 +08:00 |
|
liuwenxin
|
ad5fe4a411
|
feat(system): 新增操作日志表与 V2 迁移
需求 2.5.1 要求记录用户管理操作,先落表结构:
- operation_logs 表:冗余 username 保证账号删除后仍可追溯,
user_id 外键 ON DELETE SET NULL,success 默认 '0' 与 login_logs 口径一致
- 截断常量(USERNAME/ERROR_MESSAGE/REQUEST_DATA)集中定义,供写入方引用
- 修复既有 V1 迁移与迁移模板的 downgrade:索引是外键唯一支撑索引,
先 drop_index 会报 errno 1553,改为只 drop_table
- 同步 db/migration/V2 与 init-dev.sql,迁移版本号更新为 a45a8087831b
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-10 10:44:05 +08:00 |
|
liuwenxin
|
273ebf4657
|
chore: 初始化项目结构与登录鉴权模块
后端 FastAPI 六层结构(api/services/repositories/models/schemas/core),
统一响应信封、全局异常、日志脱敏;6 张表经 Alembic 迁移建库,SQL 留存
db/migration;登录鉴权含图形验证码(Redis GETDEL 防重放)、JWT、登录限流、
登出黑名单(TTL=令牌剩余有效期)、登录日志。
前端 Vue3 + TS + Element Plus 骨架,含登录页、路由守卫、请求封装与 Vite 代理。
工程配置:uv 锁定 Python 3.12、ruff 检查与格式化、editorconfig、gitattributes。
测试 184 项(单元 155 / 集成 29)全绿,浏览器端到端 8 项通过。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-09 18:46:36 +08:00 |
|