Commit Graph
405 Commits
Author SHA1 Message Date
yml2213 180a21c048 feat(listings): PC与移动端首页新增比例排序
- 前端选项:在 PC 首页(HomeView)与移动端首页(MobileHomeView)的排序项中,在「综合推荐」后新增「比例排序」(ratioDesc)
- 后端排序:在 sortPublicListings 中实现 ratioDesc/ratio,按折算比例从高到低排序,同比例按哈夫币数量降序次级平局决胜
- 自动化验证:新增 TestSortPublicListingsByRatio 单元测试,全量运行 ./scripts/check.sh 门禁(Go测试、MySQL测试、前端lint/typecheck/build)全部通过
2026-10-10 17:26:28 +08:00
yml2213 9d5d35c7d4 feat(admin): 商品管理支持多选皮肤筛选且要求包含所选全部皮肤
- 后端过滤:将 AdminListQuery.SkinName 筛选逻辑对齐前台,由 OR(交集) 改为 AND(全包含),选多款皮肤时账号必须同时包含所选的全部皮肤
- 前端交互:AdminListingsView 皮肤筛选支持多选交互,点击具体皮肤支持多选高亮,底部提供已选数量提示、清空与确定操作,外层按钮智能展示已选皮肤摘要
- 样式增强:补充管理后台皮肤筛选弹层底部的清空/确定操作栏样式
- 验证方式:新增并运行后端 TestFilterAdminListingsByMultipleSkinsRequiresAll 单元测试,运行全量 ./scripts/check.sh 门禁全绿通过
2026-10-10 17:14:47 +08:00
yml2213 95435faf46 perf(distribution): 优化分销订单全量与分站慢查询,消除全表扫描与每行EXISTS子查询
- 数据库迁移:新增 000083 迁移,为 distribution_order_parties 添加 (site_id, order_id) 联合覆盖索引;
- 查询优化:重构 ListOrders,利用覆盖索引派生表预收敛分销订单候选集,替代在 3.7 万行 rental_orders 上的 OR EXISTS 逐行子查询全表扫描;
- 边界修复:超管全量分销订单(site_id = 0)增加分销范围收敛,防止全平台普通非分销订单混杂和 5 表级联扫表;
- 统计优化:同步改造 GetDashboardAnalytics 与 ListDistributionUsers,彻底消除大盘统计与客户画像聚合的慢查询;
- 验证方式:新增 TestListOrdersPerformanceAndScoping 单元测试,全量运行 ./scripts/check.sh 门禁验证通过。
2026-10-10 15:17:25 +08:00
yml2213 4ea08e355b feat(distribution): 分销站点增加用户数量统计与用户信息展示模块
- 数据模型与迁移: 新增 000082 迁移在 users 表追加 distribution_site_id 并建索引,用户首次在分销站点注册/短信登录时自动绑定站点归属
- 分销管理接口: 新增 GET /admin/distribution/users 接口,聚合本站注册用户与下单客户,返回完整11位手机号、累计消费金额、订单数及来源标签
- 统计与大盘扩展: GET /admin/distribution/sites/:id/analytics 补全今日注册、累计用户、成交客户指标,主站分销商列表追加用户体量展示
- 分销后台前端: 新增「客户与用户」页面 (Users.tsx) 支持一键复制手机号与订单穿透,大盘 (Dashboard.tsx) 增加用户规模核心卡片
- 自动化测试与门禁: 新增 TestListDistributionUsersAndAnalytics 单元测试,通过全量 Go 后端集成测试及前后端构建检查
2026-10-10 14:58:33 +08:00
yml2213 6d34f86765 fix(distribution): 分销后台展示完整用户手机号信息
- 后端 ListReceivedListings 移除 owner_phone 脱敏,向分销商返回完整卖家手机号
- 前端 Orders.tsx 移除 maskPhone 遮蔽逻辑,订单列表与收号货架均直接展示真实完整手机号
- 手机号文本支持一键复制,方便分销管理员日常履约联系
- 验证方式:go test 运行通过,npm run build(tsc + vite build)通过
2026-10-10 14:18:27 +08:00
yml2213 f19c9f62b7 test(invitation): 建立邀请返利全状态全组合正交测试套件并修复布尔零值持久化缺陷
- 设计并落地 6 大测试组共 37 个组合场景(绑定准入、实名生命周期、周期滑窗阶梯、双边角色矩阵、分站独立继承、金额极值与幂等性)
- 修复 GORM 在 default:true 标签下忽略布尔零值导致分站关闭返利失效的缺陷
- 在 UpdateRebateConfig 中使用显式 Select 保证 Enabled 字段 100% 精确持久化
- 验证方式:go test -v ./internal/modules/invitation/... 全部通过,耗时约 1.2s
2026-10-10 14:07:48 +08:00
yml2213 7cddbe9463 feat(invitation): 支持分销站点自主配置返利比例与权限隔离
- 后端新增分站专属配置及审计接口(/api/distribution/invitation-config 等),基于分站管理员严格鉴权隔离
- 分销独立后台新增「邀请返利设置」页面(Invitations.tsx),支持分站管理员自主开启/调整返利比例并查看本站流水
- 主站后台邀请接口路径补齐 /admin 前缀,解决 404/401 鉴权作用域问题
- 验证方式:backend 单元测试全数通过,distribution-admin 类型与构建检查通过
2026-10-10 13:47:53 +08:00
yml2213 984433f866 feat(invitation): 实现邀请返利系统、专属注册落地页与分成管理
- 数据库与数据模型:新增 migration 000081,支持用户专属邀请码、被邀请人绑定与实名时间戳;新增邀请返利配置表与结算明细表
- 业务与结算逻辑:实现首月 60%、次月 30%、往后 15% 阶梯返利算法;买卖双向独立寻源并根据订单平台利润 50% 单边基准核算;与终态订单结算和钱包可用余额强幂等联动
- 分销站点支持:支持主站与加盟分站独立配置返利比例;跨站交易按照收号端与售卖端独立出资,资金互不侵蚀
- 前端交互与入口:
  - 新增专属短链注册落地页 /i/:code,自动带入并锁定邀请码,引导实名认证
  - 个人中心与移动端新增邀请返利看板(专属码、推广链接、统计面板、好友记录与返利流水明细)
  - 管理后台新增邀请返利管理(比例配置、邀请关系与返利流水审计)
