@yjzf/mcp-server-yjzf 0.2.9 → 0.3.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.
Files changed (45) hide show
  1. package/dist/index.js +2 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/tools/contract/new_house_commission_export.js +8 -8
  4. package/dist/tools/contract/new_house_commission_export.js.map +1 -1
  5. package/dist/tools/contract/new_house_developer_repayment_export.d.ts +6 -4
  6. package/dist/tools/contract/new_house_developer_repayment_export.d.ts.map +1 -1
  7. package/dist/tools/contract/new_house_developer_repayment_export.js +32 -10
  8. package/dist/tools/contract/new_house_developer_repayment_export.js.map +1 -1
  9. package/dist/tools/house/umai_good_house_export.d.ts +22 -0
  10. package/dist/tools/house/umai_good_house_export.d.ts.map +1 -0
  11. package/dist/tools/house/umai_good_house_export.js +143 -0
  12. package/dist/tools/house/umai_good_house_export.js.map +1 -0
  13. package/package.json +1 -1
  14. package/dist/tools/count_all_statement.d.ts +0 -46
  15. package/dist/tools/count_all_statement.d.ts.map +0 -1
  16. package/dist/tools/count_all_statement.js +0 -334
  17. package/dist/tools/count_all_statement.js.map +0 -1
  18. package/dist/tools/date_to_timestamp.d.ts +0 -19
  19. package/dist/tools/date_to_timestamp.d.ts.map +0 -1
  20. package/dist/tools/date_to_timestamp.js +0 -45
  21. package/dist/tools/date_to_timestamp.js.map +0 -1
  22. package/dist/tools/get_current_time.d.ts +0 -13
  23. package/dist/tools/get_current_time.d.ts.map +0 -1
  24. package/dist/tools/get_current_time.js +0 -23
  25. package/dist/tools/get_current_time.js.map +0 -1
  26. package/dist/tools/hello_world.d.ts +0 -20
  27. package/dist/tools/hello_world.d.ts.map +0 -1
  28. package/dist/tools/hello_world.js +0 -47
  29. package/dist/tools/hello_world.js.map +0 -1
  30. package/dist/tools/investment_contract.d.ts +0 -8
  31. package/dist/tools/investment_contract.d.ts.map +0 -1
  32. package/dist/tools/investment_contract.js +0 -106
  33. package/dist/tools/investment_contract.js.map +0 -1
  34. package/dist/tools/new_house_contract_export.d.ts +0 -14
  35. package/dist/tools/new_house_contract_export.d.ts.map +0 -1
  36. package/dist/tools/new_house_contract_export.js +0 -242
  37. package/dist/tools/new_house_contract_export.js.map +0 -1
  38. package/dist/tools/overview_by_c.d.ts +0 -26
  39. package/dist/tools/overview_by_c.d.ts.map +0 -1
  40. package/dist/tools/overview_by_c.js +0 -204
  41. package/dist/tools/overview_by_c.js.map +0 -1
  42. package/dist/tools/statement_query.d.ts +0 -43
  43. package/dist/tools/statement_query.d.ts.map +0 -1
  44. package/dist/tools/statement_query.js +0 -430
  45. package/dist/tools/statement_query.js.map +0 -1
