Commit Graph
100 Commits
Author SHA1 Message Date
yml2213 4ffc1c09be chore: 忽略本地 IDE 目录
忽略 .openidea 本地配置,并补齐文件末尾换行。
2026-11-02 15:30:02 +08:00
yml2213 6bf28489e0 fix(finance): 重写履约路由迁移与统一渠道配置
重写 120/121 迁移,统一内部 SKU、渠道 id、config_json 和旧规则转换。

后台渠道配置改读统一渠道表,卡券与人工配置不再写旧规则。

增加安全渠道切换,并排除已关闭、失败或过期的历史任务载体。

按生产 119 基线重跑迁移、完整履约财务链路和严格预检。
2026-11-02 15:29:13 +08:00
yml2213 2f87445ed9 fix(finance): 收敛内部 SKU 履约路由与载体状态
统一内部 SKU 与渠道主/兜底解析,禁止并列主渠道。

运营指定渠道改为先创建真实载体,失败保持明确 pending。

历史缺载体、多载体冲突和自动发货兜底统一由管道修复。

迁移人工配置与旧 sku_code 规则,补充严格预检和集成测试。
2026-11-02 15:02:49 +08:00
yml2213 5fe33b0b46 feat(finance): 统一内部 SKU 驱动的履约与财务分流
- 新增 internal_sku_mappings / internal_sku_channels,平台字段统一映射到内部中文 SKU
- 下单入口按内部 SKU 渠道决策修正默认人工路由,自动发货补全 dash sku
- 财务 channel_assign 读取统一渠道表;卡券/人工能力兜底,自动发货/接单要求真实载体
- carrier reconciliation 自动补自动发货任务和接单工单
- pending 落明确原因:无内部 SKU / 无渠道能力 / 无履约载体
- 合并、重判、旧 sku_code 规则清理、部署后 preflight 核对脚本
- 待分类队列按内部 SKU 聚合并展示原因
2026-11-02 14:17:08 +08:00
yml2213 531a23d78b feat(finance): 下单入口补内部 SKU,卡券/人工按商品能力兜底
- 纯数字/空内部 SKU 入口查 internal_sku_mappings,补 spec.skuNick
- 快照记录 internalSku/source,便于审计
- 财务 channel_assign 对卡券/人工使用商品渠道能力兜底(source=auto_mapping)
- 自动发货/接单仍要求真实任务/工单载体,避免只改口径
2026-11-02 13:52:40 +08:00
yml2213 a501f9f2e0 feat(finance): 内部 SKU 平台字段映射基础
- 新增 internal_sku_mappings,支持 provider/shop 级和全局映射
- 新增解析与 upsert 服务,priority/精确范围优先
- 新增纯数字内部 SKU 的中文映射回填脚本(默认 dry-run)
2026-11-02 13:49:31 +08:00
yml2213 652d501c2c docs(finance): 履约与财务分流统一方案与只读审计脚本 2026-11-02 13:48:18 +08:00
yml2213 8da669b1fd fix(finance): 卡券商品补内部 SKU 规则,待分类自动分流
- 自动创建 tpv: 商品时补渠道能力和 internal_sku 规则
- 迁移 116 为已存在的卡券商品回填内部 SKU 规则
- 同内部中文 SKU 的待分类订单自动进入第三方卡券
2026-11-02 13:36:37 +08:00
yml2213 03566aee2b fix(finance): 待分类队列按内部中文 SKU 去重与分流
- 同一内部 SKU 的不同平台 SKU 合并为一行(显示平台 SKU 列表)
- 指定渠道按 internal_sku 批量更新,并生成 internal_sku 规则
- 渠道候选的 internal_sku 优先取中文 manual_sku_key/sku_name
2026-11-02 13:32:05 +08:00
yml2213 fbd5f8f74e fix(admin): 成本中心来源页签与成本异常交互 2026-11-02 13:17:16 +08:00
yml2213 c79a7e0790 feat(scripts): 重复商品合并、断代重判与本地演示数据 2026-11-02 13:17:15 +08:00
yml2213 3c4c81003f feat(finance): 商品渠道能力、自动发货转人工与成本异常收口
- 商品可同时支持自动发货/人工,新增渠道能力与成本冲销字段
- 卡券缺商品时按内部中文 SKU 自动建 tpv: 商品并补渠道规则
- 自动发货失败转人工并冲销原渠道成本
- 配置成本后按最早缺失订单生效并立即补算、关闭异常
- tpv: 商品来源计入第三方卡券
2026-11-02 13:17:15 +08:00
yml2213 8b0666caec Merge remote-tracking branch 'gitea-aliyun/main' 2026-11-02 07:54:57 +08:00
yml2213 eb5c18b5b5 refactor(finance): 清理 legacy_platform 的展示与死查询
- 未归一组统计默认渠道补上 third_party_voucher,移除已无数据的 legacy_platform
- 前端移除历史归档/历史平台的类型与标签
- 保留后端口径的 legacy_platform→archived 筛选别名,旧链接不报错
2026-11-01 17:32:18 +08:00
yml2213 d80150ff04 docs(db): 修正 113 迁移中已过时的注释
- 删除“生产停在 111 / 由 114 删列 / 交给回填脚本”等合并前描述
- 改为单条迁移内完成回填、删列、事实改名与索引
- 更新卡券规则生成、异常原因、接单平台判定等注释
2026-11-01 16:38:11 +08:00
yml2213 769bc69bcf refactor(db): 财务渠道迁移合并为单条 113
生产当前在 112,原 113–118 六条迁移合并为 113_finance_channel_cutover:
- 渠道/状态三列 + 从 fulfillment_mode 回填
- 删除旧列及旧索引
- 销售事实列改名 channel
- 财务管道增量索引(原 117/118)
- 移除不再使用的 refund_adjustment 约束(历史退款不入财务)

