Files
DDCZ/scripts/convertJSON.js

281 lines
9.3 KiB
JavaScript
Raw Normal View History

const fs = require('fs');
const path = require('path');
// JSON文件路径
const BASE_DIR = path.join(__dirname, '..');
const COMPANY_JSON = path.join(BASE_DIR, '公司介绍.json');
const IMAGE_JSON = path.join(BASE_DIR, '企业图片.json');
const BUSINESS_JSON = path.join(BASE_DIR, '企业业务板块和内推岗位.json');
// 提取城市信息
function extractCity(region) {
if (!region) return '';
// 尝试匹配 "总部:城市名" 的格式
const match = region.match(/总部[:]\s*([^\n]+)/);
if (match) {
let city = match[1].trim();
// 移除省份前缀(如果有)
city = city.replace(/^(江苏|浙江|广东|山东|河北|河南|四川|湖北|湖南|安徽|福建|陕西|辽宁|重庆|天津|上海|北京)\s*/, '');
// 如果不是以"市"结尾且不是特殊行政区,添加"市"
if (!city.endsWith('市') && !city.includes('自治') && !city.includes('特别行政区')) {
city += '市';
}
return city;
}
return '';
}
console.log('开始读取JSON文件...\n');
// 读取JSON文件
const companyData = JSON.parse(fs.readFileSync(COMPANY_JSON, 'utf-8'));
const imageDataObj = JSON.parse(fs.readFileSync(IMAGE_JSON, 'utf-8'));
const businessDataObj = JSON.parse(fs.readFileSync(BUSINESS_JSON, 'utf-8'));
console.log(`✅ 读取 ${companyData.length} 条公司介绍数据`);
console.log(`✅ 读取 ${Object.keys(imageDataObj).length} 家企业图片数据`);
console.log(`✅ 读取 ${Object.keys(businessDataObj).length} 家企业业务板块数据\n`);
// 建立企业Map避免重复
const companiesMap = new Map();
companyData.forEach((row) => {
const name = row['✅企业名称'];
if (!name) return;
// 如果企业已存在,跳过
if (companiesMap.has(name)) return;
const region = row['✅地区'] || '';
const city = extractCity(region);
const type = row['✅企业类型'] || '';
const description = row['✅企业简介'] || '';
// 生成企业简称(去掉"有限公司"等后缀)
const shortName = name
.replace(/股份有限公司$/, '')
.replace(/有限责任公司$/, '')
.replace(/有限公司$/, '')
.replace(/集团$/, '集团');
// 生成标签(从企业类型中提取)
const tags = type.split(',').map(t => t.trim()).filter(t => t);
// 生成简介截取前100个字符
const intro = description.length > 100 ? description.substring(0, 100) + '...' : description;
companiesMap.set(name, {
name: name,
shortName: shortName,
type: type,
tags: tags,
region: region,
city: city,
description: description,
intro: intro,
reason: row['✅推荐理由'] || '', // 前端期望的字段名是 reason
gallery: [], // 前端期望的字段名是 gallery
cover: '', // 将在合并图片时设置
segments: []
});
});
console.log(`✅ 去重后企业数量: ${companiesMap.size}\n`);
// 合并图片数据
Object.keys(imageDataObj).forEach(companyName => {
if (!companiesMap.has(companyName)) return;
const company = companiesMap.get(companyName);
const images = imageDataObj[companyName];
if (Array.isArray(images)) {
images.forEach(imageUrl => {
if (imageUrl && !company.gallery.includes(imageUrl)) {
company.gallery.push(imageUrl);
}
});
// 设置封面为第一张图片
if (company.gallery.length > 0) {
company.cover = company.gallery[0];
}
}
});
console.log('✅ 已合并企业图片数据\n');
// 合并业务板块和岗位数据
Object.keys(businessDataObj).forEach(companyName => {
if (!companiesMap.has(companyName)) return;
const company = companiesMap.get(companyName);
const segments = businessDataObj[companyName];
if (Array.isArray(segments)) {
segments.forEach(item => {
const segment = item['业务板块'] || '';
const positions = item['关联岗位'] || [];
if (segment || positions.length > 0) {
company.segments.push({
name: segment, // 前端代码期望name字段
jobs: positions // 前端代码期望jobs字段
});
}
});
}
});
console.log('✅ 已合并业务板块和岗位数据\n');
// 转换为数组
const companies = Array.from(companiesMap.values());
// 对苏州市的特定企业进行排序调整
// 确保恒力集团和亨通集团排在阿特斯前面
const suzhouPriority = {
'恒力集团有限公司': 1,
'亨通集团有限公司': 2,
'阿特斯阳光电力集团股份有限公司': 3
};
companies.sort((a, b) => {
// 如果两个都是苏州的优先级企业,按优先级排序
const aPriority = suzhouPriority[a.name];
const bPriority = suzhouPriority[b.name];
if (aPriority && bPriority) {
return aPriority - bPriority;
}
// 如果只有一个是优先级企业,优先级企业排前面
if (aPriority) return -1;
if (bPriority) return 1;
// 其他情况保持原顺序
return 0;
});
// 统计信息
const cities = new Set();
const provinces = new Set();
companies.forEach(company => {
if (company.city) {
cities.add(company.city);
// 提取省份
const cityToProv = {
'苏州市': '江苏省', '南京市': '江苏省', '无锡市': '江苏省', '常州市': '江苏省',
'南通市': '江苏省', '徐州市': '江苏省', '盐城市': '江苏省', '扬州市': '江苏省',
'镇江市': '江苏省', '泰州市': '江苏省', '连云港市': '江苏省', '淮安市': '江苏省',
'宿迁市': '江苏省', '常熟市': '江苏省',
'杭州市': '浙江省', '宁波市': '浙江省', '温州市': '浙江省', '绍兴市': '浙江省',
'台州市': '浙江省',
'广州市': '广东省', '深圳市': '广东省', '东莞市': '广东省', '佛山市': '广东省',
'惠州市': '广东省', '珠海市': '广东省',
'合肥市': '安徽省', '芜湖市': '安徽省', '安庆市': '安徽省', '滁州市': '安徽省',
'池州市': '安徽省', '铜陵市': '安徽省', '六安市': '安徽省',
'石家庄市': '河北省', '唐山市': '河北省', '保定市': '河北省', '廊坊市': '河北省',
'衡水市': '河北省',
'长沙市': '湖南省', '岳阳市': '湖南省', '衡阳市': '湖南省',
'武汉市': '湖北省',
'福州市': '福建省', '厦门市': '福建省', '泉州市': '福建省', '莆田市': '福建省',
'三明市': '福建省',
'北京市': '北京市',
'上海市': '上海市',
'天津市': '天津市'
};
const province = cityToProv[company.city];
if (province) {
provinces.add(province);
}
}
});
console.log('数据统计:');
console.log(` 企业总数: ${companies.length}`);
console.log(` 覆盖城市: ${cities.size}`);
console.log(` 覆盖省份: ${provinces.size}\n`);
console.log('涉及城市列表:');
console.log(Array.from(cities).sort().join(', ') + '\n');
console.log('涉及省份列表:');
console.log(Array.from(provinces).sort().join(', ') + '\n');
// 生成data.js文件
const dataJsContent = `// 自动生成的数据文件
// 生成时间: ${new Date().toLocaleString('zh-CN')}
const companies = ${JSON.stringify(companies, null, 2)};
const cities = ${JSON.stringify(Array.from(cities).sort(), null, 2)};
const provinces = ${JSON.stringify(Array.from(provinces).sort(), null, 2)};
// 为ES6模块导出添加别名
const activeCities = cities;
const activeProvinces = provinces;
const companiesData = companies;
// ES6模块导出
export { companies, cities, provinces, activeCities, activeProvinces, companiesData };
// CommonJS导出向后兼容
if (typeof module !== 'undefined' && module.exports) {
module.exports = { companies, cities, provinces, activeCities, activeProvinces, companiesData };
}
`;
const outputPath = path.join(BASE_DIR, 'js', 'data.js');
fs.writeFileSync(outputPath, dataJsContent, 'utf-8');
const fileSize = (fs.statSync(outputPath).size / 1024).toFixed(2);
console.log(`✅ 数据已成功写入: ${outputPath}`);
console.log(`✅ 文件大小: ${fileSize} KB\n`);
// 数据质量检查
const noImage = companies.filter(c => c.gallery.length === 0);
const noSegment = companies.filter(c => c.segments.length === 0);
const noCity = companies.filter(c => !c.city);
console.log('数据质量检查:');
console.log(` 缺少图片的企业: ${noImage.length}`);
console.log(` 缺少业务板块的企业: ${noSegment.length}`);
console.log(` 缺少城市信息的企业: ${noCity.length}\n`);
if (noImage.length > 0 && noImage.length <= 10) {
console.log('缺少图片的企业:');
noImage.forEach(c => console.log(` - ${c.name}`));
console.log('');
}
if (noSegment.length > 0 && noSegment.length <= 10) {
console.log('缺少业务板块的企业:');
noSegment.forEach(c => console.log(` - ${c.name}`));
console.log('');
}
if (noCity.length > 0 && noCity.length <= 10) {
console.log('缺少城市信息的企业:');
noCity.forEach(c => console.log(` - ${c.name}`));
console.log('');
}
console.log('✨ 转换完成!');