@@ -1,106 +0,0 @@
1
- import * as z from "zod/v4";
2
- import { buildGatewayHeaders, createErrorResult, createSuccessResult } from "../utils/http.js";
3
- import { saveWorkbook, formatTimestamp } from "../utils/excel.js";
4
- import { generateDatedFileName, getGatewayBaseUrl } from "../utils/env.js";
5
- import { debug } from "../utils/debug.js";
6
- // ---------------------------------------------------------------------------
7
- // 枚举映射
8
- // ---------------------------------------------------------------------------
9
- const LOCKING_STATE_MAP = {
10
- 1: "是",
11
- 0: "否",
12
- };
13
- const CONTRACT_STATE_MAP = {
14
- 1: "审核通过",
15
- 2: "审核否决",
16
- 3: "待审核",
17
- 4: "草稿",
18
- 5: "已撤回",
19
- 6: "已回收",
20
- 8: "已签署",
21
- };
22
- const SIGN_METHOD_MAP = {
23
- 1: "线上",
24
- 2: "线下",
25
- };
26
- const ORDER_STATUS_MAP = {
27
- 0: "已关闭",
28
- 1: "跟进中",
29
- 2: "已完成",
30
- };
31
- const COLUMNS = [
32
- ["城市", "cityName"],
33
- ["锁定状态", "lockingState", (v) => LOCKING_STATE_MAP[Number(v)] ?? ""],
34
- ["合同名称", "title"],
35
- ["合同编号", "econtractNo"],
36
- ["合同状态", "state", (v) => CONTRACT_STATE_MAP[Number(v)] ?? String(v)],
37
- ["甲方", "companyA"],
38
- ["乙方", "companyB"],
39
- ["签署方式", "isOutside", (v) => SIGN_METHOD_MAP[Number(v)] ?? String(v)],
40
- ["剩余打印次数", "plusPrintNumber"],
41
- ["关联订单编号", "linkOrderNo"],
42
- ["对应订单状态", "orderStatus", (v) => ORDER_STATUS_MAP[Number(v)] ?? String(v)],
43
- ["添加人", "createdBy"],
44
- ["添加时间", "createTm", (v) => formatTimestamp(Number(v))],
45
- ];
46
- // ---------------------------------------------------------------------------
47
- // 工具导出
48
- // ---------------------------------------------------------------------------
49
- export const name = "investment_contract";
50
- export const schema = {
51
- description: "从 ERP 系统查询直营城市招商加盟合同列表数据,生成 Excel 文件",
52
- inputSchema: z.object({}),
53
- };
54
- export async function handler() {
55
- const headers = buildGatewayHeaders();
56
- try {
57
- // Step 1: 获取城市列表
58
- const citiesResponse = await fetch("https://mcp.yjzf.com/zy_cities.json", {
59
- method: "GET",
60
- headers,
61
- });
62
- if (!citiesResponse.ok) {
63
- return createErrorResult(`获取 zy_cities 数据失败: ${citiesResponse.status} ${citiesResponse.statusText}`);
64
- }
65
- const cities = await citiesResponse.json();
66
- debug("zy_cities.json", cities);
67
- // Step 2: 调用 Gateway 获取合同数据
68
- const response = await fetch(`${getGatewayBaseUrl()}/investment_contract`, {
69
- method: "POST",
70
- headers,
71
- body: JSON.stringify({ cities }),
72
- });
73
- if (!response.ok) {
74
- return createErrorResult(`请求 investment_contract 失败: ${response.status} ${response.statusText}`);
75
- }
76
- const apiResponse = await response.json();
77
- debug("investment_contract response", apiResponse);
78
- if (!apiResponse.succeed) {
79
- return createErrorResult(`网关返回错误: ${apiResponse.msg}`);
80
- }
81
- const { list } = apiResponse.data;
82
- if (list.length === 0) {
83
- return createSuccessResult("未查询到任何合同数据");
84
- }
85
- // Step 3: 构建 Excel 数据
86
- const headerRow = COLUMNS.map(([label]) => label);
87
- const dataRows = list.map((item) => COLUMNS.map(([, field, transform]) => {
88
- const val = item[field];
89
- if (transform) {
90
- return transform(val);
91
- }
92
- return val != null ? String(val) : "";
93
- }));
94
- const sheetData = [headerRow, ...dataRows];
95
- // Step 4: 保存 Excel 文件
96
- const fileName = generateDatedFileName("招商加盟合同列表导出", "xlsx", false);
97
- const sheets = [{ name: "合同数据", data: sheetData }];
98
- const filePath = saveWorkbook(sheets, fileName);
99
- return createSuccessResult(`成功导出招商加盟合同数据!\n共 ${list.length} 条记录\n文件路径: ${filePath}`);
100
- }
101
- catch (error) {
102
- const errorMessage = error instanceof Error ? error.message : String(error);
103
- return createErrorResult(`执行过程中发生错误: ${errorMessage}`);
104
- }
105
- }
106
- //# sourceMappingURL=investment_contract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"investment_contract.js","sourceRoot":"","sources":["../../src/tools/investment_contract.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import * as z from "zod/v4";
2
- export declare const name = "new_house_contract_export";
3
- export declare const schema: {
4
- description: string;
5
- inputSchema: z.ZodObject<{
6
- startTime: z.ZodOptional<z.ZodNumber>;
7
- endTime: z.ZodOptional<z.ZodNumber>;
8
- }, z.core.$strip>;
9
- };
10
- export declare function handler(args: {
11
- startTime?: number;
12
- endTime?: number;
13
- }): Promise<import("../utils/http.js").ToolResult>;
14
- //# sourceMappingURL=new_house_contract_export.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new_house_contract_export.d.ts","sourceRoot":"","sources":["../../src/tools/new_house_contract_export.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AA2K5B,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAEhD,eAAO,MAAM,MAAM;;;;;;CAalB,CAAC;AAEF,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,kDA8HA"}
@@ -1,242 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import * as z from "zod/v4";
4
- import { buildGatewayHeaders, createErrorResult, createSuccessResult } from "../utils/http.js";
5
- import { getDataDir, getGatewayBaseUrl } from "../utils/env.js";
6
- import { debug } from "../utils/debug.js";
7
- // ---------------------------------------------------------------------------
8
- // 常量
9
- // ---------------------------------------------------------------------------
10
- const BRAND_ID = "593347894961426496";
11
- const CITY_CODE = "450100";
12
- const ORGAN_ID = "625864877560328320";
13
- // const BRAND_ID = "565998180494215232";
14
- // const CITY_CODE = "450100";
15
- // const ORGAN_ID = "552692373611008128";
16
- // ---------------------------------------------------------------------------
17
- // 工具函数
18
- // ---------------------------------------------------------------------------
19
- /**
20
- * 生成文件名:认购合同_20260423_1000.xlsx
21
- */
22
- function buildFileName(label) {
23
- const now = new Date();
24
- const Y = now.getFullYear();
25
- const M = String(now.getMonth() + 1).padStart(2, "0");
26
- const D = String(now.getDate()).padStart(2, "0");
27
- const h = String(now.getHours()).padStart(2, "0");
28
- const m = String(now.getMinutes()).padStart(2, "0");
29
- return `${label}_${Y}${M}${D}_${h}${m}.xlsx`;
30
- }
31
- /**
32
- * 获取默认时间范围:当月第一天 00:00:00 ~ 今天 23:59:59.999(本地时间)。
33
- */
34
- function getDefaultTimeRange() {
35
- const now = new Date();
36
- const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);
37
- const todayEnd = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);
38
- return {
39
- startTime: monthStart.getTime(),
40
- endTime: todayEnd.getTime(),
41
- };
42
- }
43
- /**
44
- * 将 base64 编码的 Excel 数据保存为文件,返回文件绝对路径。
45
- */
46
- function saveBase64ToFile(base64Data, fileName) {
47
- const dataDir = getDataDir();
48
- fs.mkdirSync(dataDir, { recursive: true });
49
- const filePath = path.join(dataDir, fileName);
50
- const buffer = Buffer.from(base64Data, "base64");
51
- fs.writeFileSync(filePath, buffer);
52
- return filePath;
53
- }
54
- /**
55
- * 判断时间范围是否超过3个月(基于日历月)。
56
- */
57
- function isRangeExceedsThreeMonths(startTime, endTime) {
58
- const start = new Date(startTime);
59
- const threeMonthsLater = new Date(start);
60
- threeMonthsLater.setMonth(threeMonthsLater.getMonth() + 3);
61
- return endTime > threeMonthsLater.getTime();
62
- }
63
- /**
64
- * 生成唯一的 bookName,用于在异步导出列表中精确匹配。
65
- */
66
- function generateUniqueBookName(label) {
67
- const ts = Date.now();
68
- const rand = Math.random().toString(36).slice(2, 6);
69
- return `MCP_${label}_${ts}_${rand}`;
70
- }
71
- function sleep(ms) {
72
- return new Promise(resolve => setTimeout(resolve, ms));
73
- }
74
- /**
75
- * 轮询异步导出状态,返回完成后的 fileUrl。
76
- * 递增间隔轮询,最多等待10分钟。
77
- */
78
- async function pollAsyncExportStatus(bookName, headers, gatewayBaseUrl) {
79
- const intervals = [5000, 5000, 10000, 10000, 15000, 15000, 20000, 20000, 30000];
80
- const maxWait = 600_000; // 10分钟
81
- let totalWaited = 0;
82
- let consecutiveErrors = 0;
83
- for (let i = 0; totalWaited < maxWait; i++) {
84
- const interval = intervals[Math.min(i, intervals.length - 1)];
85
- await sleep(interval);
86
- totalWaited += interval;
87
- try {
88
- const resp = await fetch(`${gatewayBaseUrl}/new_house_contract_async_export_status`, {
89
- method: "POST",
90
- headers,
91
- body: JSON.stringify({ city_code: CITY_CODE, organ_id: ORGAN_ID, brand_id: BRAND_ID }),
92
- });
93
- const json = await resp.json();
94
- consecutiveErrors = 0;
95
- const match = json.data?.list?.find((item) => item.fileName === bookName);
96
- if (match?.status === 1)
97
- return match.fileUrl;
98
- if (match?.status === 0)
99
- throw new Error(`ERP 异步导出失败: ${bookName}`);
100
- console.error(`[轮询] ${bookName} 尚未完成,已等待 ${totalWaited / 1000}s`);
101
- }
102
- catch (e) {
103
- if (e.message?.includes("异步导出失败"))
104
- throw e;
105
- consecutiveErrors++;
106
- if (consecutiveErrors >= 3)
107
- throw new Error(`轮询连续失败3次: ${e.message}`);
108
- console.error(`[轮询] 请求异常(${consecutiveErrors}/3): ${e.message}`);
109
- }
110
- }
111
- throw new Error(`异步导出超时(${maxWait / 1000}s): ${bookName}`);
112
- }
113
- /**
114
- * 从 CDN fileUrl 下载文件保存到 DATA_DIR,返回文件绝对路径。
115
- */
116
- async function downloadFileFromUrl(fileUrl, fileName) {
117
- const resp = await fetch(fileUrl);
118
- if (!resp.ok)
119
- throw new Error(`下载文件失败: ${resp.status} ${resp.statusText}`);
120
- const buffer = Buffer.from(await resp.arrayBuffer());
121
- const dataDir = getDataDir();
122
- fs.mkdirSync(dataDir, { recursive: true });
123
- const filePath = path.join(dataDir, fileName);
124
- fs.writeFileSync(filePath, buffer);
125
- return filePath;
126
- }
127
- // ---------------------------------------------------------------------------
128
- // 工具导出
129
- // ---------------------------------------------------------------------------
130
- export const name = "new_house_contract_export";
131
- export const schema = {
132
- description: "从 ERP 系统导出新房合同数据(认购合同、签约合同、解约合同),生成三个独立的 Excel 文件。不传时间时默认查询当月第一天到今天。时间范围超过3个月时自动使用异步导出。",
133
- inputSchema: z.object({
134
- startTime: z
135
- .number()
136
- .optional()
137
- .describe("开始时间,毫秒时间戳,可选,不传则默认当月第一天"),
138
- endTime: z
139
- .number()
140
- .optional()
141
- .describe("结束时间,毫秒时间戳,可选,不传则默认今天"),
142
- }),
143
- };
144
- export async function handler(args) {
145
- const headers = buildGatewayHeaders();
146
- const defaults = getDefaultTimeRange();
147
- const startTime = args.startTime ?? defaults.startTime;
148
- const endTime = args.endTime ?? defaults.endTime;
149
- debug("date range", { startTime, endTime });
150
- // 校验时间范围
151
- if (startTime > endTime) {
152
- return createErrorResult("开始时间不能晚于结束时间");
153
- }
154
- const useAsync = isRangeExceedsThreeMonths(startTime, endTime);
155
- if (useAsync) {
156
- console.error(`[new_house_contract_export] 时间范围>3个月,使用异步导出模式`);
157
- }
158
- try {
159
- // 分别导出认购合同、签约合同和解约合同
160
- const contractTypes = [
161
- { type: "subscription", label: "认购合同" },
162
- { type: "signed", label: "签约合同" },
163
- { type: "cancelled", label: "解约合同" },
164
- ];
165
- const results = [];
166
- for (const ct of contractTypes) {
167
- console.error(`[new_house_contract_export] 正在导出${ct.label}...`);
168
- if (useAsync) {
169
- // 异步导出路径
170
- const bookName = generateUniqueBookName(ct.label);
171
- console.error(`[async] bookName=${bookName}`);
172
- // 1. 提交异步导出任务
173
- const submitResp = await fetch(`${getGatewayBaseUrl()}/new_house_contract_async_export`, {
174
- method: "POST",
175
- headers,
176
- body: JSON.stringify({
177
- city_code: CITY_CODE,
178
- organ_id: ORGAN_ID,
179
- brand_id: BRAND_ID,
180
- startTime,
181
- endTime,
182
- contractType: ct.type,
183
- bookName,
184
- }),
185
- });
186
- if (!submitResp.ok) {
187
- return createErrorResult(`提交${ct.label}异步导出失败: ${submitResp.status} ${submitResp.statusText}`);
188
- }
189
- const submitResult = await submitResp.json();
190
- if (!submitResult.succeed) {
191
- return createErrorResult(`提交${ct.label}异步导出失败: ${submitResult.msg}`);
192
- }
193
- console.error(`[async] ${ct.label} 任务已提交,开始轮询...`);
194
- // 2. 轮询等待完成
195
- const fileUrl = await pollAsyncExportStatus(bookName, headers, getGatewayBaseUrl());
196
- // 3. 下载文件到本地
197
- const fileName = buildFileName(ct.label);
198
- const filePath = await downloadFileFromUrl(fileUrl, fileName);
199
- results.push(`${ct.label}\n文件路径: ${filePath}`);
200
- }
201
- else {
202
- // 同步导出路径
203
- const response = await fetch(`${getGatewayBaseUrl()}/new_house_contract_export`, {
204
- method: "POST",
205
- headers,
206
- body: JSON.stringify({
207
- city_code: CITY_CODE,
208
- organ_id: ORGAN_ID,
209
- brand_id: BRAND_ID,
210
- startTime,
211
- endTime,
212
- contractType: ct.type,
213
- }),
214
- });
215
- if (!response.ok) {
216
- return createErrorResult(`请求 ${ct.label} 导出失败: ${response.status} ${response.statusText}`);
217
- }
218
- const apiResponse = await response.json();
219
- debug(`${ct.label} response`, {
220
- succeed: apiResponse.succeed,
221
- msg: apiResponse.msg,
222
- });
223
- if (!apiResponse.succeed) {
224
- return createErrorResult(`${ct.label} 网关返回错误: ${apiResponse.msg}`);
225
- }
226
- if (!apiResponse.data?.base64) {
227
- return createErrorResult(`${ct.label} 返回数据中缺少 base64 字段`);
228
- }
229
- // 直接保存原始 Excel 文件
230
- const fileName = buildFileName(ct.label);
231
- const filePath = saveBase64ToFile(apiResponse.data.base64, fileName);
232
- results.push(`${ct.label}\n文件路径: ${filePath}`);
233
- }
234
- }
235
- return createSuccessResult(`成功导出新房合同数据!\n\n${results.join("\n\n")}`);
236
- }
237
- catch (error) {
238
- const errorMessage = error instanceof Error ? error.message : String(error);
239
- return createErrorResult(`执行过程中发生错误: ${errorMessage}`);
240
- }
241
- }
242
- //# sourceMappingURL=new_house_contract_export.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new_house_contract_export.js","sourceRoot":"","sources":["../../src/tools/new_house_contract_export.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import * as z from "zod/v4";
2
- export declare const name = "overview_by_c";
3
- export declare const schema: {
4
- description: string;
5
- inputSchema: z.ZodObject<{
6
- startInclusive: z.ZodOptional<z.ZodNumber>;
7
- endExclusive: z.ZodOptional<z.ZodNumber>;
8
- }, z.core.$strip>;
9
- };
10
- export declare function handler(args: {
11
- startInclusive?: number;
12
- endExclusive?: number;
13
- }): Promise<{
14
- content: {
15
- type: "text";
16
- text: string;
17
- }[];
18
- isError: boolean;
19
- } | {
20
- content: {
21
- type: "text";
22
- text: string;
23
- }[];
24
- isError?: undefined;
25
- }>;
26
- //# sourceMappingURL=overview_by_c.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview_by_c.d.ts","sourceRoot":"","sources":["../../src/tools/overview_by_c.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAoD5B,eAAO,MAAM,IAAI,kBAAkB,CAAC;AAEpC,eAAO,MAAM,MAAM;;;;;;CAMlB,CAAC;AAEF,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;GAsLrF"}
@@ -1,204 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import * as xlsx from "xlsx";
4
- import * as z from "zod/v4";
5
- import { getDataDir, getGatewayBaseUrl } from "../utils/env.js";
6
- import { buildGatewayHeaders } from "../utils/http.js";
7
- /**
8
- * 获取当月第一天 00:00:00 的时间戳和当天 00:00:00 的时间戳
9
- * @returns {{ startInclusive: number; endExclusive: number }}
10
- */
11
- function getStartAndEnd() {
12
- const now = new Date();
13
- // 当天 00:00:00 (本地时间)
14
- const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());
15
- // 当月第一天 00:00:00
16
- const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);
17
- return {
18
- startInclusive: monthStart.getTime(),
19
- endExclusive: todayStart.getTime(),
20
- };
21
- }
22
- /**
23
- * 将时间戳格式化为 yyyymmdd 字符串
24
- * @param timestamp 毫秒时间戳
25
- * @returns 格式化后的日期字符串
26
- */
27
- function formatDateToYyyymmdd(timestamp) {
28
- const date = new Date(timestamp);
29
- const year = date.getFullYear();
30
- const month = String(date.getMonth() + 1).padStart(2, "0");
31
- const day = String(date.getDate()).padStart(2, "0");
32
- return `${year}${month}${day}`;
33
- }
34
- export const name = "overview_by_c";
35
- export const schema = {
36
- description: "获取直营城市C端行为数据数据指标报表 生成Excel文件",
37
- inputSchema: z.object({
38
- startInclusive: z.number().optional().describe("数据开始时间,毫秒时间戳,可选"),
39
- endExclusive: z.number().optional().describe("数据结束时间,毫秒时间戳,可选"),
40
- }),
41
- };
42
- export async function handler(args) {
43
- // 根据参数规则计算时间范围
44
- let startInclusive;
45
- let endExclusive;
46
- const defaults = getStartAndEnd();
47
- if (args.startInclusive === undefined && args.endExclusive === undefined) {
48
- // 都不出现,使用默认值
49
- startInclusive = defaults.startInclusive;
50
- endExclusive = defaults.endExclusive;
51
- }
52
- else if (args.startInclusive !== undefined && args.endExclusive === undefined) {
53
- // 只出现 startInclusive,使用当天00:00作为 endExclusive
54
- startInclusive = args.startInclusive;
55
- endExclusive = defaults.endExclusive;
56
- }
57
- else if (args.startInclusive === undefined && args.endExclusive !== undefined) {
58
- // 只出现 endExclusive,使用当月第一天00:00作为 startInclusive
59
- startInclusive = defaults.startInclusive;
60
- endExclusive = args.endExclusive;
61
- }
62
- else {
63
- // 都出现,使用传入的值
64
- startInclusive = args.startInclusive;
65
- endExclusive = args.endExclusive;
66
- }
67
- // 检查时间跨度是否超过 370 天
68
- const oneDayMs = 24 * 60 * 60 * 1000;
69
- const maxDays = 370;
70
- const timeSpanDays = (endExclusive - startInclusive) / oneDayMs;
71
- if (timeSpanDays > maxDays) {
72
- const startStr = formatDateToYyyymmdd(startInclusive);
73
- const endStr = formatDateToYyyymmdd(endExclusive);
74
- return {
75
- content: [
76
- {
77
- type: "text",
78
- text: `${startStr}~${endStr} 之间的时间跨度过大,请缩小查询范围后重试。`,
79
- },
80
- ],
81
- isError: true,
82
- };
83
- }
84
- // Build request headers
85
- const headers = buildGatewayHeaders();
86
- try {
87
- // Step 1: Fetch cities data
88
- const citiesResponse = await fetch("https://mcp.yjzf.com/zy_cities.json", {
89
- method: "GET",
90
- headers,
91
- });
92
- if (!citiesResponse.ok) {
93
- return {
94
- content: [
95
- {
96
- type: "text",
97
- text: `获取城市列表失败: ${citiesResponse.status} ${citiesResponse.statusText}`,
98
- },
99
- ],
100
- isError: true,
101
- };
102
- }
103
- const citiesData = await citiesResponse.json();
104
- // Step 2: Fetch overview data for each city
105
- const overviewResults = [];
106
- for (const city of citiesData) {
107
- const overviewResponse = await fetch(`${getGatewayBaseUrl()}/overview_by_c`, {
108
- method: "POST",
109
- headers,
110
- body: JSON.stringify({
111
- branch_id: city.branch_id,
112
- city_name: city.name,
113
- city_code: city.city_code,
114
- start_inclusive: startInclusive,
115
- end_exclusive: endExclusive,
116
- }),
117
- });
118
- if (!overviewResponse.ok) {
119
- console.error(`获取 ${city.name} 数据失败: ${overviewResponse.status}`);
120
- continue;
121
- }
122
- const apiResponse = await overviewResponse.json();
123
- if (!apiResponse.succeed) {
124
- console.error(`获取 ${city.name} 数据失败: ${apiResponse.msg}`);
125
- continue;
126
- }
127
- overviewResults.push(apiResponse.data);
128
- }
129
- if (overviewResults.length === 0) {
130
- return {
131
- content: [
132
- {
133
- type: "text",
134
- text: "没有获取到任何城市数据",
135
- },
136
- ],
137
- isError: true,
138
- };
139
- }
140
- // Step 3: Prepare Excel data
141
- const excelHeaders = [
142
- "城市",
143
- "二手房_活跃用户数",
144
- "二手房_新增平台商机数",
145
- "二手房_新增经纪人客户数",
146
- "二手房_新增带看客户数",
147
- "二手房_新增成交数",
148
- "租房_活跃用户数",
149
- "租房_新增平台商机数",
150
- "租房_新增经纪人客户数",
151
- "租房_新增带看客户数",
152
- "租房_新增成交数",
153
- "新房_活跃用户数",
154
- "新房_新增平台商机数",
155
- "新房_新增经纪人客户数",
156
- "新房_新增带看客户数",
157
- "新房_新增成交数",
158
- ];
159
- const excelData = [excelHeaders];
160
- for (const result of overviewResults) {
161
- const row = [result.city_name];
162
- // values 数组应该有15个元素,依次填入B-P列
163
- for (const value of result.values) {
164
- row.push(value);
165
- }
166
- excelData.push(row);
167
- }
168
- // Step 4: Create Excel workbook
169
- const worksheet = xlsx.utils.aoa_to_sheet(excelData);
170
- const workbook = xlsx.utils.book_new();
171
- xlsx.utils.book_append_sheet(workbook, worksheet, "城市流量数据");
172
- // Step 5: Generate filename with date range
173
- const startStr = formatDateToYyyymmdd(startInclusive);
174
- const endStr = formatDateToYyyymmdd(endExclusive);
175
- const fileName = `${startStr}-${endStr}_城市流量数据报告.xlsx`;
176
- // Ensure data directory exists
177
- const dataDir = getDataDir();
178
- fs.mkdirSync(dataDir, { recursive: true });
179
- const filePath = path.join(dataDir, fileName);
180
- // Write Excel file
181
- xlsx.writeFile(workbook, filePath);
182
- return {
183
- content: [
184
- {
185
- type: "text",
186
- text: `成功生成Excel报告!\n文件路径: ${filePath}\n共处理 ${overviewResults.length} 个城市数据`,
187
- },
188
- ],
189
- };
190
- }
191
- catch (error) {
192
- const errorMessage = error instanceof Error ? error.message : String(error);
193
- return {
194
- content: [
195
- {
196
- type: "text",
197
- text: `执行过程中发生错误: ${errorMessage}`,
198
- },
199
- ],
200
- isError: true,
201
- };
202
- }
203
- }
204
- //# sourceMappingURL=overview_by_c.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview_by_c.js","sourceRoot":"","sources":["../../src/tools/overview_by_c.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAoBvD;;;GAGG;AACH,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,iBAAiB;IACjB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAElE,OAAO;QACL,cAAc,EAAE,UAAU,CAAC,OAAO,EAAE;QACpC,YAAY,EAAE,UAAU,CAAC,OAAO,EAAE;KACnC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,eAAe,CAAC;AAEpC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,WAAW,EAAE,8BAA8B;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACjE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KAChE,CAAC;CACH,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAwD;IAEpF,eAAe;IACf,IAAI,cAAsB,CAAC;IAC3B,IAAI,YAAoB,CAAC;IAEzB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACzE,aAAa;QACb,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QACzC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IACvC,CAAC;SAAM,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAChF,8CAA8C;QAC9C,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QACrC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IACvC,CAAC;SAAM,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAChF,iDAAiD;QACjD,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QACzC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,aAAa;QACb,cAAc,GAAG,IAAI,CAAC,cAAe,CAAC;QACtC,YAAY,GAAG,IAAI,CAAC,YAAa,CAAC;IACpC,CAAC;IAED,mBAAmB;IACnB,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC;IACpB,MAAM,YAAY,GAAG,CAAC,YAAY,GAAG,cAAc,CAAC,GAAG,QAAQ,CAAC;IAEhE,IAAI,YAAY,GAAG,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,GAAG,QAAQ,IAAI,MAAM,wBAAwB;iBACpD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,4BAA4B;QAC5B,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;YACxE,MAAM,EAAE,KAAK;YACb,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,aAAa,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE;qBACxE;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAkB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE9D,4CAA4C;QAC5C,MAAM,eAAe,GAAuB,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,EAAE,gBAAgB,EAAE;gBAC3E,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,IAAI;oBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,eAAe,EAAE,cAAc;oBAC/B,aAAa,EAAE,YAAY;iBAC5B,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClE,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAgB,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAE/D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC1D,SAAS;YACX,CAAC;YAED,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,aAAa;qBACpB;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,YAAY,GAAG;YACnB,IAAI;YACJ,WAAW;YACX,aAAa;YACb,cAAc;YACd,aAAa;YACb,WAAW;YACX,UAAU;YACV,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,UAAU;YACV,UAAU;YACV,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,UAAU;SACX,CAAC;QAEF,MAAM,SAAS,GAA0B,CAAC,YAAY,CAAC,CAAC;QAExD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,GAAG,GAAwB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpD,6BAA6B;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAG5D,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,MAAM,gBAAgB,CAAC;QAEvD,+BAA+B;QAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE9C,mBAAmB;QACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEnC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uBAAuB,QAAQ,SAAS,eAAe,CAAC,MAAM,QAAQ;iBAC7E;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,cAAc,YAAY,EAAE;iBACnC;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}