Commit Graph
30 Commits
Author SHA1 Message Date
yml2213 b7b68abf6b test(sms): 修正重试用例因 DATETIME(0) 取整导致的时间敏感失败
updated_at 为 DATETIME(0),写库会把小数秒向上取整到下一秒,退避设为 0 时刚失败的记录会被
取数条件 updated_at <= now-退避 取不到,导致 TestDispatchRetriesThenFails 必挂;退避量改为 -2s 保证连续重试可确定执行。
2026-10-15 18:21:18 +08:00
yml2213 93e102b7c0 feat(sms): 新增节点短信提醒(审核未通过/被租用需辅助/上架未成交) 2026-10-14 14:57:52 +08:00
yml2213andCursor 590bf1cae3 fix(payment): 渠道已收款时不再把支付单回滚成支付中
租客在待支付超时或取消的最后几十秒完成付款时,订单先被取消,乐刷的支付
结果几秒后才到,入账被判定订单不可支付而拒收。原先订单推进和支付单更新
在同一个事务里,订单一报错整笔回滚,支付单停在支付中且 paid_at 为空:
钱已在渠道,系统却毫不知情。乐刷重试十次后放弃,之后既补不回入账(订单
不再是待支付),后台人工退款也发不出去(退款要求原支付单是已支付)。
日志保留期内 13 天出了 5 笔,合计 4085.60 元。

- 取消前核对渠道:超时取消、租客取消、客服关单都先查一次渠道,已收款并
  已推进订单就放弃取消,让支付正常入账而不是走退款。渠道异常时按未收款
  继续,避免渠道一抖订单全卡住
- 回调兜底记账:订单确实已结束时不再回滚,把支付单如实记成已支付并写入
  paid_at 与渠道单号,后台人工退款从此可用。退款仍由客服人工发起
- 客服关单:待支付订单按实际已收款减已退款的差额退,补上本次事故中关单
  不生成退款的直接原因
- 补齐日志上下文:回调入账失败原先只有 error="order cannot pay",现在带
  支付单号、订单号、订单状态和金额;新增 ERROR「渠道已收款但订单无法入账,
  需人工退款」作为唯一需人工介入的告警

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 09:23:25 +08:00
yml2213 6acdead0f0 Merge branch 'main' into feature/distribution-system 2026-09-11 09:35:53 +08:00
yml2213 784ffb5f72 fix(observability): 治理SSE慢请求虚报、客户端取消日志污染、退款重试刷屏与会话计数慢查询 2026-09-10 20:02:54 +08:00
yml2213 36ebe7a5f1 fix(distribution): 结算幂等与退款口径加固,补关单释放与回归测试
- 结算明细加唯一键 (order_id, party_id):自动释放与手工批次并发时以唯一键冲突为准跳过该参与方,不再重复入账
- 自动释放先无锁筛出本站未入账参与方,收敛加锁范围;手工批次建批次后先锁周期内财务快照,与自动释放串行化
- 累计退款额改为「本次回调金额与已退款成功流水合计取较大值」,多笔退款与退款结果重复回调不再把口径写小
- 关单三路径(AdminClose / AdminRejectRefund 的 close 分支 / AdminSeal)补写 release_at,接线原死代码 EnsureCompletedReleaseAtTx
- 仲裁分销重算改用实际退款额(扣除押金暂扣),避免站点被多扣
- 订单列表与详情的提价分成取 min(收入, 货架加价),退款压缩加价后不再显示负数
- 新增迁移 000070(结算明细唯一键)、000071(补回填 closed 订单释放时间)
- 新增 5 个测试文件:结算幂等与展示钳制、结算 job 幂等、累计退款、关单补写释放时间、仲裁押金暂扣口径
2026-09-10 19:13:39 +08:00
yml2213andCursor 647fdc0b4a feat(distribution): 通道费改主站承担,并按冷却期自动释放结算
利润不再扣支付通道费;站点可配置结算冷却期,到期自动入账,已释放后退款从收款站钱包回冲。同时修复当日自动批次无法追加、三方回冲打错钱包,以及测试库自增重置被 MySQL 统计缓存跳过的问题。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-10 17:11:58 +08:00
yml2213 cbd5412315 test: 后端测试从 SQLite 全面切换到 MySQL,与生产环境对齐
测试库不再使用 SQLite 内存库,改为每个测试包独立的 MySQL 库,
表结构由 backend/migrations 的真实迁移建立。

