cbs-4px-merchant-cli 0.0.9 → 0.0.11

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.
Files changed (41) hide show
  1. package/README.4px.md +5 -5
  2. package/README.cainiao.md +5 -5
  3. package/README.md +5 -5
  4. package/dist/cli.js +65 -25
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/address.d.ts +7 -1
  7. package/dist/commands/address.js +29 -10
  8. package/dist/commands/address.js.map +1 -1
  9. package/dist/commands/auth.d.ts +1 -0
  10. package/dist/commands/auth.js +87 -0
  11. package/dist/commands/auth.js.map +1 -1
  12. package/dist/commands/config.js +20 -12
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/onboarding.d.ts +16 -7
  15. package/dist/commands/onboarding.js +73 -18
  16. package/dist/commands/onboarding.js.map +1 -1
  17. package/dist/commands/order.d.ts +23 -6
  18. package/dist/commands/order.js +60 -30
  19. package/dist/commands/order.js.map +1 -1
  20. package/dist/commands/platform.d.ts +8 -0
  21. package/dist/commands/platform.js +10 -1
  22. package/dist/commands/platform.js.map +1 -1
  23. package/dist/commands/product.d.ts +3 -0
  24. package/dist/commands/product.js +3 -0
  25. package/dist/commands/product.js.map +1 -1
  26. package/dist/services/api-client.d.ts +31 -12
  27. package/dist/services/api-client.js +194 -42
  28. package/dist/services/api-client.js.map +1 -1
  29. package/dist/types/index.d.ts +126 -11
  30. package/dist/utils/run-command.d.ts +6 -0
  31. package/dist/utils/run-command.js +13 -0
  32. package/dist/utils/run-command.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skill/SKILL.md +10 -11
  35. package/skill/package.json +1 -1
  36. package/skill/reference/auth.md +20 -1
  37. package/skill/reference/index.md +1 -2
  38. package/skill/reference/onboarding.md +79 -52
  39. package/skill/reference/order.md +84 -34
  40. package/skill/reference/platform.md +1 -1
  41. package/skill/reference/product.md +3 -0
@@ -47,23 +47,43 @@ export interface LabelPrintDTO {
47
47
  }
48
48
  export interface ShipperConsigneeVO {
49
49
  orderId: number;
50
+ shipperName: string | null;
51
+ shipperCompany: string | null;
52
+ shipperAddress1: string | null;
53
+ shipperAddress2: string | null;
54
+ shipperPostcode: string | null;
55
+ shipperTelephone: string | null;
56
+ shipperMobile: string | null;
57
+ shipperEmail: string | null;
58
+ shipperCountry: string | null;
59
+ shipperCity: string | null;
60
+ shipperProvince: string | null;
50
61
  consigneeName: string | null;
62
+ consigneeFirstName: string | null;
63
+ consigneeLastName: string | null;
64
+ consigneeCompany: string | null;
51
65
  consigneeAddress1: string | null;
52
66
  consigneeAddress2: string | null;
67
+ consigneeStreet: string | null;
68
+ consigneeDoorNo: string | null;
53
69
  consigneePostcode: string | null;
54
70
  consigneeTelephone: string | null;
55
71
  consigneeMobile: string | null;
72
+ consigneeMail: string | null;
56
73
  consigneeCountry: string | null;
57
74
  consigneeCity: string | null;
58
75
  consigneeProvince: string | null;
59
- shipperName: string | null;
60
- shipperCountry: string | null;
76
+ consigneeVatNo: string | null;
61
77
  }
62
78
  export interface DeclareInvoiceVO {
63
79
  orderId: number;
64
80
  invoiceId: number;
65
81
  ename: string | null;
66
82
  cname: string | null;
83
+ pcs: number | null;
84
+ unitPrice: number | null;
85
+ hscode: string | null;
86
+ weight: number | null;
67
87
  totalPrice: number | null;
68
88
  currency: string | null;
69
89
  }
