8706247436
fix: 资产解析接口 BoundCardInfo 添加运营商字段
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m18s
2026-04-14 17:10:28 +08:00
8154a61453
fix: 移除 standaloneListColumns 中已废弃的分佣字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m51s
迁移 000116 已从 tb_iot_card 删除 first_commission_paid 和 accumulated_recharge
两列,但 standaloneListColumns 未同步清理,导致 SELECT 查询报列不存在错误。
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-14 12:40:04 +08:00
7cdb66cbe4
refactor: 统一状态名称映射为公共函数,清理废弃换卡/商户类型常量和模型
2026-04-14 11:51:58 +08:00
5410181e77
修复:C端资产信息接口 lan_ip 字段无值时不返回的问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m17s
去掉 DeviceRealtimeInfo.LANIP 的 omitempty 标签,
确保 device_realtime.lan_ip 始终出现在响应中(无值时返回 null)
2026-04-14 11:49:17 +08:00
548ec0cd6b
feat: 补全 _name 字段公共映射函数,修正实名认证注释
2026-04-14 11:44:23 +08:00
c35542f911
feat: 补全客户端订单和资产 DTO _name 字段,修复代码格式
2026-04-14 11:19:57 +08:00
42c5ec912f
feat: 技术债务清理(支付配置动态化、API文档补全、轮询常量提取、废弃代码清理)
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m13s
2026-04-14 11:11:15 +08:00
c0b64c9e30
fix: 登录时将主手机号写入 JWT,修复 bound_phone 返回空的问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
2026-04-14 11:09:42 +08:00
37706bc7ce
feat: 资产信息接口返回当前登录用户绑定手机号
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m30s
2026-04-14 10:08:42 +08:00
640ea8ec99
feat: 更新依赖注入,传入 ManualTriggerService
2026-04-13 14:52:50 +08:00
8569873690
feat: ClientRealnameHandler 集成异步触发实名检查
2026-04-13 14:51:42 +08:00
5196472d7e
fix: 修复手动触发去重TTL和日限制次数,优化权限检查和错误日志
2026-04-13 14:50:14 +08:00
8d8d426e2e
feat: verify-asset 接口返回当前生效的公众号和小程序 AppID
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m51s
2026-04-11 17:22:21 +08:00
decb7a10ec
fix: 使用专用常量 ShelfStatusOn 替代 StatusEnabled 赋值 ShelfStatus
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-11 12:20:49 +08:00
5588c7c762
fix: 修正 DTO status 字段 description 和 validate 标签
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-11 12:20:43 +08:00
eebc7194d8
fix: 修正 model status 字段 GORM comment 为 0=禁用 1=启用
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-11 12:20:31 +08:00
e945a672ed
fix: 修正套餐系列状态注释格式
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m19s
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-11 12:00:01 +08:00
41d3667df2
feat: 设备卡列表新增运营商类型字段
...
在 DeviceCardItem DTO 和 GetDeviceCards Handler 中补充 carrier_type 字段,解决设备视角卡列表缺少运营商类型的问题
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-11 11:59:54 +08:00
e9ff14df0e
规范: 新增枚举与状态字段规范并修复代理充值状态描述错误
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增 docs/enum-status-standards.md:完整的枚举/状态规范,涵盖 int vs string 选择、起始值约定、description 格式统一、constants 唯一真相来源、Response DTO 必须提供 status_name
- 更新 dto-standards SKILL.md:加入枚举规范要点,AI 写 DTO 时自动触发
- 更新 AGENTS.md:常量管理章节和 Code Review 检查清单各加入枚举检查项
- 修复 agent_recharge_dto.go:description 从错误的 3 个状态改为正确的 5 个状态(原 3:已取消 实为 3:已完成)
- 修复 agent_recharge service:toResponse 补充 StatusName 中文字段,防止前端映射出错
2026-04-11 11:25:58 +08:00
c807b99a91
fix: 修复佣金明细列表多表 JOIN 时 shop_id 字段歧义问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m24s
ListByShopID 使用 tb_commission_record.shop_id 限定表名,
避免与 JOIN 的 tb_order/tb_iot_card/tb_device 表中同名字段冲突,
解决 SQLSTATE 42702 ambiguous column reference 错误。
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-11 11:06:13 +08:00
677d6239ce
fix: 统一佣金状态常量并修复佣金明细关联查询
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m33s
- 删除 model/commission.go 中与 constants 包冲突的旧常量(值=1/2)
- 所有服务层改用 constants.CommissionStatusReleased(值=3)写入和查询
- 数据库迁移:status 1→3(已发放),2→4(已失效)
- 修复佣金明细列表接口,通过 JOIN 关联返回 order_no、iccid、virtual_no、order_created_at
- 新增 seller_shop_id / seller_shop_name 销售来源字段
- 统计接口过滤条件从精确匹配改为排除无效(NOT IN 4,99)
- 更新 OpenAPI 文档及 commission-record-query spec
2026-04-11 10:42:37 +08:00
d0989c66bb
暂且不需要实名
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m19s
2026-04-10 18:31:40 +08:00
67f3286e09
fix: 修复店铺资金摘要接口username和phone字段为空的bug
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m17s
问题原因:GetPrimaryAccountsByShopIDs 在 Store 层重复应用了数据权限过滤,
导致当前用户无权限访问的店铺账号被错误过滤,accountMap 为 nil,
最终返回的 username 和 phone 为空字符串。
解决方案:移除 Store 层的 ApplyShopFilter 权限过滤,
因为调用方(Service 层)已经保证了 shopIDs 的合法性。
2026-04-10 17:21:27 +08:00
a8b52f8ae1
fix: 设备详情 RealNameStatus 取当前使用卡而非聚合最小值
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
2026-04-10 17:15:40 +08:00
5496cb58aa
feat: 订单创建时快照买家手机号/昵称和套餐类型
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
新增字段:
- tb_order: buyer_phone, buyer_nickname(个人客户下单时快照)
- tb_order_item: package_type(套餐类型快照)
后台订单列表支持按 buyer_phone 精确过滤查询。
OpenSpec: order-buyer-snapshot
2026-04-10 17:12:56 +08:00
3cb16804a4
fix: 设备资产详情返回 enable_polling 字段
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m19s
2026-04-10 15:54:47 +08:00
2a7ac3f86e
fix: 修复轮询系统缓存不一致和可观测性问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- OnCardStatusChanged/Enabled/Disabled 添加 InvalidateCardCache,
解决 Refresh API 更新 DB 后 polling 缓存仍为旧值的 bug
- AssetResolveResponse 的 enable_polling/network_status 去掉
omitempty,解决 false/0 时字段从响应中消失的问题
- Scheduler/Initializer/PackageHandler 增加 INFO 级别日志,
可通过日志判断轮询是否工作、处理了哪些卡
2026-04-10 15:52:38 +08:00
ef8ec025bd
feat: 资产套餐接口返回是否开启虚流量字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m26s
current-package 和 packages 两个接口的响应中新增
enable_virtual_data 字段,表示该套餐是否启用虚流量
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-10 14:33:05 +08:00
4a18aac6ce
fix: 资产验证支持虚拟号(virtual_no)查询
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m27s
resolveAsset 查询 IoT 卡时仅匹配 iccid,导致用户输入
虚拟号时返回"资产不存在"(1180)。将查询条件扩展为
iccid OR virtual_no,与设备查询逻辑保持一致。
顺带将 jwt.ParseWithClaims 回调的 interface{} 替换为 any。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-10 11:42:23 +08:00
cd807e58e3
feat: Excel 导入按列位置读取,IoT 卡导入支持卡业务类型
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m28s
- 重写 parseCardRows:移除列名识别,固定跳过第1行表头,按 col0=ICCID、
col1=MSISDN、col2=VirtualNo 取值,VirtualNo 升级为必填字段
- 重写 ParseDeviceExcel:移除 buildDeviceColumnIndex,IMEI 调整至第5列
新增 MaxSimSlots 范围校验 [1,4],整行为空时不计入 total
- 删除 findCardColumns 和 buildDeviceColumnIndex 两个冗余函数
- ImportIotCardRequest 新增 card_category 字段(normal/industry,默认 normal)
- IotCardImportTask model 新增 card_category 字段
- 迁移 000111:tb_iot_card_import_task 新增 card_category 列
- CreateImportTask 将 req.CardCategory 写入任务,空串兜底 normal
- processBatch 改用 task.CardCategory 替代写死的 CardCategoryNormal
- ImportTaskResponse 新增 card_category 字段返回
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 17:16:31 +08:00
0627ffec42
feat: 代理商资金可见性重构(agent-fund-visibility)
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m10s
- 将 GET /shops/commission-summary 重命名为 GET /shops/fund-summary,
响应新增 main_balance、main_frozen_balance 两个预充值钱包字段
- 新增 GET /shops/:id/main-wallet/transactions 预充值钱包流水接口
- 将佣金统计、每日统计、发起提现从 /my/ 路径迁移至 /shops/:id/ 路径:
GET /shops/:id/commission-stats
GET /shops/:id/commission-daily-stats
POST /shops/:id/withdrawal-requests
- 删除 MyCommissionService、MyCommissionHandler 及全部 /my/ 路由
- 补齐 ListShopWithdrawalRequests、ListShopCommissionRecords 的
CanManageShop 越权校验(安全修复)
- 提现接口增加严格权限:仅代理账号本人可为自己店铺发起提现
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 14:40:39 +08:00
1d6535b81b
fix: 修复移除账号角色接口路由参数名错误
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
RemoveRole handler 中使用 c.Params("id") 取账号 ID,
但路由注册的参数名为 account_id,导致解析失败报"无效的账号 ID"。
修正为 c.Params("account_id")。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 14:38:01 +08:00
0f6fd42aff
fix: 禁用角色时检查是否已分配给账号或店铺
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
角色禁用前新增分配情况检查,若角色已分配给账号或店铺则拒绝禁用操作,
需先移除相关分配后才能禁用,与删除角色的防护逻辑保持一致。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 14:35:55 +08:00
c1cec0aede
fix: 修复C端订单差价佣金计算错误及自动购包订单系列ID缺失问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m11s
- C端普通订单(createPackageOrder)创建时未设置 SellerCostPrice,
导致底层店铺得到整个零售价作为差价佣金,上级代理链无法获得任何佣金。
修复:在 createPackageOrder 中查询卖家成本价并写入订单字段。
- purchase_validation 新增 GetCostPrice 方法,供 C 端订单查询代理渠道成本价。
- auto_purchase 自动购包订单未设置 SeriesID 和 SellerCostPrice,
导致差价佣金计算被整体跳过。修复:在 ProcessTask 中从卡/设备获取
SeriesID,从套餐分配记录获取 SellerCostPrice,传入 buildOrderAndItems。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 13:35:13 +08:00
6dfc5c0301
feat: 资产解析接口新增实名时间字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m5s
- AssetResolveResponse 新增 real_name_at 字段:card 类型取 first_realname_at,device 类型取绑定卡中最小的实名时间
- BoundCardInfo 新增 real_name_at 字段:各卡自己的 first_realname_at
- RefreshCardDataFromGateway 手动刷新路径补写实名时间:检测到 0→1 变化时同步写入 first_realname_at
- 同步更新 asset-resolve 规格文档
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 12:12:28 +08:00
fce35e8a2d
fix: 修复角色分配权限并发竞态导致唯一约束冲突报错
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m4s
- Store 层 Create 方法对唯一约束冲突幂等处理,消除并发写入报错
- Service 层预批量加载角色已有权限集合(1次查询),替换逐条 Exists 查询(N次查询),同时降低竞态窗口
💘 Generated with Crush
Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land >
2026-04-09 11:58:52 +08:00
81ba84cf05
feat: 新增店铺联级查询接口
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m3s
- 新增 GET /api/admin/shops/cascade 接口,支持按店铺名模糊查询和上级ID过滤
- Store 层新增 ListForCascade(支持数据权限过滤)和 GetParentIDsWithChildren 方法
- Service 层新增 ListCascade,批量判断 has_children 避免 N+1 查询
- 返回格式:[{id, shop_name, has_children}]
💘 Generated with Crush
Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land >
2026-04-09 11:43:37 +08:00
384a54164b
feat: 新增批量移除角色权限接口
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增 DELETE /api/admin/roles/:role_id/permissions 接口
- Store 层新增 BatchDelete 方法,单次 SQL 批量软删除
- Service 层新增 BatchRemovePermissions 方法
- Handler 层新增 BatchRemovePermissions 处理函数
- DTO 新增 BatchRemovePermissionsRequest/Params
- 修复 openapi generator 对 DELETE 方法 requestBody 不生成的问题
- RouteSpec 新增 Body 字段,支持显式指定 JSON 请求体
💘 Generated with Crush
Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land >
2026-04-09 11:41:58 +08:00
a7dfe858c7
feat: 创建代理账号时自动分配店铺默认角色
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m22s
💘 Generated with Crush
Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land >
2026-04-09 11:06:31 +08:00
e9df1e7ded
feat: IoT卡新增绑定设备虚拟号快照字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m28s
- tb_iot_card 新增 device_virtual_no 字段,存储绑定设备的虚拟号快照
- 列表/详情接口响应新增 device_virtual_no 字段
- 列表接口 is_standalone 改为可选参数(不传返回全部卡)
- 移除列表接口 virtual_no 查询参数
- 绑卡/解绑时同步更新 device_virtual_no 快照
- 设备导入时批量写入 device_virtual_no 快照
- 归档 feat-iot-card-device-virtual-no 变更提案
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-09 10:50:46 +08:00
cc56e27c01
feat: 后台线下支付订单强制上传支付凭证
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m15s
在后台创建订单接口中新增 payment_voucher_key 字段,线下支付方式
下该字段为必填,存储对象存储 file_key,便于后续追溯与审计。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-08 16:45:06 +08:00
78d6aded9b
fix: 修复IoT卡导入时未写入carrier_type和carrier_name字段
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m21s
processBatch 构建 IotCard 时只写了 CarrierID,遗漏了 CarrierType 和 CarrierName,
导致导入后所有卡的运营商名称和运营商类型为空,影响 /api/admin/iot-cards/standalone
和 /api/admin/assets/resolve/{identifier} 接口返回结果
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-08 11:56:57 +08:00
14a8ea5a2c
fix: 单卡导入虚拟号改为可选,非空时保证全局唯一
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m26s
2026-04-08 10:45:23 +08:00
303bffbe84
文档生成不正确的问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m52s
2026-04-07 18:19:47 +08:00
80c6f6c756
feat: 资产标识符标准化、资产历史订单查询及导入虚拟号强制验证
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m21s
主要变更:
- 新增 AssetIdentifier 模型及 Store,统一管理资产标识符(ICCID/IMEI/SN 等)
- 新增迁移:asset_identifier 表、order 表新增 asset_identifier 字段、iot_card.virtual_no NOT NULL 约束
- 资产 Handler/Service/Route 全面重构,支持标识符路由查询与解析
- 新增资产历史订单查询接口,支持跨设备/卡/钱包维度的订单聚合
- 设备与物联卡导入任务强制校验虚拟号,缺失时直接拒绝
- Excel 工具函数优化,前端导入指引文档同步更新
- 归档三个 OpenSpec 提案:asset-identifier-standardization、asset-historical-orders、import-mandatory-virtual-no
- 更新 OpenAPI 文档及相关 DTO
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-07 17:39:36 +08:00
7e489a19fb
fix: 角色删除前校验分配情况,禁止删除使用中的角色
...
角色被删除后,其关联的账号-角色记录未清理,导致 CountByAccountID
统计到孤儿记录,使被分配该角色的账号无法重新分配新角色。
修复方案:删除角色前检查 tb_account_role 和 tb_shop_role,
若仍有账号或店铺持有该角色则返回 1028 错误,强制管理员显式
解除所有分配后再删除,保证数据一致性与审计完整性。
2026-04-07 17:23:49 +08:00
434a8b0349
feat: 轮询系统重构(分片队列 + 停复机统一 + Handler 拆分)
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m46s
【核心变更】
1. 停复机逻辑统一(StopResumeService)
- 新增 EvaluateAndAct 统一入口,封装三条件停复机判断
- 停机条件:无套餐(no_package) / 流量耗尽(traffic_exhausted) / 未实名(not_realname)
- 复机条件:stop_reason 合规 + 有套餐且未耗尽 + 已实名或行业卡
- 修复设备套餐 Bug:hasValidPackage 按 device_id 查套餐,而非仅 iot_card_id
- 设备维度停复机加幂等锁(Redis SetNX,TTL 30s),防止多卡并发重复调 Gateway
2. Redis 分片队列(PollingQueueManager)
- 新建 queue_manager.go,封装所有轮询 Redis 操作
- 16 分片 Sorted Set,Key 格式:polling:shard:{shardID}:queue:{taskType}
- Lua 脚本原子出队(ZRANGEBYSCORE + 分批 ZREM),消除竞态窗口
- 新增背压检测:队列深度超 50 万时 Scheduler 跳过该分片
- RemoveFromAllQueues 覆盖 4 种任务类型(含 protect)
3. Handler 拆分(polling_handler.go 1360行 → 5个专注文件)
- polling_base.go:共享基类(并发控制/卡缓存/重入队)
- polling_realname_handler.go:实名采集,实名 0→1 时立即触发复机
- polling_carddata_handler.go:流量采集,保留跨月边界检测逻辑
- polling_package_handler.go:套餐采集,委托 EvaluateAndAct 决策
- polling_protect_handler.go:保护期一致性检查,保护期内强制修正
4. 配置管理(PollingConfigManager)
- 新建 config_manager.go,从 scheduler.go 提取配置职责
- 内存缓存 + 5 分钟定时刷新,刷新失败保留原缓存
- 修复 getCardCondition:停机卡返回 suspended,不再错配 activated 配置
5. 渐进式初始化(CardInitializer)
- 新建 initializer.go,分批加载(每批 10 万),批次间 sleep 500ms
- 过滤 enable_polling=false 的卡,初始化完成前 Scheduler 不出队
6. 卡生命周期服务(PollingLifecycleService)
- 新建 lifecycle_service.go,替代已删除的 callbacks.go 和 api_callback.go
- OnCardCreated/OnCardEnabled/OnCardStatusChanged 入队前检查 enable_polling
7. Scheduler 精简(1000+行 → 227行)
- 保留纯调度循环:scheduleLoop + processShardSchedule + enqueueBatch
- 保留每 10 秒触发套餐过期检测和流量重置
- 移除所有 DB 操作、配置加载、卡初始化逻辑
8. 轮询管控 API(enable_polling)
- 新增 PUT /api/admin/assets/:id/polling-status 接口
- 支持对设备/卡维度开关轮询,关闭后从所有分片队列移除
9. 数据库迁移
- 000103:tb_device 新增 enable_polling 字段(boolean, NOT NULL, DEFAULT true)
- 000104:新增 suspended 轮询配置,为 activated 配置补全 protect_check_interval
【文件统计】
- 新增:19 个文件(handler × 5、polling 组件 × 4、迁移 × 3 等)
- 修改:20 个文件(bootstrap 注入、store 接口、monitoring 适配分片等)
- 删除:3 个文件(polling_handler.go、callbacks.go、api_callback.go)
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-07 12:27:04 +08:00
10fcc0b3c9
fix: 修复强充场景幂等 key 在微信支付失败时未被清除的问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m20s
将 markClientPurchaseCreated 移至 CreateJSAPIPayment 成功之后调用,
确保支付失败时 defer 能可靠地删除幂等 key,避免用户无法重新下单。
原顺序:创建充值单 → markClientPurchaseCreated → CreateJSAPIPayment
修复后:创建充值单 → CreateJSAPIPayment → markClientPurchaseCreated → *created=true
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-04-07 09:55:06 +08:00
c0c32c62f4
fix: 修复代理充值 Handler 缺少参数验证导致 check constraint 违反的问题
...
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m18s
payment_method 字段传入中文值「线下转账」时,因 AgentRechargeHandler
未注入 validator 而跳过 oneof 验证,直接写入 DB 触发
chk_agent_recharge_method 约束报错。
- AgentRechargeHandler 注入 validator,Create 方法补加 Struct 验证
- bootstrap/handlers.go 传入 validate 实例
- openapi/handlers.go 补 nil 占位保持编译通过
2026-04-03 09:17:15 +08:00
a8a91fe04e
fix: 修复 RealtimeStatus 查询后未回写 DB 导致 Resolve 接口在线状态不同步的问题
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m12s
2026-04-02 15:14:04 +08:00