42 万行副本实测 49 秒完成;生产只需执行一条迁移,不再需要中间回填脚本。
2026-11-01 16:34:12 +08:00
yml2213 64e04cc667 fix(finance): 历史归档订单退款跳过期间校验
归档订单退款不进入财务口径,不应被历史月份/退款月份的关账状态阻断;
非归档订单退款仍严格校验期间。
2026-11-01 16:24:18 +08:00
yml2213 d62f86de0f docs: 新增财务流程总览,明确断代后范围与历史退款边界 2026-11-01 16:22:52 +08:00
yml2213 8391912bda perf(finance): 管道增量索引与异常批量入队
生产副本 42 万单压测发现:
- carrier_missing 查询在 26 万条上 15s 超时 → 改 anti-join,异常去重改批量
- 缺成本异常逐条 3 条 SQL,12 万人工单会跑几十分钟 → 按 scope 批量入队
- 新增 117/118 部分索引,成本快照/人工挂配置/载体检查走 id 顺序扫描
- 人工挂配置查询改为按配置 SKU 数组过滤,避免全量人工单排序
2026-11-01 16:22:52 +08:00
yml2213 5d7904f6ee fix(finance): 历史订单退款不再进入新财务口径
- 断代前 archived 订单的退款只保留业务记录,不再生成冲减事实/总账
- 退款后的事实与费用重算只针对非归档订单
- 移除 refund_adjustment 渠道值的前端筛选与标签
- 迁移 116 的列约束保留,不再写入该值
2026-11-01 16:22:49 +08:00
yml2213 a692723c73 docs+test: 补充成本缺失、退款期间与追溯限制说明 2026-11-01 15:21:55 +08:00
yml2213 20287916b1 fix(finance): 退款所属期间关账时阻断退款
- 手工退款按实际退款日期校验期间
- 平台退款按当前退款月份校验期间
- 避免退款成功但冲减行被关账跳过的静默丢失
2026-11-01 15:21:53 +08:00
yml2213 fd6d2d561b feat(pipeline): 渠道判定后立即归一商品并算成本
- 新增按订单项定向归一,避免新判定订单等冷通道
- 判定/指定渠道后立即归一 → 算成本 → 按业务日回填事实与总账
- 提取 refreshFactsForDates 供管道与渠道服务复用
2026-11-01 15:21:53 +08:00
yml2213 9e154cb16d fix(cost): 派生费用可随退款重算,成本版本与基线禁止追溯
- 平台费/支付费允许 estimated→estimated 按净收入重算;采购与打手报酬保持固化
- 创建成本版本时拒绝早于当前时间的 effectiveFrom
- 已有快照后禁止导入价格基线;基线生效时间改为当前
- 删除基线导入中前移现有版本生效时间的逻辑
2026-11-01 15:21:50 +08:00
yml2213 045ac98479 fix(finance): 成本缺失按渠道期望成本项判定
- 采购/打手报酬/卡券采购各自校验对应成本项快照
- 人工渠道校验 manual_case 快照
- 未分类订单仍按「任意快照」兜底
- 平台费等通用费用不再把缺失成本掩盖成完整
2026-11-01 15:21:50 +08:00
yml2213 ceb786f32e fix(cost-center): 禁止追溯改价,改价只能当前或未来生效
- 后端统一校验:retroactive 请求直接拒绝,effectiveFrom 早于当前时间拒绝
- 去掉「追溯至历史订单」入口,改价只影响之后的新订单
- 历史订单成本与成交价由快照固化,不再受改价影响
2026-11-01 14:53:25 +08:00
yml2213 fed459c7aa fix(cost): 历史订单成本固化,只有预估→实际允许升级
- 已有快照不再因成本版本变更而替换,历史订单成交价与成本保持固定
- 仅接单平台「预估 → 实际」履约结算允许 supersede
- 补配价格只影响没有快照的订单;文档同步口径
2026-11-01 14:53:11 +08:00
yml2213 00fa4d7f0a docs(finance): 补充退款冲减、通用成本范围与快照双通道说明 2026-11-01 14:46:14 +08:00
yml2213 fca836eb4b feat(cost-center): 卡券商品创建即生成渠道规则,补齐成本项预设
- 新建 tpv: 商品时自动写 third_party_voucher 规则,避免新卡券 SKU 停在待分类
- 成本项预设新增「第三方卡券采购成本」
2026-11-01 14:46:14 +08:00
yml2213 624c0ef4af feat(finance): 历史订单退款按退款日入账
- 迁移 116 新增 refund_adjustment 渠道值,并允许该类行净收入为负
- 销售事实按退款日聚合 archived 订单的已确认退款,写冲减行
- 退款后同时回填原销售日与退款日的事实与总账
- 退款同时重算相关订单项的费用快照(比例费按净收入)
- 前端渠道筛选与标签支持「历史退款冲减」
2026-11-01 14:46:11 +08:00
yml2213 cf0d600c7d fix(cost): 快照新单优先、费用口径与回填健壮性
- 成本快照拆热/冷双通道:新单走热通道分钟级入账,历史项冷通道轮询重算
- 通用成本只允许平台费/支付费自动全量,售后损失/其他必须按商品配置
- 比例费用按扣除已确认退款后的净收入计算
- 已入账 actual 快照不再被后续预估覆盖
- 受影响日期超过 31 天时按整段重算,不再静默丢弃;关账跳过会提示
- 通用费用解析不到时计数告警;已入队的成本缺失不再重复 upsert
- 快照替换与写入放入同一事务,避免事实任务读到空窗
2026-11-01 14:46:08 +08:00
yml2213 34832139b0 fix(db): 渠道迁移顺延为 113–115,避让远程 112 补资料链接
远程 main 新增 112_work_order_material_link,本地原 112–114 顺延为 113–115:
- 113_fulfillment_channel_split
- 114_drop_legacy_fulfillment_mode
- 115_rename_facts_channel
同步更新文档与代码里的迁移编号引用。
2026-11-01 14:02:52 +08:00
yml2213 6c3e360392 merge: 合并远程 main(补资料链接与工单验收修复) 2026-11-01 13:58:45 +08:00
yml2213 9bd5a9d324 docs(finance): 补充快照重算与通用成本口径 2026-10-31 20:41:50 +08:00
yml2213 7fab610159 feat(cost-center): 卡券规则批量生成与异常标签补齐
- 新增「批量生成渠道规则」,为 tpv: 商品一次性补 third_party_voucher 规则
- 异常原因补「缺少履约载体」,渠道标签补卡券/待分类/归档/未分类
2026-10-31 20:41:50 +08:00
yml2213 a62f6e1ec8 fix(pipeline): 变更按业务日回填,异常自动收口,载体管道加游标
- 渠道判定/成本快照返回受影响业务日,任务按日重算事实与总账
- 人工配置或载体补齐后,manual_config_missing / carrier_missing 自动关闭
- carrier_dispatch 使用水位游标,避免每轮从 id=0 重扫
2026-10-31 20:41:43 +08:00
yml2213 42d5874411 fix(cost): 快照变更即重算,0 元占位视为缺失,通用成本入账
- 预估→实际、补配价格时 supersede 旧快照再写新行,不再一次写死
- 全局 0 元版本不产生快照,转入 cost_missing
- 比例成本按 rate_bps 计算,费率为 0 视为未配置
- 平台费/支付费/售后等通用成本模型按渠道+通用各写一条快照
2026-10-31 20:41:38 +08:00
yml2213 fef1d0b77e docs(finance): 文档口径切到渠道模型并标注历史文档
- API 契约/成本中心模型改为 fulfillment_channel/status 与 channel 字段
- 验收 SQL 的销售事实检查改用 channel
- 2026-10 之前的口径文档加历史横幅,避免被当成现行实现
2026-10-31 20:26:20 +08:00
yml2213 6cd6401eca refactor(finance)!: 事实维度与接口字段统一改名 channel
- migration 114 将 sales_daily_facts.fulfillment_mode 重命名为 channel
- DTO/查询参数/前端类型从 fulfillmentMode 统一为 channel
- 成本中心类型 FulfillmentMode 更名为 FulfillmentChannel,并补齐卡券/待分类/归档取值
- 销售事实响应分组改为 byChannel
2026-10-31 20:26:15 +08:00
yml2213 657e49f324 perf(pipeline): 已入队的异常不再重复 upsert,未映射只算已定渠道
- 载体/人工配置/人工成本三类扫描跳过已有未解决异常的订单项
- 成本中心「未映射订单项」只统计 assigned,待分类单归履约队列
2026-10-31 20:26:10 +08:00
yml2213 3f13b8a5f7 chore(cost-center): 下线会与管道冲突的旧商品入口
- 移除自动发货商品同步、SKU 回填、按工单回填、人工商品归一等旧接口与按钮
- 商品目录只保留「从接单模板初始化」与手工新建
- 自动发货面板移除已失效的「重算成本快照」入口
2026-10-31 20:17:39 +08:00
yml2213 d979ef50d6 perf(pipeline): 订单项管道改用水位游标并只扫缺失
- 新增 watermark-store:统一读写游标/日水位/失败原因
- 渠道判定、商品归一、成本快照从上次游标继续,到表尾后回绕重试
- 成本快照只处理没有有效快照的订单项,避免每 5 分钟全量重扫
2026-10-31 20:17:33 +08:00
yml2213 ce775ca102 feat(cost-center): 第三方卡券渠道完整接入成本模型
- 商品来源筛选补 tpv: 前缀,卡券商品列表不再为空
- 成本模型新增 third_party_voucher_cost,覆盖预览/成本项/概览作用域
- 前后端成本模型枚举与下拉同步
2026-10-31 20:17:28 +08:00
yml2213 9ca1d52419 fix(finance): 人工确认后按业务日重算事实与总账
确认履约写入 manual_case 快照后,立即按该订单业务日期重算销售事实并同步总账,
避免较早订单的成本只等 3 天窗口而永远入不了报表。
2026-10-31 20:17:28 +08:00
yml2213 8e3b8e0a32 fix(finance): 销售事实只统计已支付订单并扣减退款
- 事实范围增加 pay_status IN ('paid','refunded')
- 关联 order_refunds 已确认退款,净收入/毛利按扣除退款计算
- 补回归断言,防止再次出现退款不减收入
2026-10-31 20:17:23 +08:00
yml2213 2f11ed6bca chore(deploy): 上线脚本与验收 SQL 适配渠道模型
- post-deploy 去掉已删除的履约回填与 finance:sync,改用 finance:rebuild-cutover
- 验收 SQL 的履约检查改读 fulfillment_channel/status
- 相关文档同步更新
2026-10-31 19:57:00 +08:00
yml2213 0a77524331 refactor(finance): 总账人工渠道判定改用渠道/状态列 2026-10-31 19:52:40 +08:00
yml2213 f4e0c47744 feat(cost-center): 第三方卡券渠道归一与采购价配置
- 归一新增 tpv:<SKU> 直达,卡券单无需手工映射
- 成本配置/总览/异常支持 third_party_voucher 与 archived 维度
- 新增卡券采购价面板,写入 sys_third_party_voucher_cost
- 修正 man: 商品改价误用不存在的 sys_manual_cost
2026-10-31 19:52:32 +08:00
yml2213 0ce3c8fa97 feat(fulfillment): 渠道联动与管道兜底
- 人工配置保存/删除同步渠道规则,人工确认写 channel/status
- 按 SKU 指定渠道默认同时落规则
- 管道补充:载体缺失、人工成本未记录、事实与总账按水位追赶
2026-10-31 19:52:22 +08:00
yml2213 4272515956 feat(orders): 订单读取与筛选只认渠道/状态三列
- 展示与筛选全部改读 fulfillment_channel/status,不再回退旧列
- 支持 third_party_voucher 与 archived,legacy_platform 映射为归档
- 前端类型、筛选项与标签同步
2026-10-31 19:52:13 +08:00
yml2213 65b7f4f9dc refactor(finance)!: 强制渠道模型,移除旧履约方式与同步链路
- 删除 fulfillment_mode 相关的旧同步/回填链路与定时任务
- 删除 cost_finance_sync、成本快照同步、人工商品归一等遗留服务
- 迁移 113 直接删除 order_items.fulfillment_mode 及其索引约束
- 断代脚本自带归档步骤,不再依赖独立回填脚本
- 退款/事实/总账统一走渠道版销售事实
2026-10-31 19:52:03 +08:00
yml2213 808949f3b8 feat(scheduler): 财务管道自动注册、水位记录与后台状态页
- 老配置读取时自动补齐六个管道任务,升级后无需手工添加
- 每个管道运行后写水位与 last_success_at,失败写 last_error
- 新增 GET /admin/fulfillment/pipeline/status 与单步重跑
- 后台「履约渠道 → 管道状态」展示启停、水位、最近执行与错误
- 定时任务管理接口不再丢弃管道自己的 config 字段
2026-10-31 19:13:38 +08:00
yml2213 2ba2656d58 feat(finance): 商品归一按接单模板/人工配置直接命中,减少手工映射
- 接单平台:用工单的 product_rule_id → tpl:<rule_key> 直接归一,不再依赖渠道映射
- 人工渠道:直接使用人工 SKU 配置里指定的商品
- 成本中心「未映射订单项」排除断代归档行,避免断代后仍显示历史未映射量
2026-10-31 19:05:02 +08:00
yml2213 6d86d4df7e refactor(admin-web): 财务各页去掉大标题,统一由财务导航栏进入
- 销售毛利 / 收支明细 / 商品与成本中心 / 履约渠道 移除 PageHeader 大标题块
- 与钱包管理、总账与对账保持一致(这两页本来就没有大标题)
- 成本中心的「刷新」按钮并入统计口径行,功能位置不变
2026-10-31 18:42:20 +08:00
yml2213 4538ed2ce9 fix(admin-web): 履约渠道页导航栏移到标题上方,与其他财务页对齐 2026-10-31 18:34:45 +08:00
yml2213 9b01443424 feat(admin-web): 新增履约渠道页,含待分类队列与渠道规则
- 待分类按 SKU 聚合,可直接指定渠道(含第三方卡券仅统计渠道)
- 渠道规则支持新增/删除,展示优先级与作用范围
- 问题队列按类型筛选,统一使用 PercentTable
2026-10-31 18:12:31 +08:00
yml2213 855f2efcff feat(admin): 履约渠道接口与断代运维脚本
- 新增 /admin/fulfillment 待分类、指定渠道、规则 CRUD、问题队列、管道触发
- backfill-fulfillment-channel:438k 行分批回填,幂等可续跑
- finance-cutover-v2:默认 dry-run,--execute 才清理派生数据,禁止重复执行
- rebuild-after-cutover:按断代日重跑三条管道并生成期初分录
2026-10-31 18:12:25 +08:00
yml2213 75a3801236 feat(scheduler): 六个财务管道作业,模板改价即同步成本版本
- channel_assign / carrier_dispatch / product_normalize / cost_snapshot / sales_facts / ledger_post
- 每个作业只写自己那一层,失败互不影响,可单独启停
- 接单模板保存后自动同步规则级成本版本,失败不阻塞模板保存
2026-10-31 18:12:19 +08:00
yml2213 3b0cfbb8fa feat(finance): 商品归一、成本快照与渠道销售事实三条管道
- 商品归一统一为一个匹配器,禁止自动建商品,未命中进未归一队列
- 成本快照收敛为唯一入口:商品/规则/全局版本解析,工单验收自动升级 actual
- 异常改为 SKU 级聚合,补齐后自动关闭
- 销售事实按渠道汇总,pending 收入进 unclassified 桶,归档不进报表
2026-10-31 18:12:13 +08:00
yml2213 8cdc2423d5 feat(fulfillment): 新增渠道判定管道,规则优先、载体证据兜底
- 只写 channel/status/source,不再由「有没有任务」反推渠道
- 同优先级多渠道判为冲突并保持 pending,进配置冲突队列
- 运营指定渠道即锁定,自动判定不再覆盖
- 待分类队列按 SKU 聚合,支持按 SKU 批量指定
2026-10-31 18:12:06 +08:00
yml2213 4cf700e910 feat(db): 迁移 112 拆分履约渠道/状态/来源并收敛异常模型
- order_items 新增 fulfillment_channel / status / source / locked / decided_by
- 新建 sku_channel_rules(L1 渠道规则),从 aff 商品与人工配置生成 73 条初始规则
- cost_exceptions 改为 SKU 级问题头 + cost_exception_items 明细
- 新增 finance_watermarks 管道水位与第三方卡券成本项
- 销售事实枚举扩展 third_party_voucher / unclassified
2026-10-31 18:11:39 +08:00
yml2213 45c9312e5d docs(finance): 新增财务与履约 v2 迁移草案与同步链路对照 2026-10-31 18:11:37 +08:00
yml2213 22400fbec6 fix(worker-platform): 资料更新不再覆盖并发抢单状态 2026-10-31 11:29:53 +08:00
yml2213 44791a9c8b perf(worker-platform): 排行榜公共缓存与抢单短路,压制 8.5s 慢查询脉冲
- 排行榜:Top 10 改为按 period 全局共享缓存(TTL 30s),SQL 传 currentWorkerId=0;
  个人单数解耦为 assigned_worker_id 精准索引查询(TTL 15s),未上榜展示「暂未上榜」,
  消除「每个打手一份缓存」导致的 8.5 秒全表聚合穿透;