- 验证方式:
  - 通过 repository_test.go 单元测试(阶梯区间、实名激活、跨站多方分流验证)
  - 通过 npm run format、npm run check 与 scripts/check.sh 全量门禁校验
2026-10-10 12:48:59 +08:00
yml2213 b4d2d1e2f5 feat(pickup): 增加第三方单号补录功能并优化列表提号备注展示
- 后端支持补录/修改第三方单号接口 PUT /api/v1/admin/pickups/:id/third-party-order-no,记录流转事件与审计日志
- 前端线下提号主列表在第三方单号列后展示提号备注列
- 前端列表操作列及提号详情页增加补录/修改第三方单号操作入口与弹窗
- 通过 scripts/check.sh 全量门禁校验
2026-10-09 18:45:12 +08:00
yml2213 2c943027f0 test(pickup): 基于生产克隆真实数据全链路验证店铺合并映射功能
- 数据克隆:安全连接生产环境(42.121.217.194),以只读方式完整克隆 4498 条提号单、30 条财务调整及关联支撑数据到本地数据库并校准
- 回归测试:新增 TestClonedProdDataOperations 端到端自动化回归用例,在 4498 条真实数据上完整验证店铺聚合统计、一键转标准店铺、多变体批量合并清洗、提号列表联动筛选及撤销还原逻辑
- 证据沉淀:更新实施方案文档,登记生产克隆与验证证据;验证通过全套代码门禁 (scripts/check.sh)
2026-10-09 13:45:59 +08:00
yml2213 f3c5235b81 feat(pickup): 店铺管理支持历史店铺可视化手动映射与一键批量清洗
- 数据库升级:新增 pickup_shop_mappings 映射别名表,并在 admin_pickups 增加 raw_shop_name 永久保留原始店铺录入值
- 后端映射能力:提供历史店铺聚合统计、单条/批量映射至目标标准店铺、映射规则撤销与提号单还原接口;新建提号时若录入已映射别名自动归一化
- 前端管理升级:PickupShopDialog 升级为双 Tab 结构,Tab 2「历史店铺映射与清洗」支持总览统计卡片、状态筛选、单条/批量映射清洗、一键设为标准店铺及撤销还原
- 验证方式:执行并通过全套代码门禁(scripts/check.sh:SQL约束、go vet/build/test、MySQL测试库覆盖率、vue大小、eslint、prettier、vue-tsc及vite构建)
2026-10-09 13:31:11 +08:00
yml2213 9d9adfbd5e feat(pickup): 线下提号支持扩展字段店铺管理CRUD及时间筛选
- 线下提号创建表单扩展:增加「操作人」、「第三方单号」、「下单金额」、「押金金额」字段,重构弹窗布局为紧凑双列/三列金额卡片排布,消除过度垂直滚动并默认预填操作人
- 店铺管理 CRUD:新增 pickup_shops 配置表与配套 API,支持在提号页面直接管理店铺(增删改查、启用/禁用、筛选),下拉选项自动优先加载活跃配置店铺并兼顾历史店铺
- 列表时间范围筛选:增加精确到秒的「日期+时间」时间范围选择器,支持快捷时段与后端时间范围过滤
- 生产环境数据核查:只读提取线上全部 61 项历史提号店铺名称与单量分布,完整整理沉淀至实施文档供后续映射规则参考
- 验证方式:执行并通过全套端到端代码门禁(scripts/check.sh:SQL约束、go vet、go build、MySQL真实测试库单元测试及覆盖率、vue大小检查、prettier、eslint、vue-tsc及vite构建)
2026-10-09 12:46:15 +08:00
yml2213andCursor b4d6718c8e fix(chat): 分销付款改为进入账号群,不再另建订单群
主站、分站和分站之间都只用发布时的账号群,二维码仍跟这个群走。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-05 20:58:26 +08:00
yml2213andCursor f2060c19cf feat(listings): 订单和账号详情展示可租时长与每日消耗
租客在订单列表和详情标题能看到每个号的租期、消耗。账号详情把这两项拆成独立格子。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-05 16:32:08 +08:00
yml2213andCursor 1d21b3f548 feat(distribution): 分站发布群只使用自己的二维码池
主站单独维护分站码池,池空时不再借用主站或其他分站,并去掉已停用的固定二维码入口。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 18:35:34 +08:00
yml2213andCursor 281bb4be59 fix(realname): 业务 code 优先于 HTTP 状态码,并区分额度耗尽
实测服务商业务失败时 HTTP 状态码会跟着变(身份证号错误返回 400
且 result 为 null),按状态码判断会把第三方异常误判成入参错误。
改为以业务 code 为准,仅在拿不到 code 时退回状态码与网关错误头。