基础设施
- 新增 internal/database/testdb.go:NewTestDB() 保持原签名(28 处调用零改动),
  内部连接 MySQL 测试库,首次调用重建库并执行全部真实迁移,之后每次调用清空全表
- 库名 = 测试库基础名 + 包目录名,同包共享、跨包隔离,使 go test ./... 可并发执行
  (共用一库时各包会互相 DROP/CREATE 导致 database exists)
- 新增 NewDryRunDB():MySQL 方言 + DryRun,供断言 SQL 形态的 5 处测试使用
- 新增 AutoMigrateIfMissing():只对不存在的表 AutoMigrate,
  避免改动迁移定义的索引与约束
- 新增 scripts/prepare-test-db.sh:建库与通配授权,可重复执行
- 33 处 sqlite.Open 全部替换,26 个测试文件改用 MySQL
- 删除 46 处手写 SQLite 方言 DDL(AUTOINCREMENT / INTEGER PRIMARY KEY / TEXT),
  表统一由真实迁移建立
- go.mod 移除 gorm.io/driver/sqlite 与 mattn/go-sqlite3
- 删除生产代码里 distribution/repository.go 的 sqlite 方言分支(strftime)

对齐环境后暴露并修复的真实问题
- DATE(col) 在 MySQL 返回 DATE 类型,使 Date string 字段变成 RFC3339 时间串,
  大盘日期会带出时间部分;28 处改为 DATE_FORMAT(col, '%Y-%m-%d')
- 系统自动创建分销结算批次时 created_by 写入 0,违反指向 admin_users 的外键,
  生产会直接插入失败;改为写 NULL(新增 adminRef helper)
- MySQL DATETIME 仅到秒,静默截断 Go 侧写入的时间,
  导致租用时长计算与结算时点回读比对偏差;
  rental_orders 的 9 个业务时间列提到 DATETIME(6)
- 测试数据补齐严格模式要求的 NOT NULL 列、修正超出列长的取值、补齐外键父记录

迁移
- 000065 的 ALTER TABLE rental_orders 一并完成业务时间列精度调整,
  feature 侧不再单开迁移文件