- 抢单短路:新增 work-order-grab-guard,对已关闭工单打 10s 进程内标记,命中直接 409;
  publishWorkOrderRealtimeChange 统一作废标记,避免撤单/超时重开/重新发布后误杀正常抢单;
- 我的订单:默认排序也走「先取 id 再批量回表」的延迟分页,避免宽列 material_json 参与排序;
- 文档:新增生产 CPU 波动分析报告,慢查询数字按 6,235 行日志实测重算,并标注修复状态与验收口径。

验证:typecheck / check:sql / eslint / prettier 通过;后端 npm test 914 项(910 pass、4 skip、0 fail)。
2026-10-30 22:42:11 +08:00
yml2213 4ef52f11ba style(worker): 修复验收结算仓库的 Prettier 格式 2026-10-30 21:59:19 +08:00
yml2213 96ae744dbb fix(worker): 验收重复提交幂等,修复卡待验收与手动验收 500 2026-10-30 21:33:56 +08:00
yml2213 a6ccb2e2d8 perf(finance): 统一把 Intl.DateTimeFormat 提到模块级,消除逐行构造开销
承接 14b595b0。以下 7 处仍在函数体内 `new Intl.DateTimeFormat(...)`,
单次构造约 0.5ms,按行/按条调用时会线性放大:

- utils/finance-date-range.ts         formatShanghaiDate
- utils/http.ts                       (已在上一个提交修复)
- scheduler/cost-finance-sync-job.ts  today
- finance/sales-facts-service.ts      formatDateOnly
- finance/order-refund-service.ts     toChinaDate
- admin/admin-finance-service.ts      chinaDateParts
- admin/admin-dashboard-service.ts    resolveChinaTodayRange
- scripts/sync-cost-finance.ts        formatShanghaiDate

均为同选项的纯 hoist,输出逐字节不变:formatShanghaiDate 用 9 例跨时区/
毫秒/闰日语料与旧实现比对一致;其余为相同 en-CA/en-US + Asia/Shanghai
选项的等价替换,formatToParts 的取值改为单次遍历、去掉 fromEntries/reduce。
2026-10-30 21:23:31 +08:00
yml2213 14b595b0db perf(http): 修复响应日期格式化每次重建 ICU formatter 导致的 CPU 热点
formatResponseDateTime 在函数内部 `new Intl.DateTimeFormat(...)`,而
buildSuccessPayload 会对每个成功响应的每个日期字段调用它。ICU formatter
单次构造约 0.5~0.8ms,V8 CPU 采样显示该函数占后端主线程约 30% CPU(约 0.33 核)。