额度耗尽(x-ca-error-code=B403MQ)此前与限流同样提示「请求过于频繁,
请稍后再试」,但重试不会恢复,新增 ErrProviderQuotaExhausted 并提示
联系客服。网关错误原因只在响应头,一并带进错误信息便于排查。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 12:03:52 +08:00
yml2213andCursor 0b220829bb feat(realname): 实名核验切换到数脉二要素新接口
服务商旧接口 sinocheck2 已下线,改走 eid.shumaidata.com/eid/check:

- 身份证入参 id_number 改为 idcard
- 响应改为先判业务 code、再读 result.res 的两级结构,
  code/res 兼容字符串与数字两种返回形式
- 按服务商错误码表分流:400/20010/20310 归入参错误,
  404/604 归服务未配置,其余归服务不可用
- 驳回原因优先取服务商 description
- 新接口不返回流水号,provider_order_no 对该渠道留空
- 同步更新默认 URL 与 docs/实名认证.md

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 11:53:20 +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
yml2213andCursor e5cd7b5c34 feat(orders): 号主可从自己的列表隐藏已结束订单
只写入隐藏时间,订单和款项仍保留给租客与后台。详情按钮固定对齐,删除跟在后面。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-01 16:22:55 +08:00
yml2213 2a76d59a30 feat(distribution): 公告中心支持分站自定义
公告中心(前台公告列表/详情)此前完全没有站点概念,分站访客只能看到主站公告。
本次按「默认继承主站、站长可切仅本站」的口径支持分站自定义。