脚本与文档
- check.sh / check-backend-coverage.sh 去掉 -p 1 串行与 SQLite 相关注释
- 更新 docs/Repository层测试补充总结.md 的测试运行说明
2026-09-10 14:34:01 +08:00
yml2213 369b0647bb 合并 main 分支并融合订单列表最小化与 SQL 治理
- Auth/权限中间件取 main 演进版(错误细分、token 来源),保留 dev 的用户 cookie 与登出撤销语义
- 后台订单列表:融合 main 的首页免 COUNT 优化与关键词索引路由,保留 dev 的最小化 AdminOrderListItemDTO(结账明细仍由详情接口返回,同步调整对应集成测试)
- 保留 dev 的 token_version 冻结/解冻递增与 main 的状态变化判断及通知
- 前端:保留 dev 登出接口与 main 的 fetchMe silent 参数、SSE 登录跳转;后台订单表按 dev 最小化 DTO 移除号主到手列
2026-09-05 11:43:13 +08:00
yml2213 208f12ddb4 完善本地质量门禁与资金链路测试 2026-09-02 13:50:19 +08:00
yml2213 c156c478d8 优化后台高频查询性能 2026-08-29 00:16:16 +08:00
yml2213 85332df2bd 订单接口最小化与私有文件访问加固
- 订单列表使用独立最小 DTO 并分页,号主待办提供独立接口与统计
- 用户 token 增加版本控制,冻结/改密/退出即时撤销会话
- 移除 URL token 传参,SSE 与接口统一使用 HttpOnly Cookie
- 私有文件按上传归属与业务关联授权,收款凭证转私有访问并校验归属
- 公开商品接口返回最小字段,隐藏号主身份与内部状态
- 每日清理超过 30 天未关联业务的上传归属,上传归属失败时补偿删除对象
2026-08-16 21:47:46 +08:00
yml2213 0256bfd276 修复取消订单误释放商品 2026-08-02 16:38:02 +08:00
yml2213 88d74aca7d 重构日志与可观测性体系
新增单行文本编码器与结构化 GORM 日志,统一错误记录与请求日志策略,收紧日志文件权限并修复按天切分与压缩,支付回调参数脱敏,生产强制阿里云短信,RequestID 校验防注入,日志文案中文化。
2026-07-29 16:19:35 +08:00
yml2213 4bc25b87d8 修复平台代管订单流程 2026-07-25 19:17:19 +08:00
yml2213 2efcede800 优化生产日志体积:访问降噪、压缩清理与退款告警节流
跳过轮询/封面等热路径成功请求,按日 gzip 并保留可配天数,退款 max-retry 汇总告警。
2026-07-13 22:02:20 +08:00
yml2213 72285ed638 修复超时订单重置流程 2026-06-19 18:36:46 +08:00
yml f4361c9804 优化发布群租客清退与历史消息 2026-06-18 09:39:23 +08:00
yml2213andClaude Opus 4.8 8192344027 优化号主交接超时卡死问题
- 号主交接超时(owner_timeout)后允许补提交交接说明,避免临时延误导致订单卡死
- 后台新增"重置交接"动作,可将超时订单恢复为待号主交接并刷新计时
- 交接超时改以进入待交接时刻为基准计算,新增 handoff_started_at 字段

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 04:16:31 +08:00
yml a275a006eb 修复支付取消与成功统计 2026-06-14 23:58:39 +08:00
yml ae4297fec7 仲裁退款失败补偿: refundretry 自动补建仲裁孤儿退款单
问题: dispute/arbitration.go 事务提交后 startRefundBestEffort 失败只 log.Printf 吞错, 号主收入已入账但租客退款单未建, 订单卡在 refund_status=pending 的孤儿状态。原 refundretry 的 warnMissingRefundOrders 只告警不补建, 导致资金口径不平需人工兜底。

修复: 升级 warnMissingRefundOrders, 对 settlement_status="arbitrated" 的孤儿订单自动调 StartRefund 补建 (biz_type 固定 arbitration_refund, 金额用 order.RefundAmountCent)。

幂等保证: 复用 StartRefund 内部 prepareRefundOrder 的 (order_id, biz_type) 查重作为天然幂等闸, 重复触发走 existing 分支只同步状态不重复建单。渠道失败 → markRefundFailed 留记录 + 订单 refund_status=failed → 下一轮不再视为孤儿。

范围限定: 仅仲裁孤儿自动补建 (biz_type 无歧义)。非仲裁孤儿 (取消/客服关闭/结账) biz_type 无法从订单状态可靠区分, 维持只告警。

新增测试:
- TestAutoRebuildArbitrationOrphan: 仲裁孤儿补建成功
- TestNoRebuildForNonArbitrationOrphan: 非仲裁孤儿不补建
- TestRebuildArbitrationOrphanIdempotent: 连续扫描幂等

防御: payments==nil 时跳过补建并告警, 避免单测/未来构造 Job 时 panic。

go build / vet / test 通过。
2026-06-14 16:17:19 +08:00
yml2213 fec8e37181 修复退款幂等与补偿重试 2026-06-14 07:55:02 +08:00
yml2213 607d2415a1 超时任务多实例优化 2026-06-14 03:14:43 +08:00
yml2213 8cbd06dca4 后台系统配置列表现在只返回当前真实使用的配置项 2026-05-27 08:40:03 +08:00
yml 5f6a4afcbb 彻底优化数据库字段 2026-05-24 20:49:37 +08:00
yml 778e08a261 兼容接入订单租期字段 2026-05-24 18:24:39 +08:00
yml 03e5d211dc 接入订单结账确认流程 2026-05-24 16:52:15 +08:00
yml c4cfe6dd79 新增订单待支付与支付确认后端流程 2026-05-24 16:29:47 +08:00
yml2213 a6a1afb879 删掉租期相关错误东西 2026-05-23 14:44:32 +08:00
yml 6f915b37d3 订单超时任务系统 2026-05-22 18:16:05 +08:00