|
|
7f42d198eb
|
fix: 新增 StopReasonProtectPeriod 常量和 RedisCardResumeLockKey 函数
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
|
2026-03-31 18:11:01 +08:00 |
|
|
|
ebc3e78ba9
|
修复gateway权限问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m48s
|
2026-03-31 15:59:54 +08:00 |
|
|
|
00cae60fe1
|
chore: 删除卡价格验证 hurl 测试文件
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m14s
|
2026-03-31 15:26:09 +08:00 |
|
|
|
67e0840695
|
fix: 修复钱包充值不支持 wechat_v2 支付渠道导致 1046 报错
当前激活的微信支付配置 provider_type = wechat_v2,但 CreateRecharge
硬编码使用 V3(PowerWeChat)路径,导致初始化失败。
新增 createJSAPIPayOrder 方法,根据 provider_type 路由到对应通道:
- wechat_v2 → NewPaymentV2ServiceFromConfig
- wechat(默认)→ NewPaymentAppFromConfig(V3)
与 client_order.Service.newPaymentProvider 保持相同的路由逻辑。
|
2026-03-31 15:26:03 +08:00 |
|
|
|
bc2dbcb416
|
fix: 修复 V2 微信支付参数全为空字符串的问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m17s
extractPaymentResult 只处理 map[string]any,而 V2 自建实现返回
map[string]string,类型断言静默失败导致所有字段为空字符串。
增加对 map[string]string 的处理分支,兼容 V1 和 V2 两种支付渠道。
|
2026-03-31 14:59:43 +08:00 |
|
|
|
dc4f3cb7ba
|
feat: C端订单支付拆分 — 创建订单与发起支付分离
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m10s
- CreateOrder 改造:普通下单只建单(无支付参数),强充场景保持原有微信支付一步完成
- 新增 POST /orders/:id/pay 统一支付入口,支持 wallet(钱包)和 wechat(微信 JSAPI)
- 移除 POST /orders/:id/wallet-pay,合并至统一支付接口
- app_type 改为可选字段(强充场景必传,普通下单无需传)
- CreateOrderResponse.pay_config 改为 omitempty(普通下单不返回支付参数)
|
2026-03-31 12:43:34 +08:00 |
|
|
|
121462c00f
|
feat: 给 PackageUsage 添加 package_name 快照字段,修复企业卡列表 carrier_name/package_name 为空问题
- 迁移 000099:tb_package_usage 新增 package_name 列,回填历史数据
- PackageUsage model 添加 PackageName 字段(与 DataResetCycle 保持一致的快照设计)
- 4 处 PackageUsage 创建点补充 PackageName 快照(order/service.go + auto_purchase.go)
- EnterpriseCard ListCards:carrier_name 直接取 card.CarrierName,package_name 通过
DISTINCT ON 批量查当前生效主套餐,单次查询覆盖整页,无 N+1
|
2026-03-31 12:43:07 +08:00 |
|
|
|
5b283285a2
|
fix: 修复微信支付容器内 mkdir 权限错误,新增 wechat_v2 支付渠道
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m11s
- NewPaymentAppFromConfig 加 Log.Stdout=true,禁止 PowerWeChat SDK 在容器
工作目录创建 wechat/ 日志文件夹(Permission denied 根因)
- 新增 ProviderTypeWechatV2 = wechat_v2 常量,与 wechat(v3) 独立区分
- 新增 PaymentV2Service:直连统一下单 v2 接口,XML + MD5 签名
- newPaymentProvider 按 ProviderType 分支路由到对应版本
|
2026-03-31 12:12:13 +08:00 |
|
|
|
4e65cf95d1
|
fix: 修复企业端用户所有接口返回403的问题 — AdminAuth中间件白名单遗漏Enterprise类型
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m15s
|
2026-03-31 10:41:31 +08:00 |
|
|
|
2b408230a6
|
skill
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m0s
|
2026-03-31 10:00:01 +08:00 |
|
|
|
48ad0844ae
|
fix: gendocs panic — config.Get() nil 守卫防止未初始化时访问 Logging.Development
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
|
2026-03-31 09:56:25 +08:00 |
|
|
|
2ef8b8a705
|
fix: 修复分页字段/角色DTO/套餐详情/批量分配Bug,新增C端测试登录接口和Hurl价格验证测试
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 修复B-2:27个分页DTO字段名统一(list→items, page_size→size,删除total_pages)
- 修复B-1:角色接口统一返回DTO(id小写,消除GORM大写字段名)
- 修复C-1:套餐详情接口(GET /packages/:id)补充代理佣金字段
- 修复C-2:批量分配已存在记录由500改为静默跳过
- 修复C-3:创建系列授权响应在事务提交后构建,packages数组不再为空
- 新增C端开发测试登录接口(POST /api/c/v1/auth/dev-login,仅logging.development=true时生效)
- 新增Hurl测试:card-price-verification-flow.hurl(导入卡→分配→C端价格验证)
- 新增测试Excel数据文件和dev.env测试变量
|
2026-03-31 09:54:08 +08:00 |
|
|
|
33e7f99fdc
|
fix: 修复数据清理预览接口 panic 及路由文档路径翻倍问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m12s
1. CountOldRecords 改用 GORM .Scan() 替代 .Row().Scan(),避免查询不存在的表时 nil pointer panic
2. polling_cleanup 路由注册的 basePath 参数去掉多余拼接,修复生成的 OpenAPI 文档路径翻倍
|
2026-03-30 15:09:14 +08:00 |
|
|
|
06ee422e34
|
fix: 富友验签失败 — 补全3.3接口所有非reserved字段(空值字段也必须参与签名)
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m7s
|
2026-03-30 13:48:45 +08:00 |
|
|
|
30d6743310
|
fix: 富友验签错误 — 签名原文必须包含空值字段(与富友文档签名实例一致)
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m9s
|
2026-03-30 13:21:04 +08:00 |
|
|
|
a97462dd69
|
fix: 支付失败时幂等标记未清理导致用户无法重试 — *created=true移到支付成功后
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m9s
|
2026-03-30 13:06:45 +08:00 |
|
|
|
d56b841443
|
fix: 富友回调应答XMLName缺失 + term_ip自动探测服务器IP替代硬编码
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m8s
|
2026-03-30 12:46:50 +08:00 |
|
|
|
8296742cce
|
fix: 富友预下单补充必填字段 txn_begin_ts(交易起始时间)
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m6s
|
2026-03-30 12:23:50 +08:00 |
|
|
|
0c82ae2b73
|
fix: 修复富友预下单报文格式错(1014) — XML根元素、小程序tradeType、termIP三处问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m27s
|
2026-03-30 11:57:46 +08:00 |
|
|
|
f339fb1987
|
fix: 资产钱包自动创建机制 — 修复C端购买时钱包不存在报错
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m8s
- client_order: 新增 getOrCreateWallet 兜底,钱包不存在时自动创建
- device_import: 设备导入事务内同步创建设备钱包
- iot_card_import: IoT卡批量导入后批量创建卡钱包
- queue/handler: 传递 AssetWalletStore 给两个导入 handler
- migration 000098: 为存量IoT卡和设备补建资产钱包
|
2026-03-30 11:37:41 +08:00 |
|
|
|
40809d11c5
|
修复
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m54s
|
2026-03-30 10:20:16 +08:00 |
|
|
|
50dbc52432
|
fix: C端资产详情设备补充已连接数(client_number)字段
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Gateway sync-info 返回的 client_number 字段未在整条数据链路中传递,
导致 C 端资产详情的设备实时状态缺少已连接客户端数。
修改范围:
- Gateway 模型 SyncDeviceInfoResp 新增 ClientNumber
- B 端 DTO DeviceGatewayInfo 新增 ClientNumber
- C 端 DTO DeviceRealtimeInfo 新增 ClientNumber
- 两层映射函数同步补充字段传递
|
2026-03-30 10:18:30 +08:00 |
|
|
|
cebcada950
|
refactor: 流量系统重构 — 增量累加算法 + 日粒度缓冲 + 旧详单清理
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m16s
核心改造:
- 增量算法:流量计算从覆盖式改为增量累加(gateway - lastReading),支持上游运营商重置检测
- 日流量缓冲:insertDataUsageRecord 改为 Redis INCRBYFLOAT,每日凌晨落盘到 tb_card_daily_usage
- 运营商:新增 data_reset_day 字段(联通=27,其余=1)
- IoT卡:新增 last_gateway_reading_mb 字段存储上次网关读数
- 查询层:新建 TrafficQueryService 合并 Redis(今日)+ DB(历史)数据源
- 清理:删除 DataUsageRecord model/store,移除 polling_handler 旧引用
迁移:000094-000097(carrier字段、iot_card字段、数据初始化、日流量表)
|
2026-03-30 09:59:30 +08:00 |
|
|
|
f5dd2ce4ab
|
fix: Gateway 响应类型兼容 — 新增 FlexBool/FlexInt 处理设备返回的字符串类型字段
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m4s
部分设备厂商(如华为)的 Gateway 响应中 bool/int 字段返回为字符串(wifi_enabled: "1"、battery_level: "30"),
导致 sonic 严格类型检查反序列化失败,整个设备实时数据丢失。
- 新增 FlexBool 类型:兼容 true/false、"1"/"0"、"true"/"false"
- 新增 FlexInt 类型:兼容 30、"30"、null
- SyncDeviceInfoResp 所有 bool/int 字段改用 Flex 类型
- 更新 B 端和 C 端 DTO 映射函数的类型转换
|
2026-03-28 18:24:17 +08:00 |
|
|
|
02b10f87cf
|
feat: 新增退款管理模块 — 完整的退款审批流程、佣金回扣和资产重置
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m8s
新增退款申请全生命周期管理:创建/列表/详情/审批通过/拒绝/退回/重新提交
审批通过后异步执行佣金全额回扣(扣减各代理佣金钱包)和资产重置(套餐失效+停机+世代重置)
新增 tb_refund_request 表(迁移 000093)、RefundRequest Model、8 个 DTO
新增 Store/Service/Handler/路由注册,仅平台用户可访问
|
2026-03-28 17:57:52 +08:00 |
|
|
|
5e64c64ce3
|
修复
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m5s
|
2026-03-28 17:12:29 +08:00 |
|
|
|
a2fd1dfd62
|
fix: 佣金修正接口 DTO 补充 path 参数声明,修复 OpenAPI 生成 panic
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m59s
|
2026-03-28 17:01:06 +08:00 |
|
|
|
623a622298
|
feat: 业务逻辑补全 — 佣金待审记录、C端订单重构、支付抽象、富友支付、卡设备状态联动
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
F-1: 佣金链断裂时创建 status=99 零额待审记录,新增修正接口 POST /commission-records/:id/resolve
F-4: C端订单查询从 Handler 迁移至 Service 层,移除 SkipPermissionCtx
J-1: 富友支付 JSAPI/MiniApp 预下单实现,回调补全签名验证
J-2: 平台钱包代购支持(buyerType 为空时使用资产所属代理钱包)
J-3: 套餐激活后自动更新卡/设备 status=3,最后套餐过期后更新 status=4
支付抽象: 引入 PaymentProvider 接口 + 微信/富友适配器,CreateOrder 支持多支付渠道
修复: 设备/IoT卡响应 DTO 移除 omitempty,空值字段返回 null 而非省略
|
2026-03-28 16:57:39 +08:00 |
|
|
|
65e461eff7
|
fix: 代码质量清理 — 统一C端支付枚举、修复静默错误、注入Worker回调、移除废弃同步代码
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m6s
- C端订单支付状态直接使用管理端统一枚举(1/2/3/4),移除冗余映射函数
- 资产查询绑定卡/套餐查询失败时记录Warn日志而非静默忽略
- Worker bootstrap注入停复机回调(流量耗尽停机、套餐激活复机)
- 删除废弃的SIM状态同步服务和任务处理器
- 新增开发环境数据清理脚本(full/soft/table三种模式)
|
2026-03-28 15:27:59 +08:00 |
|
|
|
e81d3a58ad
|
docs(04): capture phase context
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m6s
|
2026-03-28 14:24:25 +08:00 |
|
|
|
da8aedc96b
|
docs(phase-03.1): evolve PROJECT.md after phase completion
|
2026-03-28 13:42:29 +08:00 |
|
|
|
9995dcd0a3
|
docs(phase-03.1): complete phase execution
|
2026-03-28 13:41:26 +08:00 |
|
|
|
f0f21e52f1
|
docs: 重新生成 OpenAPI 文档,补全 Phase 03.1 新增字段
|
2026-03-28 13:32:48 +08:00 |
|
|
|
a8becf55ff
|
chore: 更新 STATE.md 记录 Phase 03.1 完成
|
2026-03-28 13:24:39 +08:00 |
|
|
|
f9da1a937f
|
docs(03.1-01): 完成 Phase 03.1 Plan 01 执行总结
- 创建 03.1-01-SUMMARY.md:记录 3 个任务完成情况、6 个文件修改、SwitchMode 类型偏差修复
- 更新 STATE.md:追加执行日志、补充 B/C 端独立 DTO 结构决策
|
2026-03-28 13:23:43 +08:00 |
|
|
|
a202b2da8a
|
feat(03.1-01): 建立设备实时 Gateway 调用链路,替换 mock 数据
- GetRealtimeStatus() device case 新增 Gateway sync-info 实时调用(IMEI/SN 优先,gatewayClient nil 安全)
- 新增 mapSyncRespToDeviceGatewayInfo() 将 SyncDeviceInfoResp 映射为 B 端 DeviceGatewayInfo DTO
- 新增 strPtr() 辅助函数(空字符串→nil,防止 JSON 出现大量空字符串字段)
- client_asset.go 删除 buildMockDeviceRealtime(),改为调用 assetService.GetRealtimeStatus() 获取真实数据
- 新增 mapDeviceGatewayInfoToClientInfo() 将 B 端 DeviceGatewayInfo 映射为 C 端 DeviceRealtimeInfo
- Gateway 调用失败时 DeviceRealtime 返回 null,不阻断主流程
|
2026-03-28 13:21:02 +08:00 |
|
|
|
3b54850f1b
|
feat(03.1-01): 修复静态 DTO 映射缺口
- toDeviceResponse() 补全 5 个 DB 缓存字段(OnlineStatus/LastOnlineTime/SoftwareVersion/SwitchMode/LastGatewaySyncAt)
- ListBindings() 补全 IsCurrent 字段映射
- buildDeviceResolveResponse() 补全 isCurrentMap + BoundCardInfo.IsCurrent + 5 个 DB 缓存字段
- GetRealtimeStatus() device case 补全 isCurrentMap + BoundCardInfo.IsCurrent
|
2026-03-28 13:19:09 +08:00 |
|
|
|
00dba42a63
|
feat(03.1-01): 补全 Gateway SyncDeviceInfoResp 缺失字段及 B 端 DeviceGatewayInfo DTO
- SyncDeviceInfoResp 新增 Rsrp/Rsrq/Sinr/WifiPassword/IPAddress/WANIP/LANIP/MaxClients/ConnectTime/Status/IMSI/ULStats/DLStats/LimitSpeed/SyncInterval 共 15 个字段
- asset_dto.go 新增 DeviceGatewayInfo B 端实时状态结构体(49 字段,全部含 description tag)
- AssetRealtimeStatusResponse 新增 DeviceRealtime *DeviceGatewayInfo 字段
- AssetResolveResponse 新增 5 个设备 DB 缓存字段(online_status/last_online_time/software_version/switch_mode/last_gateway_sync_at)
|
2026-03-28 13:17:52 +08:00 |
|
|
|
3450c20236
|
docs(03.1): 创建 Phase 03.1 计划(设备读取链路修复 + DTO 映射补全)
|
2026-03-28 13:12:42 +08:00 |
|
|
|
debe8f6edc
|
docs(03.1): 补充 D-12 AssetResolveResponse 5字段扩展决策
|
2026-03-28 13:04:35 +08:00 |
|
|
|
d0ef3bb712
|
修复错误的状态码
|
2026-03-28 12:54:04 +08:00 |
|
|
|
8826d95516
|
docs(state): record phase 03.1 context session
|
2026-03-28 12:38:15 +08:00 |
|
|
|
8af5d1a045
|
docs(03.1): capture phase context
|
2026-03-28 12:38:02 +08:00 |
|
|
|
ff62ea457a
|
docs(phase-03): evolve PROJECT.md after phase completion
|
2026-03-28 11:45:58 +08:00 |
|
|
|
71b948f22b
|
docs(phase-03): complete phase execution
|
2026-03-28 11:45:22 +08:00 |
|
|
|
129a38f942
|
docs(03-02): 完成设备体系 sync-info 接入计划(DEVICE-04)
- 新增 03-02-SUMMARY.md,记录 updateDeviceFromSyncInfo 实现细节
- STATE.md:Phase 3 完成标记,追加 DEVICE-04 决策,Next Action 更新为 Phase 4
- ROADMAP.md:Phase 3 进度更新为 Complete(2/2 plans)
- REQUIREMENTS.md:DEVICE-04 标记完成
|
2026-03-28 11:40:04 +08:00 |
|
|
|
15dbf8dc66
|
feat(03-02): Asset Service 接入 Gateway sync-info(DEVICE-04)
- Service 结构体新增 gatewayClient 字段,New() 追加 gatewayClient 参数
- Refresh device 分支在绑定卡刷新后调用 SyncDeviceInfo,nil guard + Warn 日志不阻断主流程
- 新增 updateDeviceFromSyncInfo 私有函数:更新 5 个 device 字段 + 调用 UpdateIsCurrentByDeviceID
- bootstrap/services.go asset.New() 调用追加 deps.GatewayClient
- go build ./... 零新增编译错误
|
2026-03-28 11:38:14 +08:00 |
|
|
|
ba1886c314
|
feat(03-02): DeviceSimBindingStore 新增 UpdateIsCurrentByDeviceID 方法
- 事务两步原子更新:先全部清空 is_current=false,再按 ICCID 设 true
- 通过子查询定位 iot_card_id,避免跨表 JOIN 更新
- currentIccid 为空时仅清空,不做第二步设置
|
2026-03-28 11:36:40 +08:00 |
|
|
|
8819c94322
|
docs(03-01): 完成设备体系数据基础层计划
- 创建 03-01-SUMMARY.md
- 更新 STATE.md(进度推进至 Plan 2)
- 更新 ROADMAP.md(Phase 3 进行中)
- 标记 REQUIREMENTS.md(DEVICE-01/02/03 完成)
|
2026-03-28 11:34:38 +08:00 |
|
|
|
825def88a4
|
feat(03-01): Gateway SyncDeviceInfo 方法 + DTO 字段扩展
- gateway/models.go:新增 SyncDeviceInfoReq / SyncDeviceInfoResp 结构定义
- gateway/device.go:新增 SyncDeviceInfo() 方法,POST /device/sync-info
- device_dto.go:DeviceResponse 新增 5 个 sync-info 同步字段;DeviceCardBindingResponse 新增 is_current
- asset_dto.go:BoundCardInfo 新增 is_current 字段
|
2026-03-28 11:33:01 +08:00 |
|