数据与口径:
- 新增 announcements.distribution_site_id(0=主站),前台按站点隔离
- 新增 distribution_sites.announcement_mode:inherit(默认,主站+本站)/ own_only(仅本站)

后端:
- 公告模块新增 ResolvePublicSiteScope:主站 [0]、inherit [0, siteID]、own_only [siteID],
  站点编码无效/已停用回落主站;列表与详情都按该范围过滤,详情不再允许跨站按 ID 读取
- 管理端公告列表支持按站点筛选(site_id:不传=全部,0=主站,>0=分站)并带出站点名
- 分销模块新增本站公告 CRUD(distribution/announcement.go):强制 distribution_site_id=本站,
  先过 ensureSiteAccess,跨站更新/删除/上下架一律 ErrAnnouncementNotFound
- UpdateSiteBranding 支持 announcement_mode 切换(非法值报错,读侧非法历史值回落 inherit)
- 新增权限 distribution:announcement_view|manage 并授予 super_admin/ops/finance,
  站长开通时继承 ops 角色即自动获得
- 路由:站长侧 /api/distribution/announcements*,平台侧 /api/admin/distribution/announcements*

前端:
- 分销后台新增「公告中心」页:来源开关(继承主站+本站 / 仅本站)、本站公告列表与
  新建/编辑/发布/下架/归档/恢复/删除,空态按来源模式给出引导
- 平台后台公告页新增「站点」列与筛选,新建公告可选择归属站点(主站或指定分站代发)
- 前台 PC/移动无需改动:请求已带 X-Distribution-Site-Code,后端按站点隔离,页面已有空态

测试:
- 公告模块:主站/继承/仅本站三种可见范围、跨站详情拦截、无效站点回落、管理端站点筛选
- 分销模块:本站公告 CRUD 与跨站防护、公告来源开关校验与非法值容错
2026-10-01 10:02:31 +08:00
yml2213 329d0f75bb feat(distribution): 分站前台按独立商城呈现并支持首页文案自定义
分站前台原本对顾客暴露分销身份,且登录等页面写死了主站品牌,
与「一手独立商城」的定位不符;同时首页文案全部硬编码,站长无法按自己口径调整。

去分销身份(顾客可见处):
- 头部品牌区、首页主视觉、移动端认证卡去掉「官方分销/官方分销认证/官方分销站」标识
- 会员徽标「分销专享」→「会员专享」,「所属商城」兜底「专属分销站/商城」→「官方商城」
- 订单页说明改为「当前为【X】商城,仅展示在本站产生的订单记录」,保留订单按站隔离的必要说明
- 无公告时的兜底跑马灯、轮播角标去掉分销措辞
- 清理随之失效的 pc-brand-badge / mobile-brand-badge 样式

品牌跟随站点配置(即可自定义):
- PC/移动登录页、移动注册页、加桌面引导页的品牌改为 站点名称 + Logo(无 Logo 取站名首字),
  不再写死主站「大锤商行」;主站行为不变(新增 store getter brandMark:分站取站名首字,主站仍为「锤」)

首页文案可配置:
- 新增迁移 000076 与 distribution_sites.storefront_text_json
  (tagline 头部副标题 / hero_badge 主视觉徽标 / hero_desc 主视觉描述 / card_sub 移动端卡片副标题)
- 分销后台「品牌装修 → 首页文案」可编辑,占位提示即默认值,留空或整段清空回落内置默认
- 贯通 UpdateSiteBranding → 公开站点信息接口(含 Redis 缓存失效)→ 前台 store 逐字段合并默认值
- 装修预览同步展示站长填写的副标题与徽标

