添加其他字段

This commit is contained in:
1173117610@qq.com 2026-06-29 13:14:34 +08:00
parent c3ed03c92f
commit b5c68be1a6
4 changed files with 56 additions and 31 deletions

View File

@ -374,7 +374,7 @@ AI 禁止输出以下内容,除非接口明确返回:
- 禁止编造“整体交易状况良好”等过度结论 - 禁止编造“整体交易状况良好”等过度结论
- 禁止把未返回的后台总数当作事实 - 禁止把未返回的后台总数当作事实
注意:当前接口内部请求后台订单列表时使用 `page=1`、`limit=100`。因此 `orderCount=100` 表示当前接口本次返回并参与统计的订单数量,不应擅自推断为后台完整总订单量,除非接口后续明确返回总数 注意:当前接口会根据后台返回的 `data.count` 自动分页拉取订单列表,直到取完当前筛选条件下的订单数据后再统计。`_debug_query` 只表示筛选条件,不再表示只统计第 1 页
## 11. AI 调用约束 ## 11. AI 调用约束
@ -429,5 +429,5 @@ Invoke-RestMethod `
## 13. 推荐给 AI 的简短系统提示词 ## 13. 推荐给 AI 的简短系统提示词
```text ```text
你需要通过 Merchant AI HTTP API 分析订单数据。统计接口只能使用 POST。不要直接请求后台订单接口不要暴露 token。用户提到时间时优先转换为 timePreset今天=today昨天=yesterday最近7天=last_7_days最近30天=last_30_days本周=this_week上周=last_week本月=this_month上月=last_month。只有明确起止日期时使用 custom并传 startDate/endDate格式 YYYY-MM-DD。不要把“今天”“昨天”“本月”等自然语言直接作为参数传给接口。如果用户没说时间默认 timePreset=today。订单状态 status全部=-1待支付=0已完成/成功=1已取消=2待核销/待使用=3已退款=4如果用户没有限定状态默认 status=-1。解读接口返回时必须只使用 JSON 中真实存在的字段和数值,不允许编造订单数、成功订单数、商户数、金额、日均值、趋势或业务结论。可以基于返回字段做简单计算,但必须说明“根据当前返回数据计算”。如果返回 _debug_query.time可以作为查询时间范围。当前接口 page=1、limit=100orderCount 表示本次返回并参与统计的订单数量,不要擅自推断后台完整总量 你需要通过 Merchant AI HTTP API 分析订单数据。统计接口只能使用 POST。不要直接请求后台订单接口不要暴露 token。用户提到时间时优先转换为 timePreset今天=today昨天=yesterday最近7天=last_7_days最近30天=last_30_days本周=this_week上周=last_week本月=this_month上月=last_month。只有明确起止日期时使用 custom并传 startDate/endDate格式 YYYY-MM-DD。不要把“今天”“昨天”“本月”等自然语言直接作为参数传给接口。如果用户没说时间默认 timePreset=today。订单状态 status全部=-1待支付=0已完成/成功=1已取消=2待核销/待使用=3已退款=4如果用户没有限定状态默认 status=-1。解读接口返回时必须只使用 JSON 中真实存在的字段和数值,不允许编造订单数、成功订单数、商户数、金额、日均值、趋势或业务结论。可以基于返回字段做简单计算,但必须说明“根据当前返回数据计算”。如果返回 _debug_query.time可以作为查询时间范围。当前接口会自动分页拉取当前筛选条件下的订单数据后再统计_debug_query 只表示筛选条件
``` ```

View File

@ -12,7 +12,7 @@ AI 必须严格遵守:
4. 可以做简单计算,但必须基于 JSON 已有字段,并说明“根据当前返回数据计算”。 4. 可以做简单计算,但必须基于 JSON 已有字段,并说明“根据当前返回数据计算”。
5. 如果接口返回失败,必须先说明失败原因,不要继续分析业务数据。 5. 如果接口返回失败,必须先说明失败原因,不要继续分析业务数据。
6. 如果 JSON 中存在 `_debug_query.time`,可以把它作为本次查询时间范围。 6. 如果 JSON 中存在 `_debug_query.time`,可以把它作为本次查询时间范围。
7. 当前接口默认只统计本次返回的订单列表,常见分页为 `page=1`、`limit=100`。不要擅自推断后台完整总量 7. 当前接口会根据后台 `data.count` 自动分页拉取当前筛选条件下的订单列表,再进行统计。`_debug_query` 只表示筛选条件
## 2. 输入数据格式 ## 2. 输入数据格式
@ -91,14 +91,12 @@ AI 必须严格遵守:
| 字段 | 含义 | | 字段 | 含义 |
| --- | --- | | --- | --- |
| `orderCount` | 当前返回并参与统计的订单数量 | | `orderCount` | 当前筛选条件下参与统计的订单数量 |
| `activeMerchantCount` | 当前返回数据中的活跃商户数量 | | `activeMerchantCount` | 当前筛选条件下的活跃商户数量 |
| `successOrderCount` | 当前返回数据中的成功订单数量 | | `successOrderCount` | 当前筛选条件下的成功订单数量 |
| `totalOrderAmount` | 当前返回数据中的订单总金额 | | `totalOrderAmount` | 当前筛选条件下的订单总金额 |
| `totalRealPay` | 当前返回数据中的实付总金额 | | `totalRealPay` | 当前筛选条件下的实付总金额 |
| `_debug_query.time` | 本次查询时间范围 | | `_debug_query.time` | 本次查询时间范围 |
| `_debug_query.page` | 后台列表页码 |
| `_debug_query.limit` | 后台列表每页数量 |
推荐解读模板: 推荐解读模板:
@ -112,11 +110,11 @@ AI 必须严格遵守:
- 订单总金额:{totalOrderAmount} - 订单总金额:{totalOrderAmount}
- 实付总金额:{totalRealPay} - 实付总金额:{totalRealPay}
根据当前返回数据计算: 根据当前接口统计结果计算:
- 成功率:{successOrderCount / orderCount} - 成功率:{successOrderCount / orderCount}
- 实付占比:{totalRealPay / totalOrderAmount} - 实付占比:{totalRealPay / totalOrderAmount}
注意:以上结果基于接口本次返回的数据统计。 注意:以上结果基于接口按当前筛选条件自动分页获取后的数据统计。
``` ```
`orderCount=0` 时,不要计算成功率和平均值,应该说明当前范围内没有返回订单数据。 `orderCount=0` 时,不要计算成功率和平均值,应该说明当前范围内没有返回订单数据。
@ -190,7 +188,7 @@ AI 必须严格遵守:
| 字段 | 含义 | | 字段 | 含义 |
| --- | --- | | --- | --- |
| `orderCount` | 当前返回并参与统计的订单数量 | | `orderCount` | 当前筛选条件下参与统计的订单数量 |
| `statusDistribution` | 订单状态分布 | | `statusDistribution` | 订单状态分布 |
| `payTypeDistribution` | 支付方式分布 | | `payTypeDistribution` | 支付方式分布 |
| `typeDistribution` | 订单类型分布 | | `typeDistribution` | 订单类型分布 |
@ -209,7 +207,7 @@ AI 必须严格遵守:
| `averageOrderAmount` | 平均订单金额 | | `averageOrderAmount` | 平均订单金额 |
| `averageRealPay` | 平均实付金额 | | `averageRealPay` | 平均实付金额 |
| `maxOrderAmount` | 最大订单金额 | | `maxOrderAmount` | 最大订单金额 |
| `activeMerchantCount` | 当前返回数据中的活跃商户数量 | | `activeMerchantCount` | 当前筛选条件下的活跃商户数量 |
| `topMerchantsByRealPay` | 按实付金额排序的前 10 个商户 | | `topMerchantsByRealPay` | 按实付金额排序的前 10 个商户 |
状态值参考: 状态值参考:
@ -265,7 +263,7 @@ AI 必须严格遵守:
实付金额 Top 商户: 实付金额 Top 商户:
- {topMerchantsByRealPay 中逐项列出} - {topMerchantsByRealPay 中逐项列出}
注意:以上结果基于接口本次返回的数据统计。 注意:以上结果基于接口按当前筛选条件自动分页获取后的数据统计。
``` ```
`diamond` 字段业务解释规则: `diamond` 字段业务解释规则:
@ -317,10 +315,10 @@ AI 必须严格遵守:
| `ranking` | 商户排行列表 | | `ranking` | 商户排行列表 |
| `merchantId` | 商户 ID | | `merchantId` | 商户 ID |
| `merchantName` | 商户名称,可能为空 | | `merchantName` | 商户名称,可能为空 |
| `orderCount` | 该商户当前返回数据中的订单数 | | `orderCount` | 该商户在当前筛选条件下的订单数 |
| `successOrderCount` | 该商户当前返回数据中的成功订单数 | | `successOrderCount` | 该商户在当前筛选条件下的成功订单数 |
| `totalOrderAmount` | 该商户当前返回数据中的订单金额 | | `totalOrderAmount` | 该商户在当前筛选条件下的订单金额 |
| `totalRealPay` | 该商户当前返回数据中的实付金额 | | `totalRealPay` | 该商户在当前筛选条件下的实付金额 |
推荐解读模板: 推荐解读模板:
@ -335,7 +333,7 @@ AI 必须严格遵守:
- 订单金额:{totalOrderAmount} - 订单金额:{totalOrderAmount}
- 实付金额:{totalRealPay} - 实付金额:{totalRealPay}
注意:以上排行基于接口本次返回的数据统计。 注意:以上排行基于接口按当前筛选条件自动分页获取后的数据统计。
``` ```
如果 `ranking` 为空,输出: 如果 `ranking` 为空,输出:
@ -372,7 +370,7 @@ AI 禁止:
- 禁止把 `orderCount=100` 写成其他数值。 - 禁止把 `orderCount=100` 写成其他数值。
- 禁止编造日均订单、日均流水、增长率、环比、同比。 - 禁止编造日均订单、日均流水、增长率、环比、同比。
- 禁止编造“业务表现良好”“交易状况良好”等没有数据支撑的结论。 - 禁止编造“业务表现良好”“交易状况良好”等没有数据支撑的结论。
- 禁止把当前页数据推断为后台完整总量。 - 禁止脱离接口返回 JSON 编造后台总量。
- 禁止输出 JSON 中不存在的商户、订单状态或支付方式。 - 禁止输出 JSON 中不存在的商户、订单状态或支付方式。
## 9. 没有真实 JSON 时的回答 ## 9. 没有真实 JSON 时的回答
@ -388,5 +386,5 @@ AI 禁止:
## 10. 推荐系统提示词 ## 10. 推荐系统提示词
```text ```text
你是 Merchant AI API 的结果解读助手。你只负责解读已经真实调用接口后返回的 JSON。你不能自己调用接口也不能声称已经调用接口除非系统消息中提供了真实 JSON。你必须严格使用 JSON 中存在的字段和数值,不得编造、模拟、放大或补全任何订单数、金额、商户数、日均值、增长率、排行、趋势或业务结论。如果没有真实 JSON必须说明尚未获取真实接口数据。可以基于 JSON 字段做简单计算,例如成功率、实付占比、平均金额,但必须说明“根据当前返回数据计算”。如果存在 _debug_query.time将其作为查询时间范围。注意当前接口可能只统计 page=1、limit=100 的返回数据,不要推断后台完整总量 你是 Merchant AI API 的结果解读助手。你只负责解读已经真实调用接口后返回的 JSON。你不能自己调用接口也不能声称已经调用接口除非系统消息中提供了真实 JSON。你必须严格使用 JSON 中存在的字段和数值,不得编造、模拟、放大或补全任何订单数、金额、商户数、日均值、增长率、排行、趋势或业务结论。如果没有真实 JSON必须说明尚未获取真实接口数据。可以基于 JSON 字段做简单计算,例如成功率、实付占比、平均金额,但必须说明“根据当前接口统计结果计算”。如果存在 _debug_query.time将其作为查询时间范围。当前接口会自动分页拉取当前筛选条件下的数据后再统计_debug_query 只表示筛选条件
``` ```

View File

@ -8,6 +8,8 @@ use App\Http\MerchantApiClient;
final readonly class OfflineOrderRepository final readonly class OfflineOrderRepository
{ {
private const PAGE_LIMIT = 100;
public function __construct(private MerchantApiClient $apiClient) public function __construct(private MerchantApiClient $apiClient)
{ {
} }
@ -18,13 +20,42 @@ final readonly class OfflineOrderRepository
*/ */
public function list(array $query): array public function list(array $query): array
{ {
$data = $this->apiClient->getOfflineOrders($query); $page = 1;
$orders = $data['data']['list'] ?? []; $orders = [];
$totalCount = null;
if (!is_array($orders)) { do {
return []; $data = $this->apiClient->getOfflineOrders($query + [
'page' => $page,
'limit' => self::PAGE_LIMIT,
]);
$pageOrders = $data['data']['list'] ?? [];
if (!is_array($pageOrders) || $pageOrders === []) {
break;
}
if ($totalCount === null) {
$totalCount = isset($data['data']['count']) ? (int) $data['data']['count'] : null;
}
$orders = array_merge($orders, array_values(array_filter($pageOrders, is_array(...))));
$page++;
} while ($this->shouldFetchNextPage($orders, $pageOrders, $totalCount));
return $orders;
}
/**
* @param list<array<string, mixed>> $orders
* @param mixed $pageOrders
*/
private function shouldFetchNextPage(array $orders, mixed $pageOrders, ?int $totalCount): bool
{
if ($totalCount !== null) {
return count($orders) < $totalCount;
} }
return array_values(array_filter($orders, is_array(...))); return is_array($pageOrders) && count($pageOrders) >= self::PAGE_LIMIT;
} }
} }

View File

@ -17,14 +17,10 @@ final class OfflineOrderQuery
?string $payType = null, ?string $payType = null,
?string $type = null, ?string $type = null,
?int $btcId = null, ?int $btcId = null,
int $page = 1,
int $limit = 100,
): array { ): array {
$query = [ $query = [
'status' => $status ?? -1, 'status' => $status ?? -1,
'field_key' => self::filled($fieldKey) ? $fieldKey : 'all', 'field_key' => self::filled($fieldKey) ? $fieldKey : 'all',
'page' => $page,
'limit' => $limit,
'time' => self::filled($date) ? $date : date('Y/m/d') . '-' . date('Y/m/d'), 'time' => self::filled($date) ? $date : date('Y/m/d') . '-' . date('Y/m/d'),
]; ];