合并 internal → main: 退款/提现/激活/CI 全面优化 #4
Reference in New Issue
Block a user
Delete Branch "internal"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
变更摘要
订单退款
POST /v1/admin/order/refund)GET /v1/admin/log/order/refund)提现优化
激活路径加固
用户管理
CI/CD & 部署
其他
影响范围
- Add `activation_context` TEXT column to `order` table (migration 02150) - purchaseLogic: write TemporaryOrderInfo JSON to order.ActivationContext in the same insert transaction; Redis write is now best-effort (non-fatal) - redeemCodeLogic: write redemption {type, redemption_code_id, unit_time, quantity} JSON to order.ActivationContext at order creation; Redis write is now best-effort (non-fatal) - getTempOrderInfo: on Redis miss, fall back to order.ActivationContext from DB; logs CRITICAL and returns error if both are missing (old orders with no DB record) - RedemptionActivate: on Redis miss, fall back to order.ActivationContext from DB; same CRITICAL log path for legacy orders Co-authored-by: multica-agent <github@multica.ai>fefbd4f5的 go-zero stub 方案,回到 goctl 1.7.2 + gin 原生 routes此前 calculatePurchasePrice 把 allowPromo 绑死在 orderType == 1,导致只要用户 有任何过往付费订阅(含已过期),就会被 paidSubscriptionQuery 路由为续费 (orderType=2),跳过所有促销评估。后果: - InactiveUser 召回促销永远无法触发(其目标人群恰好就是有过期订阅的用户) - Campaign 全员活动对老用户 / 升级加购场景完全失效 - 套餐列表(loadSubscribePromoMap)直接调 EvaluatePromo 不感知 orderType, 可能显示促销价但下单时却拿到原价 修复方式:把 isFirstPurchase 下放给 EvaluatePromo,由规则类型决定 gating: - NewUser 要求 isFirstPurchase=true(保留首购语义) - InactiveUser 由规则自身的"上次订阅过期 N 月以上"条件判定 - Campaign 时间窗内对任意用户生效 新增 common.HasPaidSubscription 助手,套餐列表与下单走同一份 isFirstPurchase 判定,确保展示价与实际下单价口径一致。 测试:补充 EvaluatePromo / calculatePurchasePrice 的 NewUser 屏蔽 + Campaign 放开用例;更新 loadSubscribePromoMap 测试覆盖新增 HasPaidSubscription 查询。 注:renewalLogic.go 仍未接入促销(属于方向 B 的彻底统一,本次未涵盖)。Closes HIF-143. 让 `inviteeAndInviterIds` 在 append 后 `slices.Sort` 升序,让 sqlmock IN 参数匹配稳定,同时让生产 SQL EXPLAIN 计划稳定。修复 GitHub Actions Deploy Staging 自 2026-06-03 03:51 起连续 8 次 `go test ./...` 失败问题。 测试: go test -count=10 修复前 4/10 fail, 修复后 30/30 pass. 改动: 2 files, +4/-2 (internal/logic/admin/invite/{benefits.go,benefits_test.go})- 删除原迁移误将 ticket.status=3 (取消/拒绝) 当作已通过迁入的 5 条脏数据 - 补迁 8 条遗漏的 ticket.status=4 已通过单 - content 改为 '历史提现 #<ticket_id>' 支持反查 ticket 源头 - 修正 13 个用户的 commission 字段使其等于 SUM(type=33 日志) - 给 6 个前日志时代账号补 type=335 baseline 让账目闭环 - 加 .gitignore 排除审计 CSV/TSV(含真实用户邮箱与收款地址) 执行命令(注意 --default-character-set=utf8mb4 必须): docker exec -i ppanel-mysql mysql --default-character-set=utf8mb4 \\ -uroot -p ppanel < ops/audit/migration_v3.sql 跑完后 14 项体检全 PASS, 0 个用户余额失衡。之前接口返回原始 JSON 字符串(前端不好展示): "{\"type\":333,\"amount\":-649,\"order_no\":\"xxx\",\"timestamp\":\"...\"}" 改为可读文字: 333 订单退款回佣 → "订单退款回佣(订单号 xxx)" 337 提现驳回 → "提现申请被驳回,佣金已退回" 338 提现取消 → "已取消提现,佣金已退回" 同时影响以下两个接口的 content 字段: - /v1/public/user/withdrawal_log?biz_type=commission_refund (deprecated) - /v1/public/user/commission_return_logView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.