改动:
- formatter 提到模块级只构造一次;formatToParts 直取字段,去掉
  Object.fromEntries + filter + map 的三次分配
- isIsoDateTimeString 增加 O(1) 位置预判,避免对每个字段值跑正则
- normalizeResponseDateTime 用显式循环替代 entries/fromEntries 双重分配
- 同类问题一并修复:open-91 formatOpen91ExpireTime、redeem formatGrantTime

输出逐字节一致:新增等价性测试,以修复前实现为参考覆盖跨时区/毫秒/
闰日/跨年/非法日期语料。同形态响应(200 行 × 6 日期字段)实测
35.2ms → 2.6ms(13.6x)。
2026-10-30 21:20:11 +08:00
yml2213 fb485f7e36 feat(risk-control): 新增 IP/账号手动封禁,并收口财务同步的全表更新
- 风控:worker_risk_bans 表 + 前置封禁中间件(登录一并拦截)+ 后台列表/新增/解封
- 财务:成本快照补商品维度收口到本批 order_item_id,不再整表扫 899MB 的 order_items
- 性能:order_items 覆盖索引(迁移 110)、大厅 pageSize 上限 20、已读/上传接口限流
2026-10-30 20:15:14 +08:00
yml2213 1b170d3f45 perf(worker-platform): 店铺筛选下拉加 5 分钟缓存,避免全表扫描拖垮生产 2026-10-30 19:30:56 +08:00
yml2213 dc78dc92d1 feat(cost-center): 接单模板商品全量同步,改价默认立即生效 2026-10-29 21:44:29 +08:00
yml2213 c7d650b482 fix(worker): 售后追缴自动驳回提现并扣冻结资金,修复欠款抵扣 500
- 修复欠款抵扣 SQL 参数类型冲突(debt_amount = $1 与 $1 = 0 推断不一致),
  此前手动偿还、验收报酬抵扣、充值/押金解冻/寄卖自动抵扣都会 500
- 追缴顺序改为 待解冻押金 → 提现冻结 → 可用余额 → 欠款:
  驳回待审核提现并直接扣走冻结资金,扣不完的部分退回可用余额
- 迁移 109:售后单记录 withdraw_deduction_amount,补 pending 提现部分索引
- 新增流水类型 after_sales_withdraw_deduction,前后端展示与标签同步
- 提现驳回退回余额后补调欠款自动抵扣,与充值/结算/解冻/寄卖路径对齐
- 补追缴分配单测与 SQL 参数类型静态门禁
2026-10-29 19:05:37 +08:00
yml2213 fba0a13d44 fix(fulfillment): 履约回填改用 keyset 分页并补充待回填部分索引
- 迁移 108:order_items (id) WHERE fulfillment_mode IS NULL 部分索引
  生产已 CONCURRENTLY 预建;取 5000 条待回填 id 4.8s → 4.9ms