@@ -82,6 +102,16 @@ export interface OrderDetailResp {
82
102
  shipperConsigneeDTO: ShipperConsigneeVO | null;
83
103
  declareList: DeclareInvoiceVO[];
84
104
  feeDetailList: BillingFeeItemDetailVO[];
105
+ batteryType: string | null;
106
+ iossNo: string | null;
107
+ orderNote: string | null;
108
+ customerWeight: number | null;
109
+ length: number | null;
110
+ width: number | null;
111
+ height: number | null;
112
+ dutyPayMode: string | null;
113
+ salesPlatform: string | null;
114
+ pieces: number | null;
85
115
  totalFee: string | null;
86
116
  weightFee: number | null;
87
117
  chatReplay: string | null;
@@ -93,6 +123,12 @@ export interface ProductRecommendRequest {
93
123
  postCode?: string;
94
124
  isBattery?: string;
95
125
  declareValue?: number;
126
+ /** 包裹长(cm),体积重计费产品必传 */
127
+ length?: number;
128
+ /** 包裹宽(cm) */
129
+ width?: number;
130
+ /** 包裹高(cm) */
131
+ height?: number;
96
132
  }
97
133
  export interface RecommendProductItem {
98
134
  productName: string;
@@ -155,14 +191,23 @@ export interface OrderListRequest {
155
191
  statusName?: string;
156
192
  customerOrderNo?: string;
157
193
  fpxTrackNo?: string;
194
+ queryDateType?: string;
158
195
  queryStartDate?: string;
159
196
  queryEndDate?: string;
160
197
  productCode?: string;
161
198
  destinationCountry?: string;
199
+ consigneeName?: string;
200
+ buyerId?: string;
201
+ isPrint?: string;
202
+ odaConfirm?: string;
203
+ interceptStatus?: string;
204
+ changeNoStatus?: string;
205
+ isHistory?: string;
162
206
  pageNum?: number;
163
207
  pageSize?: number;
164
208
  }
165
209
  export interface OrderSummary {
210
+ orderId: number | null;
166
211
  fpxTrackNo: string | null;
167
212
  customerOrderNo: string | null;
168
213
  statusName: string | null;
@@ -180,19 +225,36 @@ export interface OrderListResp {
180
225
  total: number;
181
226
  list: OrderSummary[];
182
227
  }
228
+ /** 地址类型:shipper 发件人 / consignee 收件人 / return 退件 / collect 揽收 */
229
+ export type AddressType = 'shipper' | 'consignee' | 'return' | 'collect';
230
+ export interface AddressBookListRequest {
231
+ addressType?: AddressType;
232
+ keyword?: string;
233
+ pageNum?: number;
234
+ pageSize?: number;
235
+ }
183
236
  export interface AddressBookItem {
184
- code: string | null;
185
- contact: string | null;
186
- contactPhone: string | null;
187
- emergencyContact: string | null;
237
+ id: string | null;
238
+ addressType: string | null;
239
+ name: string | null;
240
+ company: string | null;
241
+ phone: string | null;
242
+ mobile: string | null;
243
+ email: string | null;
244
+ country: string | null;
188
245
  province: string | null;
189
246
  city: string | null;
190
- county: string | null;
247
+ district: string | null;
191
248
  address: string | null;
192
- containerStuffingLocation: string | null;
249
+ postcode: string | null;
250
+ /** 是否默认地址:Y/N */
251
+ isDefault: string | null;
193
252
  }
194
253
  export interface OrderAddressResp {
195
254
  list: AddressBookItem[];
255
+ total: number | null;
256
+ pageNum: number | null;
257
+ pageSize: number | null;
196
258
  }
197
259
  export interface CountryItem {
198
260
  code: string;
@@ -908,11 +970,39 @@ export interface CheckAuthCodeRequest {
908
970
  flowId: string;
909
971
  isAgent?: boolean;
910
972
  }
973
+ /**
974
+ * 企业实名认证请求。
975
+ *
976
+ * 服务端 `startOrganRealNameAuth` 对除 `certTypeEnum` 外的字段全部做
977
+ * `requireNotBlank` 校验,缺一个就返回 PARAM_REQUIRED,因此这里大多为必填。
978
+ * `code`(客户编码)与 `creatorId` 由登录上下文填充,不接受调用方传入。
979
+ */
911
980
  export interface OrganAuthRequest {
912
981
  name: string;
913
982
  certNumber: string;
914
- certType?: number;
915
- agentAccountId?: string;
983
+ /** 企业证件类型:0 营业执照(统一社会信用代码)… 12 未知,服务端必填 */
984
+ certType: number;
985
+ /** 由 certType 推导,如 0 → CRED_ORG_USCC */
986
+ certTypeEnum?: string;
987
+ /** 0=企业四要素认证、1=组织机构三要素认证 */
988
+ authType: number;
989
+ /** 经办人账号 ID,来自 `auth code --agent` 的返回值 */
990
+ agentAccountId: string;
991
+ /** 法定代表人姓名 */
992
+ legalName: string;
993
+ /** 法定代表人证件号,authType=0(四要素)时服务端必填 */
994
+ legalCertNumber?: string;
995
+ /** 法定代表人证件类型:0 身份证,authType=0 时服务端必填 */
996
+ legalCertType?: number;
997
+ /** 国家数字编码,中国大陆为 485 */
998
+ countryCode: string;
999
+ /** 国家二字码,中国大陆为 CN */
1000
+ alpha2Code: string;
1001
+ country: string;
1002
+ state: string;
1003
+ city: string;
1004
+ county: string;
1005
+ address: string;
916
1006
  }
917
1007
  export interface OpenBrandRequest {
918
1008
  serviceCode: string;
@@ -1017,7 +1107,10 @@ export interface OrderSenderInfo {
1017
1107
  name?: string;
1018
1108
  company?: string;
1019
1109
  phone?: string;
1110
+ mobile?: string;
1111
+ email?: string;
1020
1112
  address?: string;
1113
+ address2?: string;
1021
1114
  country?: string;
1022
1115
  postcode?: string;
1023
1116
  city?: string;
@@ -1028,12 +1121,19 @@ export interface OrderReceiverInfo {
1028
1121
  company?: string;
1029
1122
  phone?: string;
1030
1123
  mobile?: string;
1124
+ firstName?: string;
1125
+ lastName?: string;
1031
1126
  address?: string;
1127
+ address2?: string;
1128
+ street?: string;
1129
+ doorNo?: string;
1032
1130
  city?: string;
1033
1131
  province?: string;
1034
1132
  postcode?: string;
1035
1133
  country?: string;
1036
1134
  email?: string;
1135
+ idCode?: string;
1136
+ vatNo?: string;
1037
1137
  }
1038
1138
  export interface OrderParcelInfo {
1039
1139
  weight?: number;
@@ -1041,6 +1141,13 @@ export interface OrderParcelInfo {
1041
1141
  width?: number;
1042
1142
  height?: number;
1043
1143
  dutyPayMode?: string;
1144
+ batteryType?: string;
1145
+ iossNo?: string;
1146
+ orderNote?: string;
1147
+ salesPlatform?: string;
1148
+ warehouseCode?: string;
1149
+ codPrice?: number;
1150
+ codCurrency?: string;
1044
1151
  }
1045
1152
  export interface OrderDeclareItemInfo {
1046
1153
  ename?: string;
@@ -1050,6 +1157,10 @@ export interface OrderDeclareItemInfo {
1050
1157
  currency?: string;
1051
1158
  weight?: number;
1052
1159
  hsCode?: string;
1160
+ material?: string;
1161
+ uses?: string;
1162
+ url?: string;
1163
+ brand?: string;
1053
1164
  }
1054
1165
  /** `P` = 预报(直接提交),`D` = 草稿(保存不提交)。后端默认 `P`。 */
1055
1166
  export type OrderWriteStatus = 'P' | 'D';
@@ -1059,6 +1170,9 @@ export interface CreateOrderRequest {
1059
1170
  originCountry?: string;
1060
1171
  status?: OrderWriteStatus;
1061
1172
  customerOrderNo?: string;
1173
+ pieces?: number;
1174
+ hasBattery?: string;
1175
+ buyerId?: string;
1062
1176
  sender?: OrderSenderInfo;
1063
1177
  receiver?: OrderReceiverInfo;
1064
1178
  parcel?: OrderParcelInfo;
@@ -1071,7 +1185,8 @@ export interface CreateOrderResp {
1071
1185
  customerOrderNo: string | null;
1072
1186
  }
1073
1187
  export interface EditOrderRequest extends Partial<Omit<CreateOrderRequest, 'status'>> {
1074
- orderId: number;
1188
+ /** 要编辑的订单单号(4px 物流单号或客户订单号)。后端按单号反查主键。 */
1189
+ orderNo: string;
1075
1190
  status?: OrderWriteStatus;
1076
1191
  }
1077
1192
  export interface EditOrderResp {
@@ -21,4 +21,10 @@ export interface RunCommandConfig<TData> {
21
21
  * empty branch at all): `consume` owns every output decision.
22
22
  */
23
23
  export declare function withClient<TData>(globalOptions: GlobalOptions, spinnerText: string, fetch: (client: ApiClient) => Promise<TData>, consume: (data: TData) => void): Promise<void>;
24
+ /**
25
+ * 参数校验与文件读取发生在 `withClient` 之前,因此不会经过其统一错误
26
+ * 通道。本包装器确保这类失败仍输出 Agent 可解析的 JSON 错误信封,而不是
27
+ * 未处理的 Promise rejection。
28
+ */
29
+ export declare function preflight<T>(fn: () => Promise<T>): Promise<T>;
24
30
  export declare function runCommand<TData>(globalOptions: GlobalOptions, config: RunCommandConfig<TData>): Promise<void>;
@@ -40,6 +40,19 @@ export async function withClient(globalOptions, spinnerText, fetch, consume) {
40
40
  handleError(error);
41
41
  }
42
42
  }
43
+ /**
44
+ * 参数校验与文件读取发生在 `withClient` 之前,因此不会经过其统一错误
45
+ * 通道。本包装器确保这类失败仍输出 Agent 可解析的 JSON 错误信封,而不是
46
+ * 未处理的 Promise rejection。
47
+ */
48
+ export async function preflight(fn) {
49
+ try {
50
+ return await fn();
51
+ }
52
+ catch (e) {
53
+ handleError(e);
54
+ }
55
+ }
43
56
  export async function runCommand(globalOptions, config) {
44
57
  await withClient(globalOptions, config.spinner, (client) => config.exec(client), (data) => {
45
58
  if (globalOptions.output === 'json') {
@@ -1 +1 @@
1
- {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/utils/run-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAc3D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,aAA4B,EAC5B,WAAmB,EACnB,KAA4C,EAC5C,OAA8B;IAE9B,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,aAAa,EAAE,EAAE,aAAa,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,aAA4B,EAC5B,MAA+B;IAE/B,MAAM,UAAU,CACd,aAAa,EACb,MAAM,CAAC,OAAO,EACd,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAC/B,CAAC,IAAI,EAAE,EAAE;QACP,IAAI,aAAa,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/utils/run-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAc3D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,aAA4B,EAC5B,WAAmB,EACnB,KAA4C,EAC5C,OAA8B;IAE9B,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,aAAa,EAAE,EAAE,aAAa,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,EAAoB;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,WAAW,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,aAA4B,EAC5B,MAA+B;IAE/B,MAAM,UAAU,CACd,aAAa,EACb,MAAM,CAAC,OAAO,EACd,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAC/B,CAAC,IAAI,EAAE,EAAE;QACP,IAAI,aAAa,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cbs-4px-merchant-cli",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "Cbs merchant CLI tool",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/skill/SKILL.md CHANGED
@@ -141,11 +141,11 @@ description: >-
141
141
  用户提到"验证码/收到短信了" → `fmc onboarding auth code`(**写**)
142
142
  用户提到"企业实名/公司认证" → `fmc onboarding auth organ`(**写**)
143
143
  用户提到"港澳台/海外客户认证" → `fmc onboarding auth gat`(**写**)
144
- 用户提到"对公打款/打款金额验证" → `fmc onboarding auth remit`(**写**)
144
+ 用户提到"对公打款/要不要打款" → 入驻流程已取消对公打款环节(`auth organ` 成功即认证完成),用 `fmc onboarding auth schedule` 佐证后告知"无需打款"
145
145
  用户提到"可开通品牌/有哪些品牌" → `fmc onboarding brand list`
146
146
  用户提到"开通品牌/申请合同" → `fmc onboarding brand open`(**写**)
147
147
  用户提到"合同/我的合同" → `fmc onboarding contract list`
148
- 用户提到"签合同/签署链接/下载合同" → `fmc onboarding contract url`
148
+ 用户提到"签合同/签署链接/下载合同" → `fmc onboarding contract url`(须带 `--status`,取自 `contract list`)
149
149
  用户提到"登录/配置key/认证" → `fmc auth login`
150
150
  用户提到"升级/更新/新版本" → `fmc update`
151
151
 
@@ -209,7 +209,6 @@ export BPORTAL_API_KEY=sk-xxxxx
209
209
  | `platform sync` | 提交拉单任务(异步) |
210
210
  | `platform order push` | 订单进入物流履约流程 |
211
211
  | `onboarding auth indiv` / `auth code` / `auth organ` / `auth gat` | 提交实名认证资料 |
212
- | `onboarding auth remit` | 消耗打款校验重试次数 |
213
212
  | `onboarding brand open` | 开通品牌并发起合同申请 |
214
213
 
215
214
  执行规则:
@@ -225,8 +224,8 @@ export BPORTAL_API_KEY=sk-xxxxx
225
224
 
226
225
  1. `order create --file <json> --draft -y` → 拿到 `orderId`
227
226
  2. `order get <orderNo>` 把收件人、重量、申报品念给用户核对
228
- 3. 有错就 `order edit --order-id <id> --file <json> --draft -y` 改,改到对
229
- 4. 用户明确同意后 `order forecast --ids <id> -y` 提交预报
227
+ 3. 有错就 `order edit --orderNo <单号> --file <json> --draft -y` 改,改到对
228
+ 4. 用户明确同意后 `order forecast --orderNo <单号> -y` 提交预报
230
229
  5. `label get <orderNo>` 取面单
231
230
 
232
231
  只有用户明确说"直接下单/不用确认"时,才允许省掉 `--draft`。
@@ -252,14 +251,14 @@ fmc order list --status IN_TRANSIT
252
251
 
253
252
  # 下单(写操作)—— 先建草稿,用户核对无误后再预报
254
253
  fmc order create --file ./order.json --draft -y
255
- fmc order forecast --ids 1001 -y
254
+ fmc order forecast --orderNo ORD-20260907-001 -y
256
255
 
257
256
  # 改草稿(写操作,只传要改的字段)
258
- fmc order edit --order-id 1001 --file ./patch.json --draft -y
257
+ fmc order edit --orderNo ORD-20260907-001 --file ./patch.json --draft -y
259
258
 
260
259
  # 取消 / 拦截(写操作)
261
- fmc order cancel --ids 1001 --reason "客户取消" -y
262
- fmc order intercept --ids 1001 -y
260
+ fmc order cancel --orderNo 4PX3003136946232CN --reason "客户取消" -y
261
+ fmc order intercept --orderNo 4PX3003136946232CN -y
263
262
 
264
263
  # 获取推荐产品(寄美国)
265
264
  fmc product recommend --country US
@@ -292,9 +291,9 @@ fmc platform sync --seller-account-id 10086 \
292
291
  # 查询入驻进度
293
292
  fmc onboarding progress
294
293
 
295
- # 查询合同并获取签署链接
294
+ # 查询合同并获取签署链接(--status 必填,取自 contract list)
296
295
  fmc onboarding contract list
297
- fmc onboarding contract url CT20260801001
296
+ fmc onboarding contract url CT20260801001 --status 4
298
297
  ```
299
298
 
300
299
  ---
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cbs-4px-merchant-cli",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "BPortal Merchant CLI (fmc) skill — BPortal",
5
5
  "files": [
6
6
  "SKILL.md",
@@ -4,7 +4,8 @@
4
4
 
5
5
  | Command | Description |
6
6
  | --- | --- |
7
- | `fmc auth login` | 配置 API Key |
7
+ | `fmc auth login` | 手动配置 API Key |
8
+ | `fmc auth agentz` | 通过已登录的 agentz-cli 获取并配置 API Key(AgentZ / 数字员工环境) |
8
9
  | `fmc auth status` | 查看当前认证状态 |
9
10
 
10
11
  ## Command details
@@ -35,6 +36,24 @@
35
36
  fmc auth login --api-key sk-xxxxx
36
37
  ```
37
38
 
39
+ ### `fmc auth agentz`
40
+
41
+ | Field | Value |
42
+ | --- | --- |
43
+ | **Name** | `auth agentz` |
44
+ | **Description** | 检测本机 `agentz-cli`,调用 `agentz-cli client token` 获取当前 AgentZ 客户端的 accessToken,再生成并保存商家 API Key |
45
+ | **Usage** | `fmc auth agentz` |
46
+
47
+ 仅在已安装并登录 `agentz-cli` 的 AgentZ / 数字员工环境中使用。accessToken 仅在当前进程中用于生成 API Key,不会写入配置、终端输出或日志;成功生成的 API Key 会保存至 `~/.bportal/config.json`,输出仅展示脱敏值。
48
+
49
+ 若本机没有 `agentz-cli`、客户端未登录或生成失败,请改用原有 `fmc auth login --api-key <key>`,或由运行环境注入 `BPORTAL_API_KEY`。不要手动复制或提供 accessToken。
50
+
51
+ #### Examples
52
+
53
+ ```bash
54
+ fmc auth agentz
55
+ ```
56
+
38
57
  ### `fmc auth status`
39
58
 
40
59
  | Field | Value |
@@ -83,7 +83,6 @@ Command **details** are in sibling `<group>.md` files in this directory.
83
83
  | `fmc onboarding auth code` | 提交验证码完成实名认证(写) | [onboarding.md](onboarding.md) |
84
84
  | `fmc onboarding auth organ` | 发起企业实名认证(写) | [onboarding.md](onboarding.md) |
85
85
  | `fmc onboarding auth gat` | 提交港澳台/海外实名资料(写) | [onboarding.md](onboarding.md) |
86
- | `fmc onboarding auth remit` | 校验对公打款金额(写) | [onboarding.md](onboarding.md) |
87
86
  | `fmc onboarding brand list` | 查询可开通品牌 | [onboarding.md](onboarding.md) |
88
87
  | `fmc onboarding brand open` | 开通品牌并申请合同(写) | [onboarding.md](onboarding.md) |
89
88
  | `fmc onboarding contract list` | 查询合同列表 | [onboarding.md](onboarding.md) |
@@ -111,7 +110,7 @@ Command **details** are in sibling `<group>.md` files in this directory.
111
110
  | `notice` | `list`, `detail`, `message list`, `message detail`, `message unread` | [notice.md](notice.md) |
112
111
  | `customs` | `cargo list`, `commodity list`, `commodity detail`, `hscode search`, `registration info` | [customs.md](customs.md) |
113
112
  | `platform` | `account list`, `sync`, `sync-record list`, `order list`, `order detail`, `order push` | [platform.md](platform.md) |
114
- | `onboarding` | `progress`, `customer-type`, `auth schedule`, `auth indiv`, `auth code`, `auth organ`, `auth gat`, `auth remit`, `brand list`, `brand open`, `contract list`, `contract url` | [onboarding.md](onboarding.md) |
113
+ | `onboarding` | `progress`, `customer-type`, `auth schedule`, `auth indiv`, `auth code`, `auth organ`, `auth gat`, `brand list`, `brand open`, `contract list`, `contract url` | [onboarding.md](onboarding.md) |
115
114
  | `update` | (no subcommand) | [update.md](update.md) |
116
115
  | `skill` | `install`, `status`, `uninstall` | [update.md](update.md) |
117
116
 
@@ -17,7 +17,7 @@
17
17
  | 客户类型 | 经济主体 | 认证命令 |
18
18
  | --- | --- | --- |
19
19
  | 中国大陆(0) | 个人 | `auth indiv` → `auth code` |
20
- | 中国大陆(0) | 企业 | `auth indiv --agent` → `auth code --agent` → `auth organ`(必要时 `auth remit`) |
20
+ | 中国大陆(0) | 企业 | `auth indiv --agent` → `auth code --agent`(返回经办人账号 ID)→ `auth organ`(成功即认证完成,服务端自动跳过对公打款) |
21
21
  | 港澳台(1)/ 海外(2) | 个人 / 企业 | `auth gat`(提交资料后走人工审核) |
22
22
 
23
23
  认证通过后:`brand list` → `brand open` → `contract list` → `contract url`。
@@ -149,6 +149,8 @@ fmc onboarding auth schedule
149
149
  需要 API Key 认证。**写操作**,默认二次确认。仅中国大陆客户。
150
150
 
151
151
  命令返回的 `flowId` 是下一步 `auth code` 的入参,**必须记下来**。
152
+ 例外:带 `--agent` 且该经办人**已经实名过**时,返回的是经办人账号 ID(不再下发验证码),
153
+ 可直接作为 `auth organ --agent-account-id` 使用。
152
154
 
153
155
  #### Options
154
156
 
@@ -205,6 +207,9 @@ fmc onboarding auth indiv --name 张三 --cert-number 440301199001011234 \
205
207
 
206
208
  需要 API Key 认证。**写操作**,默认二次确认。
207
209
 
210
+ 返回的是**账户 ID**;经办人认证(`--agent`)时这个值就是 `auth organ` 要的
211
+ `--agent-account-id`,**必须记下来**。
212
+
208
213
  #### Options
209
214
 
210
215
  | Flag | Type | Required | Description |
@@ -231,8 +236,11 @@ fmc onboarding auth code --flow-id FLOW20260831001 --auth-code 123456 --agent -y
231
236
 
232
237
  ```
233
238
  ✔ 验证码校验通过
239
+ 返回 c5bd9d9a1b544d1bae50727555bda804
234
240
  ```
235
241
 
242
+ 经办人认证时,上面的“返回”就是经办人账号 ID,直接作为 `auth organ --agent-account-id` 使用。
243
+
236
244
  ---
237
245
 
238
246
  ### `fmc onboarding auth organ`
@@ -241,40 +249,86 @@ fmc onboarding auth code --flow-id FLOW20260831001 --auth-code 123456 --agent -y
241
249
  | --- | --- |
242
250
  | **Name** | `onboarding auth organ` |
243
251
  | **Description** | 发起企业实名认证 |
244
- | **Usage** | `fmc onboarding auth organ --name <name> --cert-number <no> [flags]` |
252
+ | **Usage** | `fmc onboarding auth organ --name <name> --cert-number <no> --agent-account-id <id> --legal-name <name> --state <state> --city <city> --county <county> --address <address> [flags]` |
245
253
 
246
254
  需要 API Key 认证。**写操作**,默认二次确认。
247
255
 
248
256
  前置条件:经办人已通过 `auth indiv --agent` + `auth code --agent` 完成个人实名。
249
- 若返回后 `auth schedule` 显示"待对公打款验证",用 `auth remit` 收尾。
257
+ **`--agent-account-id` 取自 `auth code --agent` 的返回值**(经办人已实名时,`auth indiv --agent`
258
+ 也直接返回该账号 ID),不要编造。
259
+
260
+ 企业名称、证件、法人、注册地址是**一次性提交**的:服务端对这些字段逐个做非空校验,
261
+ 缺一个就返回 `PARAM_REQUIRED`,认证不会落一半,所以要先把资料收齐再执行。
262
+
263
+ 返回值是**企业实名的 flowId**。对公打款环节已下线:服务端在认证成功后会
264
+ **自动跳过对公打款验证**,`auth schedule` 直接变成 `已完成 (2)` 就可以 `brand open`,
265
+ **无需再做任何打款操作**。极少数存量流程可能停在 `待对公打款验证 (4)`,属异常,转人工。
266
+
267
+ **这个 flowId 是唯一来源**:`auth schedule` 不返回 flowId,CLI 也没有反查命令,
268
+ 所以要在当次会话里记下;没记下又遇到状态 `4` 只能转人工。
250
269
 
251
270
  #### Options
252
271
 
253
272
  | Flag | Type | Required | Description |
254
273
  | --- | --- | --- | --- |
255
274
  | `--name <name>` | string | yes | 企业名称 |
256
- | `--cert-number <no>` | string | yes | 统一社会信用代码 |
257
- | `--cert-type <type>` | string | no | 证件类型 |
258
- | `--agent-account-id <id>` | string | no | 经办人账号 ID |
275
+ | `--cert-number <no>` | string | yes | 企业证件号(营业执照即统一社会信用代码) |
276
+ | `--agent-account-id <id>` | string | yes | 经办人账号 ID,来自 `auth code --agent` 的返回值 |
277
+ | `--legal-name <name>` | string | yes | 法定代表人姓名 |
278
+ | `--state <name>` | string | yes | 注册地省/州 |
279
+ | `--city <name>` | string | yes | 注册地市 |
280
+ | `--county <name>` | string | yes | 注册地区/县 |
281
+ | `--address <address>` | string | yes | 注册地详细地址(营业执照上的地址) |
282
+ | `--legal-cert-number <no>` | string | 条件必填 | 法人证件号(身份证号)。`--auth-type 0`(默认)时必填 |
283
+ | `--legal-cert-type <type>` | string | no | 法人证件类型:`0` 身份证(默认 `0`) |
284
+ | `--auth-type <type>` | string | no | 认证方式:`0` 企业四要素、`1` 组织机构三要素(默认 `0`) |
285
+ | `--cert-type <type>` | string | no | 企业证件类型:`0` 营业执照、`1` 组织机构代码证、`2` 工商注册号 …(默认 `0`) |
286
+ | `--country <name>` | string | no | 国家/地区名称(默认 `中国大陆`) |
287
+ | `--country-code <code>` | string | no | 国家数字编码(默认 `485`) |
288
+ | `--alpha2-code <code>` | string | no | 国家二字码(默认 `CN`) |
259
289
  | `-y, --yes` | boolean | no | 跳过交互确认(非交互环境必传) |
260
290
 
291
+ 三要素认证(`--auth-type 1`)只对少数白名单客户开放,普通企业客户用默认的四要素。
292
+ `--cert-number`、`--legal-cert-number` 在 `--verbose` / `--dry-run` 的打印中已遮蔽为 `****`,
293
+ 但**真实值仍会随请求发送**。
294
+
261
295
  支持全局选项: `--output`, `--verbose`, `--dry-run`
262
296
 
263
297
  #### Examples
264
298
 
265
299
  ```bash
266
- fmc onboarding auth organ --name 深圳市某某科技有限公司 \
267
- --cert-number 91440300MA5XXXXXXX
300
+ # 四要素认证(默认):企业 + 法人 + 注册地址一次提交
301
+ fmc onboarding auth organ \
302
+ --name 深圳市某某科技有限公司 \
303
+ --cert-number 91440300MA5XXXXXXX \
304
+ --agent-account-id c5bd9d9a1b544d1bae50727555bda804 \
305
+ --legal-name 张三 \
306
+ --legal-cert-number 440301199001011234 \
307
+ --state 广东省 --city 深圳市 --county 南山区 \
308
+ --address "科技园某某大厦 1001"
309
+ ```
310
+
311
+ ```bash
312
+ # 三要素认证(白名单客户):无需法人证件号
313
+ fmc onboarding auth organ \
314
+ --name 某某社会团体 --cert-number 91440300MA5XXXXXXX --auth-type 1 \
315
+ --cert-type 7 --agent-account-id c5bd9d9a1b544d1bae50727555bda804 \
316
+ --legal-name 张三 \
317
+ --state 广东省 --city 深圳市 --county 南山区 --address "科技园某某大厦 1001" -y
268
318
  ```
269
319
 
270
320
  #### Output (text mode)
271
321
 
272
322
  ```
273
323
  ✔ 已发起企业实名认证
324
+ flowId FLOW20260831001
274
325
 
275
- 待对公打款验证时,用 auth remit --flow-id <flowId> --amount <分> 完成
326
+ 用 auth schedule 查看认证结果(已完成即可开通品牌,无需对公打款)
276
327
  ```
277
328
 
329
+ 对公打款环节已下线:`auth organ` 成功后服务端自动跳过打款,`auth schedule` 得到
330
+ `已完成 (2)` 就可以直接 `brand open`。
331
+
278
332
  ---
279
333
 
280
334
  ### `fmc onboarding auth gat`
@@ -344,44 +398,6 @@ fmc onboarding auth gat --customer-profile 2 --entity 2 \
344
398
 
345
399
  ---
346
400
 
347
- ### `fmc onboarding auth remit`
348
-
349
- | Field | Value |
350
- | --- | --- |
351
- | **Name** | `onboarding auth remit` |
352
- | **Description** | 校验企业对公打款金额 |
353
- | **Usage** | `fmc onboarding auth remit --flow-id <id> --amount <cents> [flags]` |
354
-
355
- 需要 API Key 认证。**写操作**,默认二次确认。
356
-
357
- 金额单位是**分**,不是元——传 `1` 表示 1 分。校验有重试次数限制,填错会消耗次数,
358
- 所以确认后再提交。
359
-
360
- #### Options
361
-
362
- | Flag | Type | Required | Description |
363
- | --- | --- | --- | --- |
364
- | `--flow-id <id>` | string | yes | 认证流程 ID |
365
- | `--amount <cents>` | string | yes | 打款金额,单位:分 |
366
- | `-y, --yes` | boolean | no | 跳过交互确认(非交互环境必传) |
367
-
368
- 支持全局选项: `--output`, `--verbose`, `--dry-run`
369
-
370
- #### Examples
371
-
372
- ```bash
373
- # 收到 0.37 元打款 → 传 37
374
- fmc onboarding auth remit --flow-id FLOW20260831001 --amount 37
375
- ```
376
-
377
- #### Output (text mode)
378
-
379
- ```
380
- ✔ 打款金额校验通过
381
- ```
382
-
383
- ---
384
-
385
401
  ### `fmc onboarding brand list`
386
402
 
387
403
  | Field | Value |
@@ -437,7 +453,7 @@ fmc onboarding brand list --customer-type 1 --output json
437
453
  需要 API Key 认证。**写操作**,默认二次确认。
438
454
 
439
455
  前置条件:中国大陆客户且已完成实名认证。开通后合同即进入申请流程,
440
- 用 `contract list` / `contract url` 继续。
456
+ 用 `contract list` 拿到合同编号与状态码,再 `contract url <合同编号> --status <状态码>` 继续。
441
457
 
442
458
  #### Options
443
459
 
@@ -474,7 +490,7 @@ fmc onboarding brand open --service-code DSS \
474
490
  ```
475
491
  ✔ 品牌开通与合同申请已提交
476
492
 
477
- 用 contract list 查看合同,contract url <合同编号> 获取签署链接
493
+ 用 contract list 查看合同,contract url <合同编号> --status <状态码> 获取签署链接
478
494
  ```
479
495
 
480
496
  ---
@@ -536,7 +552,7 @@ fmc onboarding contract list --page 2 --output json
536
552
  | --- | --- |
537
553
  | **Name** | `onboarding contract url` |
538
554
  | **Description** | 获取合同签署链接或下载链接 |
539
- | **Usage** | `fmc onboarding contract url <contractCode> [flags]` |
555
+ | **Usage** | `fmc onboarding contract url <contractCode> --status <status> [flags]` |
540
556
 
541
557
  需要 API Key 认证。
542
558
 
@@ -548,17 +564,24 @@ fmc onboarding contract list --page 2 --output json
548
564
  | Flag | Type | Required | Description |
549
565
  | --- | --- | --- | --- |
550
566
  | `<contractCode>` | string | yes | 合同编号(从 `contract list` 获取) |
567
+ | `--status <status>` | string | yes | 合同状态码(从 `contract list` 的状态原样传入) |
551
568
 
552
569
  支持全局选项: `--output`, `--verbose`, `--dry-run`
553
570
 
571
+ `--status` 必填,且**只能取自 `contract list`**:先 `contract list` 拿到该合同的
572
+ `合同编号` + `状态`,再原样传进来。禁止凭猜测或为了拿签署链接而伪造状态码
573
+ (服务端会重新查合同详情,最终以**实际状态**决定返回签署链接还是下载链接)。
574
+
554
575
  #### Examples
555
576
 
556
577
  ```bash
557
- fmc onboarding contract url CT20260801001
578
+ # 先查列表拿到编号与状态,再取链接
579
+ fmc onboarding contract list
580
+ fmc onboarding contract url CT20260801001 --status 4
558
581
  ```
559
582
 
560
583
  ```bash
561
- fmc onboarding contract url CT20260801001 --output json
584
+ fmc onboarding contract url CT20260801001 --status 4 --output json
562
585
  ```
563
586
 
564
587
  #### Output (text mode)
@@ -567,7 +590,11 @@ fmc onboarding contract url CT20260801001 --output json
567
590
  合同链接
568
591
  ──────────────────────────────────────────────────
569
592
  合同编号 CT20260801001
593
+ 合同状态 签署中 (4)
570
594
  链接 https://esign.example.com/sign/abc123
571
595
 
572
596
  签署中的合同返回签署链接,其余状态返回下载链接;请勿频繁调用
573
597
  ```
598
+
599
+ 漏传 `--status` 会被 CLI 直接拒绝(commander 报 `required option ... not specified`),
600
+ 不会发出请求。