@dalehkx/quote-cli 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/quote.js +2 -0
- package/package.json +5 -2
- package/scripts/prepack.cjs +40 -0
- package/skill/SKILL.md +222 -0
- package/skill/agents/openai.yaml +7 -0
- package/skill/references/api-mapping.md +596 -0
- package/skill/references/data-schema.md +111 -0
- package/skill/references/inquiry-api-guide.md +749 -0
- package/skill/references/inquiry-flow.md +191 -0
- package/skill/references/workflow.md +78 -0
- package/src/adapter/api.mjs +529 -43
- package/src/auth.mjs +32 -6
- package/src/commands/inquiry.mjs +37 -8
- package/src/commands/install.mjs +162 -0
- package/src/commands/login.mjs +4 -14
- package/src/commands/order.mjs +224 -16
- package/src/constants.mjs +3 -2
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# 询价流程文档
|
|
2
|
+
|
|
3
|
+
## 命令流程
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
quote login → 登录
|
|
7
|
+
quote inquiry create → 创建询价单
|
|
8
|
+
quote inquiry list → 查看询价单列表
|
|
9
|
+
quote inquiry detail → 查看询价单详情
|
|
10
|
+
quote reply list → 查看报价结果
|
|
11
|
+
quote compare → 比价分析
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 完整流程与对应 API
|
|
17
|
+
|
|
18
|
+
### 1. 登录
|
|
19
|
+
|
|
20
|
+
**命令:** `quote login`
|
|
21
|
+
|
|
22
|
+
| 步骤 | API | 说明 |
|
|
23
|
+
|------|-----|------|
|
|
24
|
+
| 检查账号 | `GET /public/users/{account}/account_info` | 702 = 未注册 |
|
|
25
|
+
| 密码登录 | `POST /public/auth/ecapp/login/password` | 返回 accessToken |
|
|
26
|
+
| 短信登录 | `POST /public/auth/ecapp/login/cellphone` | 需先发验证码 |
|
|
27
|
+
| 发验证码 | `GET /public/verify_code?channelId=LOGIN&cellphone=` | |
|
|
28
|
+
| 拉用户信息 | `GET /users/_current` | 缓存手机号、地址、公司名到 `~/.quote/config.json` |
|
|
29
|
+
|
|
30
|
+
**登录后缓存字段:** `accessToken`, `refreshToken`, `userLoginId`, `cellphone`, `companyName`, `provinceGeoId/Name`, `cityGeoId/Name`, `countyGeoId/Name`
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### 2. 创建询价单
|
|
35
|
+
|
|
36
|
+
**命令:** `quote inquiry create -p "刹车片" --brand VW --brand-name 大众 -m 朗逸 -q 2`
|
|
37
|
+
|
|
38
|
+
| 步骤 | API | 说明 |
|
|
39
|
+
|------|-----|------|
|
|
40
|
+
| (可选)查品牌列表 | `GET /inquiries/support_brands` | 不传 `--brand` 时弹出交互选择 |
|
|
41
|
+
| (可选)VIN 解析品牌 | `GET /inquiries/car_models?vin=` | 传 `--vin` 时自动获取 `carBrandId` |
|
|
42
|
+
| 创建询价 | `POST /inquiries` | 走完整询价接口 |
|
|
43
|
+
|
|
44
|
+
**`POST /inquiries` 关键请求字段:**
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"vin": "车架号(必填,不知道填 UNKNOWN00000000000)",
|
|
48
|
+
"carBrandId": "VW",
|
|
49
|
+
"carBrandName": "大众",
|
|
50
|
+
"carModelName": "朗逸",
|
|
51
|
+
"userName": "用户ID(来自登录缓存)",
|
|
52
|
+
"contactNumber": "手机号(来自登录缓存)",
|
|
53
|
+
"isOpenInvoice": false,
|
|
54
|
+
"source": "ANDROID",
|
|
55
|
+
"isSelectBrandFlag": false,
|
|
56
|
+
"isAnonymous": false,
|
|
57
|
+
"qualities": ["BRAND"],
|
|
58
|
+
"provinceGeoId": "来自登录缓存",
|
|
59
|
+
"cityGeoId": "来自登录缓存",
|
|
60
|
+
"countyGeoId": "来自登录缓存",
|
|
61
|
+
"provinceGeoName": "来自登录缓存",
|
|
62
|
+
"cityGeoName": "来自登录缓存",
|
|
63
|
+
"countyGeoName": "来自登录缓存",
|
|
64
|
+
"userNeeds": [{
|
|
65
|
+
"needsName": "刹车片",
|
|
66
|
+
"quantity": 2,
|
|
67
|
+
"isFastOe": false,
|
|
68
|
+
"isSuggest": false,
|
|
69
|
+
"imageUrls": [],
|
|
70
|
+
"originalNeed": "刹车片",
|
|
71
|
+
"inquirySource": "MANUALLY",
|
|
72
|
+
"oeCode": "",
|
|
73
|
+
"remark": ""
|
|
74
|
+
}]
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**响应:**
|
|
79
|
+
```json
|
|
80
|
+
{ "inquiryId": "B26061605224", "isSimpleDemand": false }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
### 3. 查看询价单列表
|
|
86
|
+
|
|
87
|
+
**命令:** `quote inquiry list [--status pending|quoted|ordered|closed]`
|
|
88
|
+
|
|
89
|
+
| API | `POST /inquiries/list?page=1&size=20` |
|
|
90
|
+
|-----|---------------------------------------|
|
|
91
|
+
|
|
92
|
+
**请求体(可选过滤):**
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"statusIds": ["UNQUOTE"],
|
|
96
|
+
"searchContext": "关键字"
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**状态映射:**
|
|
101
|
+
| CLI | 平台 statusIds |
|
|
102
|
+
|-----|---------------|
|
|
103
|
+
| pending | UNQUOTE, WAIT_QUOTATION, QUOTING, IN_THE_DECODING, DECODED |
|
|
104
|
+
| quoted | QUOTE, QUOTED, PART_QUOTED |
|
|
105
|
+
| ordered | ORDERED |
|
|
106
|
+
| closed | IS_CLOSED, CLOSED, EXPIRED, ABATE, CANCELED |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### 4. 查看询价单详情
|
|
111
|
+
|
|
112
|
+
**命令:** `quote inquiry detail <id>`
|
|
113
|
+
|
|
114
|
+
| API | `GET /inquiries/{inquiryId}/detailV2?platform=ANDROID` |
|
|
115
|
+
|-----|-------------------------------------------------------|
|
|
116
|
+
|
|
117
|
+
返回车型信息、配件需求列表(`needs[]`)、报价状态等。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### 5. 查看报价结果
|
|
122
|
+
|
|
123
|
+
**命令:** `quote reply list -i <inquiryId>`
|
|
124
|
+
|
|
125
|
+
| API | `GET /inquiries/store/quotation?inquiryId=&storeId=` |
|
|
126
|
+
|-----|-----------------------------------------------------|
|
|
127
|
+
|
|
128
|
+
**注意:** `storeId` 可选,不传则返回所有供应商报价。
|
|
129
|
+
|
|
130
|
+
**响应中的关键字段:**
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"consultingQuotationProducts": [{
|
|
134
|
+
"quotationProductId": "报价ID",
|
|
135
|
+
"brandName": "品牌",
|
|
136
|
+
"displayPrice": "280.00",
|
|
137
|
+
"qualityDescription": "品牌件",
|
|
138
|
+
"arrivalTime": 2,
|
|
139
|
+
"partsNum": "OE号",
|
|
140
|
+
"locationName": "仓库"
|
|
141
|
+
}]
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
### 6. 比价
|
|
148
|
+
|
|
149
|
+
**命令:** `quote compare -i <inquiryId> [-s price|delivery|brand]`
|
|
150
|
+
|
|
151
|
+
调用 `listReplies` 后本地排序,无额外 API 调用。
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 账号权限说明
|
|
156
|
+
|
|
157
|
+
| 条件 | 说明 |
|
|
158
|
+
|------|------|
|
|
159
|
+
| `registerCompleted: false` | 需先完善公司信息(`POST /users/save_company_info`),注册流程自动引导 |
|
|
160
|
+
| `authenticated: N` | 未认证用户,有 5 次免费询价额度(`GET /inquiries/remain_inquiry_number`) |
|
|
161
|
+
| `isSimpleInquiryAllowed: false` | 不能用 `POST /inquiries/simple_inquiry`,必须用 `POST /inquiries` |
|
|
162
|
+
| `authenticated: Y` | 认证用户,无次数限制,可用简易询价接口 |
|
|
163
|
+
|
|
164
|
+
**当前测试账号(18162213812)状态:**
|
|
165
|
+
- `registerCompleted: true` ✅
|
|
166
|
+
- `authenticated: N`,剩余 5 次询价
|
|
167
|
+
- `isSimpleInquiryAllowed: false` → 走 `POST /inquiries`
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 已验证可用的接口(beta 环境)
|
|
172
|
+
|
|
173
|
+
| API | 状态 |
|
|
174
|
+
|-----|------|
|
|
175
|
+
| `POST /public/auth/ecapp/login/password` | ✅ 正常 |
|
|
176
|
+
| `POST /public/auth/ecapp/login/cellphone` | ✅ 正常 |
|
|
177
|
+
| `GET /public/verify_code` | ✅ 正常 |
|
|
178
|
+
| `GET /public/users/{account}/account_info` | ✅ 正常 |
|
|
179
|
+
| `POST /public/users/register` | ✅ 正常 |
|
|
180
|
+
| `POST /users/save_company_info` | ✅ 正常 |
|
|
181
|
+
| `GET /users/_current` | ✅ 正常 |
|
|
182
|
+
| `GET /public/area` | ✅ 正常(根节点 `geoId=CHN`) |
|
|
183
|
+
| `GET /inquiries/support_brands` | ✅ 正常 |
|
|
184
|
+
| `GET /inquiries/remain_inquiry_number` | ✅ 正常 |
|
|
185
|
+
| `POST /inquiries` | ✅ 正常 |
|
|
186
|
+
| `POST /inquiries/list` | ✅ 正常 |
|
|
187
|
+
| `GET /inquiries/{id}/detailV2` | ✅ 正常 |
|
|
188
|
+
| `GET /inquiries/store/quotation` | ✅ 正常(无报价时返回空) |
|
|
189
|
+
| `POST /inquiries/simple_inquiry` | ❌ 999 系统繁忙(beta 环境问题) |
|
|
190
|
+
| `GET /inquiries/car_models` | ❌ 需要完整 VIN |
|
|
191
|
+
| `GET /maindata/brand_info` | ❌ beta 环境 500 |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# 询报价业务流程
|
|
2
|
+
|
|
3
|
+
## 角色
|
|
4
|
+
|
|
5
|
+
- **买方 (Buyer)**: 发起询价的一方(如修理厂、采购部门)
|
|
6
|
+
- **卖方 (Supplier)**: 接收询价并报价的一方(如供应商、经销商)
|
|
7
|
+
|
|
8
|
+
## 完整流程
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
12
|
+
│ 买方 │
|
|
13
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
14
|
+
│ 1. 创建询价单 │
|
|
15
|
+
│ - 填写产品/零件名称 │
|
|
16
|
+
│ - 填写规格信息(OE号、车型、数量等) │
|
|
17
|
+
│ - 状态变为 pending │
|
|
18
|
+
└──────────────────────────┬──────────────────────────────────────┘
|
|
19
|
+
│ 询价推送
|
|
20
|
+
▼
|
|
21
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
22
|
+
│ 卖方 │
|
|
23
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
24
|
+
│ 2. 报价 │
|
|
25
|
+
│ - 查看询价详情 │
|
|
26
|
+
│ - 填写价格、品牌、货期 │
|
|
27
|
+
│ - 询价单状态变为 quoted │
|
|
28
|
+
│ (可多个供应商分别报价) │
|
|
29
|
+
└──────────────────────────┬──────────────────────────────────────┘
|
|
30
|
+
│ 报价回复
|
|
31
|
+
▼
|
|
32
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
33
|
+
│ 买方 │
|
|
34
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
35
|
+
│ 3. 比价分析 │
|
|
36
|
+
│ - 按价格/货期/品牌排序 │
|
|
37
|
+
│ - 综合评估最优供应商 │
|
|
38
|
+
│ │
|
|
39
|
+
│ 4. 确认下单 │
|
|
40
|
+
│ - 选择某条报价确认 │
|
|
41
|
+
│ - 生成订单,状态变为 ordered │
|
|
42
|
+
│ │
|
|
43
|
+
│ 5. 关闭询价(可选) │
|
|
44
|
+
│ - 不需要的询价可手动关闭 │
|
|
45
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 状态流转
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
询价单状态: pending → quoted → ordered → closed
|
|
52
|
+
↗
|
|
53
|
+
可从任何状态 → closed
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 典型场景
|
|
57
|
+
|
|
58
|
+
### 场景一:汽配采购
|
|
59
|
+
|
|
60
|
+
修理厂接到维修单,需要采购刹车片:
|
|
61
|
+
1. `inquiry create --product "前刹车片" --oe "04465-33471" --vehicle "丰田凯美瑞 2020" --quantity 4`
|
|
62
|
+
2. 联系多家供应商报价
|
|
63
|
+
3. `compare` 选出性价比最优
|
|
64
|
+
4. `order confirm` 下单
|
|
65
|
+
|
|
66
|
+
### 场景二:IT 设备采购
|
|
67
|
+
|
|
68
|
+
公司需要采购服务器:
|
|
69
|
+
1. `inquiry create --product "Dell R750xs" --quantity 10 --note "需要3年保修"`
|
|
70
|
+
2. 收集各渠道报价
|
|
71
|
+
3. 比价后确认
|
|
72
|
+
|
|
73
|
+
### 场景三:工业品询价
|
|
74
|
+
|
|
75
|
+
工厂需要采购轴承:
|
|
76
|
+
1. `inquiry create --product "深沟球轴承" --oe "SKF-6205-2RS" --quantity 200`
|
|
77
|
+
2. 多家轴承经销商报价
|
|
78
|
+
3. 综合价格和货期决策
|