测试:
- 后端补装修字段写入/公开接口透出/清空回落断言
- 前端新增 storefrontText 单测(默认合并、覆盖、空白与非法类型回落)
2026-10-01 09:24:56 +08:00
yml2213 766c923a6a fix(distribution): 修复分站搜不到已审核商品并实现审核通过自动铺货
问题:分站上架商品审核通过后主站能搜到、分站看不到,且没有自动同步。

根因:分站前台/搜索只认 distribution_site_accounts 中 display_status='enabled'
的货架行,而主站前台不按站点过滤。货架行此前只由「号主在该站上架」或站长手动
「一键同步主站商品」写入,审核通过不回写;同时一键同步的失效清理把「非
published+approved」的货架行一律置为 disabled,商品重新在售后也不会恢复。

- 新增 EnsureListingShelvedTx:商品变为 published+approved 时自动铺到所有
  display_account_enabled=true 的站点货架(缺行新增、系统下架恢复、人工下架不动),
  经 ListingShelfSyncer 接口注入,避免 listing 反向依赖 distribution
- 新增 distribution_site_accounts.display_disabled_by(operator/system/空)区分下架
  来源;人工上下架各入口写入来源标记
- 一键同步的失效清理收紧为只清理「货源记录已删除」的孤儿行,并支持恢复系统下架行,
  结果新增 reenabled_count
- 新增迁移 000074 回填存量缺失货架行,部署后无需逐站手动同步
- 修复 CreateSite 显式传 false/0 的配置(不允许自动展示、结算冷却 0 天)被 GORM
  default 标签忽略而静默回落默认值
- 前端:去掉会跨站串扰的 localStorage 站点码回退,站点探测完成后再挂载应用,
  避免分站发布因缺少站点码被记成主站商品;同步弹窗文案与统计项同步更新
- 补充分销货架自动铺货、清理口径、建站零值落库与审核铺货回归测试
2026-09-30 21:11:09 +08:00
yml2213andCursor 7833e90eee feat(distribution): 分站品牌装修可配置首页入口并上传图片
分站可单独配置回收、合作反馈和客服二维码,未配置时继承主站;Logo、图标和轮播支持直接上传。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-25 17:44:56 +08:00
yml2213andCursor 170e279e71 fix(distribution): 分站挂牌的号主收入记入对应分站钱包
结账和仲裁不再把分销站号主收入写入主站钱包,用户列表也只展示主站余额。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-25 17:25:33 +08:00
yml2213 1c3a75eef0 feat(distribution): 分销站点管理支持完整 CRUD、安全删除保护与管理员密码重置
- 后端支持分销站点编辑(域名唯一性校验、收号压价点位及税率更新)
- 后端支持分销站点安全删除校验(阻断存在业务订单、财务流水、结算批次或钱包余额的站点删除;对干净站点连带清理分成规则、展示账号绑定、支付通道配置及专有站长账号)
- 后端支持站长账号展示与超级管理员重置站长密码
- 主管理后台与分销后台前端全面支持筛选搜索、编辑模态窗、状态快捷切换、站长密码重置与安全删除确认
- 补充后端 CRUD、删除保护与密码重置覆盖率测试用例
2026-09-17 19:35:52 +08:00
yml2213andCursor ff8c35ebad feat(admin-order): 订单管理列表恢复号主实际收入列
在金额左侧展示已结账/已仲裁订单的到手金额;整页一条批量 SQL 取最新结账行,避免 N+1。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 18:13:36 +08:00
yml2213andCursor a36332de1d fix(listing): 主站加速出售买家价不再误锚到参考比例
分站解耦只应改分站收号侧;主站加速出售仍跟卖家比例联动买家价,并同步分销后台列表与发布页文案。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 16:09:41 +08:00
yml2213 22fcaa5945 feat(distribution): 分站收号压价解耦买家价(方案 B 新口径)
核心语义反转:receive_cost_delta 为压价点数,收号比例 = 主站参考比例 R + 点数,
点数越大号主收号价越低;买家售价锚定主站参考比例推导,不再随收号价联动。