- reconcilePendingFulfillmentModes 增加 afterId / lastScannedId,批内固定 id > 游标
- 新增 resolveReconcileCursor:游标单调前进,未前进或不足一批即结束
- backfill-fulfillment-mode 支持 --afterId 断点续跑
2026-10-29 15:10:28 +08:00
yml2213 16b62a8e6d fix(cost-center): 修复接单模板改价 SQL 参数类型推断冲突
同一个 $1 在 reward_amount 处按 bigint 推断,在 CASE ... THEN $1 ELSE 0 处
因字面量 0 被推断成 integer,node-pg 不发送参数类型时 PostgreSQL 直接报
inconsistent types deduced for parameter $1,导致改价 500。
显式写成 $1::bigint / 0::bigint,并补源码级回归测试。
2026-10-29 14:38:20 +08:00
yml2213 979a1bfa41 fix: 免审验收容错与成本中心归一回填超时修复
- worker:等级升级计数移出验收事务,瞬时错误重试一次,最终失败转人工待办且不再返回 500
- worker:待验收阶段修改验收资料时保留 reviewMode/evidenceStatus/evidenceDueAt
- cost-center:迁移 107 新增人工待归一覆盖部分索引(生产实测候选聚合 19.6s → 391ms)
- cost-center:归一人工商品/按工单回填商品/模板预览前端超时放宽到 300s
- cost-center:批处理接口语句超时放宽到 60s(SET LOCAL,在线接口仍为 15s)
2026-10-29 14:33:35 +08:00
yml2213 814b357d46 chore(deploy): 上线门禁迁移基线扩至 103–106 2026-10-28 14:05:17 +08:00
yml2213 915ce017f3 perf(finance): 消除定时同步与后台页面的重查询
- 新增 order_items.manual_sku_key 生成列(迁移 106),统一内部 SKU 口径(skuNick → outSkuSn → sku_code → sku_name,去空格)
- 人工渠道匹配 8.4s → 62ms;人工商品归一写回 7.0s → 307ms
- 销售事实重算改为物化订单集合 + 预聚合成本/退款,6.9s → 0.5s 内
- 成本异常写入去掉逐项 LATERAL 工单探测,收口按最近 7 天窗口,7–8s → 0.5s 内
- 销售毛利订单统计去掉重复 NOT EXISTS,9.4s → 0.4s
- 接单平台店铺下拉改 EXISTS 半连接,3.1s → 0.3s
- cost-finance-sync 默认间隔 5 分钟 → 15 分钟;完整同步 51.2s → 34.9s
2026-10-28 13:41:11 +08:00
yml2213 08318ef8d9 feat(deploy): 财务上线数据阶段编排与运维加固
- 新增 deploy/post-deploy.sh:回填 → 业务配置 → 同步 → 验收四阶段编排,支持 --only/--dry-run/窗口参数
- 新增 tools 镜像与 scripts/verify-finance-launch.sql(15 项上线验收)
- 验收口径:成本闸门二选一、要求已过账凭证、备用金支出关联、成本覆盖 WARN
- 加固:参数校验、工具镜像每次刷新、docker run 兜底超时、迁移前缀探测、验收失败退出码 2
- 工具镜像预建 /app/data,消除日志 EACCES
- 回填后与 restore-db 恢复后自动 VACUUM (ANALYZE),修复订单列表分页 COUNT 全表扫描(41 万单实测 27s → 0.17s)
- 文档:41 万单同步用 7 天窗 + 180s 超时;回填/恢复后刷新统计
2026-10-28 11:52:42 +08:00
yml2213 0d9fb29460 fix(admin): 移除总账与对账页重复的页面标题 2026-10-27 16:41:55 +08:00
yml2213 9d5af359fa feat(finance): 完成财务控制、L1 钱包硬化与迁移收敛
- P0/P1:影子总账追加调整、关账/退款/资金/积分幂等、成本版本追溯、对账订单项维度
- 迁移收敛:原 103–114 合并为 103_finance_foundation、104_finance_controls、105_work_order_consignment
- 数据:L1 钱包 BIGINT/CHECK/奖励幂等;重复奖励审计口径修正与人工核对清单
- 报表:销售毛利缺失成本收入提示,旧收支页明确现金流口径
- 文档:同步迁移基线、合并评估、代码复核与上线说明
2026-10-27 16:08:16 +08:00
yml2213 0de0fd7b58 chore(db): 将 108–115 补丁迁移收敛为 108–111
- 原 108/111/112/113/114 合并为 108_finance_cost_integrity:
  成本异常归档、人工成本完整性、影子总账、商品页/模板查询索引
- 原 115 注释迁移改为 111_work_order_share_cancel_reason_comment
- 新增 reconcile-migration-history.sql,用于已跑旧 112–115 的库
  重建 schema_migrations 顺序,不重复执行 DDL
- 已验证:001→111、101→111 两条升级路径;
  旧 115 与新 111 的 pg_dump schema 完全一致
- 测试/文档迁移编号同步到 103–111

验证:backend check 853(849 pass / 4 skip);frontend check 172 + build。
2026-10-27 12:37:21 +08:00
yml2213 c8b7e80979 perf(template): 补模板证据日期/覆盖索引,预览降到秒级 2026-10-26 16:43:56 +08:00
yml2213 2b967ddd4c feat(cost-center): 商品初始化/回填增加时间范围,默认最近 30 天
- 接单模板初始化预览/执行支持 dateFrom/dateTo,只使用范围内工单证据;
  范围外模板不再先建商品
- 按工单回填商品支持时间范围;人工商品归一 UI 传时间范围
- 模板初始化重置只清理范围内导入映射/订单项,避免误伤范围外数据
- 初始化/回填默认最近 30 天,自动发货仍固定 30 天
- 文档更新初始化口径与页面操作
2026-10-26 16:26:48 +08:00
yml2213 288a0526ad perf(cost-center): 建索引后立即刷新统计信息 2026-10-26 16:08:06 +08:00
yml2213 25012c30f4 perf(cost-center): 商品页跳过无关 affiliate 聚合并补部分索引 2026-10-26 16:04:52 +08:00
yml2213 f0dda3842b test(worker): 校验拼单验收统一收口函数的寄卖钩子 2026-10-26 15:51:38 +08:00
yml2213 6dc1e7e727 fix(scheduler): 成本财务同步默认回退最近 7 天,避免小库语句超时 2026-10-26 15:49:51 +08:00
yml2213 6b0078f680 fix(finance): 收口快手退款路由并修复销售事实变更后的总账同步
- 平台退款路由从通用订单路径改为
  POST /api/v1/admin/kuaishou-industry/orders/:orderId/refunds/approve-and-record,
  服务改名 approveAndRecordKuaishouRefund,明确仅快手 91
