1688-cli 0.1.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/AGENTS.md +118 -0
- package/README.md +48 -0
- package/dist/auth/cookies.js +31 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/verify.js +25 -0
- package/dist/auth/verify.js.map +1 -0
- package/dist/cli.js +373 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cart-add.js +199 -0
- package/dist/commands/cart-add.js.map +1 -0
- package/dist/commands/cart-list.js +168 -0
- package/dist/commands/cart-list.js.map +1 -0
- package/dist/commands/cart-remove.js +119 -0
- package/dist/commands/cart-remove.js.map +1 -0
- package/dist/commands/checkout-confirm.js +407 -0
- package/dist/commands/checkout-confirm.js.map +1 -0
- package/dist/commands/checkout-prepare.js +244 -0
- package/dist/commands/checkout-prepare.js.map +1 -0
- package/dist/commands/doctor.js +246 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/image-search.js +210 -0
- package/dist/commands/image-search.js.map +1 -0
- package/dist/commands/login.js +209 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +59 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/offer.js +185 -0
- package/dist/commands/offer.js.map +1 -0
- package/dist/commands/order-get.js +76 -0
- package/dist/commands/order-get.js.map +1 -0
- package/dist/commands/order-list.js +176 -0
- package/dist/commands/order-list.js.map +1 -0
- package/dist/commands/order-logistics.js +152 -0
- package/dist/commands/order-logistics.js.map +1 -0
- package/dist/commands/search.js +250 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/seller-chat.js +213 -0
- package/dist/commands/seller-chat.js.map +1 -0
- package/dist/commands/seller-inquire.js +110 -0
- package/dist/commands/seller-inquire.js.map +1 -0
- package/dist/commands/seller-lookup-ww.js +6 -0
- package/dist/commands/seller-lookup-ww.js.map +1 -0
- package/dist/commands/seller-messages.js +181 -0
- package/dist/commands/seller-messages.js.map +1 -0
- package/dist/commands/whoami.js +53 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/workflows.js +264 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/daemon/client.js +75 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/manager.js +128 -0
- package/dist/daemon/manager.js.map +1 -0
- package/dist/daemon/protocol.js +5 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.js +197 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/throttle.js +17 -0
- package/dist/daemon/throttle.js.map +1 -0
- package/dist/io/errors.js +10 -0
- package/dist/io/errors.js.map +1 -0
- package/dist/io/output.js +17 -0
- package/dist/io/output.js.map +1 -0
- package/dist/io/prompt.js +17 -0
- package/dist/io/prompt.js.map +1 -0
- package/dist/session/context.js +91 -0
- package/dist/session/context.js.map +1 -0
- package/dist/session/dispatch.js +50 -0
- package/dist/session/dispatch.js.map +1 -0
- package/dist/session/lock.js +23 -0
- package/dist/session/lock.js.map +1 -0
- package/dist/session/paths.js +31 -0
- package/dist/session/paths.js.map +1 -0
- package/dist/session/shared.js +104 -0
- package/dist/session/shared.js.map +1 -0
- package/dist/session/state.js +27 -0
- package/dist/session/state.js.map +1 -0
- package/dist/util/time.js +17 -0
- package/dist/util/time.js.map +1 -0
- package/package.json +44 -0
- package/scripts/postinstall.mjs +49 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { dispatch } from '../session/dispatch.js';
|
|
2
|
+
import { emit, info } from '../io/output.js';
|
|
3
|
+
import { CliError } from '../io/errors.js';
|
|
4
|
+
import { readState } from '../session/state.js';
|
|
5
|
+
const IM_BASE = 'https://air.1688.com/app/ocms-fusion-components-1688/def_cbu_web_im/index.html';
|
|
6
|
+
export async function execute(ctx, args) {
|
|
7
|
+
const page = await ctx.newPage();
|
|
8
|
+
try {
|
|
9
|
+
let url;
|
|
10
|
+
if (args.sellerLoginId && args.orderId) {
|
|
11
|
+
url =
|
|
12
|
+
`${IM_BASE}?` +
|
|
13
|
+
`touid=cnalichn${encodeURIComponent(args.sellerLoginId)}` +
|
|
14
|
+
`&siteid=cnalichn` +
|
|
15
|
+
`&status=1` +
|
|
16
|
+
`&portalId=` +
|
|
17
|
+
`&gid=` +
|
|
18
|
+
`&offerId=` +
|
|
19
|
+
`&itemsId=` +
|
|
20
|
+
`&orderId=${encodeURIComponent(args.orderId)}` +
|
|
21
|
+
`#/`;
|
|
22
|
+
info(`Opening 旺旺 (order-scoped: orderId=${args.orderId})...`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
url = `${IM_BASE}?fromid=cnalichn${encodeURIComponent(args.myLoginId)}`;
|
|
26
|
+
info('Opening 旺旺 IM (sidebar mode)...');
|
|
27
|
+
}
|
|
28
|
+
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
|
29
|
+
if (/login\.1688\.com|login\.taobao\.com/.test(page.url())) {
|
|
30
|
+
throw new CliError(3, 'NOT_LOGGED_IN', 'Session expired. Run `1688 login`.');
|
|
31
|
+
}
|
|
32
|
+
const imFrame = page.frameLocator('iframe[src*="def_cbu_web_im_core"]');
|
|
33
|
+
const input = imFrame.locator('pre.edit[contenteditable="true"]').first();
|
|
34
|
+
try {
|
|
35
|
+
await input.waitFor({ state: 'visible', timeout: 20000 });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new CliError(22, 'CHAT_NOT_LOADED', 'Failed to open 旺旺 IM.');
|
|
39
|
+
}
|
|
40
|
+
await new Promise((r) => setTimeout(r, 3000));
|
|
41
|
+
// If sidebar mode: find + click the seller
|
|
42
|
+
let matched = null;
|
|
43
|
+
if (!args.sellerLoginId || !args.orderId) {
|
|
44
|
+
for (const name of args.searchNames) {
|
|
45
|
+
if (!name)
|
|
46
|
+
continue;
|
|
47
|
+
const item = imFrame.locator(`text=${name}`).first();
|
|
48
|
+
if (await item.isVisible({ timeout: 2000 }).catch(() => false)) {
|
|
49
|
+
await item.click({ force: true });
|
|
50
|
+
matched = name;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (!matched) {
|
|
55
|
+
throw new CliError(29, 'SELLER_NOT_IN_SIDEBAR', `Seller not in 旺旺 sidebar: ${args.searchNames.join(', ')}. ` +
|
|
56
|
+
'Use orderId instead to auto-activate via order context.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
matched = args.searchNames[0] ?? args.sellerLoginId;
|
|
61
|
+
}
|
|
62
|
+
// Wait for conversation panel to activate
|
|
63
|
+
const activated = await page
|
|
64
|
+
.waitForFunction(() => {
|
|
65
|
+
const iframe = document.querySelector('iframe[src*="def_cbu_web_im_core"]');
|
|
66
|
+
const body = iframe?.contentDocument?.body?.innerText ?? '';
|
|
67
|
+
return !/您尚未选择联系人/.test(body) && body.length > 50;
|
|
68
|
+
}, { timeout: 25000 })
|
|
69
|
+
.then(() => true)
|
|
70
|
+
.catch(() => false);
|
|
71
|
+
if (!activated) {
|
|
72
|
+
throw new CliError(26, 'CONVERSATION_NOT_SELECTED', `Conversation did not activate for ${matched}.`);
|
|
73
|
+
}
|
|
74
|
+
await new Promise((r) => setTimeout(r, 2500)); // let messages render
|
|
75
|
+
// Extract messages from .message-item elements
|
|
76
|
+
const frame = page
|
|
77
|
+
.frames()
|
|
78
|
+
.find((f) => /def_cbu_web_im_core/.test(f.url()));
|
|
79
|
+
if (!frame) {
|
|
80
|
+
throw new CliError(22, 'CHAT_NOT_LOADED', 'IM iframe not available.');
|
|
81
|
+
}
|
|
82
|
+
const raw = await frame.evaluate(() => {
|
|
83
|
+
const items = Array.from(document.querySelectorAll('.message-item'));
|
|
84
|
+
return items.map((item) => {
|
|
85
|
+
const cls = item.className?.toString?.() ?? '';
|
|
86
|
+
const isMine = / self(\s|$)/.test(' ' + cls);
|
|
87
|
+
const full = (item.innerText ?? '').replace(/\s+/g, ' ').trim();
|
|
88
|
+
const tsRe = /(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})/;
|
|
89
|
+
const tsMatch = full.match(tsRe);
|
|
90
|
+
const time = tsMatch ? tsMatch[1] : null;
|
|
91
|
+
let sender = '';
|
|
92
|
+
let content = full;
|
|
93
|
+
if (tsMatch) {
|
|
94
|
+
sender = full.slice(0, tsMatch.index).trim();
|
|
95
|
+
content = full.slice(tsMatch.index + tsMatch[0].length).trim();
|
|
96
|
+
}
|
|
97
|
+
// Seller side shows "shop_name:operator_name" — keep just shop part.
|
|
98
|
+
const colonIdx = sender.indexOf(':');
|
|
99
|
+
const senderShort = colonIdx > -1 ? sender.slice(0, colonIdx) : sender;
|
|
100
|
+
const read = /已读\s*$/.test(content);
|
|
101
|
+
const cleanContent = content.replace(/\s*已读\s*$/, '').trim();
|
|
102
|
+
return {
|
|
103
|
+
sender: senderShort.trim(),
|
|
104
|
+
time,
|
|
105
|
+
isMine,
|
|
106
|
+
content: cleanContent,
|
|
107
|
+
read,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
conversation: matched ?? '?',
|
|
113
|
+
total: raw.length,
|
|
114
|
+
messages: raw.slice(-Math.max(1, args.limit)),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
await page.close().catch(() => { });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export async function run(opts) {
|
|
122
|
+
if (!opts.target) {
|
|
123
|
+
throw new CliError(2, 'BAD_INPUT', 'target required (orderId or seller name).');
|
|
124
|
+
}
|
|
125
|
+
const limit = Math.min(200, Math.max(1, parseInt(opts.limit ?? '20', 10)));
|
|
126
|
+
const sinceMs = opts.since ? Date.parse(opts.since) : 0;
|
|
127
|
+
const state = await readState();
|
|
128
|
+
if (!state.nick) {
|
|
129
|
+
throw new CliError(3, 'NOT_LOGGED_IN', 'Cannot determine your loginId. Run `1688 whoami`.');
|
|
130
|
+
}
|
|
131
|
+
let args;
|
|
132
|
+
if (/^\d+$/.test(opts.target)) {
|
|
133
|
+
info(`Looking up seller for order ${opts.target}...`);
|
|
134
|
+
const order = await dispatch('order-get', { orderId: opts.target, maxScanPages: 5 }, { headed: opts.headed, profile: opts.profile });
|
|
135
|
+
args = {
|
|
136
|
+
searchNames: [order.seller.loginId, order.seller.name].filter(Boolean),
|
|
137
|
+
sellerLoginId: order.seller.loginId ?? undefined,
|
|
138
|
+
orderId: opts.target,
|
|
139
|
+
myLoginId: state.nick,
|
|
140
|
+
limit,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
args = {
|
|
145
|
+
searchNames: [opts.target],
|
|
146
|
+
myLoginId: state.nick,
|
|
147
|
+
limit,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
let data = await dispatch('seller-messages', args, { headed: opts.headed, profile: opts.profile });
|
|
151
|
+
// Apply --since filter
|
|
152
|
+
if (sinceMs > 0) {
|
|
153
|
+
data = {
|
|
154
|
+
...data,
|
|
155
|
+
messages: data.messages.filter((m) => {
|
|
156
|
+
if (!m.time)
|
|
157
|
+
return false;
|
|
158
|
+
const t = Date.parse(m.time.replace(' ', 'T') + '+08:00');
|
|
159
|
+
return Number.isFinite(t) && t > sinceMs;
|
|
160
|
+
}),
|
|
161
|
+
total: data.messages.length,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
emit({
|
|
165
|
+
human: () => printMessages(data),
|
|
166
|
+
data,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function printMessages(r) {
|
|
170
|
+
process.stdout.write(`Conversation: ${r.conversation}\n`);
|
|
171
|
+
if (r.messages.length === 0) {
|
|
172
|
+
process.stdout.write(' (no messages)\n');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
for (const m of r.messages) {
|
|
176
|
+
const who = m.isMine ? '我' : m.sender || '对方';
|
|
177
|
+
const tail = m.read && m.isMine ? ' [已读]' : '';
|
|
178
|
+
process.stdout.write(` [${m.time ?? '?'}] ${who}: ${m.content}${tail}\n`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=seller-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller-messages.js","sourceRoot":"","sources":["../../src/commands/seller-messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { dispatch } from '../session/dispatch.js';
|
|
2
|
+
import { parseIdentity } from '../auth/cookies.js';
|
|
3
|
+
import { verifyOnline } from '../auth/verify.js';
|
|
4
|
+
import { readState, writeState } from '../session/state.js';
|
|
5
|
+
import { emit, info } from '../io/output.js';
|
|
6
|
+
import { CliError } from '../io/errors.js';
|
|
7
|
+
import { nowIso, relative } from '../util/time.js';
|
|
8
|
+
export async function execute(ctx, args) {
|
|
9
|
+
const cookies = await ctx.cookies();
|
|
10
|
+
const id = parseIdentity(cookies);
|
|
11
|
+
if (!id)
|
|
12
|
+
return { loggedIn: false };
|
|
13
|
+
if (args.verify) {
|
|
14
|
+
const ok = await verifyOnline(ctx);
|
|
15
|
+
if (!ok)
|
|
16
|
+
return { loggedIn: false };
|
|
17
|
+
}
|
|
18
|
+
const state = await readState();
|
|
19
|
+
const lastVerifiedAt = args.verify ? nowIso() : state.lastVerifiedAt;
|
|
20
|
+
await writeState({
|
|
21
|
+
...state,
|
|
22
|
+
memberId: id.memberId,
|
|
23
|
+
nick: id.nick ?? undefined,
|
|
24
|
+
lastVerifiedAt,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
loggedIn: true,
|
|
28
|
+
memberId: id.memberId,
|
|
29
|
+
nick: id.nick,
|
|
30
|
+
lastVerifiedAt: lastVerifiedAt ?? null,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export async function run(opts) {
|
|
34
|
+
const data = await dispatch('whoami', { verify: opts.verify }, { profile: opts.profile });
|
|
35
|
+
if (!data.loggedIn) {
|
|
36
|
+
emit({
|
|
37
|
+
human: () => info('Not logged in. Run `1688 login` to sign in.'),
|
|
38
|
+
data: { loggedIn: false },
|
|
39
|
+
});
|
|
40
|
+
throw new CliError(3, 'NOT_LOGGED_IN', '');
|
|
41
|
+
}
|
|
42
|
+
emit({
|
|
43
|
+
human: () => {
|
|
44
|
+
const name = data.nick ?? data.memberId;
|
|
45
|
+
const tail = data.lastVerifiedAt
|
|
46
|
+
? ` (verified ${relative(data.lastVerifiedAt)})`
|
|
47
|
+
: '';
|
|
48
|
+
process.stdout.write(`${name} (memberId: ${data.memberId})${tail}\n`);
|
|
49
|
+
},
|
|
50
|
+
data,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAkBnD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAmB,EACnB,IAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IACrE,MAAM,UAAU,CAAC;QACf,GAAG,KAAK;QACR,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,SAAS;QAC1B,cAAc;KACf,CAAC,CAAC;IACH,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,cAAc,EAAE,cAAc,IAAI,IAAI;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAgB;IACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,QAAQ,EACR,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EACvB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC;YAChE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC;QACH,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAS,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc;gBAC9B,CAAC,CAAC,cAAc,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG;gBAChD,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,eAAe,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC;QACxE,CAAC;QACD,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// High-level "shortcut" workflows that compose existing commands.
|
|
2
|
+
import { dispatch } from '../session/dispatch.js';
|
|
3
|
+
import { emit, info } from '../io/output.js';
|
|
4
|
+
import { CliError } from '../io/errors.js';
|
|
5
|
+
async function listOrders(status, page, pageSize, opts) {
|
|
6
|
+
return dispatch('order-list', { status, page, pageSize }, { headed: opts.headed, profile: opts.profile });
|
|
7
|
+
}
|
|
8
|
+
async function getLogistics(orderId, opts, statusHint) {
|
|
9
|
+
return dispatch('order-logistics', { orderId, maxScanPages: 5, statusHint }, { headed: opts.headed, profile: opts.profile });
|
|
10
|
+
}
|
|
11
|
+
function daysSince(iso) {
|
|
12
|
+
if (!iso)
|
|
13
|
+
return null;
|
|
14
|
+
const t = Date.parse(iso);
|
|
15
|
+
if (!Number.isFinite(t))
|
|
16
|
+
return null;
|
|
17
|
+
return Math.floor((Date.now() - t) / 86_400_000);
|
|
18
|
+
}
|
|
19
|
+
export async function runShipped(opts) {
|
|
20
|
+
if (!opts.orderId || !/^\d+$/.test(opts.orderId)) {
|
|
21
|
+
throw new CliError(2, 'BAD_INPUT', 'Valid orderId required.');
|
|
22
|
+
}
|
|
23
|
+
info(`Fetching order ${opts.orderId}...`);
|
|
24
|
+
const order = await dispatch('order-get', { orderId: opts.orderId, maxScanPages: 5 }, { headed: opts.headed, profile: opts.profile });
|
|
25
|
+
info(`Fetching logistics...`);
|
|
26
|
+
const logistics = await getLogistics(opts.orderId, opts).catch(() => null);
|
|
27
|
+
const data = {
|
|
28
|
+
orderId: order.orderId,
|
|
29
|
+
status: order.statusLabel,
|
|
30
|
+
createdAt: order.createdAt,
|
|
31
|
+
paidAt: order.paidAt,
|
|
32
|
+
shippedAt: order.shippedAt,
|
|
33
|
+
daysSincePaid: daysSince(order.paidAt),
|
|
34
|
+
daysSinceShipped: daysSince(order.shippedAt),
|
|
35
|
+
totalAmount: order.totalAmount,
|
|
36
|
+
seller: order.seller,
|
|
37
|
+
items: order.items.map((i) => ({
|
|
38
|
+
name: i.productName,
|
|
39
|
+
qty: i.quantity,
|
|
40
|
+
amount: i.amount,
|
|
41
|
+
})),
|
|
42
|
+
logistics: logistics?.trace?.[0] ?? null,
|
|
43
|
+
};
|
|
44
|
+
emit({
|
|
45
|
+
human: () => {
|
|
46
|
+
process.stdout.write(`Order ${data.orderId}\n`);
|
|
47
|
+
process.stdout.write(` ${data.status} ¥${data.totalAmount.toFixed(2)}\n`);
|
|
48
|
+
process.stdout.write(` seller: ${data.seller.name}\n`);
|
|
49
|
+
process.stdout.write(` paid: ${data.paidAt ?? '-'} (${data.daysSincePaid ?? '?'} days ago)\n`);
|
|
50
|
+
process.stdout.write(` shipped: ${data.shippedAt ?? '-'} (${data.daysSinceShipped ?? '?'} days ago)\n`);
|
|
51
|
+
if (data.logistics) {
|
|
52
|
+
const lg = data.logistics;
|
|
53
|
+
process.stdout.write(` carrier: ${lg.carrier ?? '?'} · ${lg.mailNo}\n`);
|
|
54
|
+
process.stdout.write(` status: ${lg.currentStatus}\n`);
|
|
55
|
+
process.stdout.write(` remark: ${lg.remark}\n`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
process.stdout.write(` (no logistics yet)\n`);
|
|
59
|
+
}
|
|
60
|
+
process.stdout.write(' items:\n');
|
|
61
|
+
for (const it of data.items) {
|
|
62
|
+
process.stdout.write(` * ${it.qty}× ¥${it.amount.toFixed(2)} — ${it.name}\n`);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
data,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export async function runStuck(opts) {
|
|
69
|
+
const days = Math.max(0, parseInt(opts.days ?? '3', 10));
|
|
70
|
+
const limit = Math.max(1, parseInt(opts.limit ?? '50', 10));
|
|
71
|
+
info(`Finding waitsellersend orders paid more than ${days} days ago...`);
|
|
72
|
+
const all = [];
|
|
73
|
+
for (let p = 1; p <= 5; p++) {
|
|
74
|
+
const r = await listOrders('waitsellersend', p, 50, opts);
|
|
75
|
+
all.push(...r.orders);
|
|
76
|
+
if (r.orders.length === 0 || p >= r.totalPages)
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
const stuck = all
|
|
80
|
+
.map((o) => ({ o, days: daysSince(o.paidAt) }))
|
|
81
|
+
.filter((x) => x.days !== null && x.days >= days)
|
|
82
|
+
.sort((a, b) => (b.days ?? 0) - (a.days ?? 0))
|
|
83
|
+
.slice(0, limit);
|
|
84
|
+
const data = {
|
|
85
|
+
threshold: days,
|
|
86
|
+
total: stuck.length,
|
|
87
|
+
orders: stuck.map((x) => ({
|
|
88
|
+
orderId: x.o.orderId,
|
|
89
|
+
daysSincePaid: x.days,
|
|
90
|
+
paidAt: x.o.paidAt,
|
|
91
|
+
totalAmount: x.o.totalAmount,
|
|
92
|
+
seller: x.o.seller.name,
|
|
93
|
+
sellerLoginId: x.o.seller.loginId,
|
|
94
|
+
item: x.o.items[0]?.productName?.slice(0, 50) ?? '',
|
|
95
|
+
})),
|
|
96
|
+
};
|
|
97
|
+
emit({
|
|
98
|
+
human: () => {
|
|
99
|
+
if (stuck.length === 0) {
|
|
100
|
+
process.stdout.write(`No orders stuck > ${days} days.\n`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
process.stdout.write(`Stuck orders (paid > ${days} days, not shipped):\n\n`);
|
|
104
|
+
for (const x of data.orders) {
|
|
105
|
+
process.stdout.write(` ${x.orderId} ${x.daysSincePaid}d ¥${x.totalAmount?.toFixed(2)} ${x.seller}\n`);
|
|
106
|
+
process.stdout.write(` ${x.item}\n`);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
data,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export async function runFakeShipped(opts) {
|
|
113
|
+
const days = Math.max(0, parseInt(opts.days ?? '1', 10));
|
|
114
|
+
const limit = Math.max(1, parseInt(opts.limit ?? '50', 10));
|
|
115
|
+
const maxPages = Math.max(1, parseInt(opts.maxPages ?? '2', 10));
|
|
116
|
+
const maxCheck = Math.max(1, parseInt(opts.maxCheck ?? '20', 10));
|
|
117
|
+
info(`Finding waitbuyerreceive orders shipped > ${days} days ago...`);
|
|
118
|
+
const all = [];
|
|
119
|
+
for (let p = 1; p <= maxPages; p++) {
|
|
120
|
+
const r = await listOrders('waitbuyerreceive', p, 50, opts);
|
|
121
|
+
all.push(...r.orders);
|
|
122
|
+
if (r.orders.length === 0 || p >= r.totalPages)
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
const candidates = all
|
|
126
|
+
.map((o) => ({ o, days: daysSince(o.shippedAt) }))
|
|
127
|
+
.filter((x) => x.days !== null && x.days >= days)
|
|
128
|
+
.sort((a, b) => (b.days ?? 0) - (a.days ?? 0))
|
|
129
|
+
.slice(0, maxCheck);
|
|
130
|
+
info(`Checking logistics for ${candidates.length} oldest candidates (cap --max-check=${maxCheck})...`);
|
|
131
|
+
const flagged = [];
|
|
132
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
133
|
+
if (flagged.length >= limit)
|
|
134
|
+
break;
|
|
135
|
+
const c = candidates[i];
|
|
136
|
+
info(` [${i + 1}/${candidates.length}] ${c.o.orderId} (${c.days}d)...`);
|
|
137
|
+
const lg = await getLogistics(c.o.orderId, opts, 'waitbuyerreceive').catch((e) => ({ __error: e.message }));
|
|
138
|
+
if ('__error' in lg) {
|
|
139
|
+
if (opts.debug)
|
|
140
|
+
info(` fetch failed: ${lg.__error}`);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const trace = lg.trace?.[0];
|
|
144
|
+
if (!trace) {
|
|
145
|
+
if (opts.debug)
|
|
146
|
+
info(` no trace data (order found but logistics empty)`);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (opts.debug) {
|
|
150
|
+
info(` status="${trace.currentStatus}" remark="${trace.remark}"`);
|
|
151
|
+
}
|
|
152
|
+
// Heuristic: waybill exists but courier never picked up. Match common
|
|
153
|
+
// 1688 / 菜鸟 / 快递 phrasing for "waiting for pickup".
|
|
154
|
+
const isFake = /等待揽收|待揽收|未揽收|等待快递员揽收|包裹.*揽收|尚未揽收/.test(trace.remark) ||
|
|
155
|
+
(trace.currentStatus === '已发货' && /已发货/.test(trace.remark));
|
|
156
|
+
if (isFake) {
|
|
157
|
+
flagged.push({
|
|
158
|
+
orderId: c.o.orderId,
|
|
159
|
+
daysSinceShipped: c.days ?? 0,
|
|
160
|
+
seller: c.o.seller.name,
|
|
161
|
+
sellerLoginId: c.o.seller.loginId,
|
|
162
|
+
mailNo: trace.mailNo,
|
|
163
|
+
carrier: trace.carrier,
|
|
164
|
+
currentStatus: trace.currentStatus,
|
|
165
|
+
remark: trace.remark,
|
|
166
|
+
totalAmount: c.o.totalAmount,
|
|
167
|
+
item: c.o.items[0]?.productName?.slice(0, 50) ?? '',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
emit({
|
|
172
|
+
human: () => {
|
|
173
|
+
if (flagged.length === 0) {
|
|
174
|
+
process.stdout.write(`No fake-shipped orders found (criteria: shipped > ${days} days, logistics frozen at "等待揽收").\n`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
process.stdout.write(`⚠ ${flagged.length} suspicious orders (waybill printed > ${days} days ago, courier never collected):\n\n`);
|
|
178
|
+
for (const f of flagged) {
|
|
179
|
+
process.stdout.write(` ${f.orderId} ${f.daysSinceShipped}d ¥${f.totalAmount.toFixed(2)} ${f.seller}\n`);
|
|
180
|
+
process.stdout.write(` ${f.carrier ?? '?'} ${f.mailNo}\n`);
|
|
181
|
+
process.stdout.write(` "${f.remark}"\n`);
|
|
182
|
+
process.stdout.write(` ${f.item}\n\n`);
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
data: { threshold: days, total: flagged.length, orders: flagged },
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
export async function runSellerHistory(opts) {
|
|
189
|
+
if (!opts.seller) {
|
|
190
|
+
throw new CliError(2, 'BAD_INPUT', 'Seller required (loginId or company name).');
|
|
191
|
+
}
|
|
192
|
+
const maxPages = Math.max(1, parseInt(opts.maxPages ?? '10', 10));
|
|
193
|
+
const needle = opts.seller;
|
|
194
|
+
info(`Scanning orders (up to ${maxPages * 50} most recent)...`);
|
|
195
|
+
const matches = [];
|
|
196
|
+
for (let p = 1; p <= maxPages; p++) {
|
|
197
|
+
const r = await listOrders('all', p, 50, opts);
|
|
198
|
+
for (const o of r.orders) {
|
|
199
|
+
if (o.seller.loginId === needle ||
|
|
200
|
+
o.seller.name === needle ||
|
|
201
|
+
o.seller.loginId?.includes(needle) ||
|
|
202
|
+
o.seller.name?.includes(needle)) {
|
|
203
|
+
matches.push(o);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (r.orders.length === 0 || p >= r.totalPages)
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
// Compute shipping times for orders that have both paidAt and shippedAt
|
|
210
|
+
const shipTimes = [];
|
|
211
|
+
for (const o of matches) {
|
|
212
|
+
if (o.paidAt && o.shippedAt) {
|
|
213
|
+
const d = (Date.parse(o.shippedAt) - Date.parse(o.paidAt)) / 86_400_000;
|
|
214
|
+
if (Number.isFinite(d) && d >= 0)
|
|
215
|
+
shipTimes.push(d);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const avgShipDays = shipTimes.length
|
|
219
|
+
? shipTimes.reduce((s, d) => s + d, 0) / shipTimes.length
|
|
220
|
+
: null;
|
|
221
|
+
const onTimeRate = shipTimes.length
|
|
222
|
+
? shipTimes.filter((d) => d < 2).length / shipTimes.length
|
|
223
|
+
: null;
|
|
224
|
+
const totalSpent = matches.reduce((s, o) => s + o.totalAmount, 0);
|
|
225
|
+
const data = {
|
|
226
|
+
seller: needle,
|
|
227
|
+
totalOrders: matches.length,
|
|
228
|
+
totalSpent,
|
|
229
|
+
avgShipDays,
|
|
230
|
+
onTimeRate,
|
|
231
|
+
recent: matches.slice(0, 10).map((o) => ({
|
|
232
|
+
orderId: o.orderId,
|
|
233
|
+
createdAt: o.createdAt,
|
|
234
|
+
status: o.statusLabel,
|
|
235
|
+
amount: o.totalAmount,
|
|
236
|
+
shipDays: o.paidAt && o.shippedAt
|
|
237
|
+
? Math.round((Date.parse(o.shippedAt) - Date.parse(o.paidAt)) / 86_400_000 * 10) / 10
|
|
238
|
+
: null,
|
|
239
|
+
})),
|
|
240
|
+
};
|
|
241
|
+
emit({
|
|
242
|
+
human: () => {
|
|
243
|
+
process.stdout.write(`Seller: ${needle}\n`);
|
|
244
|
+
process.stdout.write(` total orders: ${data.totalOrders}\n`);
|
|
245
|
+
process.stdout.write(` total spent: ¥${data.totalSpent.toFixed(2)}\n`);
|
|
246
|
+
if (data.avgShipDays !== null) {
|
|
247
|
+
process.stdout.write(` avg ship days: ${data.avgShipDays.toFixed(1)}\n`);
|
|
248
|
+
}
|
|
249
|
+
if (data.onTimeRate !== null) {
|
|
250
|
+
process.stdout.write(` on-time (<2d): ${(data.onTimeRate * 100).toFixed(0)}%\n`);
|
|
251
|
+
}
|
|
252
|
+
if (data.recent.length) {
|
|
253
|
+
process.stdout.write('\n Recent orders:\n');
|
|
254
|
+
for (const o of data.recent) {
|
|
255
|
+
process.stdout.write(` ${o.orderId} ${o.createdAt} ¥${o.amount?.toFixed(2)} ${o.status}` +
|
|
256
|
+
(o.shipDays !== null ? ` (shipped ${o.shipDays}d)` : '') +
|
|
257
|
+
'\n');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
data,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { socketPath } from '../session/paths.js';
|
|
4
|
+
import { CliError } from '../io/errors.js';
|
|
5
|
+
import { makeRequestId } from './protocol.js';
|
|
6
|
+
const PING_TIMEOUT_MS = 800;
|
|
7
|
+
const CALL_TIMEOUT_MS = 5 * 60 * 1000;
|
|
8
|
+
export async function isDaemonReachable() {
|
|
9
|
+
try {
|
|
10
|
+
await fs.access(socketPath());
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const sock = net.createConnection(socketPath());
|
|
17
|
+
const timer = setTimeout(() => {
|
|
18
|
+
sock.destroy();
|
|
19
|
+
resolve(false);
|
|
20
|
+
}, PING_TIMEOUT_MS);
|
|
21
|
+
sock.once('connect', () => {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
sock.end();
|
|
24
|
+
resolve(true);
|
|
25
|
+
});
|
|
26
|
+
sock.once('error', () => {
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
resolve(false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export async function daemonCall(cmd, args) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const sock = net.createConnection(socketPath());
|
|
35
|
+
let buf = '';
|
|
36
|
+
const timer = setTimeout(() => {
|
|
37
|
+
sock.destroy();
|
|
38
|
+
reject(new Error('daemon call timed out'));
|
|
39
|
+
}, CALL_TIMEOUT_MS);
|
|
40
|
+
sock.on('connect', () => {
|
|
41
|
+
const req = { id: makeRequestId(), cmd, args };
|
|
42
|
+
sock.write(JSON.stringify(req) + '\n');
|
|
43
|
+
});
|
|
44
|
+
sock.on('data', (chunk) => {
|
|
45
|
+
buf += chunk.toString('utf8');
|
|
46
|
+
const nl = buf.indexOf('\n');
|
|
47
|
+
if (nl === -1)
|
|
48
|
+
return;
|
|
49
|
+
const line = buf.slice(0, nl);
|
|
50
|
+
let resp;
|
|
51
|
+
try {
|
|
52
|
+
resp = JSON.parse(line);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
sock.destroy();
|
|
57
|
+
reject(new Error('daemon: malformed response'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
sock.end();
|
|
62
|
+
if (resp.ok) {
|
|
63
|
+
resolve(resp.data);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
reject(new CliError(resp.exitCode, resp.code, resp.message));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
sock.on('error', (e) => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
reject(e);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}
|