77
88import * as fs from 'node:fs' ;
99import * as path from 'node:path' ;
10- import { Config , OrganizationData } from './types' ;
10+ import { Config , OrganizationData , ExtendedUserData } from './types' ;
11+
12+ // Create WeakMap to store user data for organizations
13+ const userWeakMap = new WeakMap < OrganizationData , ExtendedUserData > ( ) ;
1114
1215// Import refactored modules
1316import { DataTransformer } from './transformers/data-transformer' ;
17+ import { UserTransformer } from './transformers/user-transformer' ;
1418import { ExcelReader } from './utils/excel-reader' ;
1519import { StrapiAPI } from './utils/strapi-api' ;
1620import { DataImporter } from './utils/data-importer' ;
@@ -21,7 +25,8 @@ const CONFIG: Config = {
2125 STRAPI_TOKEN : process . env . STRAPI_TOKEN || '' ,
2226 EXCEL_FILE : process . env . EXCEL_FILE || '教育公益开放式数据库.xlsx' ,
2327 SHEET_NAME : process . env . SHEET_NAME || null ,
24- BATCH_SIZE : parseInt ( process . env . BATCH_SIZE || '10' ) ,
28+ BATCH_SIZE : parseInt ( process . env . BATCH_SIZE || '10' ) , // Default batch size
29+ BATCH_DELAY : parseInt ( process . env . BATCH_DELAY || '0' ) , // Default no delay
2530 DRY_RUN : process . env . DRY_RUN === 'true' ,
2631 MAX_ROWS : parseInt ( process . env . MAX_ROWS || '0' ) ,
2732} ;
@@ -70,12 +75,22 @@ async function main(): Promise<void> {
7075 ) ;
7176 }
7277
73- // Transform data format
78+ // Transform data format with user support
7479 console . log ( '转换数据格式...' ) ;
7580 const organizations = limitedData
7681 . map ( ( row ) => {
7782 try {
78- return DataTransformer . transformOrganization ( row ) ;
83+ const organization = DataTransformer . transformOrganization ( row ) ;
84+
85+ // Extract user data from the same row
86+ const userData = UserTransformer . transformUser ( row ) ;
87+
88+ // Attach user data for later processing using WeakMap
89+ if ( userData ) {
90+ userWeakMap . set ( organization , userData ) ;
91+ }
92+
93+ return organization ;
7994 } catch ( error : any ) {
8095 const orgName = row [ '常用名称' ] || row . name || 'Unknown' ;
8196 console . warn ( `转换数据失败,跳过行: ${ orgName } ` , error . message ) ;
@@ -97,7 +112,13 @@ async function main(): Promise<void> {
97112
98113 // Initialize API client and importer
99114 const api = new StrapiAPI ( CONFIG . STRAPI_URL , CONFIG . STRAPI_TOKEN ) ;
100- importer = new DataImporter ( api , CONFIG . BATCH_SIZE , CONFIG . DRY_RUN ) ;
115+ importer = new DataImporter (
116+ api ,
117+ userWeakMap ,
118+ CONFIG . BATCH_SIZE ,
119+ CONFIG . BATCH_DELAY ,
120+ CONFIG . DRY_RUN ,
121+ ) ;
101122
102123 // Start import
103124 await importer . importOrganizations ( organizations ) ;
@@ -115,7 +136,9 @@ function parseArgs(): void {
115136
116137 if ( args . includes ( '--help' ) || args . includes ( '-h' ) ) {
117138 console . log ( `
118- Strapi 数据导入工具
139+ Strapi 数据导入工具 (增强版)
140+
141+ 支持同时导入组织信息和联系人用户,并自动建立关联关系。
119142
120143用法:
121144 tsx scripts/import-data.ts [选项]
@@ -130,9 +153,17 @@ Strapi 数据导入工具
130153 EXCEL_FILE Excel 文件路径 (默认: 教育公益开放式数据库.xlsx)
131154 SHEET_NAME 工作表名称 (默认: 使用第一个工作表)
132155 BATCH_SIZE 批次大小 (默认: 10)
156+ BATCH_DELAY 批次间延迟秒数 (默认: 0, 表示无延迟)
133157 MAX_ROWS 最大导入行数 (默认: 0, 表示导入所有行)
134158 DRY_RUN 模拟模式 (true/false)
135159
160+ 功能特性:
161+ - 导入组织基本信息
162+ - 自动创建联系人用户账户
163+ - 建立组织与用户的关联关系
164+ - 支持用户名冲突自动处理
165+ - 重复检查和错误处理
166+
136167示例:
137168 # 正常导入
138169 STRAPI_TOKEN=your_token tsx import-data.ts
@@ -142,6 +173,12 @@ Strapi 数据导入工具
142173
143174 # 导入指定工作表
144175 SHEET_NAME="甘肃省" STRAPI_TOKEN=your_token tsx import-data.ts
176+
177+ # 仅测试前10行
178+ MAX_ROWS=10 DRY_RUN=true tsx import-data.ts
179+
180+ # 设置批次间延迟
181+ BATCH_DELAY=2 STRAPI_TOKEN=your_token tsx import-data.ts
145182` ) ;
146183 process . exit ( 0 ) ;
147184 }
0 commit comments