6dc6afece0
fix: 修复已删除店铺名称无法显示的问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m6s
店铺被软删除后,GORM 默认过滤 deleted_at IS NOT NULL 的记录,
导致查询店铺名称时找不到对应店铺,shop_name 字段被 omitempty 省略。
修复方案:在加载店铺名称的查询中添加 Unscoped(),包含已删除的店铺。
影响接口:
- GET /api/admin/devices(设备列表)
- GET /api/admin/iot-cards/standalone(独立卡列表)
- GET /api/admin/asset-allocation-records(分配记录列表)
- GET /api/admin/enterprises(企业列表)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 16:27:58 +08:00
037595c22e
feat: 单卡回收接口优化 & 店铺禁用登录拦截
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m0s
单卡回收优化:
- 移除 from_shop_id 参数,系统自动识别卡所属店铺
- 保持直属下级限制,混合来源分别处理
- 新增 GetDistributedStandaloneByICCIDRange/GetDistributedStandaloneByFilters 方法
店铺禁用拦截:
- 登录时检查关联店铺状态,禁用店铺无法登录
- 新增 CodeShopDisabled 错误码
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 15:54:53 +08:00
25e9749564
feat: 新增店铺时自动设置默认角色
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m1s
- CreateShopRequest 新增必填字段 default_role_id
- 创建店铺时验证默认角色(必须存在、是客户角色、已启用)
- 创建店铺后自动设置 ShopRole,初始账号立即拥有权限
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-25 14:33:13 +08:00
18daeae65a
feat: 钱包系统分离 - 代理钱包与卡钱包完全隔离
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m17s
## 变更概述
将统一钱包系统拆分为代理钱包和卡钱包两个独立系统,实现数据表和代码层面的完全隔离。
## 数据库变更
- 新增 6 张表:tb_agent_wallet、tb_agent_wallet_transaction、tb_agent_recharge_record、tb_card_wallet、tb_card_wallet_transaction、tb_card_recharge_record
- 删除 3 张旧表:tb_wallet、tb_wallet_transaction、tb_recharge_record
- 代理钱包:按 (shop_id, wallet_type) 唯一标识,支持主钱包和分佣钱包
- 卡钱包:按 (resource_type, resource_id) 唯一标识,支持物联网卡和设备
## 代码变更
- Model 层:新增 AgentWallet、AgentWalletTransaction、AgentRechargeRecord、CardWallet、CardWalletTransaction、CardRechargeRecord 模型
- Store 层:新增 6 个独立 Store,支持事务、乐观锁、Redis 缓存
- Service 层:重构 commission_calculation、commission_withdrawal、order、recharge 等 8 个服务
- Bootstrap 层:更新 Store 和 Service 依赖注入
- 常量层:按钱包类型重新组织常量和 Redis Key 生成函数
## 技术特性
- 乐观锁:使用 version 字段防止并发冲突
- 多租户:支持 shop_id_tag 和 enterprise_id_tag 过滤
- 事务管理:所有余额变动使用事务保证 ACID
- 缓存策略:Cache-Aside 模式,余额变动后删除缓存
## 业务影响
- 代理钱包和卡钱包业务完全隔离,互不影响
- 为独立监控、优化、扩展打下基础
- 提升代理钱包的稳定性和独立性
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-25 09:51:00 +08:00
f32d32cd36
perf: IoT 卡 30M 行分页查询优化(P95 17.9s → <500ms)
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m6s
- 新增 is_standalone 物化列 + 触发器自动维护(迁移 056)
- 并行查询拆分:多店铺 IN 查询拆为 per-shop goroutine 并行 Index Scan
- 两阶段延迟 Join:深度分页(page≥50)走覆盖索引 Index Only Scan 取 ID 再回表
- COUNT 缓存:per-shop 并行 COUNT + Redis 30 分钟 TTL
- 索引优化:删除有害全局索引、新增 partial composite indexes(迁移 057/058)
- ICCID 模糊搜索路径隔离:trigram GIN 索引走独立查询路径
- 慢查询阈值从 100ms 调整为 500ms
- 新增 30M 测试数据种子脚本和 benchmark 工具
2026-02-24 16:23:02 +08:00
c665f32976
feat: 套餐系统升级 - Worker 重构、流量重置、文档与规范更新
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m54s
- 重构 Worker 启动流程,引入 bootstrap 模块统一管理依赖注入
- 实现套餐流量重置服务(日/月/年周期重置)
- 新增套餐激活排队、加油包绑定、囤货待实名激活逻辑
- 新增订单创建幂等性防重(Redis 业务键 + 分布式锁)
- 更新 AGENTS.md/CLAUDE.md:新增注释规范、幂等性规范,移除测试要求
- 添加套餐系统升级完整文档(API文档、使用指南、功能总结、运维指南)
- 归档 OpenSpec package-system-upgrade 变更,同步 specs 到主目录
- 新增 queue types 抽象和 Redis 常量定义
2026-02-12 14:24:15 +08:00
655c9ce7a6
1
2026-02-11 17:29:06 +08:00
353621d923
移除所有测试代码和测试要求
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
**变更说明**:
- 删除所有 *_test.go 文件(单元测试、集成测试、验收测试、流程测试)
- 删除整个 tests/ 目录
- 更新 CLAUDE.md:用"测试禁令"章节替换所有测试要求
- 删除测试生成 Skill (openspec-generate-acceptance-tests)
- 删除测试生成命令 (opsx:gen-tests)
- 更新 tasks.md:删除所有测试相关任务
**新规范**:
- ❌ 禁止编写任何形式的自动化测试
- ❌ 禁止创建 *_test.go 文件
- ❌ 禁止在任务中包含测试相关工作
- ✅ 仅当用户明确要求时才编写测试
**原因**:
业务系统的正确性通过人工验证和生产环境监控保证,测试代码维护成本高于价值。
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-11 17:13:42 +08:00
804145332b
chore: 归档轮询系统实现变更 (polling-system-implementation)
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 44s
已完成千万级卡规模轮询系统的完整实现和集成测试验证,将变更归档到 openspec/changes/archive/2026-02-10-polling-system-implementation/
主要成果:
- 三大轮询任务:实名检查、卡流量检查、套餐流量检查
- 快速启动(<10秒)和渐进式初始化
- 完整运营工具:配置管理、并发控制、监控面板、告警系统、数据清理、手动触发
- 任务完成度:215/216(99.5%)
- 所有 24 个新增接口已生成 OpenAPI 文档
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-10 10:28:47 +08:00
931e140e8e
feat: 实现 IoT 卡轮询系统(支持千万级卡规模)
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m35s
实现功能:
- 实名状态检查轮询(可配置间隔)
- 卡流量检查轮询(支持跨月流量追踪)
- 套餐检查与超额自动停机
- 分布式并发控制(Redis 信号量)
- 手动触发轮询(单卡/批量/条件筛选)
- 数据清理配置与执行
- 告警规则与历史记录
- 实时监控统计(队列/性能/并发)
性能优化:
- Redis 缓存卡信息,减少 DB 查询
- Pipeline 批量写入 Redis
- 异步流量记录写入
- 渐进式初始化(10万卡/批)
压测工具(scripts/benchmark/):
- Mock Gateway 模拟上游服务
- 测试卡生成器
- 配置初始化脚本
- 实时监控脚本
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-05 17:32:44 +08:00
b11edde720
fix: 注册佣金计算任务 Handler 到队列处理器
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m19s
佣金计算任务 (commission:calculate) 的 Handler 已实现但未在队列处理器中注册,
导致支付成功后入队的佣金计算任务永远不会被消费执行。
变更内容:
- 在 pkg/queue/handler.go 中添加 registerCommissionCalculationHandler() 方法
- 创建所有需要的 Store 和 Service 依赖
- 在 RegisterHandlers() 中调用注册方法
修复后,订单支付成功将正确触发佣金计算和发放。
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-04 16:08:03 +08:00
8ab5ebc3af
feat: 在 IoT 卡和设备列表响应中添加套餐系列名称字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m2s
主要变更:
- 在 StandaloneIotCardResponse 和 DeviceResponse 中添加 series_name 字段
- 在 iot_card 和 device service 中添加 loadSeriesNames 方法批量加载系列名称
- 更新相关方法以支持 series_name 的填充
其他变更:
- 新增 OpenSpec 测试生成和共识锁定 skill
- 新增 MCP 配置文件
- 更新 CLAUDE.md 项目规范文档
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-02-04 15:28:41 +08:00
dc84cef2ce
fix(package-series): 将 enable_one_time_commission 字段提升到创建/更新请求顶层
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m5s
- DTO: CreatePackageSeriesRequest 和 UpdatePackageSeriesRequest 添加 EnableOneTimeCommission 字段
- Service: Create/Update 方法处理顶层字段并同步到 JSON config 的 Enable 字段
- 确保顶层字段与 JSON config 内的 enable 保持一致,避免业务逻辑判断出错
2026-02-04 14:38:10 +08:00
b18ecfeb55
refactor: 一次性佣金配置从套餐级别提升到系列级别
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m29s
主要变更:
- 新增 tb_shop_series_allocation 表,存储系列级别的一次性佣金配置
- ShopPackageAllocation 移除 one_time_commission_amount 字段
- PackageSeries 新增 enable_one_time_commission 字段控制是否启用一次性佣金
- 新增 /api/admin/shop-series-allocations CRUD 接口
- 佣金计算逻辑改为从 ShopSeriesAllocation 获取一次性佣金金额
- 删除废弃的 ShopSeriesOneTimeCommissionTier 模型
- OpenAPI Tag '系列分配' 和 '单套餐分配' 合并为 '套餐分配'
迁移脚本:
- 000042: 重构佣金套餐模型
- 000043: 简化佣金分配
- 000044: 一次性佣金分配重构
- 000045: PackageSeries 添加 enable_one_time_commission 字段
测试:
- 新增验收测试 (shop_series_allocation, commission_calculation)
- 新增流程测试 (one_time_commission_chain)
- 删除过时的单元测试(已被验收测试覆盖)
2026-02-04 14:28:44 +08:00
fba8e9e76b
refactor(account): 移除卡类型字段、优化账号列表查询和权限检查
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m18s
- 移除 IoT 卡和号卡的 card_type 字段(数据库迁移)
- 优化账号列表查询,支持按店铺和企业筛选
- 账号响应增加店铺名称和企业名称字段
- 实现批量加载店铺和企业名称,避免 N+1 查询
- 更新权限检查中间件,完善权限验证逻辑
- 更新相关测试用例,确保功能正确性
2026-02-03 10:59:44 +08:00
ad6d43e0cd
移除
2026-02-03 10:19:39 +08:00
5a90caa619
feat(shop-role): 实现店铺角色继承功能和权限检查优化
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m39s
- 新增店铺角色管理 API 和数据模型
- 实现角色继承和权限检查逻辑
- 添加流程测试框架和集成测试
- 更新权限服务和账号管理逻辑
- 添加数据库迁移脚本
- 归档 OpenSpec 变更文档
Ultraworked with Sisyphus
2026-02-03 10:06:13 +08:00
bc7e5d6f6d
修复go的验证库把int的0当作无值的情况
2026-02-03 09:57:53 +08:00
0b82f30f86
修复飘红问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 15h48m25s
2026-02-02 17:52:14 +08:00
301eb6158e
docs: 添加 add-gateway-admin-api 最终报告和完成文档
2026-02-02 17:51:38 +08:00
6c83087319
docs: 标记 add-gateway-admin-api 计划所有任务为完成
2026-02-02 17:49:40 +08:00
2ae585225b
test(integration): 添加 Gateway 接口集成测试
...
- 添加 6 个卡 Gateway 接口测试(查询状态、流量、实名、获取链接、停机、复机)
- 添加 7 个设备 Gateway 接口测试(查询信息、卡槽、限速、WiFi、切卡、重启、恢复出厂)
- 每个接口测试包含成功场景和权限校验场景
- 更新测试环境初始化,添加 Gateway 客户端 mock 支持
- 所有 13 个接口测试通过
2026-02-02 17:44:24 +08:00
543c454f16
feat(routes): 注册 7 个设备 Gateway 路由
2026-02-02 17:33:39 +08:00
246ea6e287
修改 Bootstrap 注入 Gateway Client 依赖到 IotCardHandler 和 DeviceHandler
2026-02-02 17:27:59 +08:00
80f560df33
refactor(account): 统一账号管理API、完善权限检查和操作审计
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m17s
- 合并 customer_account 和 shop_account 路由到统一的 account 接口
- 新增统一认证接口 (auth handler)
- 实现越权防护中间件和权限检查工具函数
- 新增操作审计日志模型和服务
- 更新数据库迁移 (版本 39: account_operation_log 表)
- 补充集成测试覆盖权限检查和审计日志场景
2026-02-02 17:23:20 +08:00
5851cc6403
feat(permission): 为权限树接口添加状态查询参数和返回值
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m22s
- 新增 PermissionTreeRequest DTO 支持 status 查询参数
- PermissionTreeNode 返回值新增 status 字段
- Store 层 GetAll 方法支持状态过滤
- Handler 层使用 QueryParser 解析请求参数
2026-02-02 17:12:14 +08:00
76b539e867
chore: 归档 OpenSpec 变更 refactor-series-binding-to-series-id
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m22s
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-02-02 12:21:00 +08:00
b47f7b4f46
修复: 更新集成测试以适配 series_id 字段重命名
...
- 将所有测试用例的 series_allocation_id 改为 series_id
- 更新测试逻辑,直接使用 series.ID 而非 allocation.ID
- 修复禁用系列测试,直接禁用 PackageSeries 而非 ShopSeriesAllocation
- 所有集成测试通过验证
2026-02-02 12:16:55 +08:00
37f43d2e2d
重构: 将卡/设备的套餐系列绑定从分配ID改为系列ID
...
- 数据库: 重命名 series_allocation_id → series_id
- Model: IotCard 和 Device 字段重命名
- DTO: 所有请求/响应字段统一为 series_id
- Store: 方法重命名,新增 GetByShopAndSeries 查询
- Service: 业务逻辑优化,系列验证和权限验证分离
- 测试: 更新所有测试用例,新增 shop_series_allocation_store_test.go
- 文档: 更新 API 文档说明参数变更
BREAKING CHANGE: API 参数从 series_allocation_id 改为 series_id
2026-02-02 12:09:53 +08:00
a30b3036bb
feat(iot-card-import): 为导入任务接口添加平台用户权限控制
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m10s
- 在 Import/List/GetByID 接口添加用户类型校验
- 仅超级管理员和平台用户可访问
- 同步更新 OpenAPI 路由描述
- 补充集成测试覆盖权限拒绝场景
2026-02-02 10:25:03 +08:00
d81bd242a4
fix(force-recharge): 补充强充配置缺失的接口和数据库字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m19s
- 订单管理:增加 payment_method 字段支持,合并代购订单逻辑
- 套餐系列分配:增加强充配置字段(enable_force_recharge、force_recharge_amount、force_recharge_trigger_type)
- 数据库迁移:添加 force_recharge_trigger_type 字段
- 测试:更新订单服务测试用例
- OpenSpec:归档 fix-force-recharge-missing-interfaces 变更
2026-01-31 15:34:32 +08:00
d309951493
feat(import): 用 Excel 格式替换 CSV 导入
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m33s
- 删除 CSV 解析代码,新增 Excel 解析器 (excelize)
- 更新 IoT 卡和设备导入任务处理器
- 更新 API 路由文档和前端接入指南
- 归档变更到 openspec/changes/archive/
- 同步 delta specs 到 main specs
2026-01-31 14:13:02 +08:00
62708892ec
文档
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m2s
2026-01-31 13:06:30 +08:00
b8dda7e62a
chore(bootstrap): 更新依赖注入和 API 文档
...
- Bootstrap 注册 RechargeHandler 和 RechargeService
- Bootstrap 注册 RechargeStore 数据访问层
- 更新 PaymentCallback 依赖注入(添加 RechargeService)
- 更新 OpenAPI 文档生成器注册充值接口
- 同步 admin-openapi.yaml 文档(新增充值和代购预检接口)
2026-01-31 12:15:12 +08:00
5891e9db8d
feat(routes): 注册充值和代购订单路由
...
- 新增 H5 充值路由(创建订单、预检、列表、详情)
- 新增 Admin 代购订单预检路由
- 更新 H5 路由组注册充值处理器
- 更新 Admin 路由组注册代购预检接口
2026-01-31 12:15:07 +08:00
902ddb3687
feat(handler): 支持代购订单预检和充值订单支付回调
...
- OrderHandler 新增 PurchaseCheck 接口用于代购订单预检
- PaymentCallback 支持充值订单支付回调处理
- 根据订单号前缀区分订单类型(代购订单 vs 充值订单)
- 充值订单回调自动更新订单状态和钱包余额
2026-01-31 12:15:03 +08:00
760b3db1df
feat(h5): 新增充值订单处理器和 DTO
...
- 实现 RechargeHandler 处理充值订单创建、预检、查询等接口
- 添加充值相关 DTO(CreateRechargeRequest、RechargeCheckRequest 等)
- 支持充值预检(强充检查、金额限制等)
- 支持充值订单列表和详情查询
2026-01-31 12:14:59 +08:00
001eb81e5e
chore(openspec): 清理已归档的 gateway-integration 变更
2026-01-31 12:01:47 +08:00
1ec7de4ec4
chore(bootstrap): 更新依赖注入和配置
...
- bootstrap/services.go
- OrderService 初始化新增依赖注入
- 添加 ShopSeriesAllocationStore、IotCardStore、DeviceStore
- docker-compose.prod.yml
- 对象存储 S3 端点改为 HTTPS(安全性提升)
- 同时更新 API 和 Worker 服务配置
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-01-31 12:01:37 +08:00
113b3edd69
feat(order): 支持代购订单和强充要求检查
...
- OrderService 新增代购订单支持
- 强充要求检查(首次购买最低充值)
- 代购订单支付限制(无需支付)
- 强充金额验证
- 新增 OrderDTO 请求/响应结构
- PurchaseCheckRequest/Response(购买预检)
- CreatePurchaseOnBehalfRequest(代购订单创建)
- Order 模型新增支付方式
- PaymentMethodOffline(线下支付,仅平台代购使用)
- OrderService 依赖注入扩展
- 新增 SeriesAllocationStore、IotCardStore、DeviceStore
- 支持强充要求检查逻辑
- 完整的集成测试覆盖(534 行)
- 代购订单创建、强充验证、支付限制等场景
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-01-31 12:01:33 +08:00
22f19377a5
feat(recharge): 新增充值服务和 DTO
...
- 实现 RechargeService 完整充值业务逻辑
- 创建充值订单、预检强充要求
- 支付回调处理、幂等性检查
- 累计充值更新、一次性佣金触发
- 新增 RechargeDTO 请求/响应结构
- CreateRechargeRequest、RechargeResponse
- RechargeListRequest/Response、RechargeCheckRequest/Response
- 完整的单元测试覆盖(1488 行)
- 强充要求检查、支付回调、佣金发放等场景
- 事务处理、幂等性验证
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-01-31 12:01:26 +08:00
c7bf43f306
fix(commission): 代购订单跳过一次性佣金和累计充值更新
2026-01-31 11:46:50 +08:00
1036b5979e
feat(store): 新增 RechargeStore 充值订单数据访问层
...
实现充值订单的完整 CRUD 操作:
- Create: 创建充值订单
- GetByRechargeNo: 根据订单号查询(不存在返回 nil)
- GetByID: 根据 ID 查询
- List: 支持分页和多条件筛选(用户、钱包、状态、时间范围)
- UpdateStatus: 更新状态(支持乐观锁检查)
- UpdatePaymentInfo: 更新支付信息
测试覆盖率: 94.7%(7个方法全部覆盖)
- 包含正常流程、边界条件、错误处理测试
- 使用 testutils.NewTestTransaction 和 GetTestRedis
- 所有测试通过
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-01-31 11:37:47 +08:00
cb0835cd94
feat(constants): 添加充值订单状态和配置常量
2026-01-31 11:32:07 +08:00
526d9c62b7
feat(errors): 添加充值和代购相关错误码
...
- 充值相关: CodeRechargeAmountInvalid (1120), CodeRechargeNotFound (1121), CodeRechargeAlreadyPaid (1122)
- 代购相关: CodePurchaseOnBehalfForbidden (1130), CodePurchaseOnBehalfInvalidTarget (1131)
- 强充验证: CodeForceRechargeRequired (1140), CodeForceRechargeAmountMismatch (1141)
2026-01-31 11:31:58 +08:00
116355835a
feat(model): 添加代购和强充配置字段
2026-01-31 11:31:57 +08:00
f6a0f0f39c
feat(migration): 添加代购和强充配置字段迁移
2026-01-31 11:31:42 +08:00
e461791a0e
解决冲突
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m7s
2026-01-30 18:09:31 +08:00
109ae688d2
解决冲突
2026-01-30 17:37:35 +08:00
65b4127b84
Merge branch 'emdash/wechat-official-account-payment-integration-30g'
...
# Conflicts:
# README.md
# cmd/api/main.go
# internal/bootstrap/dependencies.go
# pkg/config/config.go
# pkg/config/defaults/config.yaml
2026-01-30 17:32:33 +08:00