471e21a68b
fix(activity): 修复复制活动时奖励快照时间写入异常
...
本次提交修复了管理端复制活动接口在复制奖励配置时写入零时间导致的 MySQL datetime 报错,并补齐了活动奖励复制过程遗漏的快照与业务字段,避免新活动复制后出现配置丢失或插入失败。
- 复制逻辑:在 CopyActivity 中完整复制 price_snapshot_cents、cost_snapshot_cents、price_snapshot_at、min_score、drop_quantity 等奖励字段
- 异常兜底:当历史奖励快照时间为空或为零值时,复制时自动回填为当前时间;当价格/成本快照缺失且存在商品 ID 时,回退读取当前商品价格与成本价
- 兼容历史数据:确保旧奖励配置即使未完整回填快照字段,也能被安全复制,不再因 0000-00-00 时间值触发插入失败
- 测试覆盖:补充活动复制场景测试,验证快照字段原样复制、缺失快照自动补齐,以及 min_score/drop_quantity 等字段不会在复制时丢失
2026-04-21 03:08:21 +08:00
0a397adf41
feat: 支持批量合成并收口不包邮运费规则
...
本次提交同时完成碎片批量合成与盒柜发货运费规则改造,减少用户重复操作,并确保不包邮商品在任何件数下都必须支付运费。
- 合成功能:新增批量合成接口与前端一键合成入口,按配方可合成上限批量消耗碎片并生成对应资产,同时补充批量合成测试
- 运费规则:后端新增统一运费判定逻辑,命中 category_id 14/15 的商品时整单强制收取运费,否则继续沿用少于 5 件收运费的旧规则
- 发货流程:新增运费检查接口,前端发货前先向后端确认是否需要支付运费,并根据“件数不足”或“包含不包邮商品”展示不同提示文案
- 接口校验:运费预下单与批量申请发货统一复用后端判定逻辑,避免前端规则被绕过
2026-04-21 02:06:56 +08:00
win
a96b1543f0
排行榜 扫雷
2026-04-20 15:53:31 +08:00
1cf57657ca
feat(shipping): 发货列表返回收货地址信息
...
为用户发货分组接口补充 address 字段,在按批次聚合发货记录时一并收集 address_id,批量查询 user_addresses 并回填到 shipment 返回结果。
这样小程序发货列表卡片可以直接展示本次申请发货所选的联系人、手机号和详细地址,避免前端额外发起地址查询或依赖本地拼装。
2026-04-17 20:42:46 +08:00
fb4b266bac
fix(channel): 统一渠道分析时间筛选范围
...
让渠道分析弹窗的概览卡片和趋势图共用同一时间筛选范围,
并将默认行为调整为历史全量展示。前端改为在未选择日期时
不再回退最近 12 天,后端新增统一时间窗口解析逻辑,使
overview 与 daily 在全量、指定区间和 days 模式下保持一致。
2026-04-09 17:51:42 +08:00
03214dddf2
fix(channel): align channel cost with draw-source attribution
...
Replace channel cost aggregation with draw-source based cost calculation
that follows activity profit-loss logic and keeps cost attribution on the
original ordering user's channel. Update channel stats tests to cover the
new cost path and related schema fields.
2026-04-09 17:04:30 +08:00
58fd926b46
fix(finance): 统一收益统计口径,修复多处数据计算错误
...
1. Revenue 口径统一为 actual_amount(真实现金到账)
- 优惠券(discount_amount)和积分(points_amount)是平台免费发放的营销补贴,
不算收入,改为展示字段
- 涉及: profit_metrics.go, dashboard_spending.go, users_profit_loss.go,
dashboard_user_spending.go, activity_rankings_admin.go
2. Cost 口径统一为奖品库存价值
- 删除 finance service 中的积分成本扫描(Step 3)和优惠券成本扫描(Step 4)
- 之前优惠券同时算在收入和成本两侧,导致利润被人为压低
- 涉及: query_user.go, query_activity.go
3. 统一 value_cents fallback chain
- finance service 改为与排行榜一致的三级回退:
COALESCE(NULLIF(value_cents,0), price_snapshot_cents, products.price, 0)
- 涉及: query_user.go, query_activity.go
4. 活动盈亏收入统一到 finance service
- 删除 dashboard_activity.go 自有的 revenue SQL(含比例分摊逻辑)
- 收入和成本统一由 finance.Service.QueryActivityProfitLoss() 提供
- 修复日志明细 profit:道具卡倍率改用 ComputePrizeCostWithMultiplier
5. finance service 新增展示字段
- ProfitLossDetail 增加 CouponDiscount, PointsDiscount, GamePassValue
- 不参与 Revenue/Cost/Profit 计算,仅供前端展示营销补贴明细
6. 修复对对碰次卡订单 discount_amount 数据污染
- matching_game_app.go 次卡下单时 DiscountAmount 错误设为活动全价
- 改为 0(次卡支付不涉及优惠券)
- 附带历史数据修复 migration SQL
7. 排除已分解奖品的成本重复计算
- 用户可以把奖品分解成积分再兑换新商品,导致同一份价值被计算两次
- 所有库存查询增加排除条件: status=3 且 remark 含 redeemed_points 或 batch_redeemed
- 涉及 6 个文件的库存成本/资产查询
8. 排行榜详情抽屉限定活动范围
- prize 查询增加 activity_id > 0 过滤,排除积分兑换/转入/合成等非活动产出
- 使排行榜与其详情抽屉口径一致
修改文件(12个):
- internal/service/finance/profit_metrics.go
- internal/service/finance/query_user.go
- internal/service/finance/query_activity.go
- internal/service/finance/types.go
- internal/api/admin/dashboard_activity.go
- internal/api/admin/dashboard_spending.go
- internal/api/admin/dashboard_user_spending.go
- internal/api/admin/users_profit_loss.go
- internal/api/admin/users_profile.go
- internal/api/admin/activity_rankings_admin.go
- internal/api/activity/matching_game_app.go
- migrations/20260325_fix_matching_gamepass_discount.sql
2026-03-26 00:01:17 +08:00
46b9555823
feat(fragment): 商品成本价 + 活动奖品单次产出数量
...
- products 表新增 cost_price 字段(成本价/分)
- activity_reward_settings 新增 drop_quantity(单次产出数量,默认1)
和 cost_snapshot_cents(成本价快照)
- 奖品创建/修改时自动快照成本价,drop_quantity 限制 1-100
- 抽奖发放逻辑按 drop_quantity 循环创建多个库存项
- 抽奖结果接口按 drop_quantity 返回多条 item,前端自动合并显示
- 抽奖记录接口返回 drop_quantity 字段
- 商品管理 API 全链路支持 cost_price
2026-03-23 22:26:06 +08:00
win
1f8f3f7fad
x
2026-03-21 19:00:28 +08:00
win
2a7b731484
feat(finance): implement Phase 1 core P&L service + wire into dashboard
...
- Add internal/service/finance/types.go: AssetType enum, param/result structs
- Add internal/service/finance/service.go: Service interface, read-only ctor
- Add internal/service/finance/query_user.go: QueryUserProfitLoss (4 fan-out scans)
- Add internal/service/finance/query_activity.go: QueryActivityProfitLoss (4 fan-out scans)
- Add internal/service/finance/service_test.go: 22 integration tests (all pass)
- Wire finance.Service into admin handler (admin.go)
- Replace dashboard_activity cost scan with finance.Service call (D-09: value_cents single source of truth)
- Revenue/gamepass/draw-count scans unchanged; response schema fully compatible
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-21 18:38:33 +08:00
535106f158
fix(coupon): 修复订单超时取消时金额券未退还的bug
...
问题:
commit b9a40df 修复了 CancelOrder()(用户/管理员主动取消)的券退回逻辑,
去掉了 `AND status = 4` 条件,但遗漏了 order_timeout.go 中超时取消的
同一逻辑,导致次数卡包(game_pass_package)订单超时取消时金额券余额丢失。
根因:
game_pass_package 下单时,金额券(type=1)通过 applyCouponToGamePassOrder()
直接扣减 balance_amount 并保持 status=1(有余额)或 status=2(用完),
不会设置 status=4(预扣中)。而 cancelExpiredOrder() 的 UPDATE 语句带有
`WHERE id = ? AND status = 4` 条件,导致匹配不到行,退券静默失败。
生产已确认影响:用户9110的券1690(订单28229)和券1532(订单26743)
因此bug各丢失10元余额。
修复:
- 去掉 `AND status = 4` 条件,改为 `WHERE id = ?`,兼容所有券状态
- 新增幂等校验:先查 timeout_refund 流水是否已存在,防止重复退还
- 新增兜底逻辑:order_coupons 无记录时,从 user_coupon_ledger 流水
回推预扣金额,与 CancelOrder() 的修复方案完全对齐
2026-03-20 20:32:30 +08:00
win
eaf4af4ba4
Merge remote-tracking branch 'origin/zuncle'
2026-03-19 22:37:56 +08:00
47c36b43cd
feat(fragment): add synthesis flow and fragment restrictions with tests
2026-03-19 16:26:36 +08:00
4ffd8e8326
fix: 修复过期优惠券仍可兑换/使用的漏洞
...
- store.go: 积分商城优惠券列表加 valid_end > now 过滤
- coupons_list.go: 修复 NULL valid_end 被错误排除,无截止日期券正确显示为有效
- activity_order_service.go: 过期/不可用券下单返回明确错误,不再静默跳过
- points_redeem_coupon_app.go: 积分兑换前校验模板 valid_end
- coupon_add.go: 发券前校验模板 valid_end,过期拒绝发放
2026-03-18 21:58:25 +08:00
b9a40df5c5
fix(coupon): 修复订单取消时金额券未退还的bug
...
订单取消退券逻辑依赖 used_order_id 匹配,但金额券在下单时
不设置 used_order_id(仅在支付确认后设置),导致未支付订单
取消时 WHERE 条件匹配不到行,退券静默失败。
修复:去掉 used_order_id 条件,按券 ID 直接退还,增加幂等
校验和错误处理,兜底从流水回推预扣金额。
2026-03-17 21:15:33 +08:00
win
8d8f660e34
Merge remote-tracking branch 'origin/zuncle'
2026-03-17 18:36:24 +08:00
c7cd3c21e5
feat(shipping): 发货订单超过48小时不允许撤销
...
- 在cancel_shipping.go中添加48小时限制检查
- 在shipping_groups.go中返回created_at字段供前端判断
- 超过48小时的订单撤销时提示'需要撤销发货请联系客服'
2026-03-17 18:11:00 +08:00
win
a450a92673
Merge origin/zuncle into main
2026-03-17 16:00:23 +08:00
win
c0267c7a33
feat(channel): GMV支付方式拆分(现金/优惠券/积分)
...
后端:
- GMVBreakdown 结构体拆分 total/cash/coupon/points 四个维度
- calcGMVByTotalAmount 返回值改为 GMVBreakdown,SELECT 增加 actual_amount/discount_amount/points_amount
- StatsOverview/StatsDailyItem 新增 cash_cents/coupon_cents/points_cents 字段
- 测试数据增加优惠券场景,新增拆分断言
前端:
- API 接口类型同步增加 3 个拆分字段
- 概览区新增支付构成行:现金/优惠券/积分 各带金额和占比
2026-03-16 23:33:48 +08:00
win
8d1eef2f7f
fix(channel): 修复渠道统计GMV重复计数和商城直购误计入
...
1. 排除商城直购(source_type=1):GMV和成本过滤条件从IN(1,2,3,4)改为IN(2,3,4)
2. 排除次卡免费使用订单(actual_amount=0):避免购买次卡和使用次卡双重计入GMV
- source_type=4 一番赏使用次卡:1578单 44032元重复
- source_type=3 对对碰使用次卡:422单 7042元重复
- 合计去除51074元虚增GMV(29.1%)
3. 成本过滤条件同步修正:source_type IN(2,3,4),total_amount>0
修正后:GMV从175600降至124527元,毛利率从37.4%回到真实的11.8%
2026-03-16 21:41:39 +08:00
fac825245b
fix: 修复赠送流程地址归属错误,强制登录后才能填写收货地址
...
接收者未登录时提交地址会错误保存到赠送者名下,现改为:
- API层:登录态从可选改为必选,未登录返回401
- Service层:始终用提交者ID作为地址归属人
2026-03-15 13:23:09 +08:00
win
98694b4e69
revert: 移除转赠资产禁止兑换积分的限制
...
经数据核实,转赠后兑换积分属于合法行为(资产转赠后归接收方所有)。
并发漏洞虽然产生了重复转赠/发货记录,但实际经济损失为 0 元:
- 18 个重复发货资产中,没有任何一个真正被两方都发了货
- 没有任何资产被重复兑换积分
保留前两个并发修复(SELECT FOR UPDATE + RowsAffected 检查),
回退第三个业务限制(禁止转赠资产兑换积分)。
2026-03-15 13:23:09 +08:00
win
9cf9f798bb
fix(security): 修复赠送资产薅积分三大漏洞
...
1. SELECT FOR UPDATE 锁定资产行,防止并发转赠竞态条件
2. 检查 RowsAffected 防止 GORM 静默失败导致空壳发货记录
3. 兑换积分时校验转赠来源,禁止转赠资产兑换积分
4. 转赠来源校验改用写库查询,避免主从延迟绕过
5. 转赠来源查询错误不再静默忽略,失败时返回错误
基于 zuncle 分支修复,额外修正了两个安全隐患:
- RedeemInventoryToPoints/RedeemInventoriesToPoints 中
转赠记录查询从 readDB 改为 writeDB
- Count()/Find() 返回的 error 不再丢弃
2026-03-15 13:23:09 +08:00
win
749464c03e
revert: 移除转赠资产禁止兑换积分的限制
...
经数据核实,转赠后兑换积分属于合法行为(资产转赠后归接收方所有)。
并发漏洞虽然产生了重复转赠/发货记录,但实际经济损失为 0 元:
- 18 个重复发货资产中,没有任何一个真正被两方都发了货
- 没有任何资产被重复兑换积分
保留前两个并发修复(SELECT FOR UPDATE + RowsAffected 检查),
回退第三个业务限制(禁止转赠资产兑换积分)。
2026-03-11 16:51:27 +08:00
win
8229b41382
fix(security): 修复赠送资产薅积分三大漏洞
...
1. SELECT FOR UPDATE 锁定资产行,防止并发转赠竞态条件
2. 检查 RowsAffected 防止 GORM 静默失败导致空壳发货记录
3. 兑换积分时校验转赠来源,禁止转赠资产兑换积分
4. 转赠来源校验改用写库查询,避免主从延迟绕过
5. 转赠来源查询错误不再静默忽略,失败时返回错误
基于 zuncle 分支修复,额外修正了两个安全隐患:
- RedeemInventoryToPoints/RedeemInventoriesToPoints 中
转赠记录查询从 readDB 改为 writeDB
- Count()/Find() 返回的 error 不再丢弃
2026-03-11 16:25:11 +08:00
bd91c0fad1
fix(transfer): 修复赠送资产并发漏洞及转赠积分薅取问题
...
- SubmitAddressShare 事务内 SELECT FOR UPDATE 锁定资产行,防止并发重复提交
- 检查 UPDATE RowsAffected,静默失败时回滚事务
- 防重检查从 readDB 移入事务内写库,消除主从延迟竞态
- RedeemInventoryToPoints/RedeemInventoriesToPoints 添加转赠来源校验,
禁止通过转赠获得的资产兑换积分
2026-03-11 14:14:34 +08:00
win
91dd42ca1c
feat(channel): 渠道统计新增盈亏计算并修复成本口径
...
后端:
- StatsOverview/StatsDailyItem 新增 cost/profit 字段
- 新增 calcPaidByPriceDraw 三路收入分类(抽奖/对对碰/一番赏)
- 新增 calcCostByInventory 成本计算(含道具卡倍数)
- 修复成本统计未过滤 source_type 导致直播间免费发奖资产被错误计入
- remark.go 新增 PkgID 解析支持一番赏订单
前端:
- 渠道统计弹窗新增"总成本"和"盈亏"卡片
- 趋势图新增"盈亏分析"Tab
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-11 02:29:19 +08:00
d45096d13f
fix(refund): 修复退款后翻牌游戏资格未回收的问题
...
问题描述:
用户退单后,翻牌游戏资格会重新出现(被重置),但用户已经抽过奖了。
这导致用户可以通过退款获得额外的翻牌机会。
根本原因:
退款处理逻辑 reclaimLivestreamAssets 只回收了 user_inventory 中的实物奖品,
但没有回收 user_game_tickets 中的翻牌游戏资格。
解决方案:
在 reclaimLivestreamAssets 函数后添加 reclaimFlipCardTicket 函数,
用于检测并回收翻牌游戏资格:
1. 通过 shop_order_id 查询抖店订单获取商品ID
2. 查询 douyin_product_rewards 表检查商品是否配置了翻牌游戏奖励
- 检查 reward_type = 'game_ticket'
- 检查 payload.game_code = 'flip_card'
3. 如果配置了翻牌奖励,回收用户的翻牌次数
- 扣减 user_game_tickets.available
- 扣减 user_game_tickets.total_earned
4. 在 game_ticket_logs 表中记录回收日志
影响范围:
- 仅影响配置了翻牌游戏奖励的商品订单退款
- 退款时会同步回收翻牌游戏资格
- 已使用过的翻牌次数不会被回收(只回收 available > 0 的记录)
测试建议:
1. 购买配置了翻牌奖励的商品
2. 进行翻牌游戏
3. 申请退款
4. 验证翻牌资格是否被正确回收
2026-03-08 16:01:39 +08:00
2aa7cdbd61
fix(shipping): 使用资产价值快照价格确保发货与分解价格一致
...
修复改价后发货价格与分解价格不一致的问题:
- 发货时优先使用 user_inventory.value_cents 快照价格
- 后台发货列表使用 shipping_records.price 存储的快照价格
- 确保盈亏统计时价格数据准确一致
2026-03-05 17:54:58 +08:00
win
b3b63dcba2
admin
2026-03-05 12:50:06 +08:00
win
994a7ba0df
邀请关系
2026-02-27 17:51:38 +08:00
win
e0db8751f3
任务中心的问题
2026-02-27 16:07:12 +08:00
win
46a7253239
fix:订单同步
2026-02-27 00:08:02 +08:00
win
8b7af03400
feat(prize): freeze value snapshots across grant redeem refund and reports
2026-02-21 22:16:20 +08:00
win
7e8a2ebb52
feat: Add user spending dashboard, update database schema, and refine various API endpoints and service logic.
2026-02-21 21:33:19 +08:00
ec035ffb53
任务大厅,限量显示
2026-02-19 19:55:25 +08:00
af1c16c7c5
优惠券bug
2026-02-18 23:23:34 +08:00
58baa11a98
fix:优惠券购买次卡bug
2026-02-10 01:17:15 +08:00
e124f8d4ff
优化钱
2026-02-08 17:19:27 +08:00
fbdaf77eda
x
2026-02-06 16:49:27 +08:00
029ed489bc
x
2026-02-06 15:18:16 +08:00
571cb2f4db
add: 仪表盘
2026-02-04 12:44:37 +08:00
9eea272d69
统计更新
2026-02-03 17:44:02 +08:00
25c44c2064
x
2026-02-02 23:56:01 +08:00
55e22086e8
201
2026-02-01 00:27:38 +08:00
6d33cc7fd0
fix:盈亏计算
2026-01-27 01:33:32 +08:00
5ad2f4ace3
feat: 保存当前开发进度 - 直播抽奖验证功能
2026-01-18 01:55:54 +08:00
b21e2db8ef
feat: 添加抖音商品奖励功能,并增强后台用户列表统计数据、邀请人数及道具数量展示。
2026-01-08 10:13:29 +08:00
e3a96e68d8
fix: 修复退款时清理一番赏格位、积分兑换商品库存校验及抖音登录自邀问题。
2026-01-06 01:46:25 +08:00
359ca9121f
chore: 添加定时开奖和抖店同步的调试与信息日志
2026-01-04 22:58:38 +08:00