- 迁移 000072:distribution_sites 新增 receive_cost_delta(旧 receive_ratio_delta 保留只读)
- receive_pricing:新增 Normalize/ApplySiteReceiveCostDelta;分站定价买家侧改用
  R 锚点(referenceSellerCoinBasePrice),快照写入 site_receive_cost_delta 与 pricing_model 标记
- site_receive:新增 resolveSiteReceiveCostDelta 读取链路,旧 ResolveReceiveRatioDelta 保留
- 分成不变:压价差经结算层 profit 自动进入 35/40/25 三方分成池;
  货架自主加价仍 100% 归分站,两条边界均以主站为锚
- 权限对齐旧字段:主站全局管理员与分站操作员均可设置
- 前端三端同步:主站 pricing.ts/usePricingCalculator 买卖解耦试算、
  主站后台弹窗改「收号压价」价格语义文案、分销后台 SiteSettings 同步
- 测试:单测锚定 R=43 时 cost_delta=3 → 收号 217.4 / 卖价 263.2 不变 / markup 池 30.6→54.9
2026-09-17 15:54:56 +08:00
yml2213 8dc21d2757 refactor(sitecode): 统一各模块分销站点编码解析为公共包
- 新增 internal/sitecode 包:FromRequest 头优先解析、FromQueryThenHeader
  探测接口专用、ExtractHost/IsLocalHost 提取 Host 域名
- 替换 auth/order/listing/chat/notification/withdrawal/wallet/distribution
  八模块 17 处各自内联的解析逻辑,统一优先级与 TrimSpace 行为
- 修复 notification 漏 TrimSpace、探测接口会话头压过显式 query、
  GetPublicSiteInfo 把 localhost Host 当站点域名查库等不一致
- 顺手清理 auth 中无引用的 extractHost 死代码
- gofmt 修复 withdrawal/presenter、chat/file/payment 测试四个历史遗留格式问题
2026-09-17 14:54:38 +08:00
yml2213 69774458b0 fix(file): 修复商品详情截图与提现打款凭证等私有图片 403 权限问题
- 放宽公开商品截图 key 提取规则,支持任意合规 object key 转换为免鉴权公开端点
- 补充后台截图上传 listing_screenshot 与 operating-expense 场景识别
- dependencies 授权器支持已审核上架商品截图兜底放行、提现人打款凭证鉴权及变体后缀匹配
- /api/files 路由组支持用户与管理员双重鉴权 (AuthUserOrAdmin)
- 前端收款账号凭证与提现详情凭证统一升级为 AuthImage 组件并支持大图预览
2026-09-16 20:33:09 +08:00
yml2213 6d31da1874 feat(admin-order): 订单列表展示完整用户手机号便于客服定位
- backend: AdminOrderListItemDTO 不再脱敏 owner_phone/renter_phone,移除 order 包内已无用的 maskPhone
- frontend: 同步 AdminOrderListItem 类型注释
- tests: 更新后台列表用例为断言完整手机号,并继续校验不泄露账号快照
2026-09-16 14:46:12 +08:00
yml2213 5f5a57b81f fix(withdrawal): 修复提现详情收款二维码使用公网URL导致鉴权失败加载错误
- backend: withdrawal presenter 增加 privateCertificateURLs 兼容转换历史公网 payment-cert 路径
- frontend: AuthImage 与 fetchFileBlobByURL 兼容私有凭证 key,后台上下文通过管理员私有对象接口安全加载
- frontend: 按对象接口路径与 key 前缀精确判定,避免外链带 ?key= 被误代理到后台私有对象接口
- tests: 补充 TestPrivateCertificateURLs 单元测试
2026-09-16 14:39:32 +08:00
yml2213 3465475756 feat(caddy): 支持分销站点独立域名 On-Demand TLS 自动签发 SSL 证书
- 后端新增 GET /api/distribution/check-domain 作为 Caddy on_demand_tls ask 白名单端点
- 补充 CheckDomain 相关场景自动化测试
- Caddyfile 启用 on_demand_tls 并配置动态分销前台入口
2026-09-16 14:20:44 +08:00
yml2213 dc13b5dc82 feat(distribution): 支持分站独立短信验证码通道
- 新增分销站点独立短信服务商配置(阿里云),登录验证码按 site_code/domain
  解析专属通道,未启用或解析失败时回退主站默认通道
