@xbongbong/xbbcli 2.0.0
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/README.md +436 -0
- package/ai-call-add-task.js +106 -0
- package/ai-word-list.js +81 -0
- package/bin/xbbcli.js +120 -0
- package/buyer-inquiry-detail.js +112 -0
- package/buyer-inquiry-list.js +142 -0
- package/clue-add-couser.js +86 -0
- package/clue-add.js +102 -0
- package/clue-back.js +82 -0
- package/clue-del.js +75 -0
- package/clue-delete-couser.js +84 -0
- package/clue-delete-mainuser.js +84 -0
- package/clue-detail.js +78 -0
- package/clue-distribution.js +91 -0
- package/clue-edit.js +101 -0
- package/clue-handover.js +103 -0
- package/clue-list.js +224 -0
- package/clue-thorough-delete.js +82 -0
- package/communicate-add.js +144 -0
- package/communicate-del.js +118 -0
- package/communicate-detail.js +123 -0
- package/communicate-edit.js +146 -0
- package/communicate-list.js +194 -0
- package/communicate-plan-add.js +102 -0
- package/communicate-plan-cancel.js +76 -0
- package/communicate-plan-del.js +76 -0
- package/communicate-plan-detail.js +79 -0
- package/communicate-plan-list.js +129 -0
- package/communicate-plan-single-operate.js +86 -0
- package/contact-add-couser.js +87 -0
- package/contact-add-mainuser.js +87 -0
- package/contact-add.js +125 -0
- package/contact-del.js +70 -0
- package/contact-delete-couser.js +87 -0
- package/contact-delete-mainuser.js +87 -0
- package/contact-detail.js +72 -0
- package/contact-edit.js +103 -0
- package/contact-handover.js +84 -0
- package/contact-list.js +195 -0
- package/contract-add-couser.js +129 -0
- package/contract-add-mainuser.js +129 -0
- package/contract-add.js +148 -0
- package/contract-del.js +117 -0
- package/contract-delete-couser.js +128 -0
- package/contract-delete-mainuser.js +129 -0
- package/contract-detail.js +124 -0
- package/contract-edit.js +147 -0
- package/contract-handover.js +129 -0
- package/contract-list.js +235 -0
- package/contract-outstock-add.js +104 -0
- package/contract-outstock-del.js +78 -0
- package/contract-outstock-detail.js +80 -0
- package/contract-outstock-edit.js +106 -0
- package/contract-outstock-list.js +121 -0
- package/customer-add-couser.js +186 -0
- package/customer-add.js +152 -0
- package/customer-back.js +125 -0
- package/customer-del.js +117 -0
- package/customer-delete-couser.js +128 -0
- package/customer-delete-mainuser.js +129 -0
- package/customer-detail.js +148 -0
- package/customer-distribution.js +132 -0
- package/customer-edit.js +174 -0
- package/customer-handover.js +131 -0
- package/customer-invoice-address-add.js +101 -0
- package/customer-invoice-address-edit.js +102 -0
- package/customer-invoice-address.js +86 -0
- package/customer-invoice-info-add.js +101 -0
- package/customer-invoice-info-edit.js +102 -0
- package/customer-invoice-info.js +88 -0
- package/customer-list.js +187 -0
- package/department-add.js +77 -0
- package/department-del.js +76 -0
- package/department-edit.js +77 -0
- package/department-list.js +190 -0
- package/form-data-add-couser.js +84 -0
- package/form-data-add-mainuser.js +84 -0
- package/form-data-add.js +171 -0
- package/form-data-del.js +135 -0
- package/form-data-delete-couser.js +85 -0
- package/form-data-delete-mainuser.js +84 -0
- package/form-data-detail.js +146 -0
- package/form-data-edit.js +171 -0
- package/form-data-handover.js +84 -0
- package/form-data-list.js +188 -0
- package/form-get.js +157 -0
- package/form-list.js +169 -0
- package/invoice-add.js +98 -0
- package/invoice-cancel.js +97 -0
- package/invoice-del.js +83 -0
- package/invoice-detail.js +85 -0
- package/invoice-edit.js +101 -0
- package/invoice-get-amount-detail.js +84 -0
- package/invoice-list.js +125 -0
- package/invoice-red.js +101 -0
- package/label-add.js +93 -0
- package/label-all-list.js +102 -0
- package/label-batch-add.js +111 -0
- package/label-batch-remove.js +111 -0
- package/label-del-completely.js +88 -0
- package/label-del.js +98 -0
- package/label-edit.js +96 -0
- package/label-group-add.js +89 -0
- package/label-group-del.js +83 -0
- package/label-group-list.js +87 -0
- package/label-group-update.js +92 -0
- package/label-list.js +97 -0
- package/label-reduction.js +92 -0
- package/label-repeat.js +89 -0
- package/market-activity-add.js +109 -0
- package/market-activity-del.js +83 -0
- package/market-activity-detail.js +84 -0
- package/market-activity-edit.js +106 -0
- package/market-activity-handover.js +88 -0
- package/market-activity-list.js +121 -0
- package/opportunity-add-couser.js +129 -0
- package/opportunity-add-mainuser.js +129 -0
- package/opportunity-add.js +147 -0
- package/opportunity-del.js +118 -0
- package/opportunity-delete-couser.js +129 -0
- package/opportunity-delete-mainuser.js +128 -0
- package/opportunity-detail.js +125 -0
- package/opportunity-edit.js +146 -0
- package/opportunity-handover.js +130 -0
- package/opportunity-list.js +169 -0
- package/package.json +34 -0
- package/pay-plan-add-couser.js +88 -0
- package/pay-plan-add-mainuser.js +88 -0
- package/pay-plan-add.js +104 -0
- package/pay-plan-delete-couser.js +87 -0
- package/pay-plan-delete-mainuser.js +87 -0
- package/pay-plan-handover.js +85 -0
- package/pay-sheet-add-bad.js +104 -0
- package/pay-sheet-add-couser.js +87 -0
- package/pay-sheet-add-mainuser.js +88 -0
- package/pay-sheet-add-red.js +104 -0
- package/pay-sheet-add-write-off.js +104 -0
- package/pay-sheet-del.js +86 -0
- package/pay-sheet-delete-couser.js +87 -0
- package/pay-sheet-delete-mainuser.js +88 -0
- package/pay-sheet-detail.js +85 -0
- package/pay-sheet-edit-bad.js +110 -0
- package/pay-sheet-edit-red.js +110 -0
- package/pay-sheet-edit-write-off.js +106 -0
- package/pay-sheet-get-amount-detail.js +83 -0
- package/pay-sheet-list.js +123 -0
- package/payment-add-couser.js +129 -0
- package/payment-add-mainuser.js +129 -0
- package/payment-add.js +142 -0
- package/payment-del.js +117 -0
- package/payment-delete-couser.js +128 -0
- package/payment-delete-mainuser.js +128 -0
- package/payment-detail.js +123 -0
- package/payment-edit.js +146 -0
- package/payment-handover.js +130 -0
- package/payment-list.js +195 -0
- package/payment-sheet-add-bad-debt.js +142 -0
- package/payment-sheet-add-pre.js +104 -0
- package/payment-sheet-add-red.js +142 -0
- package/payment-sheet-add-write-off.js +130 -0
- package/payment-sheet-del.js +106 -0
- package/payment-sheet-detail.js +113 -0
- package/payment-sheet-edit-bad-debt.js +131 -0
- package/payment-sheet-edit-red.js +146 -0
- package/payment-sheet-edit-write-off.js +146 -0
- package/payment-sheet-get-amount-detail.js +84 -0
- package/payment-sheet-handover.js +85 -0
- package/payment-sheet-list.js +206 -0
- package/product-add.js +129 -0
- package/product-category-add.js +124 -0
- package/product-category-del.js +132 -0
- package/product-category-list.js +164 -0
- package/product-category-update.js +139 -0
- package/product-del.js +106 -0
- package/product-detail.js +183 -0
- package/product-edit.js +131 -0
- package/product-list.js +193 -0
- package/product-online.js +91 -0
- package/quotation-add-couser.js +106 -0
- package/quotation-add-mainuser.js +101 -0
- package/quotation-add.js +100 -0
- package/quotation-del.js +83 -0
- package/quotation-delete-couser.js +101 -0
- package/quotation-delete-mainuser.js +101 -0
- package/quotation-detail.js +85 -0
- package/quotation-edit.js +101 -0
- package/quotation-handover.js +84 -0
- package/quotation-list.js +123 -0
- package/refund-add.js +83 -0
- package/refund-del.js +68 -0
- package/refund-detail.js +71 -0
- package/refund-edit.js +84 -0
- package/refund-list.js +193 -0
- package/role-list.js +85 -0
- package/sign-in-list.js +136 -0
- package/stage-get.js +100 -0
- package/stage-jump.js +109 -0
- package/supplier-add.js +142 -0
- package/token-generate.js +109 -0
- package/token-set.js +222 -0
- package/user-add.js +103 -0
- package/user-del.js +90 -0
- package/user-edit.js +102 -0
- package/user-handover.js +78 -0
- package/user-list.js +147 -0
- package/version.js +18 -0
- package/work-order-add.js +171 -0
- package/work-order-asset-add-couser.js +101 -0
- package/work-order-asset-add-mainuser.js +104 -0
- package/work-order-asset-add.js +98 -0
- package/work-order-asset-del-couser.js +101 -0
- package/work-order-asset-del-mainuser.js +101 -0
- package/work-order-asset-del.js +83 -0
- package/work-order-asset-detail.js +85 -0
- package/work-order-asset-edit.js +101 -0
- package/work-order-asset-handover.js +101 -0
- package/work-order-asset-list.js +123 -0
- package/work-order-del.js +136 -0
- package/work-order-detail.js +186 -0
- package/work-order-dynamic-list.js +145 -0
- package/work-order-edit.js +170 -0
- package/work-order-list.js +243 -0
- package/work-order-operate.js +167 -0
- package/work-order-template-detail.js +157 -0
- package/work-order-template-list.js +145 -0
- package/work-report-daily-add.js +97 -0
- package/work-report-daily-del.js +75 -0
- package/work-report-daily-detail.js +78 -0
- package/work-report-daily-edit.js +129 -0
- package/work-report-daily-get-work-plan.js +80 -0
- package/work-report-daily-list.js +116 -0
- package/work-report-monthly-add.js +98 -0
- package/work-report-monthly-del.js +79 -0
- package/work-report-monthly-detail.js +78 -0
- package/work-report-monthly-edit.js +98 -0
- package/work-report-monthly-list.js +116 -0
- package/work-report-weekly-add.js +98 -0
- package/work-report-weekly-del.js +76 -0
- package/work-report-weekly-detail.js +79 -0
- package/work-report-weekly-edit.js +99 -0
- package/work-report-weekly-list.js +116 -0
- package/work-task-add-couser.js +88 -0
- package/work-task-add.js +242 -0
- package/work-task-delete-couser.js +85 -0
- package/work-task-detail.js +101 -0
- package/work-task-edit.js +116 -0
- package/work-task-handover.js +85 -0
- package/workorder-add-couser.js +128 -0
- package/workorder-delete-couser.js +129 -0
- package/workorder-handover.js +137 -0
- package/workorderlist.js +194 -0
- package/workorderproductlist.js +159 -0
- package/worktimerecorddetail.js +157 -0
- package/worktimerecordlist.js +199 -0
- package/xbb-registry.js +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
# xbbcli
|
|
2
|
+
|
|
3
|
+
销帮帮 CRM (`xbb`) 命令行工具。所有命令直接调用 HTTP API,不依赖 `opencli` 或浏览器。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @xbongbong/xbbcli
|
|
9
|
+
xbbcli --help
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
开发目录中也可以直接运行 `node bin/xbbcli.js`。
|
|
13
|
+
|
|
14
|
+
需要升级时运行 `npm update -g @xbongbong/xbbcli`。
|
|
15
|
+
|
|
16
|
+
## 初始化配置
|
|
17
|
+
|
|
18
|
+
首次使用先保存 `corpid`、`token` 和 `userId`:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
xbbcli token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
执行后会写入:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
~/.xbbcli/config.env
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
文件内容包含:
|
|
31
|
+
|
|
32
|
+
- `corpid`
|
|
33
|
+
- `token`
|
|
34
|
+
- `baseurl`
|
|
35
|
+
- `userId`
|
|
36
|
+
|
|
37
|
+
同时会自动拉取两份表单清单并合并缓存到:
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
~/.xbbcli/<corpid>.formlist.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
初始化过程会直接调用接口拉取两份表单清单:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
xbbcli form-list --saasMark 2 -f json
|
|
47
|
+
xbbcli form-list --saasMark 1 -f json
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`baseurl` 路由规则:
|
|
51
|
+
|
|
52
|
+
- `corpid` 以 `ding` 开头,或包含 `$$ding` 时,使用 `https://proapi.xbongbong.com`
|
|
53
|
+
- 其他 `corpid` 使用 `https://appapi.xbongbong.com`
|
|
54
|
+
|
|
55
|
+
## 当前支持的命令
|
|
56
|
+
|
|
57
|
+
### 配置
|
|
58
|
+
|
|
59
|
+
- `token-set`:保存个人 token、`corpid`、`userId`、`baseurl`,并刷新本地表单缓存;传入的 token 不以 `user_` 开头时,会先为该 `userId` 刷新并保存个人 token
|
|
60
|
+
- `token-generate`:生成/获取个人 token,`--resetToken 0` 获取(默认)、`1` 刷新;`--checkUserId` 未传则用配置中的 `userId`
|
|
61
|
+
|
|
62
|
+
### 组织与人员
|
|
63
|
+
|
|
64
|
+
- `user-list`:用户列表
|
|
65
|
+
- `user-add`:新建用户
|
|
66
|
+
- `user-edit`:编辑用户
|
|
67
|
+
- `user-del`:删除用户
|
|
68
|
+
- `user-handover`:用户交接
|
|
69
|
+
- `department-list`:部门列表
|
|
70
|
+
- `department-add`:新建部门
|
|
71
|
+
- `department-edit`:编辑部门
|
|
72
|
+
- `department-del`:删除部门
|
|
73
|
+
- `role-list`:角色列表
|
|
74
|
+
|
|
75
|
+
### CRM 主数据
|
|
76
|
+
|
|
77
|
+
- `customer-list`:客户列表
|
|
78
|
+
- `customer-detail`:客户详情
|
|
79
|
+
- `customer-add`:新增客户
|
|
80
|
+
- `customer-edit`:编辑客户
|
|
81
|
+
- `customer-add-couser`:客户添加协同人
|
|
82
|
+
- `customer-del`:删除客户
|
|
83
|
+
- `customer-back`:客户退回公海
|
|
84
|
+
- `customer-handover`:客户移交
|
|
85
|
+
- `customer-distribution`:客户分配
|
|
86
|
+
- `customer-delete-mainuser`:客户删除负责人
|
|
87
|
+
- `customer-delete-couser`:客户删除协同人
|
|
88
|
+
- `customer-invoice-info`:客户开票信息列表
|
|
89
|
+
- `customer-invoice-info-add`:新增客户开票信息
|
|
90
|
+
- `customer-invoice-info-edit`:编辑客户开票信息
|
|
91
|
+
- `customer-invoice-address`:客户开票地址列表
|
|
92
|
+
- `customer-invoice-address-add`:新增客户开票地址
|
|
93
|
+
- `customer-invoice-address-edit`:编辑客户开票地址
|
|
94
|
+
- `clue-list`:线索列表
|
|
95
|
+
- `clue-add`:新建线索
|
|
96
|
+
- `clue-edit`:编辑线索
|
|
97
|
+
- `clue-detail`:线索详情
|
|
98
|
+
- `clue-del`:删除线索
|
|
99
|
+
- `clue-add-couser`:线索添加协同人
|
|
100
|
+
- `clue-delete-couser`:线索删除协同人
|
|
101
|
+
- `clue-delete-mainuser`:线索删除负责人
|
|
102
|
+
- `clue-distribution`:线索分配
|
|
103
|
+
- `clue-back`:线索退回公海
|
|
104
|
+
- `clue-thorough-delete`:线索彻底删除
|
|
105
|
+
- `contact-list`:联系人列表
|
|
106
|
+
- `contact-add`:新建联系人
|
|
107
|
+
- `contact-edit`:编辑联系人
|
|
108
|
+
- `contact-detail`:联系人详情
|
|
109
|
+
- `contact-del`:删除联系人
|
|
110
|
+
- `contact-add-couser`:联系人添加协同人
|
|
111
|
+
- `contact-add-mainuser`:联系人添加负责人
|
|
112
|
+
- `contact-delete-couser`:联系人删除协同人
|
|
113
|
+
- `contact-delete-mainuser`:联系人删除负责人
|
|
114
|
+
- `contact-handover`:联系人移交
|
|
115
|
+
|
|
116
|
+
### 销售机会操作
|
|
117
|
+
|
|
118
|
+
- `opportunity-add`:新建销售机会
|
|
119
|
+
- `opportunity-edit`:编辑销售机会
|
|
120
|
+
- `opportunity-list`:销售机会列表
|
|
121
|
+
- `opportunity-detail`:销售机会详情
|
|
122
|
+
- `opportunity-del`:删除销售机会
|
|
123
|
+
- `opportunity-handover`:销售机会移交
|
|
124
|
+
- `opportunity-add-mainuser`:销售机会添加负责人
|
|
125
|
+
- `opportunity-delete-mainuser`:销售机会删除负责人
|
|
126
|
+
- `opportunity-add-couser`:销售机会添加协同人
|
|
127
|
+
- `opportunity-delete-couser`:销售机会删除协同人
|
|
128
|
+
|
|
129
|
+
### 合同订单操作
|
|
130
|
+
|
|
131
|
+
- `contract-add`:新建合同订单
|
|
132
|
+
- `contract-edit`:编辑合同订单
|
|
133
|
+
- `contract-list`:合同订单列表
|
|
134
|
+
- `contract-detail`:合同订单详情
|
|
135
|
+
- `contract-del`:删除合同订单
|
|
136
|
+
- `contract-handover`:合同订单移交
|
|
137
|
+
- `contract-add-mainuser`:合同订单添加负责人
|
|
138
|
+
- `contract-outstock-add`:新建销售出库单
|
|
139
|
+
- `contract-outstock-edit`:编辑销售出库单
|
|
140
|
+
- `contract-outstock-detail`:销售出库单详情
|
|
141
|
+
- `contract-outstock-del`:删除销售出库单
|
|
142
|
+
- `contract-outstock-list`:销售出库单列表
|
|
143
|
+
- `contract-delete-mainuser`:合同订单删除负责人
|
|
144
|
+
- `contract-add-couser`:合同订单添加协同人
|
|
145
|
+
- `contract-delete-couser`:合同订单删除协同人
|
|
146
|
+
|
|
147
|
+
### 跟进记录操作
|
|
148
|
+
|
|
149
|
+
- `communicate-add`:新建跟进记录
|
|
150
|
+
- `communicate-edit`:编辑跟进记录
|
|
151
|
+
- `communicate-list`:跟进记录列表
|
|
152
|
+
- `communicate-detail`:跟进记录详情
|
|
153
|
+
- `communicate-del`:删除跟进记录
|
|
154
|
+
- `communicate-plan-list`:拜访计划列表
|
|
155
|
+
- `communicate-plan-detail`:拜访计划详情
|
|
156
|
+
- `communicate-plan-add`:拜访计划新建
|
|
157
|
+
- `communicate-plan-cancel`:拜访计划取消
|
|
158
|
+
- `communicate-plan-del`:拜访计划删除
|
|
159
|
+
- `communicate-plan-single-operate`:拜访计划延期
|
|
160
|
+
- `market-activity-list`:市场活动列表
|
|
161
|
+
- `market-activity-add`:新建市场活动
|
|
162
|
+
- `market-activity-edit`:编辑市场活动
|
|
163
|
+
- `market-activity-detail`:市场活动详情
|
|
164
|
+
- `market-activity-del`:删除市场活动
|
|
165
|
+
- `market-activity-handover`:市场活动移交
|
|
166
|
+
|
|
167
|
+
### 表单相关
|
|
168
|
+
|
|
169
|
+
- `form-list`:表单模板列表
|
|
170
|
+
- `form-get`:表单模板字段定义,在填充参数时不清楚参数含义/下拉框可选项值,调用本接口获取 form 解释
|
|
171
|
+
- `form-data-list`:自定义表单数据列表
|
|
172
|
+
- `form-data-detail`:自定义表单数据详情
|
|
173
|
+
- `form-data-add`:新增自定义表单数据
|
|
174
|
+
- `form-data-edit`:编辑自定义表单数据
|
|
175
|
+
- `form-data-del`:删除自定义表单数据
|
|
176
|
+
- `form-data-add-mainuser`:自定义表单添加负责人
|
|
177
|
+
- `form-data-delete-mainuser`:自定义表单删除负责人
|
|
178
|
+
- `form-data-add-couser`:自定义表单添加协同人
|
|
179
|
+
- `form-data-delete-couser`:自定义表单删除协同人
|
|
180
|
+
- `form-data-handover`:自定义表单移交
|
|
181
|
+
|
|
182
|
+
### 产品
|
|
183
|
+
|
|
184
|
+
- `product-list`:产品列表
|
|
185
|
+
- `product-detail`:产品详情
|
|
186
|
+
- `product-add`:新建产品
|
|
187
|
+
- `product-edit`:编辑产品
|
|
188
|
+
- `product-del`:删除产品
|
|
189
|
+
- `product-online`:产品上下架
|
|
190
|
+
- `product-category-list`:产品分类列表
|
|
191
|
+
- `product-category-add`:新建产品分类
|
|
192
|
+
- `product-category-update`:编辑产品分类
|
|
193
|
+
- `product-category-del`:删除产品分类
|
|
194
|
+
|
|
195
|
+
### 应收款操作
|
|
196
|
+
|
|
197
|
+
- `payment-list`:应收款列表
|
|
198
|
+
- `payment-add`:新建应收款
|
|
199
|
+
- `payment-edit`:编辑应收款
|
|
200
|
+
- `payment-detail`:应收款详情
|
|
201
|
+
- `payment-del`:删除应收款
|
|
202
|
+
- `payment-handover`:应收款移交
|
|
203
|
+
- `payment-add-mainuser`:应收款添加负责人
|
|
204
|
+
- `payment-delete-mainuser`:应收款删除负责人
|
|
205
|
+
- `payment-add-couser`:应收款添加协同人
|
|
206
|
+
- `payment-delete-couser`:应收款删除协同人
|
|
207
|
+
|
|
208
|
+
### 回款与退款
|
|
209
|
+
|
|
210
|
+
- `payment-sheet-list`:回款单列表
|
|
211
|
+
- `payment-sheet-add-write-off`:新建核销回款单
|
|
212
|
+
- `payment-sheet-edit-write-off`:编辑核销回款单
|
|
213
|
+
- `payment-sheet-add-red`:新建红冲回款单
|
|
214
|
+
- `payment-sheet-edit-red`:编辑红冲回款单
|
|
215
|
+
- `payment-sheet-add-bad-debt`:新建坏账回款单
|
|
216
|
+
- `payment-sheet-edit-bad-debt`:编辑坏账回款单
|
|
217
|
+
- `payment-sheet-add-pre`:新建预收款回款单
|
|
218
|
+
- `payment-sheet-get-amount-detail`:回款单金额明细
|
|
219
|
+
- `payment-sheet-detail`:回款单详情
|
|
220
|
+
- `payment-sheet-del`:删除回款单
|
|
221
|
+
- `payment-sheet-handover`:回款单移交
|
|
222
|
+
- `pay-plan-add`:新增付款计划
|
|
223
|
+
- `pay-plan-add-couser`:付款计划添加协同人
|
|
224
|
+
- `pay-plan-add-mainuser`:付款计划添加负责人
|
|
225
|
+
- `pay-plan-delete-couser`:付款计划删除协同人
|
|
226
|
+
- `pay-plan-delete-mainuser`:付款计划删除负责人
|
|
227
|
+
- `pay-sheet-list`:付款单列表
|
|
228
|
+
- `pay-sheet-add-write-off`:新建付款单
|
|
229
|
+
- `pay-sheet-edit-write-off`:编辑付款单
|
|
230
|
+
- `pay-sheet-add-red`:新建核销付款单红冲
|
|
231
|
+
- `pay-sheet-edit-red`:编辑核销付款单红冲
|
|
232
|
+
- `pay-sheet-add-bad`:新建核销付款单坏账
|
|
233
|
+
- `pay-sheet-edit-bad`:编辑核销付款单坏账
|
|
234
|
+
- `pay-sheet-add-couser`:付款单添加协同人
|
|
235
|
+
- `pay-sheet-add-mainuser`:付款单添加负责人
|
|
236
|
+
- `pay-sheet-delete-couser`:付款单删除协同人
|
|
237
|
+
- `pay-sheet-delete-mainuser`:付款单删除负责人
|
|
238
|
+
- `pay-sheet-get-amount-detail`:付款单金额明细
|
|
239
|
+
- `pay-sheet-detail`:付款单详情
|
|
240
|
+
- `pay-sheet-del`:删除付款单
|
|
241
|
+
- `refund-list`:退货退款单列表
|
|
242
|
+
- `refund-add`:新建退货退款单
|
|
243
|
+
- `refund-edit`:编辑退货退款单
|
|
244
|
+
- `refund-detail`:退货退款单详情
|
|
245
|
+
- `refund-del`:删除退货退款单
|
|
246
|
+
|
|
247
|
+
### 新版工单(服务云)
|
|
248
|
+
- `work-order-list`:新版工单列表命令
|
|
249
|
+
- `work-order-detail`:工单详情
|
|
250
|
+
- `work-order-add`:新增工单
|
|
251
|
+
- `work-order-edit`:编辑工单
|
|
252
|
+
- `work-order-del`:删除工单
|
|
253
|
+
- `work-order-operate`:工单流转
|
|
254
|
+
- `work-order-template-list`:工单模板列表
|
|
255
|
+
- `work-order-template-detail`:工单模板详情
|
|
256
|
+
- `workorder-handover`:移交工单负责人
|
|
257
|
+
- `workorder-add-couser`:添加工单协同人
|
|
258
|
+
- `workorder-delete-couser`:删除工单协同人
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
### 工作报告
|
|
262
|
+
|
|
263
|
+
- `work-report-daily-list`:日报列表
|
|
264
|
+
- `work-report-daily-detail`:日报详情
|
|
265
|
+
- `work-report-daily-add`:新建日报
|
|
266
|
+
- `work-report-daily-edit`:编辑日报
|
|
267
|
+
- `work-report-daily-del`:删除日报
|
|
268
|
+
- `work-report-daily-get-work-plan`:获取工作计划
|
|
269
|
+
- `work-report-weekly-list`:周报列表
|
|
270
|
+
- `work-report-weekly-detail`:周报详情
|
|
271
|
+
- `work-report-weekly-add`:新建周报
|
|
272
|
+
- `work-report-weekly-edit`:编辑周报
|
|
273
|
+
- `work-report-weekly-del`:删除周报
|
|
274
|
+
- `work-report-monthly-list`:月报列表
|
|
275
|
+
- `work-report-monthly-detail`:月报详情
|
|
276
|
+
- `work-report-monthly-add`:新建月报
|
|
277
|
+
- `work-report-monthly-edit`:编辑月报
|
|
278
|
+
- `work-report-monthly-del`:删除月报
|
|
279
|
+
|
|
280
|
+
### 阶段流转
|
|
281
|
+
|
|
282
|
+
- `stage-get`:阶段获取
|
|
283
|
+
- `stage-jump`:阶段跳转
|
|
284
|
+
|
|
285
|
+
### 旧工单(已过时,不建议使用)
|
|
286
|
+
- `workorderlist`:旧版工单列表命令
|
|
287
|
+
- `workorderproductlist`:工单配件列表
|
|
288
|
+
- `worktimerecordlist`:工时记录列表
|
|
289
|
+
- `worktimerecorddetail`:工时记录详情
|
|
290
|
+
|
|
291
|
+
## 命名说明
|
|
292
|
+
|
|
293
|
+
仓库里现在同时保留两套工单命名:
|
|
294
|
+
|
|
295
|
+
- 旧命名:`workorderlist`、`workorderproductlist`
|
|
296
|
+
- 新命名:`work-order-list`、`work-order-detail`、`work-order-add`、`work-order-edit`、`work-order-del`、`work-order-operate`
|
|
297
|
+
|
|
298
|
+
建议新接入优先使用带连字符的 `work-order-*` 命令。`workorderlist` 仍保留,主要用于兼容旧功能。
|
|
299
|
+
|
|
300
|
+
## 通用行为
|
|
301
|
+
|
|
302
|
+
- 先执行一次 `token-set` 保存有效的 `corpid`、`token`、`userId`
|
|
303
|
+
- 除 `token-set` 外,其余命令都会从 `~/.xbbcli/config.env` 读取 `corpid`
|
|
304
|
+
- 大部分命令会从 `~/.xbbcli/config.env` 读取 `token`
|
|
305
|
+
- 所有命令会从配置中读取 `userId` 并附加到请求 header 中
|
|
306
|
+
- 大部分命令需要 formId 参数,可以根据业务名称或 businessType 从 `~/.xbbcli/<corpid>.formlist.json` 中获取 formId
|
|
307
|
+
- 未传入的可选参数不会进入请求体
|
|
308
|
+
- `--attr` 和 `--value` 只有同时提供时才会拼入查询条件
|
|
309
|
+
- `--limit` 是在响应映射之后截断结果
|
|
310
|
+
- 失败时返回的是带 `code` / `msg` 的结果行,不抛异常
|
|
311
|
+
- 加 `--debug` 可以输出 `requestBody` 和 `responseBody`
|
|
312
|
+
- 加 `--raw` 可以输出接口返回的原始 JSON 字符串(所有 list 命令均支持)
|
|
313
|
+
- 在填充参数时不清楚参数含义/下拉框可选项值,调用 `form-get` 命令获取 form 解释
|
|
314
|
+
|
|
315
|
+
## 常用示例
|
|
316
|
+
|
|
317
|
+
### 基础配置/初始化
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
xbbcli token-set --corpid your_corpid --token your_token --userId your_userid
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 员工信息
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
xbbcli user-list
|
|
327
|
+
xbbcli user-list --nameLike 张三 --debug
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### 表单查询
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
xbbcli form-list --saasMark 1
|
|
334
|
+
xbbcli form-list --saasMark 1 --businessType 100
|
|
335
|
+
xbbcli form-list --saasMark 2 --name 工单
|
|
336
|
+
|
|
337
|
+
xbbcli form-get --formId 19274
|
|
338
|
+
xbbcli form-get --formId 19277 --subBusinessType 100
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 客户
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
xbbcli customer-list --formId 12345
|
|
345
|
+
xbbcli customer-list --formId 12345 --attr text_1 --value apiTest.001
|
|
346
|
+
|
|
347
|
+
xbbcli customer-add --formId 19274 --dataList '{"text_1":"apiTest.001"}'
|
|
348
|
+
xbbcli customer-edit --formId 19274 --dataId 310992 --dataList '{"text_1":"apiTest.001-编辑"}'
|
|
349
|
+
xbbcli customer-detail --dataId 310992
|
|
350
|
+
xbbcli customer-add-couser --dataId 310995 --businessUserIdList '["xbbTest002"]'
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### 表单模型/业务数据
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
xbbcli form-data-list --formId 19274
|
|
357
|
+
xbbcli form-data-detail --dataId 310992
|
|
358
|
+
xbbcli form-data-add --formId 19274 --dataList '{"text_1":"apiTest.001"}'
|
|
359
|
+
xbbcli form-data-edit --dataId 310992 --dataList '{"text_1":"apiTest.001-编辑"}'
|
|
360
|
+
xbbcli form-data-del --dataId 310992
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### 产品、回款、退款
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
xbbcli product-list --attr serialNo --value CP.API.0001
|
|
367
|
+
xbbcli product-detail --dataId 10001
|
|
368
|
+
xbbcli product-category-list
|
|
369
|
+
xbbcli product-category-update --dataId 306 --name 分类A
|
|
370
|
+
xbbcli product-category-del --dataId 306
|
|
371
|
+
|
|
372
|
+
xbbcli payment-list --attr serialNo --value PMO.API.0001
|
|
373
|
+
xbbcli payment-sheet-list --attr serialNo --value RMO.API.0001
|
|
374
|
+
xbbcli payment-sheet-list --subBusinessType 702
|
|
375
|
+
xbbcli payment-sheet-edit-write-off --dataId 1194 --dataList '{"text_7":"编辑备注"}'
|
|
376
|
+
xbbcli payment-sheet-add-red --dataList '{"serialNo":"RMO.API.0001"}'
|
|
377
|
+
xbbcli payment-sheet-edit-red --dataId 1198 --dataList '{"text_7":"编辑红冲备注"}'
|
|
378
|
+
xbbcli payment-sheet-add-bad-debt --dataList '{"serialNo":"RMO.API.0002"}'
|
|
379
|
+
xbbcli refund-list --attr serialNo --value RFO.API.0001
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 工单新命名
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
xbbcli work-order-list --formId 7526034
|
|
386
|
+
xbbcli work-order-list --formId 7526034 --attr serialNo --value WOO.20210616001
|
|
387
|
+
xbbcli work-order-list --formId 7526034 --conditions "[{\"attr\":\"text_4\",\"value\":[4],\"symbol\":\"in\"},{\"attr\":\"ownerId\",\"value\":[\"02415643151585\"],\"symbol\":\"equal\"}]"
|
|
388
|
+
|
|
389
|
+
xbbcli work-order-detail --dataId 663
|
|
390
|
+
xbbcli work-order-add --formId 7526034 --dataList '{"text_1":"测试工单"}'
|
|
391
|
+
xbbcli work-order-edit --dataId 663 --dataList '{"text_1":"测试工单-更新"}'
|
|
392
|
+
xbbcli work-order-del --dataId 663
|
|
393
|
+
xbbcli work-order-operate --dataId 663 --operateType 12 --userId "02415643151585"
|
|
394
|
+
xbbcli work-order-operate --dataId 663 --operateType 1 --data '{"cancelReason":"测试取消"}'
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### 工单旧命名与工时
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
xbbcli workorderlist --formId 689 --attr serialNo --value WOO.20210616001
|
|
401
|
+
xbbcli workorderproductlist --dataId 663
|
|
402
|
+
xbbcli work-order-template-list
|
|
403
|
+
xbbcli work-order-template-detail --formId 689
|
|
404
|
+
|
|
405
|
+
xbbcli worktimerecordlist
|
|
406
|
+
xbbcli worktimerecordlist --conditions "[{\"attr\":\"ownerId\",\"value\":[\"02415643151585\"],\"symbol\":\"equal\"}]"
|
|
407
|
+
xbbcli worktimerecorddetail --dataId 10001
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
## 参数约定
|
|
411
|
+
|
|
412
|
+
- `dataList`:JSON 对象字符串,例如 `{"text_1":"value"}`
|
|
413
|
+
- `conditions`:JSON 数组字符串,例如 `[{"attr":"text_4","value":[4],"symbol":"in"}]`
|
|
414
|
+
- `businessUserIdList`:支持 JSON 数组或逗号分隔字符串
|
|
415
|
+
- `operateType` 常见值:
|
|
416
|
+
- `1` 取消
|
|
417
|
+
- `2` 重启
|
|
418
|
+
- `3` 移交
|
|
419
|
+
- `4` 分配
|
|
420
|
+
- `8` 接受
|
|
421
|
+
- `10` 开始
|
|
422
|
+
- `11` 签到
|
|
423
|
+
- `12` 完成
|
|
424
|
+
- `13` 签退
|
|
425
|
+
- `15` 回退
|
|
426
|
+
- `16` 结算
|
|
427
|
+
- `17` 回访
|
|
428
|
+
- `18` 指派
|
|
429
|
+
- `19` 自由节点完成
|
|
430
|
+
- `20` 编辑回执单
|
|
431
|
+
|
|
432
|
+
## 调试
|
|
433
|
+
|
|
434
|
+
命令加 `--debug` 后,会把请求体和原始响应一起带回结果列,便于排查签名、参数拼装和接口返回问题。
|
|
435
|
+
|
|
436
|
+
命令加 `--raw` 后,直接返回接口原始 JSON 字符串(单行 `{ raw: "..." }`),适合管道处理或人工检查响应结构。所有 list 命令均支持该参数。
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { cli, Strategy } from './xbb-registry.js';
|
|
6
|
+
|
|
7
|
+
const CONFIG_FILE = path.join(os.homedir(), '.opencli', 'xbb', 'config.env');
|
|
8
|
+
const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/hkh/call/addTask';
|
|
9
|
+
const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
|
|
10
|
+
const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 opencli xbb token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
|
|
11
|
+
|
|
12
|
+
function readConfig() {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
15
|
+
} catch {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getRuntimeConfig() {
|
|
21
|
+
const config = readConfig();
|
|
22
|
+
return {
|
|
23
|
+
corpid: String(config.corpid || '').trim(),
|
|
24
|
+
token: String(config.token || '').trim(),
|
|
25
|
+
baseUrl: String(config.baseurl || DEFAULT_BASE_URL).trim(),
|
|
26
|
+
userId: String(config.userId || '').trim(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function buildApiUrl(baseUrl, apiUrl) {
|
|
31
|
+
const apiPath = new URL(apiUrl).pathname;
|
|
32
|
+
return `${baseUrl.replace(/\/+$/, '')}${apiPath}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function parseJsonArray(raw) {
|
|
36
|
+
const text = String(raw || '').trim();
|
|
37
|
+
if (!text) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const parsed = JSON.parse(text);
|
|
42
|
+
return Array.isArray(parsed) ? parsed : undefined;
|
|
43
|
+
} catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function makeErrorRow(code, msg) {
|
|
49
|
+
return [{ code, msg }];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
cli({
|
|
53
|
+
site: 'xbb',
|
|
54
|
+
name: 'ai-call-add-task',
|
|
55
|
+
description: '批量AI呼叫接口(businessType: -1;业务模块: hkh AI呼叫)',
|
|
56
|
+
strategy: Strategy.PUBLIC,
|
|
57
|
+
access: 'write',
|
|
58
|
+
browser: false,
|
|
59
|
+
domain: 'proapi.xbongbong.com',
|
|
60
|
+
args: [
|
|
61
|
+
{ name: 'formId', type: 'int', help: '表单id(必填)' },
|
|
62
|
+
{ name: 'dataIdList', type: 'str', help: '客户id列表,JSON数组字符串(必填)' },
|
|
63
|
+
{ name: 'id', type: 'int', help: 'AI话术ID(必填,可通过 ai-word-list 获取)' },
|
|
64
|
+
{ name: 'businessType', type: 'int', help: '业务类型(必填)' },
|
|
65
|
+
{ name: 'userId', type: 'str', default: '', help: '操作人id(可选)' },
|
|
66
|
+
{ name: 'debug', type: 'bool', default: false, help: '输出请求体和返回体调试信息' },
|
|
67
|
+
],
|
|
68
|
+
columns: ['code', 'msg'],
|
|
69
|
+
func: async function (kwargs) {
|
|
70
|
+
const debug = Boolean(kwargs.debug);
|
|
71
|
+
const { corpid, token, baseUrl, userId } = getRuntimeConfig();
|
|
72
|
+
const runtimeUserId = String(kwargs.userId || userId || '').trim();
|
|
73
|
+
const payload = { corpid };
|
|
74
|
+
payload.formId = Number(kwargs.formId || 0);
|
|
75
|
+
const parsedDataIdList = parseJsonArray(kwargs.dataIdList);
|
|
76
|
+
if (Array.isArray(parsedDataIdList)) payload.dataIdList = parsedDataIdList;
|
|
77
|
+
payload.id = Number(kwargs.id || 0);
|
|
78
|
+
payload.businessType = Number(kwargs.businessType || 0);
|
|
79
|
+
if (runtimeUserId) payload.userId = runtimeUserId;
|
|
80
|
+
const requestBody = JSON.stringify(payload);
|
|
81
|
+
if (!payload.corpid) return makeErrorRow('NO_CORPID', '缺少本地 corpid;请先执行 opencli xbb token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>');
|
|
82
|
+
if (!payload.formId) return makeErrorRow('NO_FORMID', '缺少 --formId');
|
|
83
|
+
if (parsedDataIdList === null) return makeErrorRow('NO_DATAIDLIST', '缺少 --dataIdList');
|
|
84
|
+
if (parsedDataIdList === undefined) return makeErrorRow('INVALID_DATAIDLIST', '--dataIdList 必须是 JSON 数组字符串');
|
|
85
|
+
if (!payload.id) return makeErrorRow('NO_ID', '缺少 --id');
|
|
86
|
+
if (!payload.businessType) return makeErrorRow('NO_BUSINESSTYPE', '缺少 --businessType');
|
|
87
|
+
if (!token) return makeErrorRow('NO_TOKEN', MISSING_TOKEN_MESSAGE);
|
|
88
|
+
const sign = crypto.createHash('sha256').update(requestBody + token).digest('hex');
|
|
89
|
+
const headers = Object.assign({ 'Content-Type': 'application/json;charset=UTF-8', sign }, runtimeUserId ? { userId: runtimeUserId } : {});
|
|
90
|
+
const apiUrl = buildApiUrl(baseUrl, API_URL);
|
|
91
|
+
if (debug) {
|
|
92
|
+
process.stderr.write(`[debug] URL: ${apiUrl}\n[debug] Headers: ${JSON.stringify(headers)}\n[debug] RequestBody: ${requestBody}\n`);
|
|
93
|
+
}
|
|
94
|
+
const resp = await fetch(apiUrl, { method: 'POST', headers, body: requestBody });
|
|
95
|
+
if (!resp.ok) {
|
|
96
|
+
const responseText = await resp.text();
|
|
97
|
+
if (debug) process.stderr.write(`[debug] ResponseBody: ${responseText}\n`);
|
|
98
|
+
return makeErrorRow(resp.status, `HTTP ${resp.status} ${resp.statusText}`);
|
|
99
|
+
}
|
|
100
|
+
const data = await resp.json();
|
|
101
|
+
const responseBody = JSON.stringify(data);
|
|
102
|
+
if (debug) process.stderr.write(`[debug] ResponseBody: ${responseBody}\n`);
|
|
103
|
+
if (data.code !== 1) return makeErrorRow(data.code ?? '', data.msg ?? '未知错误');
|
|
104
|
+
return [{ code: data.code ?? '', msg: data.msg || '' }];
|
|
105
|
+
},
|
|
106
|
+
});
|
package/ai-word-list.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { cli, Strategy } from './xbb-registry.js';
|
|
6
|
+
|
|
7
|
+
const CONFIG_FILE = path.join(os.homedir(), '.opencli', 'xbb', 'config.env');
|
|
8
|
+
const API_URL = 'https://proapi.xbongbong.com/pro/v2/api/hkh/call/aiWords';
|
|
9
|
+
const DEFAULT_BASE_URL = 'https://proapi.xbongbong.com';
|
|
10
|
+
const MISSING_TOKEN_MESSAGE = '缺少 token;请先执行 opencli xbb token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>';
|
|
11
|
+
|
|
12
|
+
function readConfig() {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
15
|
+
} catch {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getRuntimeConfig() {
|
|
21
|
+
const config = readConfig();
|
|
22
|
+
return {
|
|
23
|
+
corpid: String(config.corpid || '').trim(),
|
|
24
|
+
token: String(config.token || '').trim(),
|
|
25
|
+
baseUrl: String(config.baseurl || DEFAULT_BASE_URL).trim(),
|
|
26
|
+
userId: String(config.userId || '').trim(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function buildApiUrl(baseUrl, apiUrl) {
|
|
31
|
+
const apiPath = new URL(apiUrl).pathname;
|
|
32
|
+
return `${baseUrl.replace(/\/+$/, '')}${apiPath}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function makeErrorRow(code, msg) {
|
|
36
|
+
return [{ rank: '', id: '', wordsname: '', isonline: '', isuse: '', ismarket: '', ispy: '', code, msg }];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
cli({
|
|
40
|
+
site: 'xbb',
|
|
41
|
+
name: 'ai-word-list',
|
|
42
|
+
description: '获取AI话术列表接口(businessType: -1;业务模块: hkh AI呼叫)',
|
|
43
|
+
strategy: Strategy.PUBLIC,
|
|
44
|
+
access: 'read',
|
|
45
|
+
browser: false,
|
|
46
|
+
domain: 'proapi.xbongbong.com',
|
|
47
|
+
args: [
|
|
48
|
+
{ name: 'userId', type: 'str', default: '', help: '操作人id(可选)' },
|
|
49
|
+
{ name: 'debug', type: 'bool', default: false, help: '输出请求体和返回体调试信息' },
|
|
50
|
+
],
|
|
51
|
+
columns: ['rank', 'id', 'wordsname', 'isonline', 'isuse', 'ismarket', 'ispy', 'code', 'msg'],
|
|
52
|
+
func: async function (kwargs) {
|
|
53
|
+
const debug = Boolean(kwargs.debug);
|
|
54
|
+
const { corpid, token, baseUrl, userId } = getRuntimeConfig();
|
|
55
|
+
const runtimeUserId = String(kwargs.userId || userId || '').trim();
|
|
56
|
+
const payload = { corpid };
|
|
57
|
+
if (runtimeUserId) payload.userId = runtimeUserId;
|
|
58
|
+
const requestBody = JSON.stringify(payload);
|
|
59
|
+
if (!payload.corpid) return makeErrorRow('NO_CORPID', '缺少本地 corpid;请先执行 opencli xbb token-set --corpid <CORPID> --token <TOKEN> --userId <USERID>');
|
|
60
|
+
if (!token) return makeErrorRow('NO_TOKEN', MISSING_TOKEN_MESSAGE);
|
|
61
|
+
const sign = crypto.createHash('sha256').update(requestBody + token).digest('hex');
|
|
62
|
+
const headers = Object.assign({ 'Content-Type': 'application/json;charset=UTF-8', sign }, runtimeUserId ? { userId: runtimeUserId } : {});
|
|
63
|
+
const apiUrl = buildApiUrl(baseUrl, API_URL);
|
|
64
|
+
if (debug) {
|
|
65
|
+
process.stderr.write(`[debug] URL: ${apiUrl}\n[debug] Headers: ${JSON.stringify(headers)}\n[debug] RequestBody: ${requestBody}\n`);
|
|
66
|
+
}
|
|
67
|
+
const resp = await fetch(apiUrl, { method: 'POST', headers, body: requestBody });
|
|
68
|
+
if (!resp.ok) {
|
|
69
|
+
const responseText = await resp.text();
|
|
70
|
+
if (debug) process.stderr.write(`[debug] ResponseBody: ${responseText}\n`);
|
|
71
|
+
return makeErrorRow(resp.status, `HTTP ${resp.status} ${resp.statusText}`);
|
|
72
|
+
}
|
|
73
|
+
const data = await resp.json();
|
|
74
|
+
const responseBody = JSON.stringify(data);
|
|
75
|
+
if (debug) process.stderr.write(`[debug] ResponseBody: ${responseBody}\n`);
|
|
76
|
+
if (data.code !== 1) return makeErrorRow(data.code ?? '', data.msg ?? '未知错误');
|
|
77
|
+
const list = Array.isArray(data.result?.wordList) ? data.result.wordList : [];
|
|
78
|
+
if (!list.length) return makeErrorRow('NO_DATA', '接口成功,但 wordList 为空');
|
|
79
|
+
return list.map((item, index) => ({ rank: index + 1, id: item.id || '', wordsname: item.wordsname || '', isonline: item.isonline ?? '', isuse: item.isuse ?? '', ismarket: item.ismarket ?? '', ispy: item.ispy ?? '', code: '', msg: '' }));
|
|
80
|
+
},
|
|
81
|
+
});
|