123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- import { Provide } from '@midwayjs/core';
- import { InjectEntityModel } from '@midwayjs/typeorm';
- import * as Excel from 'exceljs';
- import * as path from 'path';
- import { And, Equal, Like, Not, Repository } from 'typeorm';
- import { Region } from '../../entity/system/region.entity';
- import { Company } from '../../entity/users/company.entity';
- import { DictData } from '../../entity/system/dictData.entity';
- import { Supply } from '../../entity/platform/supply.entity';
- import { differenceWith, get, isEqual, isObject, isString, last, take, trim } from 'lodash';
- import { Demand } from '../../entity/platform/demand.entity';
- import _ = require('lodash');
- import { Project } from '../../entity/platform/project.entity';
- import { Tags } from '../../entity/system/tags.entity';
- // 2024-06-24 导入
- @Provide()
- export class initTwoService {
- tags = ['20240624'];
- @InjectEntityModel(Tags)
- tagsModel: Repository<Tags>;
- @InjectEntityModel(Region)
- regionModel: Repository<Region>;
- @InjectEntityModel(Company)
- companyModel: Repository<Company>;
- @InjectEntityModel(DictData)
- dictDataModel: Repository<DictData>;
- @InjectEntityModel(Supply)
- supplyModel: Repository<Supply>;
- @InjectEntityModel(Demand)
- demandModel: Repository<Demand>;
- @InjectEntityModel(Project)
- projectModel: Repository<Project>;
- async initData() {
- // return await this.importCompany();
- // return await this.importSupply();
- // return await this.importDemand();
- // return await this.importProject();
- }
- async addTags() {
- const list = [{ title: '20240624' }, { title: '企业' }, { title: '供给' }, { title: '项目' }, { title: '需求' }];
- for (const i of list) {
- const num = await this.tagsModel.createQueryBuilder().where('title = :title', { title: i.title }).getCount();
- if (num <= 0) {
- await this.tagsModel.insert(i);
- }
- }
- }
- async addImportDataTags() {
- // company,supply,project 直接全表更新tags
- const ctags: any = [...this.tags, '企业'];
- await this.companyModel.update({}, { tags: ctags });
- const stags: any = [...this.tags, '供给'];
- await this.supplyModel.update({}, { tags: stags });
- const ptags: any = [...this.tags, '项目'];
- await this.projectModel.update({}, { tags: ptags });
- // demand 2024-06-23 至2024-06-25内的所有数据加标签
- const demandTags: any = [...this.tags, '需求'];
- await this.demandModel.createQueryBuilder().update().set({ tags: demandTags }).where('created_time BETWEEN :start AND :end', { start: '2024-06-23', end: '2024-06-25' }).execute();
- }
- /**
- * 获取excel表头对应的字段
- * @returns 表格列对应字段对象
- */
- companyMeta() {
- return {
- 2: 'area1',
- 3: 'area2',
- 4: 'name',
- 5: 'products',
- 6: 'type',
- 7: 'person',
- };
- }
- async importCompany() {
- const p = path.resolve(__dirname, '../../../importData/20240624', '重点企业库.xlsx');
- const wb = new Excel.Workbook();
- await wb.xlsx.readFile(p);
- const sheet = wb.getWorksheet('总表');
- if (!sheet) return;
- const meta = this.companyMeta();
- const specialDeal = {
- 新区: '新区',
- 高新区: '长春高新技术产业开发区',
- 经开: '长春经济技术开发区',
- 中韩: '中韩国际合作示范区',
- 汽开: '长春汽车经济技术开发区',
- // 医药高新区: '',
- // 中新食品区: '',
- };
- const allData = [];
- sheet.eachRow((row, ri) => {
- if (ri === 1 || ri === 2) {
- // 不处理
- } else {
- const obj = {};
- row.eachCell((cell, ci) => {
- const val = cell.value;
- const key = meta[ci];
- if (key) obj[key] = val;
- });
- allData.push(obj);
- }
- });
- // 需要处理下 area1和area2,这俩是需要放到 area中,在region中找到合适的数据后放到area []里
- for (const i of allData) {
- // #region 地区处理
- i.area = ['吉林省'];
- if (i.area2 === '医药高新区') {
- i.area.push('通化市', '医药高新区');
- } else if (i.area2 === '中新食品区') {
- i.area.push('吉林市', '医药高新区');
- } else {
- const builder = this.regionModel.createQueryBuilder();
- builder.where(`name like '%${i.area1}%'`);
- // builder.andWhere(`name Not Like '%省%'`);
- builder.andWhere(`level = 'city'`);
- builder.andWhere(`code like '22%'`);
- const r1 = await builder.getOne();
- const r2 = await this.regionModel.findOne({ where: { name: Like(`%${i.area2}%`), code: Like('22%'), level: Equal('area') } });
- if (r1) i.area.push(r1.name);
- if (r2) i.area.push(r2.name);
- else {
- // 需要特殊处理的
- const str = specialDeal[i.area2];
- if (str) i.area.push(str);
- }
- }
- delete i.area1;
- delete i.area2;
- // #endregion
- // #region 字典处理
- if (i.type === '农林牧渔业') {
- i.type = '0';
- } else if (i.type === '卫生和社会工作') {
- i.type = '16';
- } else {
- const typeDict = await this.dictDataModel.findOne({ where: { label: i.type } });
- if (typeDict) {
- i.type = typeDict.value;
- }
- }
- // #endregion
- }
- await this.companyModel.insert(allData);
- }
- supplyMeta() {
- return {
- 3: 'industry',
- 4: 'field',
- 5: 'name',
- 6: 'brief',
- 7: 'source',
- };
- }
- async importSupply() {
- const p = path.resolve(__dirname, '../../../importData/20240624', '供应库.xlsx');
- const wb = new Excel.Workbook();
- await wb.xlsx.readFile(p);
- const sheet = wb.getWorksheet('总库');
- if (!sheet) return;
- const meta = this.supplyMeta();
- const allData = [];
- sheet.eachRow((row, ri) => {
- if (ri === 1 || ri === 2) {
- // 不处理
- } else {
- const obj = {};
- row.eachCell((cell, ci) => {
- const val = cell.value;
- const key = meta[ci];
- if (key) obj[key] = val;
- });
- allData.push(obj);
- }
- });
- // TODO:将产业,领域换成字典表
- // return allData;
- await this.supplyModel.insert(allData);
- }
- demandMeta() {
- return {
- 4: 'industry',
- 5: 'field',
- 6: 'area1',
- 7: 'area2',
- 8: 'company',
- 9: 'tec_name',
- 10: 'company_brief',
- 11: 'question',
- 12: 'brief',
- 13: 'year',
- 14: 'month',
- 15: 'contacts',
- 16: 'tel',
- };
- }
- async importDemand() {
- const p = path.resolve(__dirname, '../../../importData/20240624', '需求库.xlsx');
- const wb = new Excel.Workbook();
- await wb.xlsx.readFile(p);
- const sheet = wb.getWorksheet('3-技术需求库-打印');
- if (!sheet) return;
- const meta = this.demandMeta();
- const specialArea1Deal = {
- 延边州: '延边朝鲜族自治州',
- };
- const specialArea2Deal = {
- 新区: '新区',
- 高新区: '长春高新技术产业开发区',
- 经开: '长春经济技术开发区',
- 中韩: '中韩国际合作示范区',
- 汽开: '长春汽车经济技术开发区',
- 汽开区: '长春汽车经济技术开发区',
- // 医药高新区: '',
- // 中新食品区: '',
- };
- const allData = [];
- sheet.eachRow((row, ri) => {
- if (ri === 1 || ri === 2 || ri === 3) {
- // 不处理
- } else {
- const obj = {};
- row.eachCell((cell, ci) => {
- const val = cell.value;
- const key = meta[ci];
- if (key) obj[key] = val;
- });
- if (get(obj, 'company') && trim(get(obj, 'company')) !== '') allData.push(obj);
- }
- });
- for (const i of allData) {
- // #region 地区处理
- i.area = ['吉林省'];
- if (i.area2 === '医药高新区') {
- i.area.push('通化市', '医药高新区');
- } else if (i.area2 === '中新食品区') {
- i.area.push('吉林市', '医药高新区');
- } else {
- const builder = this.regionModel.createQueryBuilder();
- builder.where(`name like '%${i.area1}%'`);
- // builder.andWhere(`name Not Like '%省%'`);
- builder.andWhere(`level = 'city'`);
- builder.andWhere(`code like '22%'`);
- const r1 = await builder.getOne();
- const r2 = await this.regionModel.findOne({ where: { name: Like(`%${i.area2}%`), code: Like('22%'), level: Equal('area') } });
- if (r1) {
- i.area.push(r1.name);
- delete i.area1;
- } else {
- const area = specialArea1Deal[i.area1];
- if (area) {
- i.area.push(area);
- delete i.area1;
- }
- }
- if (r2) {
- i.area.push(r2.name);
- delete i.area2;
- } else {
- // 需要特殊处理的
- const area = specialArea2Deal[i.area2];
- if (area) {
- i.area.push(area);
- }
- // 还有一种情况就是省市都写的一个.就不需要第二个了,所以最后一定删除
- delete i.area2;
- }
- }
- // #endregion
- }
- // return allData.filter(f => f.area1 || f.area2);
- await this.demandModel.insert(allData);
- }
- projectMeta() {
- return {
- 3: 'name',
- 4: 'brief',
- 5: 'main',
- 6: 'progress',
- 7: 'track_unit',
- 8: 'source',
- };
- }
- projectIndustryMeta() {
- return [
- { size: 33, value: '汽车电子及新型汽车零部件' },
- { size: 30, value: '光电子及智能传感器' },
- { size: 24, value: '精密仪器及先进装备' },
- { size: 60, value: '生物医药及先进医疗器械' },
- { size: 4, value: '车规级芯片及功率半导体器件' },
- { size: 13, value: '人工智能及智能机器人' },
- { size: 24, value: '生物基及高性能新材料' },
- { size: 25, value: '新能源及动力电池' },
- { size: 10, value: '碳纤维及复合材料' },
- { size: 5, value: '遥感卫星及航空航天' },
- { size: 10, value: '精细化工及天然气化工' },
- { size: 20, value: '农产品加工及绿色食品' },
- { size: 5, value: '孵化平台' },
- { size: 9, value: '产业技术创新平台' },
- ];
- }
- async importProject() {
- const p = path.resolve(__dirname, '../../../importData/20240624', '项目库.xlsx');
- const wb = new Excel.Workbook();
- await wb.xlsx.readFile(p);
- const sheet = wb.getWorksheet('统计表');
- if (!sheet) return;
- const meta = this.projectMeta();
- let allData = [];
- const notDealRows = [1, 2, 3, 4, 5];
- const industryMeta = this.projectIndustryMeta();
- sheet.eachRow((row, ri) => {
- if (notDealRows.includes(ri)) {
- // 不处理
- } else {
- const obj = {};
- row.eachCell((cell, ci) => {
- const val = cell.value;
- const key = meta[ci];
- if (key) {
- obj[key] = val;
- }
- });
- const res = industryMeta.find(f => f.value === get(obj, 'name'));
- if (!res) {
- for (const key in obj) {
- if (!isString(obj[key])) {
- const rtobj = get(obj[key], 'richText');
- let text = '';
- if (rtobj) {
- for (const i of rtobj) {
- text = `${text}${i.text}`;
- }
- }
- obj[key] = text;
- }
- }
- allData.push(obj);
- }
- }
- });
- // 分组,然后给加上产业字段
- const newData = [];
- for (const meta of industryMeta) {
- const { size, value } = meta;
- const nds = take(allData, size);
- for (const i of nds) {
- i.industry = value;
- }
- newData.push(...nds);
- // 删除提取出来的数据
- allData = differenceWith(allData, nds, isEqual);
- }
- await this.projectModel.insert(newData);
- // return newData;
- }
- }
|