- 总账同步改为未关账期间按日整体重建销售凭证,解决收入回填/退款重算后
  旧凭证金额不更新的问题;删除与重建放在同一事务,已关账期间保持不动
- 文档明确 revenue:backfill 是存量订单退款的前置条件:
  revenue_amount_fen=0 会导致退款登记按钮置灰
- 本地生产副本已执行 revenue:backfill:375,447 行全部回填,
  order 375483 可退金额恢复为 237.00 元

验证:backend check 844(840 pass / 4 skip);frontend check 172 + build;
集成测试通过(代录、总账平衡、关账阻断、对账)。
2026-10-26 13:48:53 +08:00
yml2213 861524a91a docs(finance): 校准代录与本地迁移基线到 112 2026-10-26 13:33:25 +08:00
yml2213 62763ddf0c feat(finance): 支持代录指定客服账户,并上线影子总账/对账/关账/快手平台退款
- 人工确认履约:管理员/财务/运营可传 fundAccountId / creditOwnerAdminUserId
  指定客服备用金/积分账户;客服仍强制本人账户
- 新增迁移 112:finance_accounts / journal_entries / journal_lines /
  periods / reconciliations / reconciliation_items,种子 11 个科目
- 影子总账:销售事实按日生成收入/退款/成本凭证,支持手工凭证、试算平衡;
  不接管钱包余额;总账同步接入定时任务与退款重算
- 期间关账/反关账:关账先补凭证并校验试算平衡,closed 期间禁止新增凭证
- 平台对账:JSON 账单导入,按 provider + platform_order_id 匹配订单/退款,
  标记 matched/amount_mismatch/missing_order/missing_refund/duplicate
- 平台退款:快手行业(91)同意退款 API 接入,成功后落 source=platform;
  抖音/拼多多返回 501,保留手工退款
- 新增后台「财务 → 总账与对账」页面(总账/期间/对账三个 Tab)
- 集成测试扩展到代录、总账平衡、关账阻断、手工凭证、对账匹配

验证:backend check 844(840 pass / 4 skip);frontend check 172 + build;
迁移 112 在 scratch 库全量执行并重跑幂等;本地生产副本已升级到 112,
销售事实同步 56 条凭证,借贷合计 1,885,351,864 = 1,885,351,864。
2026-10-26 13:32:47 +08:00
yml2213 f0eb8a5e05 docs(finance): 补充责任主管前置与客服账户初始化步骤 2026-10-26 13:05:46 +08:00
yml2213 a3e2bdb7c4 feat(finance): 人工成本单事务/幂等 + 配置自动匹配 + 缺成本监控
- 确认履约改为单事务:锁订单项 → 复查快照 → 扣积分/备用金 → 写成本快照;
  快照失败整体回滚,不再出现「钱扣了、成本没记」
- manual_case 的 subject_id 统一为 order_item_id,新增订单项级唯一索引(迁移 111),
  消除 manual_expenses.id / platform_credit_entries.id 跨表撞车
- 人工 SKU 匹配增加 sku_code / sku_name 兜底;保存配置立即回填最近 30 天,
  定时任务按窗口 rematch,确认时再按 SKU 兜底匹配
- 新增 manual_cost_missing 异常队列:从首次人工配置起算,确认履约立即收口
- 补单元测试与真实 PostgreSQL 集成测试(并发、重复、强制快照失败回滚、双资金链路)
- 校准财务文档并新增上线初始化/验收手册(历史人工不补录,只保证配置后的新单)

验证:backend typecheck/lint/format/check:sql/test 843(839 pass / 4 skip);
frontend typecheck/lint/test 172;迁移 111 在 scratch 库全量执行 + 重跑幂等。
2026-10-26 13:04:51 +08:00
yml2213 73908119dc style(backend): 修复 4 个文件的 Prettier 格式告警
仅按仓库 Prettier 规则换行/去多余空行,无逻辑变更:
- routes/admin/cost-center-catalog.ts
- services/cost-center/affiliate-dash-prices-baseline.ts
- services/cost-center/affiliate-product-service.ts
- services/cost-center/product-catalog-service.ts

验证:backend format:check / typecheck / lint / check:sql 通过,
tests 833 pass(3 skipped);frontend format:check 通过。
2026-10-26 12:13:08 +08:00
yml2213 31a8b6fc65 Merge branch 'dev1023' into dev
解决 9 个冲突文件,并修复合并后遗留问题:

- 大厅候选集:采用 FIFO 窗口 + 全部置顶单 UNION(列表与抢单/拼单复核同源)
- 拼单份额:采用多次参与模型(每次参与 INSERT 新份额、requestId 幂等),
  取消后可重新参与;移除 HEAD 已废弃的单行 rejoin 逻辑与对应测试
- 工单迁移与成本中心 103–108 编号撞车:合并重写为
  109_work_order_share_participation / 110_work_order_hall_and_shop_indexes;
  临时库全量执行与重跑幂等验证通过(10 列、唯一键已删、7 个索引)
- 实时补丁:保留个性化字段、置顶重排、分页总数同步;补回 orderTimelineVisible 类型
- 打手大厅:保留 memo 组件化,移植「再拼一次」多份额按钮逻辑
- 全项目表格统一 PercentTable:WorkerOrderShareTable 改造