- 密钥经 crypto.Encryptor 加密落库,模型字段 json 序列化隔离,DTO 仅回传掩码
- provider 白名单校验,mock 仅在非生产环境放行;启用时强制校验必填凭据
- 配置读写/测试接口限管理员权限,测试发送增加 60s 频控(Redis,缺省进程内)
- 解密失败记告警并优雅回退主站,避免把密文当明文密钥使用
- 两套前端新增短信配置入口、必填与手机号校验、发送冷却
- 新增迁移 000071 及加解密、白名单、频控、解析回退等单测
2026-09-16 14:06:01 +08:00
yml2213 d3d571357a refactor(order): 结账单状态常量化并锁定仲裁结单统计口径
仲裁结案会把结账单置为终态 settled,但该状态一直是裸字符串;同时 adminfinance 按日结算聚合只按
accepted 过滤,容易被误读成"仲裁单掉出统计"。本次只做卫生与口径固化,不改任何行为:
- order 新增 CheckoutStatus{Submitted,Countered,Accepted,Disputed,Settled},包内沿用非导出别名
- dispute 的仲裁结案与争议取消分支改用常量;distribution 不能反向依赖 order,本地声明同名常量
- adminfinance 聚合里的 oc.status = 'accepted' 改为常量绑定,并注释说明仲裁单不计入是有意口径
- 新增 distribution 结账单退款重算用例(该分支原先无覆盖):accepted/settled 按结账单实际租金,
  submitted 不被采用;dashboard 用例补一张 settled 结账单,钉住"不计入已结算订单数"
2026-09-16 12:49:21 +08:00
yml2213andCursor c9d9160ff4 feat(distribution): 分站可下调收号比例且不超过主站上限
让分销站能按自身能力下调收号比例扩大利润,同时把主站回收比例作为硬边界,避免分站把比例加得比主站更高。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 20:35:30 +08:00
yml2213andCursor 1c86bef765 feat(distribution): 支持分站发布群固定二维码
主站分销配置可为每个站点绑定可复用企微码,号主在该站上传账号后发到对应发布群,不再消耗主站码池。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 19:02:10 +08:00
yml2213andCursor 776c33f83c Merge branch 'main' into feature/distribution-system
同步结账损耗全额归号主与后台时间线 AuthImage 修复。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 18:36:16 +08:00
yml2213 dff0577385 feat(checkout): 修复后置损耗结算全额归号主、支持角色隔离实时试算与全流程UI重构
- fix(pricing): 后置消耗/损耗金额 100% 划归号主收益,超出预收部分平台不抽成,避免被平台费吸收
- feat(checkout): 前端新增结账实时试算预览组件 (CheckoutTrialPreview + useCheckoutSimulator),角色隔离展示(仅见自身收入/退款,屏蔽平台服务费)
- refactor(admin): 重构交易全流程时间线 (ProcessTimeline.vue),将平铺挤压指标重构成4大分类仪表盘微型卡片矩阵,升级可视化业务状态流转徽章与阶段色彩主题
- style(admin): 优化支付与交接流水元信息网格布局,防止超宽屏下长单行拉伸
2026-09-13 10:19:33 +08:00
yml2213 3508608a8f feat(distribution): 优化货架批量操作、结算大事务、大盘与前台多端解析缓存及货架分页 2026-09-11 12:59:33 +08:00
yml2213 9ae6d5eaea feat(distribution): 优化一键同步主站商品功能(并发防重、分批入库、失效商品联动下架与初始加价)
- 后端优化:
  - 引入 Redis + 内存 sync.Map 双重互斥锁,避免并发/连击导致唯一索引冲突 (ErrSyncInProgress)
  - 使用 CreateInBatches(500) 进行大数据量批量插入,杜绝超长 SQL 与锁表超时
  - 增加 CleanStaleListings 支持,自动排查并联动下架主站非在售的货架商品,清理历史幽灵数据
  - 增加 DefaultShelfRatioDelta 支持,新同步商品直接继承初始加价比例,免除二次手动改价
