docs(camel_oil): 新增骆驼加油相关功能文档
- 添加骆驼加油API端点设计及系统架构文档 - 新增定时任务模块详细说明及任务流程图 - 完成订单管理服务功能及架构介绍 - 增加账号管理模块设计与状态机说明 - 集成Pig接码平台文档,介绍验证码检测流程 - 详细列出各组件的依赖关系及性能优化措施 - 提供故障排除指南及系统扩展性总结
This commit is contained in:
210
.qoder/repowiki/zh/content/Camel Oil Api Endpoints.md
Normal file
210
.qoder/repowiki/zh/content/Camel Oil Api Endpoints.md
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
# 骆驼加油API端点
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档中引用的文件**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/dao/internal/v_1_camel_oil_account.go)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [简介](#简介)
|
||||||
|
2. [项目结构](#项目结构)
|
||||||
|
3. [核心组件](#核心组件)
|
||||||
|
4. [架构概述](#架构概述)
|
||||||
|
5. [详细组件分析](#详细组件分析)
|
||||||
|
6. [依赖分析](#依赖分析)
|
||||||
|
7. [性能考虑](#性能考虑)
|
||||||
|
8. [故障排除指南](#故障排除指南)
|
||||||
|
9. [结论](#结论)
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
本文档详细描述了骆驼加油(Camel Oil)API模块的端点设计、功能实现和系统架构。该模块主要服务于JD V2平台的账号与订单管理,提供完整的账号生命周期管理和订单处理能力。API设计遵循GoFrame框架规范,采用分层架构实现高内聚低耦合。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
骆驼加油模块位于`api/camel_oil`目录下,采用版本化API设计,包含v1版本的账号和订单管理接口。控制器位于`internal/controller/camel_oil`目录,服务层位于`internal/service`,数据访问层由GoFrame自动生成。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
subgraph "API层"
|
||||||
|
A[api/camel_oil]
|
||||||
|
A1[v1/account.go]
|
||||||
|
A2[v1/order.go]
|
||||||
|
A3[camel_oil.go]
|
||||||
|
end
|
||||||
|
subgraph "控制层"
|
||||||
|
B[internal/controller/camel_oil]
|
||||||
|
B1[camel_oil_v1_list_account.go]
|
||||||
|
B2[camel_oil_v1_submit_order.go]
|
||||||
|
end
|
||||||
|
subgraph "服务层"
|
||||||
|
C[internal/service]
|
||||||
|
C1[camel_oil.go]
|
||||||
|
end
|
||||||
|
subgraph "数据层"
|
||||||
|
D[internal/dao/internal]
|
||||||
|
D1[v_1_camel_oil_account.go]
|
||||||
|
end
|
||||||
|
A --> B
|
||||||
|
B --> C
|
||||||
|
C --> D
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/dao/internal/v_1_camel_oil_account.go)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
骆驼加油模块的核心组件包括账号管理、订单处理和状态监控三大功能模块。通过`ICamelOilV1`接口定义了11个API端点,涵盖账号列表查询、状态检测、订单提交、订单查询等关键业务功能。服务层`ICamelOil`接口提供了50多个方法,支持完整的业务逻辑处理。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
## 架构概述
|
||||||
|
系统采用典型的分层架构设计,从上至下分为API层、控制层、服务层和数据访问层。API层定义接口契约,控制层处理HTTP请求转发,服务层实现核心业务逻辑,数据访问层负责数据库操作。各层之间通过接口解耦,确保系统的可维护性和可扩展性。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
Client[客户端] --> API[API层]
|
||||||
|
API --> Controller[控制层]
|
||||||
|
Controller --> Service[服务层]
|
||||||
|
Service --> DAO[数据访问层]
|
||||||
|
DAO --> DB[(数据库)]
|
||||||
|
style Client fill:#f9f,stroke:#333
|
||||||
|
style API fill:#bbf,stroke:#333
|
||||||
|
style Controller fill:#f96,stroke:#333
|
||||||
|
style Service fill:#6f9,stroke:#333
|
||||||
|
style DAO fill:#69f,stroke:#333
|
||||||
|
style DB fill:#9f9,stroke:#333
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
## 详细组件分析
|
||||||
|
### 账号管理组件分析
|
||||||
|
账号管理组件提供完整的账号生命周期管理功能,包括账号列表查询、状态检测、历史记录查询和统计信息获取。通过`ListAccountReq`请求结构体定义了分页查询参数,支持状态筛选和关键词搜索。
|
||||||
|
|
||||||
|
#### 对象导向组件:
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class ListAccountReq {
|
||||||
|
+path : /jd-v2/account/list
|
||||||
|
+tags : JD V2 Account
|
||||||
|
+method : get
|
||||||
|
+summary : 账号列表
|
||||||
|
+CommonPageReq
|
||||||
|
+Status : CamelOilAccountStatus
|
||||||
|
+Keyword : string
|
||||||
|
}
|
||||||
|
class AccountListItem {
|
||||||
|
+AccountId : int64
|
||||||
|
+AccountName : string
|
||||||
|
+Phone : string
|
||||||
|
+Status : CamelOilAccountStatus
|
||||||
|
+StatusText : string
|
||||||
|
+DailyOrderCount : int
|
||||||
|
+DailyOrderDate : string
|
||||||
|
+TotalOrderCount : int
|
||||||
|
+LastUsedAt : gtime.Time
|
||||||
|
+LastLoginAt : gtime.Time
|
||||||
|
+TokenExpireAt : gtime.Time
|
||||||
|
+RemainingOrders : int
|
||||||
|
+FailureReason : string
|
||||||
|
+Remark : string
|
||||||
|
+CreatedAt : gtime.Time
|
||||||
|
+UpdatedAt : gtime.Time
|
||||||
|
}
|
||||||
|
class ListAccountRes {
|
||||||
|
+CommonPageRes~AccountListItem~
|
||||||
|
}
|
||||||
|
ListAccountReq --> ListAccountRes : "返回"
|
||||||
|
AccountListItem --> ListAccountRes : "包含"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
|
||||||
|
### 订单处理组件分析
|
||||||
|
订单处理组件负责订单的全生命周期管理,包括订单提交、列表查询、详情获取、历史记录和手动回调。通过`SubmitOrderReq`定义了订单提交的必要参数,包括金额、商户订单号和附加信息。
|
||||||
|
|
||||||
|
#### API/服务组件:
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Client as "客户端"
|
||||||
|
participant API as "API网关"
|
||||||
|
participant Controller as "ControllerV1"
|
||||||
|
participant Service as "CamelOil服务"
|
||||||
|
Client->>API : POST /jd-v2/order/submit
|
||||||
|
API->>Controller : 转发SubmitOrder请求
|
||||||
|
Controller->>Service : 调用SubmitOrder方法
|
||||||
|
Service-->>Controller : 返回SubmitOrderRes
|
||||||
|
Controller-->>API : 返回响应
|
||||||
|
API-->>Client : 返回订单号和支付链接
|
||||||
|
Note over Client,Service : 提交订单流程
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
## 依赖分析
|
||||||
|
骆驼加油模块依赖多个核心组件,包括公共API模块、常量定义、GoFrame框架等。通过接口注入方式实现服务层的依赖管理,确保各组件之间的松耦合。数据库依赖通过GoFrame的DAO模式实现,自动生成数据访问代码。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
CamelOil[骆驼加油模块] --> CommonApi[commonApi]
|
||||||
|
CamelOil --> Consts[consts]
|
||||||
|
CamelOil --> GoFrame[github.com/gogf/gf/v2]
|
||||||
|
CamelOil --> Service[service]
|
||||||
|
Service --> DAO[dao]
|
||||||
|
DAO --> Database[(数据库)]
|
||||||
|
style CamelOil fill:#f96,stroke:#333
|
||||||
|
style CommonApi fill:#69f,stroke:#333
|
||||||
|
style Consts fill:#69f,stroke:#333
|
||||||
|
style GoFrame fill:#69f,stroke:#333
|
||||||
|
style Service fill:#6f9,stroke:#333
|
||||||
|
style DAO fill:#69f,stroke:#333
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
## 性能考虑
|
||||||
|
系统在设计时充分考虑了性能因素,采用分页查询避免大数据量加载,通过缓存机制减少数据库访问。账号选择策略采用轮询方式,确保负载均衡。定时任务用于处理订单支付状态检测和账号日重置,避免实时处理带来的性能压力。
|
||||||
|
|
||||||
|
## 故障排除指南
|
||||||
|
当遇到API调用失败时,首先检查请求参数是否符合验证规则。对于未实现的接口(如CheckAccount),需要查看控制器实现状态。数据库相关问题可通过检查DAO层代码和数据库表结构来定位。系统提供了详细的错误码机制,便于快速定位问题根源。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [camel_oil_v1_check_account.go](file://internal/controller/camel_oil/camel_oil_v1_check_account.go)
|
||||||
|
- [camel_oil_v1_account_history.go](file://internal/controller/camel_oil/camel_oil_v1_account_history.go)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
骆驼加油API模块提供了完整的JD V2平台账号和订单管理功能,采用分层架构设计确保代码的可维护性。通过接口定义和依赖注入实现组件解耦,支持系统的灵活扩展。建议完善未实现的接口功能,并加强错误处理和日志记录,进一步提升系统的稳定性和可观察性。
|
||||||
320
.qoder/repowiki/zh/content/Camel Oil Cron Jobs.md
Normal file
320
.qoder/repowiki/zh/content/Camel Oil Cron Jobs.md
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
# 骆驼加油定时任务
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档引用的文件**
|
||||||
|
- [main.go](file://main.go)
|
||||||
|
- [cron.go](file://utility/cron/cron.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go)
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [项目结构](#项目结构)
|
||||||
|
2. [核心组件](#核心组件)
|
||||||
|
3. [骆驼加油模块定时任务](#骆驼加油模块定时任务)
|
||||||
|
4. [定时任务注册机制](#定时任务注册机制)
|
||||||
|
5. [数据库设计](#数据库设计)
|
||||||
|
6. [状态管理与枚举](#状态管理与枚举)
|
||||||
|
7. [业务逻辑分析](#业务逻辑分析)
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[kami_backend] --> B[api]
|
||||||
|
A --> C[internal]
|
||||||
|
A --> D[utility]
|
||||||
|
A --> E[sql]
|
||||||
|
B --> B1[camel_oil]
|
||||||
|
B1 --> B11[v1]
|
||||||
|
B11 --> B111[account.go]
|
||||||
|
B11 --> B112[order.go]
|
||||||
|
C --> C1[controller]
|
||||||
|
C1 --> C11[camel_oil]
|
||||||
|
C11 --> C111[camel_oil_v1_submit_order.go]
|
||||||
|
C11 --> C112[camel_oil_v1_order_callback.go]
|
||||||
|
C --> C2[logic]
|
||||||
|
C2 --> C21[camel_oil]
|
||||||
|
C21 --> C211[cron_tasks.go]
|
||||||
|
C21 --> C212[account_login.go]
|
||||||
|
C21 --> C213[order.go]
|
||||||
|
C --> C3[service]
|
||||||
|
C3 --> C31[camel_oil.go]
|
||||||
|
C --> C4[consts]
|
||||||
|
C4 --> C41[camel_oil.go]
|
||||||
|
C --> C5[dao]
|
||||||
|
C5 --> C51[v_1_camel_oil_account.go]
|
||||||
|
C5 --> C52[v_1_camel_oil_order.go]
|
||||||
|
D --> D1[cron]
|
||||||
|
D1 --> D11[cron.go]
|
||||||
|
E --> E1[camel_oil_tables.sql]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [main.go](file://main.go#L1-L56)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L1-L96)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [main.go](file://main.go#L1-L56)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L1-L96)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
|
||||||
|
骆驼加油模块的核心组件包括定时任务调度器、服务接口、业务逻辑处理和数据库访问层。这些组件协同工作,实现了账号管理、订单处理和状态监控等功能。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [internal/service/camel_oil.go](file://internal/service/camel_oil.go#L1-L102)
|
||||||
|
- [internal/logic/camel_oil/cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L1-L242)
|
||||||
|
|
||||||
|
## 骆驼加油模块定时任务
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[定时任务调度] --> B[账号登录任务]
|
||||||
|
A --> C[验证码检测任务]
|
||||||
|
A --> D[订单支付状态检测任务]
|
||||||
|
A --> E[账号日重置任务]
|
||||||
|
B --> B1[每5分钟执行]
|
||||||
|
B1 --> B2[检查可用订单容量]
|
||||||
|
B2 --> B3[容量≤50时触发登录]
|
||||||
|
C --> C1[每5秒执行]
|
||||||
|
C1 --> C2[查询待验证码账号]
|
||||||
|
C2 --> C3[从野猪平台检测验证码]
|
||||||
|
C3 --> C4[调用骆驼加油平台登录]
|
||||||
|
D --> D1[每10秒执行]
|
||||||
|
D1 --> D2[查询待支付订单]
|
||||||
|
D2 --> D3[检测支付状态]
|
||||||
|
D3 --> D4[更新订单状态]
|
||||||
|
E --> E1[每日00:00执行]
|
||||||
|
E1 --> E2[重置在线账号日订单数]
|
||||||
|
E2 --> E3[处理暂停账号]
|
||||||
|
E3 --> E4[恢复或标记失效]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L74-L95)
|
||||||
|
- [internal/logic/camel_oil/cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L19-L241)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L74-L95)
|
||||||
|
- [internal/logic/camel_oil/cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L19-L241)
|
||||||
|
|
||||||
|
## 定时任务注册机制
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Main as main.go
|
||||||
|
participant Cron as cron.go
|
||||||
|
participant Service as camel_oil.go
|
||||||
|
participant Logic as cron_tasks.go
|
||||||
|
Main->>Cron : main()启动
|
||||||
|
Cron->>Cron : Register(ctx)
|
||||||
|
Cron->>Cron : registerCamelOilTasks(ctx)
|
||||||
|
Cron->>Service : 调用CronAccountLoginTask()
|
||||||
|
Service->>Logic : 执行具体逻辑
|
||||||
|
Logic->>Logic : 检查容量并触发登录
|
||||||
|
Cron->>Service : 调用CronVerifyCodeCheckTask()
|
||||||
|
Service->>Logic : 执行验证码检测
|
||||||
|
Cron->>Service : 调用CronOrderPaymentCheckTask()
|
||||||
|
Service->>Logic : 检测订单支付状态
|
||||||
|
Cron->>Service : 调用CronAccountDailyResetTask()
|
||||||
|
Service->>Logic : 执行日重置任务
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [main.go](file://main.go#L24-L54)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L14-L95)
|
||||||
|
- [internal/service/camel_oil.go](file://internal/service/camel_oil.go#L63-L68)
|
||||||
|
- [internal/logic/camel_oil/cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L19-L241)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [main.go](file://main.go#L24-L54)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L14-L95)
|
||||||
|
|
||||||
|
## 数据库设计
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
erDiagram
|
||||||
|
camel_oil_account {
|
||||||
|
bigint id PK
|
||||||
|
varchar(128) account_name
|
||||||
|
varchar(20) phone UK
|
||||||
|
text token
|
||||||
|
tinyint status
|
||||||
|
datetime token_expire_at
|
||||||
|
datetime last_login_at
|
||||||
|
datetime last_used_at
|
||||||
|
int daily_order_count
|
||||||
|
date daily_order_date
|
||||||
|
int total_order_count
|
||||||
|
text failure_reason
|
||||||
|
text remark
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
camel_oil_order {
|
||||||
|
bigint id PK
|
||||||
|
varchar(64) order_no UK
|
||||||
|
varchar(128) merchant_order_id
|
||||||
|
bigint account_id FK
|
||||||
|
varchar(128) account_name
|
||||||
|
varchar(128) platform_order_no
|
||||||
|
decimal(10,2) amount
|
||||||
|
text alipay_url
|
||||||
|
tinyint status
|
||||||
|
tinyint pay_status
|
||||||
|
tinyint notify_status
|
||||||
|
int notify_count
|
||||||
|
datetime last_check_at
|
||||||
|
datetime paid_at
|
||||||
|
text attach
|
||||||
|
text failure_reason
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
camel_oil_account_history {
|
||||||
|
bigint id PK
|
||||||
|
varchar(36) history_uuid UK
|
||||||
|
bigint account_id FK
|
||||||
|
varchar(32) change_type
|
||||||
|
tinyint status_before
|
||||||
|
tinyint status_after
|
||||||
|
int failure_count
|
||||||
|
text remark
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
camel_oil_order_history {
|
||||||
|
bigint id PK
|
||||||
|
varchar(36) history_uuid UK
|
||||||
|
varchar(64) order_no FK
|
||||||
|
varchar(32) change_type
|
||||||
|
bigint account_id FK
|
||||||
|
varchar(128) account_name
|
||||||
|
text raw_data
|
||||||
|
text remark
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
camel_oil_account ||--o{ camel_oil_order : "1:N"
|
||||||
|
camel_oil_account ||--o{ camel_oil_account_history : "1:N"
|
||||||
|
camel_oil_order ||--o{ camel_oil_order_history : "1:N"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [sql/camel_oil_tables.sql](file://sql/camel_oil_tables.sql#L1-L119)
|
||||||
|
- [internal/consts/camel_oil.go](file://internal/consts/camel_oil.go#L7-L229)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [sql/camel_oil_tables.sql](file://sql/camel_oil_tables.sql#L1-L119)
|
||||||
|
|
||||||
|
## 状态管理与枚举
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class CamelOilAccountStatus {
|
||||||
|
+Pending : 0
|
||||||
|
+SendCode : 1
|
||||||
|
+Online : 2
|
||||||
|
+Paused : 3
|
||||||
|
+Invalid : 4
|
||||||
|
}
|
||||||
|
class CamelOilOrderStatus {
|
||||||
|
+Pending : 0
|
||||||
|
+Processing : 1
|
||||||
|
+Completed : 2
|
||||||
|
+Failed : 3
|
||||||
|
}
|
||||||
|
class CamelOilPayStatus {
|
||||||
|
+Unpaid : 0
|
||||||
|
+Paid : 1
|
||||||
|
+Refunded : 2
|
||||||
|
+Timeout : 3
|
||||||
|
}
|
||||||
|
class CamelOilNotifyStatus {
|
||||||
|
+Pending : 0
|
||||||
|
+Success : 1
|
||||||
|
+Failed : 2
|
||||||
|
}
|
||||||
|
class CamelOilAccountChangeType {
|
||||||
|
+Create
|
||||||
|
+Login
|
||||||
|
+Offline
|
||||||
|
+LoginFail
|
||||||
|
+Pause
|
||||||
|
+Resume
|
||||||
|
+Invalidate
|
||||||
|
+OrderBind
|
||||||
|
+OrderComplete
|
||||||
|
+Update
|
||||||
|
+Delete
|
||||||
|
}
|
||||||
|
class CamelOilOrderChangeType {
|
||||||
|
+Create
|
||||||
|
+Submit
|
||||||
|
+GetPayUrl
|
||||||
|
+CheckPay
|
||||||
|
+Paid
|
||||||
|
+Timeout
|
||||||
|
+Fail
|
||||||
|
+CallbackSuccess
|
||||||
|
+CallbackFail
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [internal/consts/camel_oil.go](file://internal/consts/camel_oil.go#L7-L183)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [internal/consts/camel_oil.go](file://internal/consts/camel_oil.go#L7-L183)
|
||||||
|
|
||||||
|
## 业务逻辑分析
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A[开始] --> B{检查可用订单容量}
|
||||||
|
B --> |≤50| C[触发账号登录任务]
|
||||||
|
B --> |>50| D[无需登录]
|
||||||
|
C --> E[从野猪平台获取手机号]
|
||||||
|
E --> F[创建账号记录]
|
||||||
|
F --> G[调用骆驼加油平台发送验证码]
|
||||||
|
G --> H{发送成功?}
|
||||||
|
H --> |是| I[更新状态为发送验证码]
|
||||||
|
H --> |否| J[标记账号失效]
|
||||||
|
I --> K[验证码检测任务]
|
||||||
|
K --> L{收到验证码?}
|
||||||
|
L --> |是| M[调用骆驼加油平台登录]
|
||||||
|
L --> |否| N[继续等待]
|
||||||
|
M --> O{登录成功?}
|
||||||
|
O --> |是| P[保存Token,更新状态为在线]
|
||||||
|
O --> |否| Q[标记账号登录失败]
|
||||||
|
P --> R[账号可用于下单]
|
||||||
|
Q --> S[标记账号失效]
|
||||||
|
T[订单支付状态检测] --> U[查询待支付订单]
|
||||||
|
U --> V{存在订单?}
|
||||||
|
V --> |是| W[检测支付状态]
|
||||||
|
W --> X{已支付?}
|
||||||
|
X --> |是| Y[更新订单为已支付]
|
||||||
|
X --> |否| Z{超1小时?}
|
||||||
|
Z --> |是| AA[标记支付超时]
|
||||||
|
Z --> |否| AB[继续等待]
|
||||||
|
Y --> AC[完成]
|
||||||
|
AA --> AC
|
||||||
|
AB --> AC
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [internal/logic/camel_oil/cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L19-L241)
|
||||||
|
- [internal/logic/camel_oil/account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
- [internal/logic/camel_oil/order.go](file://internal/logic/camel_oil/order.go#L1-L165)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [internal/logic/camel_oil/cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L19-L241)
|
||||||
|
- [internal/logic/camel_oil/account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
- [internal/logic/camel_oil/order.go](file://internal/logic/camel_oil/order.go#L1-L165)
|
||||||
172
.qoder/repowiki/zh/content/Camel Oil Order Management.md
Normal file
172
.qoder/repowiki/zh/content/Camel Oil Order Management.md
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
# 骆驼油订单管理
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档引用文件**
|
||||||
|
- [main.go](file://main.go)
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [camel_oil_v1_list_order.go](file://internal/controller/camel_oil/camel_oil_v1_list_order.go)
|
||||||
|
- [camel_oil_v1_order_detail.go](file://internal/controller/camel_oil/camel_oil_v1_order_detail.go)
|
||||||
|
- [camel_oil_v1_order_callback.go](file://internal/controller/camel_oil/camel_oil_v1_order_callback.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [简介](#简介)
|
||||||
|
2. [项目结构](#项目结构)
|
||||||
|
3. [核心组件](#核心组件)
|
||||||
|
4. [架构概览](#架构概览)
|
||||||
|
5. [详细组件分析](#详细组件分析)
|
||||||
|
6. [依赖分析](#依赖分析)
|
||||||
|
7. [性能考虑](#性能考虑)
|
||||||
|
8. [故障排除指南](#故障排除指南)
|
||||||
|
9. [结论](#结论)
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
本系统为骆驼油平台的订单管理服务,提供账号管理、订单提交、状态查询、回调处理等核心功能。系统基于GoFrame框架构建,采用分层架构设计,支持高并发订单处理与自动化任务调度。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
骆驼油订单管理模块位于`api/camel_oil`目录下,包含v1版本API定义,控制器位于`internal/controller/camel_oil`,服务接口定义在`internal/service/camel_oil.go`,相关常量定义于`internal/consts/camel_oil.go`。系统通过API层、控制器层、服务层三层架构实现功能解耦。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[API层] --> B[控制器层]
|
||||||
|
B --> C[服务层]
|
||||||
|
C --> D[数据访问层]
|
||||||
|
A --> |HTTP请求| B
|
||||||
|
B --> |调用| C
|
||||||
|
C --> |操作| D
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/controller/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
**章节来源**
|
||||||
|
- [main.go](file://main.go#L24-L54)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
系统核心组件包括订单管理、账号管理、支付回调、状态查询等功能。通过`ICamelOil`接口定义了完整的业务能力,包括订单提交、列表查询、详情获取、回调触发等操作。服务层实现具体业务逻辑,控制器层负责请求转发。
|
||||||
|
|
||||||
|
**章节来源**
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go#L15-L85)
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go#L11-L164)
|
||||||
|
|
||||||
|
## 架构概览
|
||||||
|
系统采用典型的分层架构模式,从上至下分为API接口层、控制器层、服务层和数据访问层。API层定义RESTful接口规范,控制器层处理HTTP请求并调用服务层,服务层封装核心业务逻辑,数据层负责持久化操作。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
subgraph "API层"
|
||||||
|
A[SubmitOrder]
|
||||||
|
B[ListOrder]
|
||||||
|
C[OrderDetail]
|
||||||
|
D[OrderCallback]
|
||||||
|
end
|
||||||
|
subgraph "控制器层"
|
||||||
|
E[camel_oil_v1_submit_order]
|
||||||
|
F[camel_oil_v1_list_order]
|
||||||
|
G[camel_oil_v1_order_detail]
|
||||||
|
H[camel_oil_v1_order_callback]
|
||||||
|
end
|
||||||
|
subgraph "服务层"
|
||||||
|
I[SubmitOrder]
|
||||||
|
J[ListOrder]
|
||||||
|
K[OrderDetail]
|
||||||
|
L[TriggerOrderCallback]
|
||||||
|
end
|
||||||
|
A --> E
|
||||||
|
B --> F
|
||||||
|
C --> G
|
||||||
|
D --> H
|
||||||
|
E --> I
|
||||||
|
F --> J
|
||||||
|
G --> K
|
||||||
|
H --> L
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [camel_oil_v1_list_order.go](file://internal/controller/camel_oil/camel_oil_v1_list_order.go)
|
||||||
|
- [camel_oil_v1_order_detail.go](file://internal/controller/camel_oil/camel_oil_v1_order_detail.go)
|
||||||
|
- [camel_oil_v1_order_callback.go](file://internal/controller/camel_oil/camel_oil_v1_order_callback.go)
|
||||||
|
|
||||||
|
## 详细组件分析
|
||||||
|
|
||||||
|
### 订单管理组件分析
|
||||||
|
订单管理组件提供完整的订单生命周期管理功能,包括创建、查询、状态更新和回调处理。系统通过`SubmitOrderReq`结构体定义订单提交参数,包含金额、商户订单号等必要字段。
|
||||||
|
|
||||||
|
#### 订单提交流程
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant 客户端
|
||||||
|
participant API
|
||||||
|
participant 控制器
|
||||||
|
participant 服务层
|
||||||
|
客户端->>API : POST /jd-v2/order/submit
|
||||||
|
API->>控制器 : 转发请求
|
||||||
|
控制器->>服务层 : 调用SubmitOrder
|
||||||
|
服务层-->>控制器 : 返回订单信息
|
||||||
|
控制器-->>API : 返回响应
|
||||||
|
API-->>客户端 : 返回订单号和支付链接
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go#L11-L24)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
#### 订单查询功能
|
||||||
|
系统提供多种订单查询接口,支持按订单号、商户订单号、账号ID、状态等条件进行筛选。`ListOrderReq`结构体定义了分页查询参数和过滤条件。
|
||||||
|
|
||||||
|
**章节来源**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go#L26-L61)
|
||||||
|
- [camel_oil_v1_list_order.go](file://internal/controller/camel_oil/camel_oil_v1_list_order.go)
|
||||||
|
|
||||||
|
### 账号管理组件分析
|
||||||
|
账号管理组件负责维护骆驼油平台账号的状态和使用情况,包括账号创建、状态更新、历史记录等功能。
|
||||||
|
|
||||||
|
#### 账号状态管理
|
||||||
|
系统定义了完整的账号状态机,通过`CamelOilAccountStatus`常量管理账号生命周期。每个状态变更都会记录到历史表中,便于追踪和审计。
|
||||||
|
|
||||||
|
**章节来源**
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go#L11-L40)
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
|
||||||
|
## 依赖分析
|
||||||
|
系统主要依赖GoFrame框架提供的基础能力,包括路由、数据库访问、日志记录等。通过`main.go`中的import语句引入必要模块,服务注册机制确保各组件正确初始化。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
A[骆驼油服务] --> B[GoFrame框架]
|
||||||
|
A --> C[MySQL数据库]
|
||||||
|
A --> D[Redis缓存]
|
||||||
|
A --> E[OpenTelemetry]
|
||||||
|
B --> F[路由系统]
|
||||||
|
B --> G[日志系统]
|
||||||
|
B --> H[配置管理]
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [main.go](file://main.go#L3-L17)
|
||||||
|
- [go.mod](file://go.mod)
|
||||||
|
|
||||||
|
**章节来源**
|
||||||
|
- [main.go](file://main.go#L1-L56)
|
||||||
|
|
||||||
|
## 性能考虑
|
||||||
|
系统设计考虑了高并发场景下的性能表现,通过连接池、缓存机制、异步处理等方式提升响应速度。定时任务如`CronOrderPaymentCheckTask`定期检查订单支付状态,避免实时查询带来的性能压力。
|
||||||
|
|
||||||
|
## 故障排除指南
|
||||||
|
常见问题包括订单提交失败、支付状态不更新、账号登录异常等。建议检查服务日志、数据库连接状态、第三方接口可用性。通过`OrderHistory`接口可查询订单变更历史,辅助问题定位。
|
||||||
|
|
||||||
|
**章节来源**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go#L102-L123)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go#L75-L78)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
骆驼油订单管理系统提供了完整的订单处理能力,架构清晰,功能完备。通过分层设计实现了良好的可维护性和扩展性,适合处理大规模订单业务场景。
|
||||||
216
.qoder/repowiki/zh/content/外部集成/Camel Oil Account Management.md
Normal file
216
.qoder/repowiki/zh/content/外部集成/Camel Oil Account Management.md
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
# 骆驼加油账号管理
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档引用的文件**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [camel_oil_new.go](file://internal/controller/camel_oil/camel_oil_new.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [camel_oil_v1_list_order.go](file://internal/controller/camel_oil/camel_oil_v1_list_order.go)
|
||||||
|
- [camel_oil_v1_order_detail.go](file://internal/controller/camel_oil/camel_oil_v1_order_detail.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [简介](#简介)
|
||||||
|
2. [项目结构](#项目结构)
|
||||||
|
3. [核心组件](#核心组件)
|
||||||
|
4. [架构概述](#架构概述)
|
||||||
|
5. [详细组件分析](#详细组件分析)
|
||||||
|
6. [依赖分析](#依赖分析)
|
||||||
|
7. [性能考虑](#性能考虑)
|
||||||
|
8. [故障排除指南](#故障排除指南)
|
||||||
|
9. [结论](#结论)
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
本系统为骆驼加油平台的账号与订单管理模块,提供完整的账号生命周期管理、订单处理及状态追踪功能。系统通过API接口实现账号查询、状态检测、订单提交与查询等核心业务功能,支持高并发下的稳定运行。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
骆驼加油模块采用分层架构设计,包含API定义、控制器、服务层和数据访问层。主要目录结构如下:
|
||||||
|
- `api/camel_oil/`:API接口定义
|
||||||
|
- `internal/controller/camel_oil/`:控制器层
|
||||||
|
- `internal/service/camel_oil.go`:服务层主入口
|
||||||
|
- `internal/consts/camel_oil.go`:常量定义
|
||||||
|
- `sql/camel_oil_tables.sql`:数据库表结构
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[API接口] --> B[Controller]
|
||||||
|
B --> C[Service]
|
||||||
|
C --> D[DAO]
|
||||||
|
D --> E[(数据库)]
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_new.go](file://internal/controller/camel_oil/camel_oil_new.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_new.go](file://internal/controller/camel_oil/camel_oil_new.go)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
系统核心功能包括账号管理、订单处理两大模块。账号管理支持状态查询、历史记录查看;订单处理支持提交、查询、回调等功能。所有接口均通过统一的服务入口进行调度。
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
|
||||||
|
## 架构概述
|
||||||
|
系统采用GoFrame框架构建,遵循MVC设计模式。前端请求通过API路由进入Controller层,由Controller调用Service层处理业务逻辑,最终通过DAO层操作数据库。Redis用于分布式锁控制并发访问。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
Client[客户端] --> API[API接口]
|
||||||
|
API --> Controller[控制器]
|
||||||
|
Controller --> Service[服务层]
|
||||||
|
Service --> DAO[数据访问层]
|
||||||
|
DAO --> DB[(MySQL)]
|
||||||
|
Service --> Cache[(Redis)]
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_new.go](file://internal/controller/camel_oil/camel_oil_new.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
## 详细组件分析
|
||||||
|
|
||||||
|
### 账号管理分析
|
||||||
|
账号管理模块提供账号列表查询、状态检测、历史记录等功能。系统通过状态机管理账号生命周期,支持待登录、在线、暂停、失效等多种状态。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class AccountListItem {
|
||||||
|
+int64 AccountId
|
||||||
|
+string AccountName
|
||||||
|
+string Phone
|
||||||
|
+int Status
|
||||||
|
+string StatusText
|
||||||
|
+int DailyOrderCount
|
||||||
|
+string DailyOrderDate
|
||||||
|
+int TotalOrderCount
|
||||||
|
+*gtime.Time LastUsedAt
|
||||||
|
+*gtime.Time LastLoginAt
|
||||||
|
+*gtime.Time TokenExpireAt
|
||||||
|
+int RemainingOrders
|
||||||
|
+string FailureReason
|
||||||
|
+string Remark
|
||||||
|
+*gtime.Time CreatedAt
|
||||||
|
+*gtime.Time UpdatedAt
|
||||||
|
}
|
||||||
|
class ListAccountReq {
|
||||||
|
+CommonPageReq Meta
|
||||||
|
+int Page
|
||||||
|
+int Limit
|
||||||
|
+int Status
|
||||||
|
+string Keyword
|
||||||
|
}
|
||||||
|
class CheckAccountReq {
|
||||||
|
+CommonMeta Meta
|
||||||
|
+int64 AccountId
|
||||||
|
}
|
||||||
|
ListAccountReq --> AccountListItem : "返回列表"
|
||||||
|
CheckAccountReq --> AccountListItem : "返回详情"
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [account.go](file://api/camel_oil/v1/account.go)
|
||||||
|
- [camel_oil_v1_list_account.go](file://internal/controller/camel_oil/camel_oil_v1_list_account.go)
|
||||||
|
|
||||||
|
### 订单处理分析
|
||||||
|
订单处理模块负责订单的创建、查询、状态更新和回调通知。系统通过分布式锁保证订单处理的原子性,防止重复提交。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Client
|
||||||
|
participant Controller
|
||||||
|
participant Service
|
||||||
|
participant DB
|
||||||
|
Client->>Controller : SubmitOrder(金额, 商户订单号)
|
||||||
|
Controller->>Service : 调用SubmitOrder
|
||||||
|
Service->>DB : 检查可用账号
|
||||||
|
DB-->>Service : 返回账号信息
|
||||||
|
Service->>Service : 分配账号并创建订单
|
||||||
|
Service-->>Controller : 返回订单号和支付链接
|
||||||
|
Controller-->>Client : 返回响应
|
||||||
|
Note over Client,DB : 订单提交流程
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [order.go](file://api/camel_oil/v1/order.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
### 状态管理分析
|
||||||
|
系统定义了完整的状态转换机制,涵盖账号状态、订单状态、支付状态等多个维度。状态变更均记录到历史表中,便于追踪和审计。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> 待登录
|
||||||
|
待登录 --> 登录中 : 开始登录
|
||||||
|
登录中 --> 在线 : 登录成功
|
||||||
|
登录中 --> 已失效 : 登录失败
|
||||||
|
在线 --> 已暂停 : 达到每日上限
|
||||||
|
已暂停 --> 在线 : 每日重置
|
||||||
|
在线 --> 已失效 : 长时间未使用
|
||||||
|
已失效 --> [*]
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
|
||||||
|
## 依赖分析
|
||||||
|
系统依赖于多个外部组件和内部模块。主要依赖关系如下:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[骆驼加油API] --> B[用户中心]
|
||||||
|
A --> C[支付系统]
|
||||||
|
A --> D[通知服务]
|
||||||
|
A --> E[Redis缓存]
|
||||||
|
A --> F[MySQL数据库]
|
||||||
|
B --> G[认证服务]
|
||||||
|
C --> H[支付宝网关]
|
||||||
|
style A fill:#f9f,stroke:#333
|
||||||
|
style F fill:#bbf,stroke:#333
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
## 性能考虑
|
||||||
|
系统在设计时充分考虑了性能因素。通过Redis分布式锁控制并发,避免热点账号的竞争;使用数据库索引优化查询性能;设置合理的超时机制防止资源占用。
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
|
||||||
|
## 故障排除指南
|
||||||
|
常见问题包括账号无法登录、订单提交失败等。排查时应首先检查日志中的错误码,根据错误码定位问题根源。对于分布式锁相关问题,需检查Redis连接状态。
|
||||||
|
|
||||||
|
**本节来源**
|
||||||
|
- [camel_oil.go](file://internal/consts/camel_oil.go)
|
||||||
|
- [camel_oil_v1_check_account.go](file://internal/controller/camel_oil/camel_oil_v1_check_account.go)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
骆驼加油账号管理系统实现了完整的账号与订单管理功能,具备良好的扩展性和稳定性。通过合理的设计和优化,能够满足高并发场景下的业务需求。
|
||||||
211
.qoder/repowiki/zh/content/外部集成/Pig Integration.md
Normal file
211
.qoder/repowiki/zh/content/外部集成/Pig Integration.md
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
# Pig Integration
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档中引用的文件**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go)
|
||||||
|
- [api_test.go](file://utility/integration/pig/api_test.go)
|
||||||
|
- [account_login.go](file://internal/logic/camel_oil/account_login.go)
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go)
|
||||||
|
- [cache.go](file://utility/cache/cache.go)
|
||||||
|
- [camel_oil_api.go](file://utility/integration/camel_oil_api/api.go)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [介绍](#介绍)
|
||||||
|
2. [项目结构](#项目结构)
|
||||||
|
3. [核心组件](#核心组件)
|
||||||
|
4. [架构概述](#架构概述)
|
||||||
|
5. [详细组件分析](#详细组件分析)
|
||||||
|
6. [依赖分析](#依赖分析)
|
||||||
|
7. [性能考虑](#性能考虑)
|
||||||
|
8. [故障排除指南](#故障排除指南)
|
||||||
|
9. [结论](#结论)
|
||||||
|
|
||||||
|
## 介绍
|
||||||
|
Pig Integration 文档详细介绍了在 kami_backend 项目中集成 Pig 接码平台的实现。该集成主要用于骆驼加油业务场景中的手机号获取和验证码检测。系统通过与 Pig 平台的 API 交互,自动化完成账号注册、验证码接收和登录流程,从而支持批量账号管理和订单处理。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
该项目是一个基于 Go 语言的后端服务,采用模块化设计,主要分为 API 接口层、业务逻辑层、数据访问层和集成服务层。Pig 集成位于 `utility/integration/pig` 目录下,作为独立的集成模块被业务逻辑层调用。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
subgraph "API Layer"
|
||||||
|
API[api/]
|
||||||
|
end
|
||||||
|
subgraph "Business Logic Layer"
|
||||||
|
Logic[internal/logic/]
|
||||||
|
end
|
||||||
|
subgraph "Integration Layer"
|
||||||
|
Integration[utility/integration/]
|
||||||
|
Pig[pig/]
|
||||||
|
CamelOilApi[camel_oil_api/]
|
||||||
|
KamiGateway[kami_gateway/]
|
||||||
|
end
|
||||||
|
subgraph "Data Access Layer"
|
||||||
|
DAO[internal/dao/]
|
||||||
|
end
|
||||||
|
API --> Logic
|
||||||
|
Logic --> Integration
|
||||||
|
Integration --> Pig
|
||||||
|
Integration --> CamelOilApi
|
||||||
|
Logic --> DAO
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [project_structure](file://project_structure)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [project_structure](file://project_structure)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
Pig 集成的核心组件包括 `InternalClient` 结构体及其方法,如 `NewClient`、`getToken`、`GetAccountInfo` 和 `CheckVerifyCode`。这些组件共同实现了与 Pig 平台的认证、账号信息获取和验证码检测功能。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
|
||||||
|
## 架构概述
|
||||||
|
Pig 集成的架构设计遵循了客户端-服务器模式,其中 `InternalClient` 作为客户端与 Pig 平台的服务器进行 HTTP 通信。该集成通过缓存机制优化了 token 的获取,避免了频繁的认证请求,提高了系统的整体性能。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Logic as 骆驼油业务逻辑
|
||||||
|
participant PigClient as Pig客户端
|
||||||
|
participant PigServer as Pig服务器
|
||||||
|
Logic->>PigClient : GetAccountInfo()
|
||||||
|
PigClient->>PigClient : getToken()
|
||||||
|
PigClient->>PigClient : 检查缓存中的token
|
||||||
|
alt 缓存命中
|
||||||
|
PigClient-->>PigClient : 返回缓存的token
|
||||||
|
else 缓存未命中
|
||||||
|
PigClient->>PigServer : POST /sms/?api=login
|
||||||
|
PigServer-->>PigClient : 返回token
|
||||||
|
PigClient->>PigClient : 缓存token
|
||||||
|
end
|
||||||
|
PigClient->>PigServer : POST /sms?api=getPhone
|
||||||
|
PigServer-->>PigClient : 返回手机号
|
||||||
|
PigClient-->>Logic : 返回手机号
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
|
||||||
|
## 详细组件分析
|
||||||
|
|
||||||
|
### Pig 客户端分析
|
||||||
|
Pig 客户端实现了与 Pig 接码平台的完整交互流程,包括认证、账号信息获取和验证码检测。
|
||||||
|
|
||||||
|
#### Pig 客户端结构
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class InternalClient {
|
||||||
|
+Client *gclient.Client
|
||||||
|
+NewClient() *InternalClient
|
||||||
|
+getToken(ctx context.Context) (string, error)
|
||||||
|
+GetAccountInfo(ctx context.Context) (string, error)
|
||||||
|
+CheckVerifyCode(ctx context.Context, phone string) (code string, received bool, err error)
|
||||||
|
}
|
||||||
|
InternalClient --> gclient.Client : "使用"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
|
||||||
|
#### 账号登录流程
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
Start([开始登录]) --> GetPhone["获取手机号 (GetAccountInfo)"]
|
||||||
|
GetPhone --> SendCaptcha["发送验证码"]
|
||||||
|
SendCaptcha --> WaitCaptcha["等待验证码"]
|
||||||
|
WaitCaptcha --> CheckCode["检测验证码 (CheckVerifyCode)"]
|
||||||
|
CheckCode --> CodeReceived{"验证码已接收?"}
|
||||||
|
CodeReceived --> |否| WaitCaptcha
|
||||||
|
CodeReceived --> |是| Login["执行登录"]
|
||||||
|
Login --> End([登录完成])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L1-L242)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
- [account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
|
||||||
|
### 验证码检测任务分析
|
||||||
|
验证码检测任务是骆驼加油业务中的关键定时任务,负责定期检查待验证账号的验证码接收情况,并完成登录流程。
|
||||||
|
|
||||||
|
#### 验证码检测任务流程
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
Start([开始任务]) --> QueryAccounts["查询待验证码账号"]
|
||||||
|
QueryAccounts --> Loop{"遍历账号"}
|
||||||
|
Loop --> GetPhone["获取账号手机号"]
|
||||||
|
GetPhone --> CheckCode["检测验证码 (CheckVerifyCode)"]
|
||||||
|
CheckCode --> CodeReceived{"验证码已接收?"}
|
||||||
|
CodeReceived --> |否| ContinueLoop["继续下一个账号"]
|
||||||
|
CodeReceived --> |是| ExecuteLogin["执行登录"]
|
||||||
|
ExecuteLogin --> UpdateStatus["更新账号状态为在线"]
|
||||||
|
UpdateStatus --> LogSuccess["记录成功日志"]
|
||||||
|
ContinueLoop --> Loop
|
||||||
|
Loop --> EndLoop{"遍历完成?"}
|
||||||
|
EndLoop --> |是| End([任务完成])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L169-L241)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L169-L241)
|
||||||
|
|
||||||
|
## 依赖分析
|
||||||
|
Pig 集成依赖于多个内部和外部组件,形成了一个复杂的依赖网络。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
PigClient[utility/integration/pig@InternalClient] --> GClient[github.com/gogf/gf/v2/net/gclient]
|
||||||
|
PigClient --> Cache[utility/cache]
|
||||||
|
PigClient --> GLog[github.com/gogf/gf/v2/os/glog]
|
||||||
|
PigClient --> GTime[github.com/gogf/gf/v2/os/gtime]
|
||||||
|
CamelOilLogic[internal/logic/camel_oil@sCamelOil] --> PigClient
|
||||||
|
CamelOilLogic --> CamelOilApi[utility/integration/camel_oil_api]
|
||||||
|
CamelOilLogic --> DAO[internal/dao]
|
||||||
|
CamelOilLogic --> Config[utility/config]
|
||||||
|
Cache --> Redis[github.com/gogf/gf/v2/contrib/nosql/redis/v2]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
- [account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L1-L242)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
- [account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L1-L242)
|
||||||
|
|
||||||
|
## 性能考虑
|
||||||
|
Pig 集成在设计时充分考虑了性能优化,主要体现在以下几个方面:
|
||||||
|
|
||||||
|
1. **Token 缓存**:通过 Redis 缓存 Pig 平台的认证 token,有效期为 24 小时,避免了频繁的认证请求。
|
||||||
|
2. **单例模式**:`InternalClient` 使用 sync.OnceFunc 确保全局唯一实例,减少了资源消耗。
|
||||||
|
3. **HTTP 客户端复用**:使用 g.Client() 创建的客户端实例被复用,避免了频繁创建和销毁 HTTP 客户端的开销。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
- [cache.go](file://utility/cache/cache.go#L1-L220)
|
||||||
|
|
||||||
|
## 故障排除指南
|
||||||
|
在使用 Pig 集成时可能遇到以下常见问题及解决方案:
|
||||||
|
|
||||||
|
1. **获取 token 失败**:检查 Pig 平台的用户名和密码是否正确,确保网络连接正常。
|
||||||
|
2. **获取手机号失败**:确认 Pig 平台是否有可用的手机号资源,检查 API 接口是否正常。
|
||||||
|
3. **验证码检测超时**:增加检测间隔时间,或检查 Pig 平台的短信发送是否正常。
|
||||||
|
4. **登录失败**:检查骆驼加油平台的登录接口是否正常,确认验证码是否正确。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [api.go](file://utility/integration/pig/api.go#L1-L116)
|
||||||
|
- [account_login.go](file://internal/logic/camel_oil/account_login.go#L1-L137)
|
||||||
|
- [cron_tasks.go](file://internal/logic/camel_oil/cron_tasks.go#L1-L242)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
Pig Integration 在 kami_backend 项目中扮演着关键角色,为骆驼加油业务提供了稳定的手机号获取和验证码检测能力。该集成设计合理,性能优化到位,通过与骆驼加油平台和内部业务逻辑的紧密配合,实现了自动化账号管理和订单处理流程。未来可以考虑增加更多的错误处理和重试机制,进一步提高系统的稳定性和可靠性。
|
||||||
@@ -0,0 +1,346 @@
|
|||||||
|
# 骆驼加油数据库模式
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档中引用的文件**
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/model/entity/v_1_camel_oil_account.go)
|
||||||
|
- [v_1_camel_oil_order.go](file://internal/model/entity/v_1_camel_oil_order.go)
|
||||||
|
- [v_1_camel_oil_account_history.go](file://internal/model/entity/v_1_camel_oil_account_history.go)
|
||||||
|
- [v_1_camel_oil_order_history.go](file://internal/model/entity/v_1_camel_oil_order_history.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [camel_oil_v1_order_callback.go](file://internal/controller/camel_oil/camel_oil_v1_order_callback.go)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [简介](#简介)
|
||||||
|
2. [项目结构](#项目结构)
|
||||||
|
3. [核心组件](#核心组件)
|
||||||
|
4. [架构概述](#架构概述)
|
||||||
|
5. [详细组件分析](#详细组件分析)
|
||||||
|
6. [依赖分析](#依赖分析)
|
||||||
|
7. [性能考虑](#性能考虑)
|
||||||
|
8. [故障排除指南](#故障排除指南)
|
||||||
|
9. [结论](#结论)
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
本文档详细描述了骆驼加油平台的数据库模式,包括账号管理、订单处理和历史记录等核心功能。该系统主要用于管理骆驼加油平台的账号登录状态、订单生命周期以及相关的历史变更记录。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
骆驼加油模块的代码结构遵循分层设计原则,主要包含API接口、控制器、数据访问对象(DAO)和实体模型等组件。数据库表结构定义在SQL文件中,而对应的Go语言模型则分布在model目录下。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
subgraph "API层"
|
||||||
|
API[api/camel_oil/v1]
|
||||||
|
end
|
||||||
|
subgraph "控制器层"
|
||||||
|
Controller[internal/controller/camel_oil]
|
||||||
|
end
|
||||||
|
subgraph "服务层"
|
||||||
|
Service[internal/service/camel_oil.go]
|
||||||
|
end
|
||||||
|
subgraph "逻辑层"
|
||||||
|
Logic[internal/logic/camel_oil]
|
||||||
|
end
|
||||||
|
subgraph "数据访问层"
|
||||||
|
DAO[internal/dao]
|
||||||
|
end
|
||||||
|
subgraph "模型层"
|
||||||
|
Model[internal/model/entity]
|
||||||
|
end
|
||||||
|
subgraph "数据库"
|
||||||
|
DB[sql/camel_oil_tables.sql]
|
||||||
|
end
|
||||||
|
API --> Controller
|
||||||
|
Controller --> Service
|
||||||
|
Service --> Logic
|
||||||
|
Logic --> DAO
|
||||||
|
DAO --> Model
|
||||||
|
Model --> DB
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [service.go](file://internal/service/camel_oil.go)
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/model/entity/v_1_camel_oil_account.go)
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [camel_oil.go](file://api/camel_oil/camel_oil.go)
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
骆驼加油系统的核心组件包括四个主要数据库表:账号表、订单表、账号历史表和订单历史表。这些表共同构成了系统的数据基础,支持账号管理、订单处理和操作审计等功能。
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/model/entity/v_1_camel_oil_account.go)
|
||||||
|
- [v_1_camel_oil_order.go](file://internal/model/entity/v_1_camel_oil_order.go)
|
||||||
|
|
||||||
|
## 架构概述
|
||||||
|
骆驼加油系统的数据架构采用标准的分层设计,通过实体-关系模型来管理平台的核心业务数据。系统通过外键约束确保数据完整性,并使用软删除机制保留历史数据。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
erDiagram
|
||||||
|
CAMEL_OIL_ACCOUNT {
|
||||||
|
bigint id PK
|
||||||
|
varchar(128) account_name
|
||||||
|
varchar(20) phone UK
|
||||||
|
text token
|
||||||
|
tinyint status
|
||||||
|
datetime token_expire_at
|
||||||
|
datetime last_login_at
|
||||||
|
datetime last_used_at
|
||||||
|
int daily_order_count
|
||||||
|
date daily_order_date
|
||||||
|
int total_order_count
|
||||||
|
text failure_reason
|
||||||
|
text remark
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
CAMEL_OIL_ORDER {
|
||||||
|
bigint id PK
|
||||||
|
varchar(64) order_no UK
|
||||||
|
varchar(128) merchant_order_id
|
||||||
|
bigint account_id FK
|
||||||
|
varchar(128) account_name
|
||||||
|
varchar(128) platform_order_no
|
||||||
|
decimal(10,2) amount
|
||||||
|
text alipay_url
|
||||||
|
tinyint status
|
||||||
|
tinyint pay_status
|
||||||
|
tinyint notify_status
|
||||||
|
int notify_count
|
||||||
|
datetime last_check_at
|
||||||
|
datetime paid_at
|
||||||
|
text attach
|
||||||
|
text failure_reason
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
CAMEL_OIL_ACCOUNT_HISTORY {
|
||||||
|
bigint id PK
|
||||||
|
varchar(36) history_uuid UK
|
||||||
|
bigint account_id FK
|
||||||
|
varchar(32) change_type
|
||||||
|
tinyint status_before
|
||||||
|
tinyint status_after
|
||||||
|
int failure_count
|
||||||
|
text remark
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
CAMEL_OIL_ORDER_HISTORY {
|
||||||
|
bigint id PK
|
||||||
|
varchar(36) history_uuid UK
|
||||||
|
varchar(64) order_no FK
|
||||||
|
varchar(32) change_type
|
||||||
|
bigint account_id FK
|
||||||
|
varchar(128) account_name
|
||||||
|
text raw_data
|
||||||
|
text remark
|
||||||
|
datetime created_at
|
||||||
|
datetime updated_at
|
||||||
|
datetime deleted_at
|
||||||
|
}
|
||||||
|
CAMEL_OIL_ACCOUNT ||--o{ CAMEL_OIL_ORDER : "拥有"
|
||||||
|
CAMEL_OIL_ACCOUNT ||--o{ CAMEL_OIL_ACCOUNT_HISTORY : "产生"
|
||||||
|
CAMEL_OIL_ORDER ||--o{ CAMEL_OIL_ORDER_HISTORY : "产生"
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/model/entity/v_1_camel_oil_account.go)
|
||||||
|
- [v_1_camel_oil_order.go](file://internal/model/entity/v_1_camel_oil_order.go)
|
||||||
|
|
||||||
|
## 详细组件分析
|
||||||
|
|
||||||
|
### 账号管理组件分析
|
||||||
|
骆驼加油账号管理组件负责维护平台账号的生命周期,包括登录状态、Token管理和使用统计等功能。
|
||||||
|
|
||||||
|
#### 账号实体类图
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class V1CamelOilAccount {
|
||||||
|
+int64 id
|
||||||
|
+string accountName
|
||||||
|
+string phone
|
||||||
|
+string token
|
||||||
|
+int status
|
||||||
|
+gtime.Time tokenExpireAt
|
||||||
|
+gtime.Time lastLoginAt
|
||||||
|
+gtime.Time lastUsedAt
|
||||||
|
+int dailyOrderCount
|
||||||
|
+gtime.Time dailyOrderDate
|
||||||
|
+int totalOrderCount
|
||||||
|
+string failureReason
|
||||||
|
+string remark
|
||||||
|
+gtime.Time createdAt
|
||||||
|
+gtime.Time updatedAt
|
||||||
|
+gtime.Time deletedAt
|
||||||
|
}
|
||||||
|
class V1CamelOilAccountHistory {
|
||||||
|
+int64 id
|
||||||
|
+string historyUuid
|
||||||
|
+int64 accountId
|
||||||
|
+string changeType
|
||||||
|
+int statusBefore
|
||||||
|
+int statusAfter
|
||||||
|
+int failureCount
|
||||||
|
+string remark
|
||||||
|
+gtime.Time createdAt
|
||||||
|
+gtime.Time updatedAt
|
||||||
|
+gtime.Time deletedAt
|
||||||
|
}
|
||||||
|
V1CamelOilAccount --> V1CamelOilAccountHistory : "生成"
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/model/entity/v_1_camel_oil_account.go)
|
||||||
|
- [v_1_camel_oil_account_history.go](file://internal/model/entity/v_1_camel_oil_account_history.go)
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [v_1_camel_oil_account.go](file://internal/model/entity/v_1_camel_oil_account.go)
|
||||||
|
- [v_1_camel_oil_account_history.go](file://internal/model/entity/v_1_camel_oil_account_history.go)
|
||||||
|
|
||||||
|
### 订单处理组件分析
|
||||||
|
订单处理组件负责管理骆驼加油平台的订单生命周期,从创建到支付完成或失败的全过程。
|
||||||
|
|
||||||
|
#### 订单实体类图
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class V1CamelOilOrder {
|
||||||
|
+int64 id
|
||||||
|
+string orderNo
|
||||||
|
+string merchantOrderId
|
||||||
|
+int64 accountId
|
||||||
|
+string accountName
|
||||||
|
+string platformOrderNo
|
||||||
|
+decimal amount
|
||||||
|
+string alipayUrl
|
||||||
|
+int status
|
||||||
|
+int payStatus
|
||||||
|
+int notifyStatus
|
||||||
|
+int notifyCount
|
||||||
|
+gtime.Time lastCheckAt
|
||||||
|
+gtime.Time paidAt
|
||||||
|
+string attach
|
||||||
|
+string failureReason
|
||||||
|
+gtime.Time createdAt
|
||||||
|
+gtime.Time updatedAt
|
||||||
|
+gtime.Time deletedAt
|
||||||
|
}
|
||||||
|
class V1CamelOilOrderHistory {
|
||||||
|
+int64 id
|
||||||
|
+string historyUuid
|
||||||
|
+string orderNo
|
||||||
|
+string changeType
|
||||||
|
+int64 accountId
|
||||||
|
+string accountName
|
||||||
|
+string rawData
|
||||||
|
+string remark
|
||||||
|
+gtime.Time createdAt
|
||||||
|
+gtime.Time updatedAt
|
||||||
|
+gtime.Time deletedAt
|
||||||
|
}
|
||||||
|
V1CamelOilOrder --> V1CamelOilOrderHistory : "生成"
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [v_1_camel_oil_order.go](file://internal/model/entity/v_1_camel_oil_order.go)
|
||||||
|
- [v_1_camel_oil_order_history.go](file://internal/model/entity/v_1_camel_oil_order_history.go)
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [v_1_camel_oil_order.go](file://internal/model/entity/v_1_camel_oil_order.go)
|
||||||
|
- [v_1_camel_oil_order_history.go](file://internal/model/entity/v_1_camel_oil_order_history.go)
|
||||||
|
|
||||||
|
### API流程分析
|
||||||
|
骆驼加油系统的API流程展示了订单提交和回调处理的核心业务流程。
|
||||||
|
|
||||||
|
#### 订单提交流程序列图
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Client as "客户端"
|
||||||
|
participant Controller as "ControllerV1"
|
||||||
|
participant Service as "CamelOil Service"
|
||||||
|
Client->>Controller : SubmitOrder请求
|
||||||
|
Controller->>Service : 调用SubmitOrder方法
|
||||||
|
Service-->>Controller : 返回结果
|
||||||
|
Controller-->>Client : 返回响应
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
|
||||||
|
#### 回调处理流程序列图
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Client as "第三方平台"
|
||||||
|
participant Controller as "ControllerV1"
|
||||||
|
Client->>Controller : OrderCallback请求
|
||||||
|
Controller-->>Client : 返回未实现错误
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [camel_oil_v1_order_callback.go](file://internal/controller/camel_oil/camel_oil_v1_order_callback.go)
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [camel_oil_v1_submit_order.go](file://internal/controller/camel_oil/camel_oil_v1_submit_order.go)
|
||||||
|
- [camel_oil_v1_order_callback.go](file://internal/controller/camel_oil/camel_oil_v1_order_callback.go)
|
||||||
|
|
||||||
|
## 依赖分析
|
||||||
|
骆驼加油模块与其他系统组件存在明确的依赖关系,主要通过服务层进行交互。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
CamelOil[骆驼加油模块] --> GoFrame[GoFrame框架]
|
||||||
|
CamelOil --> Database[MySQL数据库]
|
||||||
|
CamelOil --> Utility[工具库]
|
||||||
|
CamelOil --> Internal[内部其他模块]
|
||||||
|
subgraph "内部依赖"
|
||||||
|
Internal --> Service[service模块]
|
||||||
|
Internal --> Model[model模块]
|
||||||
|
Internal --> DAO[dao模块]
|
||||||
|
Internal --> Logic[logic模块]
|
||||||
|
end
|
||||||
|
subgraph "外部依赖"
|
||||||
|
Utility --> Cache[缓存]
|
||||||
|
Utility --> Notify[通知服务]
|
||||||
|
Utility --> Monitor[监控服务]
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
**图示来源**
|
||||||
|
- [go.mod](file://go.mod)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [go.mod](file://go.mod)
|
||||||
|
- [camel_oil.go](file://internal/service/camel_oil.go)
|
||||||
|
|
||||||
|
## 性能考虑
|
||||||
|
骆驼加油系统的数据库设计考虑了性能优化,主要体现在以下几个方面:
|
||||||
|
- 在关键字段上创建了适当的索引以提高查询效率
|
||||||
|
- 使用软删除而非物理删除来保留历史数据
|
||||||
|
- 对时间敏感的字段建立了复合索引
|
||||||
|
- 通过外键约束确保数据完整性的同时考虑了查询性能
|
||||||
|
|
||||||
|
## 故障排除指南
|
||||||
|
在使用骆驼加油系统时可能遇到的常见问题及解决方案:
|
||||||
|
|
||||||
|
1. **账号登录失败**:检查账号状态是否为"待登录",确认Token是否过期
|
||||||
|
2. **订单创建失败**:验证商户订单号是否唯一,检查账号状态是否正常
|
||||||
|
3. **回调处理异常**:当前回调功能尚未实现,需要开发相应的处理逻辑
|
||||||
|
4. **数据查询缓慢**:检查相关字段的索引是否存在,优化查询条件
|
||||||
|
|
||||||
|
**节来源**
|
||||||
|
- [camel_oil_tables.sql](file://sql/camel_oil_tables.sql)
|
||||||
|
- [camel_oil_v1_order_callback.go](file://internal/controller/camel_oil/camel_oil_v1_order_callback.go)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
骆驼加油系统的数据库模式设计合理,通过四个核心表实现了账号管理、订单处理和历史记录的完整功能。系统采用分层架构,代码结构清晰,便于维护和扩展。建议尽快实现订单回调功能,并进一步完善错误处理机制。
|
||||||
203
.qoder/repowiki/zh/content/项目概述/Graceful Shutdown Fix.md
Normal file
203
.qoder/repowiki/zh/content/项目概述/Graceful Shutdown Fix.md
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
# 优雅关闭修复
|
||||||
|
|
||||||
|
<cite>
|
||||||
|
**本文档引用的文件**
|
||||||
|
- [main.go](file://main.go)
|
||||||
|
- [cmd.go](file://internal/cmd/cmd.go)
|
||||||
|
- [pool.go](file://utility/pool/pool.go)
|
||||||
|
- [cron.go](file://utility/cron/cron.go)
|
||||||
|
- [config.go](file://utility/config/config.go)
|
||||||
|
</cite>
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
1. [简介](#简介)
|
||||||
|
2. [项目结构](#项目结构)
|
||||||
|
3. [核心组件](#核心组件)
|
||||||
|
4. [架构概述](#架构概述)
|
||||||
|
5. [详细组件分析](#详细组件分析)
|
||||||
|
6. [依赖分析](#依赖分析)
|
||||||
|
7. [性能考虑](#性能考虑)
|
||||||
|
8. [故障排除指南](#故障排除指南)
|
||||||
|
9. [结论](#结论)
|
||||||
|
10. [附录](#附录)(如有必要)
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
本文档详细描述了kami_backend项目中优雅关闭功能的实现机制。系统在接收到终止信号时,能够有序地停止定时任务和关闭线程池,确保所有正在进行的任务能够完成,避免数据丢失或服务异常中断。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
本项目采用GoFrame框架构建的后端服务,主要包含API接口、内部服务逻辑、工具库和配置文件等模块。项目结构清晰,按功能划分目录,便于维护和扩展。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
subgraph "核心模块"
|
||||||
|
main["main.go<br/>主程序入口"]
|
||||||
|
cmd["internal/cmd<br/>命令行处理"]
|
||||||
|
controller["internal/controller<br/>控制器"]
|
||||||
|
service["internal/service<br/>服务层"]
|
||||||
|
logic["internal/logic<br/>业务逻辑"]
|
||||||
|
end
|
||||||
|
subgraph "工具库"
|
||||||
|
utility["utility<br/>通用工具"]
|
||||||
|
pool["utility/pool<br/>线程池管理"]
|
||||||
|
cron["utility/cron<br/>定时任务"]
|
||||||
|
config["utility/config<br/>配置管理"]
|
||||||
|
otel["utility/otel<br/>可观测性"]
|
||||||
|
end
|
||||||
|
subgraph "配置与资源"
|
||||||
|
manifest["manifest<br/>部署配置"]
|
||||||
|
resource["resource<br/>资源文件"]
|
||||||
|
sql["sql<br/>数据库脚本"]
|
||||||
|
end
|
||||||
|
main --> cmd
|
||||||
|
cmd --> controller
|
||||||
|
controller --> service
|
||||||
|
service --> logic
|
||||||
|
utility --> cmd
|
||||||
|
config --> utility
|
||||||
|
cron --> cmd
|
||||||
|
pool --> cmd
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [main.go](file://main.go#L1-L56)
|
||||||
|
- [cmd.go](file://internal/cmd/cmd.go#L1-L97)
|
||||||
|
- [pool.go](file://utility/pool/pool.go#L1-L64)
|
||||||
|
- [cron.go](file://utility/cron/cron.go#L1-L96)
|
||||||
|
- [config.go](file://utility/config/config.go#L1-L112)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [main.go](file://main.go#L1-L56)
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L1-L97)
|
||||||
|
|
||||||
|
## 核心组件
|
||||||
|
系统的核心组件包括主程序入口、命令行处理器、定时任务管理器和线程池管理器。这些组件协同工作,确保服务能够正常启动、运行和优雅关闭。
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [main.go](file://main.go#L24-L55)
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L42-L85)
|
||||||
|
|
||||||
|
## 架构概述
|
||||||
|
系统采用分层架构设计,从上到下依次为API层、控制器层、服务层和数据访问层。同时,系统集成了定时任务和线程池等辅助组件,以支持后台任务处理和并发操作。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[客户端] --> B[API接口]
|
||||||
|
B --> C[控制器层]
|
||||||
|
C --> D[服务层]
|
||||||
|
D --> E[业务逻辑层]
|
||||||
|
E --> F[数据访问层]
|
||||||
|
F --> G[(数据库)]
|
||||||
|
H[定时任务] --> D
|
||||||
|
I[线程池] --> E
|
||||||
|
J[配置管理] --> 所有层级
|
||||||
|
K[可观测性] --> 所有层级
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L47-L76)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L13-L71)
|
||||||
|
- [utility/pool/pool.go](file://utility/pool/pool.go#L30-L33)
|
||||||
|
|
||||||
|
## 详细组件分析
|
||||||
|
|
||||||
|
### 优雅关闭机制分析
|
||||||
|
系统实现了完整的优雅关闭流程,确保在服务终止时能够有序地清理资源和完成正在进行的任务。
|
||||||
|
|
||||||
|
#### 优雅关闭流程
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant 系统 as 系统
|
||||||
|
participant 信号监听 as 信号监听
|
||||||
|
participant 定时任务 as 定时任务
|
||||||
|
participant 线程池 as 线程池
|
||||||
|
系统->>信号监听 : 启动信号监听
|
||||||
|
信号监听->>系统 : 等待SIGINT/SIGTERM
|
||||||
|
系统->>系统 : 运行主服务
|
||||||
|
用户->>系统 : 发送终止信号
|
||||||
|
信号监听->>系统 : 接收终止信号
|
||||||
|
系统->>定时任务 : 停止所有定时任务
|
||||||
|
定时任务-->>系统 : 确认所有任务完成
|
||||||
|
系统->>线程池 : 关闭所有线程池
|
||||||
|
线程池-->>系统 : 确认线程池已关闭
|
||||||
|
系统->>系统 : 服务完全停止
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L87-L96)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L13-L71)
|
||||||
|
- [utility/pool/pool.go](file://utility/pool/pool.go#L56-L63)
|
||||||
|
|
||||||
|
#### 线程池管理
|
||||||
|
```mermaid
|
||||||
|
classDiagram
|
||||||
|
class PoolManager {
|
||||||
|
+Pools map[Key]*grpool.Pool
|
||||||
|
+New(key Key, limit... int) *grpool.Pool
|
||||||
|
+GracefulDown()
|
||||||
|
}
|
||||||
|
class Key {
|
||||||
|
+AppleCardCallBack
|
||||||
|
+JDCardCallBack
|
||||||
|
+RedeemCardConsume
|
||||||
|
+其他任务类型
|
||||||
|
}
|
||||||
|
PoolManager "1" *-- "0..*" grpool.Pool
|
||||||
|
Key ..> PoolManager : 作为键值
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [utility/pool/pool.go](file://utility/pool/pool.go#L30-L63)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L87-L96)
|
||||||
|
- [utility/pool/pool.go](file://utility/pool/pool.go#L1-L64)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L1-L96)
|
||||||
|
|
||||||
|
## 依赖分析
|
||||||
|
系统各组件之间的依赖关系清晰,主要依赖GoFrame框架提供的功能,以及OpenTelemetry用于可观测性。
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[main.go] --> B[cmd.go]
|
||||||
|
B --> C[gogf/gf框架]
|
||||||
|
B --> D[pool.go]
|
||||||
|
B --> E[cron.go]
|
||||||
|
B --> F[otel]
|
||||||
|
D --> G[grpool]
|
||||||
|
E --> H[gcron]
|
||||||
|
F --> I[OpenTelemetry]
|
||||||
|
C --> J[数据库驱动]
|
||||||
|
C --> K[Redis驱动]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagram sources**
|
||||||
|
- [go.mod](file://go.mod#L5-L100)
|
||||||
|
- [main.go](file://main.go#L3-L16)
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L28-L40)
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [go.mod](file://go.mod#L1-L101)
|
||||||
|
- [main.go](file://main.go#L3-L16)
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L28-L40)
|
||||||
|
|
||||||
|
## 性能考虑
|
||||||
|
系统在设计时考虑了性能和资源管理,通过线程池和定时任务的合理配置,确保系统在高并发场景下的稳定运行。优雅关闭机制避免了 abrupt termination 可能导致的资源泄漏和数据不一致问题。
|
||||||
|
|
||||||
|
## 故障排除指南
|
||||||
|
当遇到服务无法正常关闭的问题时,可以按照以下步骤进行排查:
|
||||||
|
|
||||||
|
1. 检查是否有长时间运行的定时任务未完成
|
||||||
|
2. 确认线程池中的任务是否都能在合理时间内完成
|
||||||
|
3. 查看日志中是否有任务执行失败的记录
|
||||||
|
4. 检查系统资源使用情况,确保没有资源瓶颈
|
||||||
|
|
||||||
|
**Section sources**
|
||||||
|
- [internal/cmd/cmd.go](file://internal/cmd/cmd.go#L87-L96)
|
||||||
|
- [utility/pool/pool.go](file://utility/pool/pool.go#L56-L63)
|
||||||
|
- [utility/cron/cron.go](file://utility/cron/cron.go#L13-L71)
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
kami_backend项目的优雅关闭实现是完整且可靠的。通过有序地停止定时任务和关闭线程池,系统能够在接收到终止信号时安全地停止服务,确保数据一致性和系统稳定性。这种设计模式值得在其他微服务中推广使用。
|
||||||
|
|
||||||
|
## 附录
|
||||||
|
本文档基于项目当前代码库生成,随着项目的演进,相关实现可能会有所变化。建议定期更新文档以保持与代码的一致性。
|
||||||
File diff suppressed because one or more lines are too long
@@ -3,11 +3,6 @@ package card_apple_order
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/duke-git/lancet/v2/slice"
|
|
||||||
"github.com/gogf/gf/v2/database/gdb"
|
|
||||||
"github.com/gogf/gf/v2/errors/gcode"
|
|
||||||
"github.com/gogf/gf/v2/os/glog"
|
|
||||||
"github.com/shopspring/decimal"
|
|
||||||
"kami/internal/consts"
|
"kami/internal/consts"
|
||||||
"kami/internal/errHandler"
|
"kami/internal/errHandler"
|
||||||
"kami/internal/model"
|
"kami/internal/model"
|
||||||
@@ -18,9 +13,17 @@ import (
|
|||||||
"kami/utility/integration/apple"
|
"kami/utility/integration/apple"
|
||||||
"kami/utility/pool"
|
"kami/utility/pool"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
"github.com/gogf/gf/v2/database/gdb"
|
||||||
|
"github.com/gogf/gf/v2/errors/gcode"
|
||||||
|
"github.com/gogf/gf/v2/os/gcron"
|
||||||
|
"github.com/gogf/gf/v2/os/gctx"
|
||||||
|
"github.com/gogf/gf/v2/os/glog"
|
||||||
|
"github.com/shopspring/decimal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// HandleRedeemResult 处理核销结果,根据不同的状态进行相应的业务操作
|
// handleRedeemResult 处理核销结果,根据状态码分类进行对应处理
|
||||||
func (h *sAppleOrder) handleRedeemResult(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo) error {
|
func (h *sAppleOrder) handleRedeemResult(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo) error {
|
||||||
// 调用 Apple 服务进行核销(同步等待)
|
// 调用 Apple 服务进行核销(同步等待)
|
||||||
redeemClient := apple.NewClient()
|
redeemClient := apple.NewClient()
|
||||||
@@ -31,12 +34,41 @@ func (h *sAppleOrder) handleRedeemResult(ctx context.Context, orderEntity *entit
|
|||||||
OrderId: orderEntity.OrderNo,
|
OrderId: orderEntity.OrderNo,
|
||||||
RedemptionCode: orderEntity.CardPass,
|
RedemptionCode: orderEntity.CardPass,
|
||||||
}
|
}
|
||||||
_, _ = redeemClient.Redeem(ctx, redeemReq)
|
resp, err := redeemClient.Redeem(ctx, redeemReq)
|
||||||
return nil
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据状态码分类处理
|
||||||
|
switch {
|
||||||
|
// 1. 成功状态(CodeSuccess = 0)
|
||||||
|
case resp.Code == apple.CodeSuccess:
|
||||||
|
return h.handleRedeemSuccess(ctx, orderEntity, accountInfo, resp.Data.Amount, resp.Data.BalanceBefore, resp.Data.BalanceAfter)
|
||||||
|
|
||||||
|
// 2. 网络请求或系统资源错误(5000-5999)
|
||||||
|
case resp.Code >= 5000 && resp.Code < 6000:
|
||||||
|
return h.handleSystemError(ctx, orderEntity, accountInfo, resp.Code, resp.Message)
|
||||||
|
|
||||||
|
// 3. 苹果账户原因错误(8001-8005)
|
||||||
|
case resp.Code >= 8001 && resp.Code <= 8005:
|
||||||
|
return h.handleAccountError(ctx, orderEntity, accountInfo, resp.Code, resp.Message)
|
||||||
|
|
||||||
|
// 4. 充值限制错误(8010-8012)
|
||||||
|
case resp.Code >= 8010 && resp.Code <= 8012:
|
||||||
|
return h.handleRedeemLimitError(ctx, orderEntity, accountInfo, resp.Code, resp.Message)
|
||||||
|
|
||||||
|
// 5. 卡密错误(8013-8014)
|
||||||
|
case resp.Code >= 8013 && resp.Code <= 8014:
|
||||||
|
return h.handleCardCodeError(ctx, orderEntity, accountInfo, resp.Code, resp.Message)
|
||||||
|
|
||||||
|
// 未知错误
|
||||||
|
default:
|
||||||
|
return h.handleRedeemFailed(ctx, orderEntity, accountInfo, resp.Message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleRedeemSuccess 处理核销成功的情况
|
// handleRedeemSuccess 处理核销成功的情况
|
||||||
func (h *sAppleOrder) handleRedeemSuccess(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo, balanceBefore, balanceAfter float64) error {
|
func (h *sAppleOrder) handleRedeemSuccess(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo, amount, balanceBefore, balanceAfter float64) error {
|
||||||
// 将返回的金额字符串转换为 float64(假数据处理)
|
// 将返回的金额字符串转换为 float64(假数据处理)
|
||||||
actualAmount := orderEntity.CardAmount // 使用卡密面额作为默认金额
|
actualAmount := orderEntity.CardAmount // 使用卡密面额作为默认金额
|
||||||
|
|
||||||
@@ -135,6 +167,178 @@ func (h *sAppleOrder) handleAccountInvalid(ctx context.Context, orderEntity *ent
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handleSystemError 处理系统资源错误(5000-5999)
|
||||||
|
// 订单退回待处理,等待系统重新调度重试
|
||||||
|
func (h *sAppleOrder) handleSystemError(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo, code apple.Code, message string) error {
|
||||||
|
// 订单退回待处理状态
|
||||||
|
err := h.ModifyOrderStatus(ctx, orderEntity.OrderNo, consts.AppleRechargeOrderWaiting, fmt.Sprintf("系统错误:%s", message), nil)
|
||||||
|
if err != nil {
|
||||||
|
glog.Error(ctx, fmt.Sprintf("更新订单状态失败 - 订单号: %s, 错误: %v", orderEntity.OrderNo, err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 减少分配计数
|
||||||
|
_ = h.DecrementDistributionCount(ctx, orderEntity.OrderNo)
|
||||||
|
|
||||||
|
// 添加历史记录
|
||||||
|
_ = h.AddHistory(ctx, &model.AppleCardRechargeHistoryInput{
|
||||||
|
AccountID: accountInfo.Id,
|
||||||
|
OrderNo: orderEntity.OrderNo,
|
||||||
|
RechargeId: int(orderEntity.Id),
|
||||||
|
AccountName: accountInfo.Account,
|
||||||
|
Operation: consts.AppleRechargeOperationItunesFail,
|
||||||
|
Remark: fmt.Sprintf("系统错误(状态码: %d):%s", code, message),
|
||||||
|
}, nil)
|
||||||
|
|
||||||
|
glog.Warning(ctx, fmt.Sprintf("系统错误,订单已退回待处理 - 订单号: %s, 状态码: %d", orderEntity.OrderNo, code))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleAccountError 处理苹果账户原因错误(8001-8005)
|
||||||
|
// 标记账户失效,订单退回待处理,等待重新分配其他有效账户
|
||||||
|
func (h *sAppleOrder) handleAccountError(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo, code apple.Code, message string) error {
|
||||||
|
// 根据错误码标记不同的账户失效状态
|
||||||
|
var accountStatus consts.AppleAccountStatus
|
||||||
|
switch code {
|
||||||
|
case apple.CodeApplePasswordError, apple.CodeApplePasswordExpired:
|
||||||
|
accountStatus = consts.AppleAccountWrongPassword // 账号密码错误
|
||||||
|
case apple.CodeAppleAccountForbidden:
|
||||||
|
accountStatus = consts.AppleAccountForbidden // 账号被禁用
|
||||||
|
case apple.CodeAppleAccountLocked:
|
||||||
|
accountStatus = consts.AppleAccountLimited // 账号被封锁(作为受限处理)
|
||||||
|
case apple.CodeAppleStatusUnknown:
|
||||||
|
accountStatus = consts.AppleAccountNormal // 状态未知,保持正常以便后续重试
|
||||||
|
default:
|
||||||
|
accountStatus = consts.AppleAccountWrongPassword
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标记账户为失效状态
|
||||||
|
_ = service.AppleAccount().ModifyStatus(ctx, accountInfo.Id, accountStatus, nil)
|
||||||
|
|
||||||
|
// 订单重新设为待调度状态
|
||||||
|
err := h.ModifyOrderStatus(ctx, orderEntity.OrderNo, consts.AppleRechargeOrderWaiting, "苹果账户原因导致失效,待重新分配", nil)
|
||||||
|
if err != nil {
|
||||||
|
glog.Error(ctx, fmt.Sprintf("更新订单状态失败 - 订单号: %s, 错误: %v", orderEntity.OrderNo, err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 减少分配计数,允许重新分配
|
||||||
|
_ = h.DecrementDistributionCount(ctx, orderEntity.OrderNo)
|
||||||
|
|
||||||
|
// 添加历史记录
|
||||||
|
_ = h.AddHistory(ctx, &model.AppleCardRechargeHistoryInput{
|
||||||
|
AccountID: accountInfo.Id,
|
||||||
|
OrderNo: orderEntity.OrderNo,
|
||||||
|
RechargeId: int(orderEntity.Id),
|
||||||
|
AccountName: accountInfo.Account,
|
||||||
|
Operation: consts.AppleRechargeOperationWrongPassword,
|
||||||
|
Remark: fmt.Sprintf("苹果账户错误(状态码: %d):%s", code, message),
|
||||||
|
}, nil)
|
||||||
|
|
||||||
|
glog.Warning(ctx, fmt.Sprintf("苹果账户原因导致失效,订单已退回待重新分配 - 订单号: %s, 账号: %s, 状态码: %d", orderEntity.OrderNo, accountInfo.Account, code))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleRedeemLimitError 处理充值限制错误(8010-8012)
|
||||||
|
// 根据限制类型标记账户,订单根据业务规则决定重试或失败
|
||||||
|
func (h *sAppleOrder) handleRedeemLimitError(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo, code apple.Code, message string) error {
|
||||||
|
// 根据限制类型标记账户状态
|
||||||
|
var accountStatus consts.AppleAccountStatus
|
||||||
|
var accountRemark string
|
||||||
|
|
||||||
|
switch code {
|
||||||
|
case apple.CodeAppleRedeemLimitExceeded:
|
||||||
|
// 充值次数限制 - 永久受限
|
||||||
|
accountStatus = consts.AppleAccountForbiddenByTooManyRecharge
|
||||||
|
accountRemark = "苹果账户充值次数限制(永久)"
|
||||||
|
case apple.CodeAppleRedeemLimitExceededTemporarily:
|
||||||
|
// 临时限制 - 标记为临时冻结,暂停兑换
|
||||||
|
accountStatus = consts.AppleAccountTmpStoppedByTooManyRequest
|
||||||
|
_, _ = gcron.AddOnce(gctx.GetInitCtx(), "@every 2m", func(ctx2 context.Context) {
|
||||||
|
// 获取追踪能力
|
||||||
|
_ = service.AppleAccount().ModifyStatus(ctx2, orderEntity.AccountId, consts.AppleAccountNormal, nil)
|
||||||
|
})
|
||||||
|
accountRemark = "苹果账户临时充值限制(2分钟后恢复)"
|
||||||
|
case apple.CodeAppleRedeemLimitExceededPerMinute:
|
||||||
|
// 一分钟限制 - 标记为临时冻结
|
||||||
|
_, _ = gcron.AddOnce(gctx.GetInitCtx(), "@every 1m", func(ctx2 context.Context) {
|
||||||
|
// 获取追踪能力
|
||||||
|
_ = service.AppleAccount().ModifyStatus(ctx2, orderEntity.AccountId, consts.AppleAccountNormal, nil)
|
||||||
|
})
|
||||||
|
accountStatus = consts.AppleAccountTmpLimited
|
||||||
|
accountRemark = "苹果账户一分钟充值限制(1分钟后恢复)"
|
||||||
|
default:
|
||||||
|
accountStatus = consts.AppleAccountLimited
|
||||||
|
accountRemark = fmt.Sprintf("苹果账户充值限制(状态码: %d)", code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标记账户限制状态
|
||||||
|
_ = service.AppleAccount().ModifyStatus(ctx, accountInfo.Id, accountStatus, nil)
|
||||||
|
|
||||||
|
// 订单退回待处理,后续可根据限制类型进行重试或转移到其他账户
|
||||||
|
err := h.ModifyOrderStatus(ctx, orderEntity.OrderNo, consts.AppleRechargeOrderWaiting, fmt.Sprintf("账户受限:%s", message), nil)
|
||||||
|
if err != nil {
|
||||||
|
glog.Error(ctx, fmt.Sprintf("更新订单状态失败 - 订单号: %s, 错误: %v", orderEntity.OrderNo, err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 减少分配计数
|
||||||
|
_ = h.DecrementDistributionCount(ctx, orderEntity.OrderNo)
|
||||||
|
|
||||||
|
// 添加历史记录
|
||||||
|
_ = h.AddHistory(ctx, &model.AppleCardRechargeHistoryInput{
|
||||||
|
AccountID: accountInfo.Id,
|
||||||
|
OrderNo: orderEntity.OrderNo,
|
||||||
|
RechargeId: int(orderEntity.Id),
|
||||||
|
AccountName: accountInfo.Account,
|
||||||
|
Operation: consts.AppleRechargeOperationItunesFail,
|
||||||
|
Remark: fmt.Sprintf("%s - %s", accountRemark, message),
|
||||||
|
}, nil)
|
||||||
|
|
||||||
|
glog.Warning(ctx, fmt.Sprintf("账户充值限制,订单已退回待处理 - 订单号: %s, 账号: %s, 限制类型: %d", orderEntity.OrderNo, accountInfo.Account, code))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleCardCodeError 处理卡密错误(8013-8014)
|
||||||
|
// 直接按订单失败处理,更新订单状态为失败
|
||||||
|
func (h *sAppleOrder) handleCardCodeError(ctx context.Context, orderEntity *entity.V1CardAppleRechargeInfo, accountInfo *entity.V1CardAppleAccountInfo, code apple.Code, message string) error {
|
||||||
|
// 根据卡密错误类型确定订单失败状态
|
||||||
|
var orderStatus consts.AppleRechargeOrderStatus = consts.AppleRechargeOrderFail
|
||||||
|
var operationRemark string
|
||||||
|
|
||||||
|
switch code {
|
||||||
|
case apple.CodeAppleRedeemAlreadyClaimed:
|
||||||
|
operationRemark = "卡密已被兑换"
|
||||||
|
case apple.CodeAppleRedeemNotFound:
|
||||||
|
operationRemark = "卡密不存在"
|
||||||
|
default:
|
||||||
|
operationRemark = fmt.Sprintf("卡密错误(状态码: %d)", code)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新订单为失败状态
|
||||||
|
err := h.ModifyOrderStatus(ctx, orderEntity.OrderNo, orderStatus, operationRemark, nil)
|
||||||
|
if err != nil {
|
||||||
|
glog.Error(ctx, fmt.Sprintf("更新订单失败状态失败 - 订单号: %s, 错误: %v", orderEntity.OrderNo, err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 减少分配计数(卡密错误不再重试)
|
||||||
|
_ = h.DecrementDistributionCount(ctx, orderEntity.OrderNo)
|
||||||
|
|
||||||
|
// 添加历史记录
|
||||||
|
_ = h.AddHistory(ctx, &model.AppleCardRechargeHistoryInput{
|
||||||
|
AccountID: accountInfo.Id,
|
||||||
|
OrderNo: orderEntity.OrderNo,
|
||||||
|
RechargeId: int(orderEntity.Id),
|
||||||
|
AccountName: accountInfo.Account,
|
||||||
|
Operation: consts.AppleRechargeOperationItunesFail,
|
||||||
|
Remark: fmt.Sprintf("卡密错误 - %s", message),
|
||||||
|
}, nil)
|
||||||
|
|
||||||
|
glog.Warning(ctx, fmt.Sprintf("卡密错误,订单已失败 - 订单号: %s, 账号: %s, 错误: %s", orderEntity.OrderNo, accountInfo.Account, operationRemark))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ProcessOrderWithPush 处理订单:根据订单类型判断是立即进行核销处理还是创建定时任务异步处理
|
// ProcessOrderWithPush 处理订单:根据订单类型判断是立即进行核销处理还是创建定时任务异步处理
|
||||||
// 参数说明:
|
// 参数说明:
|
||||||
// - orderEntity: 待处理的订单信息
|
// - orderEntity: 待处理的订单信息
|
||||||
@@ -174,6 +378,7 @@ func (h *sAppleOrder) processOrderWithAccount(ctx context.Context, orderInfo *en
|
|||||||
if err == nil && !cacheVar.IsNil() {
|
if err == nil && !cacheVar.IsNil() {
|
||||||
glog.Warning(ctx, "账户正在处理中", accountInfo.Account)
|
glog.Warning(ctx, "账户正在处理中", accountInfo.Account)
|
||||||
}
|
}
|
||||||
|
//3分钟超时
|
||||||
_ = cache.NewCache().Set(ctx, cache.PrefixAppleAccount.Key(accountInfo.Id), 1, time.Minute*3)
|
_ = cache.NewCache().Set(ctx, cache.PrefixAppleAccount.Key(accountInfo.Id), 1, time.Minute*3)
|
||||||
defer func() {
|
defer func() {
|
||||||
_, _ = cache.NewCache().Remove(ctx, cache.PrefixAppleAccount.Key(accountInfo.Id))
|
_, _ = cache.NewCache().Remove(ctx, cache.PrefixAppleAccount.Key(accountInfo.Id))
|
||||||
@@ -198,8 +403,7 @@ func (h *sAppleOrder) processOrderWithAccount(ctx context.Context, orderInfo *en
|
|||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Error(ctx, "修改订单状态失败", err)
|
return err
|
||||||
}
|
}
|
||||||
_ = h.handleRedeemResult(ctx, orderInfo, accountInfo)
|
return h.handleRedeemResult(ctx, orderInfo, accountInfo)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|||||||
158
utility/integration/apple/consts.go
Normal file
158
utility/integration/apple/consts.go
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
package apple
|
||||||
|
|
||||||
|
// ==================== API 错误码枚举 ====================
|
||||||
|
// 统一的REST API错误码,包含标准错误码和Apple特定错误码
|
||||||
|
|
||||||
|
type Code int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ==================== 成功 (0) ====================
|
||||||
|
CodeSuccess Code = 0 // 成功
|
||||||
|
|
||||||
|
// ==================== 认证与授权错误 (1000-1999) ====================
|
||||||
|
CodeLoginFailed Code = 1001 // 登录失败
|
||||||
|
CodeTokenExpired Code = 1002 // token过期
|
||||||
|
CodeInsufficientPermissions Code = 1003 // 权限不足
|
||||||
|
CodeInvalidToken Code = 1004 // token无效
|
||||||
|
|
||||||
|
// ==================== 业务逻辑错误 (2000-2999) ====================
|
||||||
|
CodeOrderCreationFailed Code = 2001 // 订单创建失败
|
||||||
|
CodePaymentFailed Code = 2002 // 支付失败
|
||||||
|
CodeInsufficientBalance Code = 2003 // 余额不足
|
||||||
|
CodeOperationNotAllowed Code = 2004 // 操作不允许
|
||||||
|
|
||||||
|
// ==================== 验证错误 (3000-3999) ====================
|
||||||
|
CodeInvalidInput Code = 3001 // 输入无效
|
||||||
|
CodeMissingRequiredField Code = 3002 // 缺失必填字段
|
||||||
|
CodeInvalidFormat Code = 3003 // 格式无效
|
||||||
|
CodeValidationError Code = 3004 // 验证错误
|
||||||
|
|
||||||
|
// ==================== 资源错误 (4000-4999) ====================
|
||||||
|
CodeResourceNotFound Code = 4001 // 资源不存在
|
||||||
|
CodeResourceAlreadyExists Code = 4002 // 资源已存在
|
||||||
|
CodeResourceConflict Code = 4003 // 资源冲突
|
||||||
|
|
||||||
|
// ==================== 系统错误 (5000-5999) ====================
|
||||||
|
CodeDatabaseError Code = 5001 // 数据库错误
|
||||||
|
CodeExternalServiceError Code = 5002 // 外部服务错误
|
||||||
|
CodeCacheError Code = 5003 // 缓存错误
|
||||||
|
CodeInternalError Code = 5004 // 内部系统错误
|
||||||
|
CodeNotImplemented Code = 5005 // 功能未实现
|
||||||
|
|
||||||
|
// ==================== Apple 特定错误 (8000-8099) ====================
|
||||||
|
// Apple 账户错误 (8001-8005)
|
||||||
|
CodeAppleAccountForbidden Code = 8001 // 苹果账户被禁用
|
||||||
|
CodeAppleAccountLocked Code = 8002 // 苹果账户被封锁
|
||||||
|
CodeApplePasswordError Code = 8003 // 苹果账号密码错误
|
||||||
|
CodeAppleStatusUnknown Code = 8004 // 苹果核销状态未知
|
||||||
|
CodeApplePasswordExpired Code = 8005 // 苹果账号密码失效,需要重新登录
|
||||||
|
|
||||||
|
// Apple 充值限制错误 (8010-8012)
|
||||||
|
CodeAppleRedeemLimitExceeded Code = 8010 // 充值次数限制
|
||||||
|
CodeAppleRedeemLimitExceededTemporarily Code = 8011 // 充值次数临时限制
|
||||||
|
CodeAppleRedeemLimitExceededPerMinute Code = 8012 // 充值次数一分钟限制
|
||||||
|
|
||||||
|
// Apple 卡密错误 (8013-8014)
|
||||||
|
CodeAppleRedeemAlreadyClaimed Code = 8013 // 卡密已经被兑换
|
||||||
|
CodeAppleRedeemNotFound Code = 8014 // 卡密不存在
|
||||||
|
|
||||||
|
// ==================== 未知错误 (9000-9999) ====================
|
||||||
|
CodeUnknownError Code = 9000 // 未知错误
|
||||||
|
)
|
||||||
|
|
||||||
|
// String 返回错误码的文字描述
|
||||||
|
func (c Code) String() string {
|
||||||
|
switch c {
|
||||||
|
case CodeSuccess:
|
||||||
|
return "成功"
|
||||||
|
case CodeLoginFailed:
|
||||||
|
return "登录失败"
|
||||||
|
case CodeTokenExpired:
|
||||||
|
return "token过期"
|
||||||
|
case CodeInsufficientPermissions:
|
||||||
|
return "权限不足"
|
||||||
|
case CodeInvalidToken:
|
||||||
|
return "token无效"
|
||||||
|
case CodeOrderCreationFailed:
|
||||||
|
return "订单创建失败"
|
||||||
|
case CodePaymentFailed:
|
||||||
|
return "支付失败"
|
||||||
|
case CodeInsufficientBalance:
|
||||||
|
return "余额不足"
|
||||||
|
case CodeOperationNotAllowed:
|
||||||
|
return "操作不允许"
|
||||||
|
case CodeInvalidInput:
|
||||||
|
return "输入无效"
|
||||||
|
case CodeMissingRequiredField:
|
||||||
|
return "缺失必填字段"
|
||||||
|
case CodeInvalidFormat:
|
||||||
|
return "格式无效"
|
||||||
|
case CodeValidationError:
|
||||||
|
return "验证错误"
|
||||||
|
case CodeResourceNotFound:
|
||||||
|
return "资源不存在"
|
||||||
|
case CodeResourceAlreadyExists:
|
||||||
|
return "资源已存在"
|
||||||
|
case CodeResourceConflict:
|
||||||
|
return "资源冲突"
|
||||||
|
case CodeDatabaseError:
|
||||||
|
return "数据库错误"
|
||||||
|
case CodeExternalServiceError:
|
||||||
|
return "外部服务错误"
|
||||||
|
case CodeCacheError:
|
||||||
|
return "缓存错误"
|
||||||
|
case CodeInternalError:
|
||||||
|
return "内部系统错误"
|
||||||
|
case CodeNotImplemented:
|
||||||
|
return "功能未实现"
|
||||||
|
case CodeAppleAccountForbidden:
|
||||||
|
return "苹果账户被禁用"
|
||||||
|
case CodeAppleAccountLocked:
|
||||||
|
return "苹果账户被封锁"
|
||||||
|
case CodeApplePasswordError:
|
||||||
|
return "苹果账号密码错误"
|
||||||
|
case CodeAppleStatusUnknown:
|
||||||
|
return "苹果核销状态未知"
|
||||||
|
case CodeApplePasswordExpired:
|
||||||
|
return "苹果账号密码失效,需要重新登录"
|
||||||
|
case CodeAppleRedeemLimitExceeded:
|
||||||
|
return "充值次数限制"
|
||||||
|
case CodeAppleRedeemLimitExceededTemporarily:
|
||||||
|
return "充值次数临时限制"
|
||||||
|
case CodeAppleRedeemLimitExceededPerMinute:
|
||||||
|
return "充值次数一分钟限制"
|
||||||
|
case CodeAppleRedeemAlreadyClaimed:
|
||||||
|
return "卡密已经被兑换"
|
||||||
|
case CodeAppleRedeemNotFound:
|
||||||
|
return "卡密不存在"
|
||||||
|
case CodeUnknownError:
|
||||||
|
return "未知错误"
|
||||||
|
default:
|
||||||
|
return "未知错误"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSuccess 判断是否成功
|
||||||
|
func (c Code) IsSuccess() bool {
|
||||||
|
return c == CodeSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsAppleAccountError 判断是否是苹果账户相关错误
|
||||||
|
func (c Code) IsAppleAccountError() bool {
|
||||||
|
return c >= 8001 && c <= 8005
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsAppleRedeemLimitError 判断是否是苹果充值限制错误
|
||||||
|
func (c Code) IsAppleRedeemLimitError() bool {
|
||||||
|
return c >= 8010 && c <= 8012
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsAppleCardError 判断是否是苹果卡密相关错误
|
||||||
|
func (c Code) IsAppleCardError() bool {
|
||||||
|
return c >= 8013 && c <= 8014
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsAppleError 判断是否是苹果特定错误
|
||||||
|
func (c Code) IsAppleError() bool {
|
||||||
|
return c >= 8001 && c <= 8099
|
||||||
|
}
|
||||||
@@ -8,11 +8,10 @@ type RedeemReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RedeemResp struct {
|
type RedeemResp struct {
|
||||||
StatusDescription string `json:"status_description" description:"状态描述"`
|
BalanceBefore float64 `json:"balance_before" description:"兑换前账户余额"`
|
||||||
BalanceBefore string `json:"balance_before" description:"兑换前账户余额"`
|
BalanceAfter float64 `json:"balance_after" description:"兑换后账户余额"`
|
||||||
BalanceAfter string `json:"balance_after" description:"兑换后账户余额"`
|
Amount float64 `json:"amount" description:"本次兑换金额"`
|
||||||
Amount string `json:"amount" description:"本次兑换金额"`
|
OrderId string `json:"order_id" description:"订单ID"`
|
||||||
OrderId string `json:"order_id" description:"订单ID"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type QueryBalanceReq struct {
|
type QueryBalanceReq struct {
|
||||||
@@ -22,10 +21,9 @@ type QueryBalanceReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type QueryBalanceResp struct {
|
type QueryBalanceResp struct {
|
||||||
Status int `json:"status" description:"查询状态:0成功,其他"`
|
Status int `json:"status" description:"查询状态:0成功,其他"`
|
||||||
StatusDescription string `json:"status_description" description:"状态描述"`
|
Balance string `json:"balance" description:"当前账户余额"`
|
||||||
Balance string `json:"balance" description:"当前账户余额"`
|
OrderId string `json:"order_id" description:"订单ID"`
|
||||||
OrderId string `json:"order_id" description:"订单ID"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type HeartBeatReq = QueryBalanceReq
|
type HeartBeatReq = QueryBalanceReq
|
||||||
@@ -35,8 +33,8 @@ type HeartBeatResp struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Resp[T any] struct {
|
type Resp[T any] struct {
|
||||||
Data *T `json:"data"`
|
Data *T `json:"data,omitempty"`
|
||||||
Code int `json:"code"`
|
Code Code `json:"code"`
|
||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
TraceId string `json:"trace_id"`
|
TraceId string `json:"trace_id"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user