验证:backend typecheck/lint/check:sql/test(833 pass)、
frontend typecheck/lint/test(172 pass)/build 全绿。
2026-10-26 12:10:53 +08:00
yml2213 dfc01db4ae feat(admin): 整合财务模块导航为侧边栏子菜单与顶部联动Tab
- 侧边栏收敛:将散落在运营分组下的销售毛利、商品与成本、钱包管理、收支明细整合入「财务」二级子菜单,并支持智能展开与角色权限隔离
- 顶部导航联动:新增 FinanceSubNav 通用组件,在销售毛利、商品与成本中心、钱包管理、收支明细 4 个页面顶部统一提供一键切换 Tab
- 语义规范化:将原“财务”流水页面标题明确为“收支明细”,消除模块与页面的命名歧义
- 验证方式:npm run check 全量检查通过(Prettier、ESLint、tsc、单测 100% 通过),构建产物已同步至运行容器并验证路由与交互
2026-10-25 20:39:11 +08:00
yml2213 eaffae4af0 fix(frontend): 支持请求级自定义超时并将接单模板初始化与批量回填超时延长至5分钟
- 在 http 客户端封装中增加可选 RequestOptions 参数透传,允许对耗时较长的数据初始化/大批量回填接口单独配置超时
- 将 applyAdminTemplateProductBootstrap、syncAdminAffiliateDashCostSnapshots、backfillAdminProductMappings 及 backfillAdminNormalizedQuantities 客户端超时由 50 秒延长至 300 秒(5分钟)
- 彻底解决生产全量订单数据规模下接单模板初始化触发 50 秒网络超时提示的问题
- 验证方式:npm --prefix apps/frontend run typecheck 通过,生产镜像构建运行正常
2026-10-25 17:29:58 +08:00
yml2213 12f370de15 feat(cost-center): 将统计与自动发货同步统一收敛至最近一个月并自愈历史非标SKU
- 范围收敛:将财务日期范围默认窗口、自动发货履约任务扫描、成本快照重算及定时任务默认窗口统一收敛为最近一个月(30 天),不再扫描混乱的历史遗留数据
- 脏数据清洗与自愈:在自动发货同步与基线导入时自动识别并清理历史把中文名当做 SKU 插入的 21 个非标脏商品,将关联的 116 个订单项平滑重定向至标准 38 款基线商品
- 标准提取:从履约任务 context_json 中按优先级提取标准上游 sku,通过正则仅允许合规英数标识符入库,避免中文名称污染商品目录
- 界面对齐:前端销售毛利概览默认查询最近 30 天,自动发货与目录改价追溯生效时间默认设置为近一个月(30 天前)
- 验证方式:全量单测 783 项通过、tsc 0 error、容器内执行同步后脏商品归零且销售事实精准重算
2026-10-25 16:24:50 +08:00
yml2213 e61d003342 fix(cost-center): 将自动发货价格基线转为内建常量并修复参数类型
- 提取并内建 38 条自动发货采购成本基线常量,消除生产镜像缺失 scripts 目录的 ENOENT 问题
- 在 jsonb_build_object 中增加 $5::text 类型显式强转,避免 Postgres 参数类型推断错误
- 增加同生效日期的版本就地更新逻辑,保障基线可重复无损导入
- 验证方式:npm run typecheck、npm test、生产镜像容器内真实触发导入接口返回 200
2026-10-25 16:03:16 +08:00
yml2213 b7ad69831a feat(cost-center): 统一商品成本中心为全系统唯一标准价格源并闭环改价与工单同步
- 核心架构:将商品与成本中心确立为全系统唯一标准价格源,接单模板价格在接单平台禁止编辑并提示收敛至成本中心,后端 saveAdminWorkProductRule 严格拦截价格篡改
- 改价与同步:标准商品目录与自动发货专属面板提供统一改价弹窗,支持追溯/立即生效/指定时间;改价后自动或手动将新价格同步至接单大厅待抢单工单,保持下游业务一致
- 缺陷修复:修复 cost_versions 追溯改价时因同生效时间违反 chk_cost_versions_period 检查约束及 uq_cost_versions_scope 唯一索引冲突的问题,采用 active 版本就地更新机制
- 分类树优化:工单二级分类树限定仅在工单来源展示,自动发货与人工客服彻底隐藏分类树并重置过滤条件
- 验证方式:通过后端 784 项全量测试、前后端 tsc 类型检查及前端生产构建打包
2026-10-25 15:21:34 +08:00
yml2213 55a3e0df9c refactor(admin-ui): 成本中心导航收敛为 4 个固定 Tab
原结构是「4 个来源 Tab(内容只有一句提示语)× 6 个内容 Tab」,
且来源 Tab 会增删内容 Tab:选「自动发货」后标准商品/渠道映射/发单价格直接消失,
切换来源还会强制跳转。用户反馈「逻辑不顺、很多 tab 没必要」。

- 来源改为工具栏 Segmented:只筛数据,不改变导航;Tab 永远 4 个
  标准商品 / 渠道映射 / 成本配置 / 成本异常;
- 自动发货 SKU、发单价格、人工 SKU 配置合并为「成本配置」,
  选「全部」时给三个入口卡片,选具体来源时直接渲染对应面板;
- 自动发货 SKU 原本是标准商品的同数据子集(同一个接口 + carrierType),
  合并后不再有重复入口;
- 渠道映射在自动发货/人工来源下改为说明性提示,不再展示空表;
- 异常徽标改用当前来源的计数,不再出现「徽标 10 万、列表几百条」;
- refreshAll 改为按 queryKey 前缀失效,修好漏刷
  (诊断、未归一队列、人工 SKU 等 5 个查询);
- 删除 Context 里 12 个从未被读取的字段(products/versions/exceptions 等
  空数组与 loading 常量),注释改为与实现一致;
- 「生效发单价格」改名「生效成本版本」——它统计的是全部 active 版本,
  按来源过滤后叫发单价格会误导。

验证:后端 786 测试、前端 lint/typecheck/test/build 通过。
2026-10-25 13:55:36 +08:00