- 前端优化:
  - distribution-admin 货架管理新增一键同步配置弹窗(可勾选自动下架失效商品、配置初始加价)
  - 同步完成后展示结构化统计弹窗(新增、保持、联动下架、主站在售总量)
  - 前后端类型定义与 API 客户端对齐升级
- 测试覆盖:
  - 补充 TestSyncSiteAccountsOptimizations 单元测试与 handler 集成测试
  - 全工程测试与门禁 check.sh 100% 通过
2026-09-11 12:47:59 +08:00
yml2213 ef91b24bf2 test(distribution): 补齐分销全场景E2E与HTTP接口全链路集成测试
- 新增端到端测试场景:
  - 场景 1: 主站收号分站加价售卖与批次结算全链路
  - 场景 2: 分站收号主站售卖、独立鉴权、大盘统计与提现全流程
  - 场景 3: 三方模式跨站流转、专属支付通道自动路由与双站批次独立结算
  - 场景 4: 分站自收自售、3天冷却期自动释放及幂等防护
  - 场景 5: 结算后退款回冲金库钱包、掏空后透支扣减与仲裁风险隔离
  - 场景 6: 一键开站、成员JWT鉴权、品牌个性化、三模解析与货架同步加价
- 新增 distribution/handler_integration_test.go:覆盖 30+ 分销 HTTP 接口(前台公开端点、分站管理员登录/信息端点、站长运营端点及总台管理端点)
- 修复并对齐底层逻辑:
  - FindOrder & ListOrders:多参与方按 PartyID 准确隔离各站收益与提价统计
  - SnapshotPaidOrderTx:规范多方模式下 PartyTypeSite 的 SiteID/PartyID
  - 增加 ErrInsufficientBalance 哨兵错误并在 handler 映射为 400
2026-09-11 11:20:07 +08:00
yml2213 9ae763dee6 fix(distribution): 修复收号站订单详情权限、专属支付通道路由、大盘统计与仲裁积分隔离
- 修复 FindOrder 在收号站模式(two_party_distributor_receive / three_party)下的 403 权限判定,放行参与方站点成员并精准计算收益
- 串联 distribution_site_payment_channels 至 payment.Start 核心支付发起流程,分销订单优先使用绑定的专属商户通道
- 修复数据大盘 GetDashboardAnalytics 趋势中 ReceivedCount 恒为 0 的问题,并对齐今日订单与 GMV 统计
- 修复 dispute/arbitration.go 仲裁完成时向分销租客发放成长积分的泄漏风险
- 提现管理新增 distribution_site_name/distribution_site_code 字段并在后台列表与详情弹窗中区分展示分销站
- GetPublicSiteInfo 增加 X-Distribution-Site-Code 请求头兜底支持
2026-09-11 10:31:14 +08:00
yml2213 6acdead0f0 Merge branch 'main' into feature/distribution-system 2026-09-11 09:35:53 +08:00
yml2213 fa49505239 chore(migration): 顺延分销迁移序号至 000066-000068,为 main 分支 000065 让路 2026-09-11 09:35:51 +08:00
yml2213 7734f315ce feat(ocr): 支持 PP-OCRv6 异步识别模型并设为默认,解决排队与高延迟问题 2026-09-10 20:12:05 +08:00
yml2213 784ffb5f72 fix(observability): 治理SSE慢请求虚报、客户端取消日志污染、退款重试刷屏与会话计数慢查询 2026-09-10 20:02:54 +08:00
yml2213 403d20cabd refactor(migration): 整合分销迁移至终态定义并清理零散改表与测试种子数据 2026-09-10 19:45:00 +08:00
yml2213 140c538d4f fix(distribution): 人工批次窗口期防退款穿透与退款中途金额单调性加固 2026-09-10 19:39:27 +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