python切换node的版本

This commit is contained in:
ray
2026-04-28 10:05:38 +08:00
parent a008d416a3
commit 552d840f3f
10 changed files with 1524 additions and 344 deletions

View File

@@ -20,11 +20,17 @@ export const config = {
rootDir,
baseUrl: process.env.ALIYUN_APS_BASE_URL || 'https://aps.aliyun.com',
headless: toBool(process.env.ALIYUN_APS_HEADLESS, false),
browserChannel: (process.env.ALIYUN_APS_BROWSER_CHANNEL || '').trim(),
browserExecutablePath: (process.env.ALIYUN_APS_BROWSER_EXECUTABLE_PATH || '').trim(),
timezone: process.env.ALIYUN_APS_TIMEZONE || 'Asia/Shanghai',
cron: process.env.ALIYUN_APS_CRON || '0 6 * * *',
orderStartDate: process.env.ALIYUN_APS_ORDER_START_DATE || '2024-01-01',
incrementalOrderStartDate: process.env.ALIYUN_APS_INCREMENTAL_ORDER_START_DATE || '',
billStartMonth: process.env.ALIYUN_APS_BILL_START_MONTH || '2024-01',
orderIncrementalOverlapDays: Math.max(0, Number.parseInt(process.env.ALIYUN_APS_ORDER_INCREMENTAL_OVERLAP_DAYS || '2', 10) || 2),
billIncrementalOverlapDays: Math.max(0, Number.parseInt(process.env.ALIYUN_APS_BILL_INCREMENTAL_OVERLAP_DAYS || '7', 10) || 7),
messageIncrementalOverlapDays: Math.max(0, Number.parseInt(process.env.ALIYUN_APS_MESSAGE_INCREMENTAL_OVERLAP_DAYS || '7', 10) || 7),
scheduleMode: process.env.ALIYUN_APS_SCHEDULE_MODE || 'incremental',
smtp: {
host: process.env.ALIYUN_APS_SMTP_HOST || 'smtp.qq.com',
port: parseInt(process.env.ALIYUN_APS_SMTP_PORT || '465', 10),
@@ -37,11 +43,20 @@ export const config = {
fullSync: toBool(process.env.ALIYUN_APS_FULL_SYNC, true),
resumeBillMonth: process.env.ALIYUN_APS_RESUME_BILL_MONTH || '',
resumeBillPage: Math.max(1, Number.parseInt(process.env.ALIYUN_APS_RESUME_BILL_PAGE || '1', 10) || 1),
dbSyncScript: process.env.ALIYUN_APS_DB_SYNC_SCRIPT || '../aps-aliyun-sync/aps_db_sync.py',
userDataDir: ensureDir(path.join(rootDir, '.browser')),
storageStateFile: path.join(rootDir, '.browser', 'storage-state.json'),
dataDir: ensureDir(path.join(rootDir, 'data')),
downloadDir: ensureDir(path.join(rootDir, 'downloads')),
errorDir: ensureDir(path.join(rootDir, 'data', 'errors')),
db: {
host: process.env.ALIYUN_APS_DB_HOST || '',
port: parseInt(process.env.ALIYUN_APS_DB_PORT || '3306', 10),
user: process.env.ALIYUN_APS_DB_USER || '',
password: process.env.ALIYUN_APS_DB_PASSWORD || '',
database: process.env.ALIYUN_APS_DB_NAME || '',
charset: process.env.ALIYUN_APS_DB_CHARSET || 'utf8mb4',
connectionLimit: Math.max(1, Number.parseInt(process.env.ALIYUN_APS_DB_CONNECTION_LIMIT || '5', 10) || 5),
},
};
export const datasets = {
@@ -180,6 +195,34 @@ export const datasets = {
serviceEndAt: record['服务结束时间'] || '',
}),
},
messages: {
name: 'messages',
url: `${config.baseUrl}/#/message`,
heading: '消息',
pageSize: 20,
uniqueKey: (record) => record.msgId || record.__hash,
normalize: (record) => ({
msgId: pickFirst(record, ['消息ID', 'msg_id', '消息id', 'ID', 'id']),
title: pickFirst(record, ['消息标题', '标题', 'title']),
content: pickFirst(record, ['消息内容', '内容', 'content']),
msgType: pickFirst(record, ['消息类型', 'type', 'msg_type']),
fromApp: pickFirst(record, ['来源应用', 'from_app', '应用']),
bizCode: pickFirst(record, ['业务编码', 'biz_code']),
msgChannel: pickFirst(record, ['消息通道', 'msg_channel']),
categoryId: pickFirst(record, ['分类ID', 'category_id']),
categoryName: pickFirst(record, ['分类名称', 'category_name']),
lv1CategoryId: pickFirst(record, ['一级分类ID', 'lv1_category_id']),
lv2CategoryId: pickFirst(record, ['二级分类ID', 'lv2_category_id']),
lv3CategoryId: pickFirst(record, ['三级分类ID', 'lv3_category_id']),
messageClassification: pickFirst(record, ['归类结果', 'message_classification']),
customerName: pickFirst(record, ['客户名称', 'customer_name']),
orderNo: pickFirst(record, ['订单号', 'order_no']),
status: pickFirst(record, ['消息状态', '状态', 'status']),
gmtCreated: pickFirst(record, ['消息创建时间', '创建时间', 'gmt_created']),
gmtModified: pickFirst(record, ['消息修改时间', '修改时间', 'gmt_modified']),
extraData: record,
}),
},
};
function splitLines(value) {
@@ -188,3 +231,13 @@ function splitLines(value) {
.map((part) => part.trim())
.filter(Boolean);
}
function pickFirst(record, keys) {
for (const key of keys) {
const value = record[key];
if (value != null && String(value).trim()) {
return String(value).trim();
}
}
return '';
}