158 lines
5.7 KiB
JavaScript
158 lines
5.7 KiB
JavaScript
import fs from 'fs/promises';
|
|
import path from 'path';
|
|
import { main as getProject } from './getProject.js';
|
|
import { main as getPreSaleLicense } from './getPreSaleLicense.js';
|
|
import { main as getCompanies } from './getCompanies.js';
|
|
|
|
// 检查数据文件是否存在
|
|
async function checkDataFileExists(dataPath) {
|
|
try {
|
|
await fs.access(dataPath);
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// 执行脚本函数并等待完成
|
|
async function runScript(scriptFunction, description, dataFilePath) {
|
|
console.log(`开始执行: ${description}`);
|
|
|
|
// 检查数据文件是否已存在
|
|
const dataExists = await checkDataFileExists(dataFilePath);
|
|
if (dataExists) {
|
|
console.log(`📁 发现现有数据文件: ${path.basename(dataFilePath)},跳过抓取脚本\n`);
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
await scriptFunction();
|
|
|
|
console.log(`✅ ${description} 执行完成\n`);
|
|
return true;
|
|
} catch (error) {
|
|
console.error(`❌ ${description} 执行失败:`, error.message);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// 合并许可证数据到项目数据中
|
|
async function mergeLicenseData() {
|
|
console.log('开始合并许可证数据...');
|
|
|
|
try {
|
|
// 读取项目数据
|
|
const projectDataPath = path.join(process.cwd(), 'data', 'project.json');
|
|
const projectData = JSON.parse(await fs.readFile(projectDataPath, 'utf-8'));
|
|
|
|
// 读取许可证数据
|
|
const licenseDataPath = path.join(process.cwd(), 'data', 'preSaleLicense.json');
|
|
const licenseData = JSON.parse(await fs.readFile(licenseDataPath, 'utf-8'));
|
|
|
|
// 创建许可证号到许可证数据的映射
|
|
const licenseMap = new Map();
|
|
licenseData.forEach(license => {
|
|
if (license['许可证号']) {
|
|
licenseMap.set(license['许可证号'], license);
|
|
}
|
|
});
|
|
|
|
console.log(`找到 ${licenseMap.size} 个许可证记录`);
|
|
|
|
// 为每个项目合并许可证详细信息
|
|
let mergedCount = 0;
|
|
projectData.forEach(project => {
|
|
if (project['预售许可证'] && Array.isArray(project['预售许可证'])) {
|
|
project['预售许可证'].forEach(license => {
|
|
const licenseNumber = license['许可证号'];
|
|
const fullLicenseData = licenseMap.get(licenseNumber);
|
|
|
|
if (fullLicenseData) {
|
|
// 将完整的许可证信息合并到现有许可证对象中
|
|
Object.assign(license, fullLicenseData);
|
|
mergedCount++;
|
|
} else {
|
|
console.warn(`⚠️ 未找到许可证详情: ${licenseNumber}`);
|
|
// 添加一个标记表示未找到详情
|
|
license['详情获取状态'] = '未找到';
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
console.log(`✅ 成功合并 ${mergedCount} 个许可证详情`);
|
|
|
|
// 计算总套数
|
|
console.log('开始计算套数...');
|
|
projectData.forEach(project => {
|
|
if (project['预售许可证'] && Array.isArray(project['预售许可证'])) {
|
|
let approvedUnits = 0;
|
|
let unsoldUnits = 0;
|
|
|
|
project['预售许可证'].forEach(license => {
|
|
approvedUnits += parseInt(license['总套数'], 10) || 0;
|
|
unsoldUnits += parseInt(license['可售套数'], 10) || 0;
|
|
});
|
|
|
|
project['核准预售套数'] = approvedUnits;
|
|
project['未售总套数'] = unsoldUnits;
|
|
project['已售总套数'] = approvedUnits - unsoldUnits;
|
|
}
|
|
});
|
|
console.log('✅ 套数计算完成');
|
|
|
|
// 保存合并后的数据
|
|
const outputPath = path.join(process.cwd(), 'data', 'merged_data.json');
|
|
await fs.writeFile(outputPath, JSON.stringify(projectData, null, 4), 'utf-8');
|
|
|
|
console.log(`📁 合并后的数据已保存至: ${outputPath}`);
|
|
console.log(`📊 总项目数: ${projectData.length}`);
|
|
|
|
return projectData;
|
|
|
|
} catch (error) {
|
|
console.error('❌ 数据合并失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// 主函数
|
|
async function main() {
|
|
console.log('🚀 开始普宁房地产数据整合流程\n');
|
|
|
|
try {
|
|
// 步骤1: 获取项目数据
|
|
const projectDataPath = path.join(process.cwd(), 'data', 'project.json');
|
|
const projectSuccess = await runScript(getProject, '项目信息抓取脚本', projectDataPath);
|
|
if (!projectSuccess) {
|
|
throw new Error('项目信息抓取失败');
|
|
}
|
|
|
|
// 步骤2: 获取许可证数据
|
|
const licenseDataPath = path.join(process.cwd(), 'data', 'preSaleLicense.json');
|
|
const licenseSuccess = await runScript(getPreSaleLicense, '预售许可证抓取脚本', licenseDataPath);
|
|
if (!licenseSuccess) {
|
|
throw new Error('预售许可证抓取失败');
|
|
}
|
|
|
|
// 步骤3: 获取公司数据
|
|
const companyDataPath = path.join(process.cwd(), 'data', 'companies.json');
|
|
const companySuccess = await runScript(getCompanies, '公司信息抓取脚本', companyDataPath);
|
|
if (!companySuccess) {
|
|
throw new Error('公司信息抓取失败');
|
|
}
|
|
|
|
// 步骤4: 合并数据
|
|
await mergeLicenseData();
|
|
|
|
console.log('\n🎉 所有数据处理完成!');
|
|
console.log('📁 输出文件: data/merged_data.json, data/companies.json');
|
|
|
|
} catch (error) {
|
|
console.error('\n💥 处理过程中发生错误:', error.message);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// 运行主函数
|
|
main(); |