yml2213
|
bab522bcb3
|
feat(auth): 接入 DCAuth v2 登录并完善成员管理
- 登录链路改为用户名 + 密码 + 短信验证码 + DCAuth v2 设备签名
- 迁移 014:新增 login_sms_codes / user_devices / device_challenges 与 users.phone
- 新增 /api/dcauth/authorize 与 challenge 状态轮询;旧密码登录仅放行未绑定手机号的账号
- 成员管理支持手机号绑定、设备重置、账号改名、昵称与重置密码
- 移除最后一个商户关系时软删除账号,释放用户名、手机号并撤销设备绑定
|
2026-10-21 22:37:49 +08:00 |
|
yml2213
|
e293cebaf5
|
feat(rock): 发货记录表格新增时间与备注列并支持上报失效联动
- 做了什么:
1. 数据库新增 013_rock_tokens_remark.sql 迁移,rock_tokens 表补充 remark 字段并在 ListTokens 中支持备注模糊检索;
2. 后端扩展 UpdateTokenRemark、MarkTokenAbnormal 接口,同时优化 ResetMismatchToken 支持 mismatch 与 abnormal 状态的解冻重置;
3. 前端 RockTokenTable 新增「流转时间」列(入库/绑错/发货/绑定/提货)与「备注」列(TokenRemarkCell 浮窗快捷预设选择与自定义输入);
4. 快捷选择「已上报」或点击「上报失效」自动将链接标记为 abnormal 作废,从可用库存池中剔除,防止被新订单领走;
5. 优化操作列与顶部筛选栏:mismatch 增加「上报失效」与警示重置;abnormal 状态明确显示已失效并提供强制恢复;筛选栏新增「已上报失效」Tab。
- 为什么:
解决绑定错误上报 0868 上游后无法记录备注、且原「解冻重置」容易误将已作废卡密放回可用库存池导致后续订单报错的问题。
- 验证方式:
1. 后端单元测试 TestRockService_TokenRemarkAndAbnormal 与 TestRock 测试集通过;
2. make fmt、go vet 通过;
3. 前端 oxlint 检查通过 (0 errors, 0 warnings),npm run build 生产构建通过。
|
2026-10-08 20:13:25 +08:00 |
|
yml2213
|
8cc5d42d53
|
feat(admin): 平台商户成员管理改用抽屉,消除商户视角切换与全局状态污染
- 交互重构:在「平台商户」与「平台账号」点击成员管理时,不再跳转路由或改写 localStorage.merchant_id,改为滑出 MerchantMembersDrawer 抽屉
- 抽屉能力:支持查看指定商户成员列表、新增成员(新建账号或关联已有账号)、修改角色与启用状态、移除成员
- 顶栏清理:彻底移除顶栏右上角的「当前商户:xxx」标签与「退出商户视角」按钮,超管登录自动清理任何残留上下文
- 后端补齐:新增平台专属 /api/platform/merchants/:id/members 与 roles 接口,平台操作不再依赖 X-Merchant-ID
- 验证:tsc -b && vite build 成功;全量 go test ./... 包含路由与鉴权回归测试 100% 通过
|
2026-10-06 21:13:37 +08:00 |
|
yml2213
|
663d7e1e9f
|
fix(admin): 商户筛选下拉改用不分页的精简接口
自查新做的下游订单页时发现的问题:商户筛选下拉调用
/api/platform/merchants?size=200,而分页查询会把 >100 的 size 静默降级为 20
(service.normalizePage),因此商户超过 20 家时下拉里会少一批商户,界面不报任何错。
- 新增 service.ListMerchantOptions:不分页返回全部启用商户的精简信息
(id/code/name),独立于分页的 ListMerchants
- 新增 GET /api/platform/merchant-options
- 前端改用该接口;types 增加 MerchantOption,api 增加 merchantOptions()
测试:
- TestListMerchantOptionsReturnsAllActiveMerchants:造 25 家启用 + 1 家禁用,
断言返回数量与库中启用数一致、必须超过分页上限、且不含已禁用商户
- TestListMerchantsClampsOversizedPageSize:钉住「size=200 实际只返回 20 条,
而 total 反映真实总数」这一事实,即上面接口存在的理由
|
2026-10-06 20:44:48 +08:00 |
|
yml2213
|
e692790aa7
|
fix(admin): 平台路由不再依赖商户上下文,消除管理端被残留上下文锁死
问题:Tenant 中间件挂在整个已登录分组上,包括 /api/platform/*。管理员
localStorage 里一旦残留一个已禁用/已删除的商户 ID,ResolveMerchantForAdmin 就会对
所有请求返回 403——连"去把它改回来"的平台页面都打不开,整个管理端被锁死。
判断依据:逐条核对 35 条 /platform/* 路由与 13 个平台侧 handler,租户依赖为 0。
平台接口本身就是跨商户的,商户上下文对它们没有意义。
- router:平台分组从租户中间件里摘出,只挂 Auth + RequireRole(admin);
商户侧分组保持 Tenant 不变,单商户隔离语义一点没动
- 搬迁后逐条比对路由集合:平台 35 条、商户侧全部一致
- request.ts:对 /platform/* 以及管理员的 /dashboard 不再发送 X-Merchant-ID,
作为第二道防线(后者后端本就按角色忽略商户,带上只会引入 403 风险)
回归测试:新增 TestPlatformRoutesIgnoreStaleMerchantContext(无上下文 / 残留不存在的
商户两种情形都必须 200)与 TestMerchantRoutesStillRejectStaleContext(商户侧仍须 403)。
已实测这两个用例在未修复时会失败,报 403「当前账号无权访问该商户」/「商户不存在或已禁用」。
实测(无效商户上下文下):/api/platform/orders → 200 total=37;
/api/platform/merchants、rock/config、product-catalog → 200;/api/merchant/orders → 403。
|
2026-10-06 20:39:57 +08:00 |
|
yml2213
|
8c12d1d448
|
fix(admin): 超管看不到下游订单——新增平台侧跨商户订单视图
问题:管理员首页 Dashboard 显示平台总量(37 单,跨全部商户),点进「发货订单」
却只有 29 单,两个数字互相矛盾且界面上没有任何解释。
根因是「平台管理员」在两套接口里语义不同:
- /api/dashboard:isPlatformAdmin 只看 JWT 角色 → 平台视角,跨商户聚合
- /api/merchant/*:Tenant 中间件强制落到单个 merchant_id → 商户成员视角。
管理员唯一的成员关系是自营商户,于是被静默框定在商户 1
且 34 条 /platform/* 路由中没有任何订单入口,前端也没有商户切换器或上下文提示。
修复(不改动商户侧隔离语义):
- 新增 GET /api/platform/orders,support 按商户/状态/来源/关键字筛选,缺省为全部商户
- Service 抽出共用的 orderFilters 集中校验,ListOrders 与 ListPlatformOrders 并行;
ListOrders 仍强制单商户,避免新增平台路径时顺手放宽商户侧可见范围
- FulfillmentOrder 增加 Merchant 关联字段,仅平台侧 Preload,商户侧响应结构不变
- 前端新增「下游订单(全部商户)」页与菜单项,「发货订单」更名为「发货订单(当前商户)」
- README 补充两个订单入口的说明,避免后来者重踩
验证:单测覆盖跨商户可见性、按商户筛选、筛选校验、以及商户侧隔离不回归;
实测新接口返回 37 单(自营 29 + 测试商户 8)且带商户信息,商户侧仍为 29 单且无 merchant 字段。
|
2026-10-06 20:28:41 +08:00 |
|
yml2213
|
44ec142395
|
style: 清理 gofmt 偏差
纯对齐与行尾空行调整,无逻辑变更。gofmt -l 现输出为空,
配合 make fmt 可将格式检查直接纳入 CI。
|
2026-10-06 19:43:43 +08:00 |
|
 yml2213andCursor
|
4b8fc76f36
|
feat(rock): 绑定错误可直接改买家 UID,提货号继续留在原订单
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-10-06 17:47:02 +08:00 |
|
 yml2213andCursor
|
717392b195
|
feat(rock): 未扫码绑定的使用中链接可释放回库存
历史残留绑定不再占住提货链接,退款后可以把还没扫上的库存分给下一单。
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-10-05 22:13:17 +08:00 |
|
yml2213
|
0dff9d892e
|
feat(merchant-products): 开放商品编辑功能,支持超级管理员与商户修改售价积分、成本价与库存模式
1. 后端 Handler 新增 UpdateProduct 方法,并在 /api/merchant/products/:id 注册 PATCH 路由,支持修改商品显示名称、对外售价积分、成本价与库存;
2. 前端商户中心 merchantApi 扩充 updateProduct 接口对接;
3. 商品列表(ProductsTab)操作列新增【编辑】按钮与模态框,提供商品名称、对外售价(积分)、成本价(积分)、无限库存/指定限量模式及上架状态编辑功能;
4. 修复超级管理员在自营或商户商品列表中无法自由调价与调整库存的交互缺失问题。
|
2026-10-05 15:10:21 +08:00 |
|
yml2213
|
ef7f67dd0c
|
feat(fulfillment): 接入Rock发货平台(0666.pro)代理履约、通用库存池与UID强一致风控
1. 数据库新增 012_rock_fulfillment 迁移,创建 rock_configs 配置表与 rock_tokens 通用库存表,补齐黑色ROCK长袖T恤与蓝色运动服上衣商品目录;
2. 封装 RockClient 与 RockService,实现 0666.pro 平台 Bearer Token 极简连通校验、批量采购50个入库、水位监控巡检与自动补货;
3. 新增 RockProvider 实现标准履约路由,引入 Anti-Ghost 旧绑定基线比对与 UID 强一致门禁,扫错号硬阻断并记录为 mismatch 状态;
4. 针对黑色ROCK与蓝色运动服实现动态发货(绑定后发货前动态选择 skin),并提取腾讯官方发货流水号 fulfillId 对账;
5. 新增全局自动发货总开关(Kill Switch),支持一键软熔断降级转人工接单处理;
6. 前端新增 PlatformRock 管理大屏,提供总开关切换、Token配置与连通测试、库存监控、一键补货及错单解冻重置。
|
2026-10-05 14:56:11 +08:00 |
|
yml2213
|
ec76844da8
|
feat(log): 全面重构日志系统,支持日志级别、去除ANSI乱码并抑制高频轮询
|
2026-09-18 15:04:38 +08:00 |
|
yml2213
|
20bde97d7a
|
fix(delivery): add transient retry, fix queue deadlock, and gate delivery submit by scan auth
|
2026-09-18 14:49:54 +08:00 |
|
 yml2213andCursor
|
df1a170d44
|
refactor(catalog): 废弃 LEWAN_ 镜像,统一英文 SKU 与积分价,商品图按 SKU 缓存
对外目录只保留英文主 sku;迁移硬删镜像并校准 1元=100积分;发货页/凭证优先使用 local {sku}.webp。
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-09-14 20:00:26 +08:00 |
|
yml2213
|
bf9614569e
|
feat: 优化发货凭证与字段兼容,隐藏内部积分展示并增强DLC角色解析
|
2026-09-14 17:37:53 +08:00 |
|
yml2213
|
5f642eb7a6
|
feat: 优化发货交付页面与凭据生成,支持一键复制结果图片及官方商品图片本地缓存
- 交付界面重构:隐藏内部订单号、流水号与发货渠道,展示聚焦于买家游戏UID、角色名与交付时间
- 发货结果凭据生成:采用 Canvas 生成高清发货存证图,优化存证说明文案与自适应排版
- 一键复制图片:支持直接将结果凭证图片写入系统剪贴板,方便客服在聊天窗口快捷粘贴
- 官方图片本地化缓存:全量下载乐玩商品官方主图并建立本地持久化路由,规避外部源站跨域及破损问题
- 修复乐玩渠道角色UID提取与履约状态幂等回填逻辑
|
2026-09-14 17:19:12 +08:00 |
|
 yml2213andCursor
|
f7f48d0feb
|
功能:接入乐玩开放平台双渠道路由,并修复渠道锁定与 Webhook 可靠性
在保持 DLC 默认零破坏的前提下,支持 priority/仅乐玩/仅 DLC 履约策略与后台 GUI 配置;同步补齐 Prepare 渠道落库、乐玩订单取消、Webhook 验签与失败重试。
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-09-11 15:48:03 +08:00 |
|
yml2213
|
99a33675b0
|
优化商户管理, 增加商户名重置密码等等
|
2026-08-14 13:09:56 +08:00 |
|
yml2213
|
ee3e427ab7
|
作废链接和取消订单
|
2026-08-14 12:58:20 +08:00 |
|
yml2213
|
91c055c130
|
功能:平台管理员删除商户账号
|
2026-08-13 14:35:30 +08:00 |
|
yml2213
|
538be52636
|
修复:管理员默认商户与账户设置
|
2026-08-13 14:12:25 +08:00 |
|
yml2213
|
6dae7fafa8
|
功能:恢复商户账号分组查看
|
2026-08-13 13:39:37 +08:00 |
|
yml2213
|
cfdc12cf94
|
优化:平台管理员账号独立管理
|
2026-08-13 13:31:06 +08:00 |
|
yml2213
|
1f85add5e0
|
功能:优化账号分层与管理员初始化
|
2026-08-13 13:18:41 +08:00 |
|
yml2213
|
2b3a1b111b
|
功能:增加平台账号管理与管理员保护
|
2026-08-13 12:52:50 +08:00 |
|
yml2213
|
8c47b961e1
|
功能:完善登录安全与客服手动下单
|
2026-08-13 12:40:04 +08:00 |
|
yml2213
|
aea65a2fd3
|
feat: manage merchant members
|
2026-08-13 11:45:55 +08:00 |
|
yml2213
|
a4791decb0
|
feat: support merchant team roles and permissions
|
2026-08-13 11:41:34 +08:00 |
|
yml2213
|
b686a82e60
|
feat: add manual fulfillment order creation
|
2026-08-11 11:49:58 +08:00 |
|
yml2213
|
2264851d5d
|
拆分 service 与前端大文件,修复 CORS 配置与格式问题
- 后端 internal/service 按职责拆分:
fulfillment.go(1397→527)拆出 wallet/timeout/data/order/query/dashboard/shipnotify
delivery.go(1124→801)拆出 upstream/link/state/helpers
merchant.go(855→251)拆出 member/product/api_client/catalog/helpers
- 前端 MerchantCenter.tsx(1327→606)拆出 merchantCenterTabs/merchantCenterUtils
- docker-compose backend 透传 CORS_ALLOWED_ORIGINS
- CORS 白名单实现(config/router/README/.env.example 配套)
- 修复 gofmt 与文件尾部多余空行
|
2026-08-05 13:32:11 +08:00 |
|
yml2213
|
16b508eb9b
|
商户管理优化, 商户只能上架下架, 管理员可以编辑
|
2026-08-04 14:35:53 +08:00 |
|
yml2213
|
ca58c2bcaa
|
余额告警独立页面与多渠道通知:钉钉/飞书/企业微信/Bark,支持通知频率策略
- 告警设置拆分为独立页面,支持钉钉/飞书/企业微信/Bark/通用Webhook 多渠道
- 通知策略:低于阈值后按间隔重复提醒,达到最大次数停止,余额恢复自动重置
- 旧 webhook 配置自动迁移为通用渠道,渠道支持测试发送
- 优化告警话术:去商户ID展示、数字千分位格式化
|
2026-08-04 13:56:26 +08:00 |
|
yml2213
|
941e7ad79a
|
积分充值全流程落地:申请审核入账、凭证上传压缩转webp、管理员调账收权
- 新增积分充值申请与审核:商户提交充值申请(凭证图片必填,1元=100积分),
管理员审核通过后事务内自动入账,幂等键防重复
- 新增通用图片上传组件 ImageUploader:canvas 压缩转 webp、预览、删除,
后端按魔数校验图片格式并持久化到 data/uploads
- 管理员钱包调整改为按商户维度:移除商户侧调账接口,新增管理员
平台商户积分调整与钱包流水查看
- 低余额 Webhook 告警配置持久化,充值入账/调账后自动检查推送
- 平台商户操作列移除进入/成员,积分充值页接入真实接口并修复金额单位换算
|
2026-08-04 13:03:29 +08:00 |
|
yml2213
|
e6f09eaf14
|
优化商品列表表格列宽与上架配置面板
|
2026-08-04 11:16:54 +08:00 |
|
yml2213
|
ae9804e158
|
访问日志跳过 /health 健康检查,避免每 30 秒刷屏
|
2026-08-04 09:43:39 +08:00 |
|
yml2213
|
19ada1282e
|
新增查询绑定结果接口(自建发货页轮询角色信息)
- GET /api/client/v1/orders/{order_no}/delivery/bind-result?bind_uuid=xxx
- 返回 bound/game_account/role_name/game_channel;未绑定返回 bound=false(不报错,供轮询)
- 对接文档自建发货页模式新增该接口,注明轮询建议间隔
|
2026-08-03 17:10:50 +08:00 |
|
yml2213
|
27a86f5311
|
回调优化为单地址 upsert 配置并支持重置密钥
- 回调订阅改为单记录 upsert:保存即覆盖(URL/事件/状态),自动停用其他订阅,无新增/删除
- 新增重置密钥:保存时传 rotate_secret=true 重新生成密钥并返回一次,解决密钥丢失无法找回
- 删除不再使用的 PATCH /callbacks/:id/status 路由及对应 handler/service 死代码
- 前端回调页改为内联表单(URL/事件/状态),新增重置密钥按钮(确认后展示新密钥一次)
- 补充单地址复用、disabled 不投递、密钥轮换测试
|
2026-08-03 11:23:46 +08:00 |
|
yml2213
|
7fe4a05ed7
|
优化api密钥
|
2026-08-03 10:38:06 +08:00 |
|
yml2213
|
eac025c92f
|
加强发货提交可靠性并统一契约口径
- 发货提交记录阶段推进与失败分类,失败不再清空 result_data
- 超时巡检区分已提交上游与提交中断两类卡单,避免误判
- 已提交上游的失败订单禁止自动重发,防止重复发货
- ship_attempts 仅在 claim 时计数,失败阶段只记录分类信息
- CanFulfill 对已提交上游的失败单返回不可发货
- 删除预留的 pending 订单状态,统一订单状态模型
- 契约改名:order.fulfillment.updated -> order.shipping.updated,fulfillment:read -> shipping:read
- 文档修正 scope 为或关系
|
2026-07-31 18:42:52 +08:00 |
|
yml2213
|
30362f14bd
|
简化开放下单幂等参数
|
2026-07-31 15:25:26 +08:00 |
|
yml2213
|
761522e808
|
补商户发货API
|
2026-07-31 12:24:54 +08:00 |
|
yml2213
|
e4c1306216
|
完善发货链接签名和作废恢复
|
2026-07-31 11:43:13 +08:00 |
|
yml2213
|
6ca226ce4b
|
接入无感发货流程
|
2026-07-31 10:45:13 +08:00 |
|
yml2213
|
f29f3eb841
|
关闭公开注册并优化仪表盘
|
2026-07-31 09:39:18 +08:00 |
|
yml2213
|
ee956e2e01
|
优化发货接口对接流程
|
2026-07-30 23:44:50 +08:00 |
|
yml2213
|
5858ff59ae
|
修正发货回调流程
|
2026-07-30 19:35:34 +08:00 |
|
yml2213
|
254ba9b721
|
恢复测试订单创建
|
2026-07-30 19:04:38 +08:00 |
|
yml2213
|
502b719f48
|
feat: 平台管理员可在前端分配商品给商户
后端:
- service: 新增 ListProductCatalog(自营商户商品目录)、ListMerchantProductsByAdmin、AssignProducts(按目录ID批量同步商户商品,未勾选的已有商品会被移除)
- handler + router: 新增 GET /platform/product-catalog、GET /platform/merchants/:id/products、POST /platform/merchants/:id/products/assign 三个管理员路由
前端:
- types: 新增 ProductCatalogItem 类型
- api: platformApi 新增 productCatalog / merchantProducts / assignProducts
- PlatformMerchants: 商户列表操作列新增「分配商品」按钮,弹窗内以表格+复选框展示平台商品目录,支持全选/清空/重置,打开时按已有商品预选,保存后同步分配结果
实测:创建商户自动获得27个默认商品,管理员可随时增减调整
|
2026-07-30 15:20:02 +08:00 |
|
yml2213
|
bafe41a3ea
|
重构: 手续费改为百分比/固定二选一,清理旧 Skin/Order/ShipLog 演示链路
手续费:
- 新增 fee_type 字段(rate/fixed),百分比与固定金额二选一,不再叠加
- calculateServiceFee 按 fee_type 分支计算
- 商户创建/更新校验 fee_type,订单落库快照 fee_type
- 前端表单改为下拉选择手续费类型,动态显示对应输入框
- 测试拆为 TestFeeRate + TestFeeFixed
清理旧链路:
- 删除旧 Skin/Order/ShipLog 模型及 OrderService/SkinService
- Dashboard 迁移到 FulfillmentService
- 上游 /api/open/v1 改为基于 FulfillmentOrder 实现,接口契约不变
- 推送留痕改用 AuditLog,不再建 ShipLog 表
- 删除前端 Skins/Orders/ShipLogs/Distributors 页面及路由、菜单、API、类型
- 新增迁移 003: 添加 fee_type 列并 DROP 旧表
|
2026-07-30 14:12:27 +08:00 |
|
yml2213
|
83429456a6
|
实现多商户履约平台基础
|
2026-07-30 12:02:32 +08:00 |
|