initOne.service.ts 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import { Provide } from '@midwayjs/core';
  2. import { InjectEntityModel } from '@midwayjs/typeorm';
  3. import { isArray } from 'lodash';
  4. import { Repository } from 'typeorm';
  5. import { Achievement } from '../../entity/platform/achievement.entity';
  6. import { Demand } from '../../entity/platform/demand.entity';
  7. import { Expert } from '../../entity/users/expert.entity';
  8. import * as Excel from 'exceljs';
  9. import * as path from 'path';
  10. import { Tags } from '../../entity/system/tags.entity';
  11. // 2024-06-11 导入
  12. @Provide()
  13. export class InitOneService {
  14. // 本次导入公共标签
  15. tags = ['20240611'];
  16. @InjectEntityModel(Tags)
  17. tagsModel: Repository<Tags>;
  18. @InjectEntityModel(Demand)
  19. demandModel: Repository<Demand>;
  20. @InjectEntityModel(Achievement)
  21. achievementModel: Repository<Achievement>;
  22. @InjectEntityModel(Expert)
  23. expertModel: Repository<Expert>;
  24. async initData() {
  25. console.log('in initData');
  26. // await this.importRequirementFromExcel();
  27. // await this.importAchieveFromExcel();
  28. // await this.importExpertFromExcel();
  29. }
  30. async dataToUse() {
  31. await this.achievementModel.update({}, { is_use: '0', status: '1' });
  32. }
  33. async addTags() {
  34. const list = [{ title: '20240611' }, { title: '成果' }, { title: '专家' }, { title: '需求' }];
  35. for (const i of list) {
  36. const num = await this.tagsModel.createQueryBuilder().where('title = :title', { title: i.title }).getCount();
  37. if (num <= 0) {
  38. await this.tagsModel.insert(i);
  39. }
  40. }
  41. }
  42. async addImportDataTags() {
  43. // 查询achievementModel和expertModel的所有数据,并为其添加标签
  44. const achieveTags: any = [...this.tags, '成果'];
  45. const expertTags: any = [...this.tags, '专家'];
  46. await this.achievementModel.update({}, { tags: achieveTags });
  47. await this.expertModel.update({}, { tags: expertTags });
  48. // 查询demandModel 2024-06-10 至 2024-06-12 (其实就是2024-06-11)的数据,添加标签,之后24号的数据在initTwo中添加
  49. const demandTags: any = [...this.tags, '需求'];
  50. await this.demandModel.createQueryBuilder().update().set({ tags: demandTags }).where('created_time BETWEEN :start AND :end', { start: '2024-06-10', end: '2024-06-12' }).execute();
  51. }
  52. async importRequirementFromExcel() {
  53. const p = path.resolve(__dirname, '../../../importData/20240611', '需求库.xlsx');
  54. const wb = new Excel.Workbook();
  55. await wb.xlsx.readFile(p);
  56. const sheet = wb.getWorksheet(1);
  57. const meta = this.requirementMeta();
  58. const allData = [];
  59. const cityArr = ['长春', '吉林', '通化', '白山', '辽源', '四平', '白城', '松原', '延边州', '延边'];
  60. const areaArr = [
  61. '五棵树经济开发区',
  62. '南关区',
  63. '宽城区',
  64. '朝阳区',
  65. '二道区',
  66. '绿园区',
  67. '双阳区',
  68. '九台区',
  69. '公主岭市',
  70. '榆树市',
  71. '德惠市',
  72. '农安县',
  73. '昌邑区',
  74. '龙潭区',
  75. '船营区',
  76. '丰满区',
  77. '蛟河市',
  78. '桦甸市',
  79. '舒兰市',
  80. '磐石市',
  81. '永吉县',
  82. '东昌区',
  83. '二道江区',
  84. '集安市',
  85. '梅河口市',
  86. '通化县',
  87. '辉南县',
  88. '柳河县',
  89. '浑江区',
  90. '江源区',
  91. '临江市',
  92. '抚松县',
  93. '靖宇县',
  94. '长白朝鲜族自治县',
  95. '龙山区',
  96. '西安区',
  97. '东丰县',
  98. '东辽县',
  99. '铁西区',
  100. '铁东区',
  101. '双辽市',
  102. '梨树县',
  103. '伊通满族自治县',
  104. '洮北区',
  105. '洮南市',
  106. '大安市',
  107. '镇赉县',
  108. '通榆县',
  109. '宁江区',
  110. '扶余市',
  111. '长岭县',
  112. '乾安县',
  113. '前郭尔罗斯蒙古族自治县',
  114. '延吉市',
  115. '图们市',
  116. '敦化市',
  117. '珲春市',
  118. '龙井市',
  119. '和龙市',
  120. '汪清县',
  121. '安图县',
  122. ];
  123. const specialList = [
  124. { e: '高新区', to: '高新技术产业开发区' },
  125. { e: '高新', to: '高新技术产业开发区' },
  126. { e: '经开', to: '经济技术开发区' },
  127. { e: '五棵树', to: '五棵树经济开发区' },
  128. { e: '北湖', to: '北湖科技开发区' },
  129. { e: '净月', to: '净月高新技术产业开发区' },
  130. { e: '绿园经济', to: '绿园经济开发区' },
  131. ];
  132. const ignoreArea = ['吉林', '长春', '白城'];
  133. const specialAreaList = [
  134. { e: '梅河口', to: ['吉林省', '通化市', '梅河口市'] },
  135. { e: '德惠', to: ['吉林省', '长春市', '德惠市'] },
  136. { e: '敦化', to: ['吉林省', '延边州', '敦化市'] },
  137. { e: '延吉', to: ['吉林省', '延边州', '延吉市'] },
  138. { e: '柳河', to: ['吉林省', '通化市', '柳河县'] },
  139. ];
  140. sheet.eachRow((row, ri) => {
  141. if (ri === 1 || ri === 2) {
  142. // 不处理
  143. } else {
  144. const obj = {};
  145. row.eachCell((cell, ci) => {
  146. const val = cell.value as string;
  147. const key = meta[ci];
  148. if (ci === 3) {
  149. let area = ['吉林省'];
  150. // 处理地区
  151. const res = cityArr.find(f => val.includes(f));
  152. if (res) {
  153. // 有市级关键词的, 延边州不需要处理
  154. if (res === '延边') area.push('延边州');
  155. else if (res !== '延边州') area.push(`${res}市`);
  156. else area.push(res);
  157. const elseStr = val.replace(res, '');
  158. if (elseStr !== '' && !ignoreArea.includes(elseStr)) {
  159. const areaVal = areaArr.find(f => f.includes(elseStr));
  160. if (areaVal) area.push(areaVal);
  161. else {
  162. const rs = specialList.find(f => elseStr.includes(f.e));
  163. if (rs) area.push(rs.to);
  164. }
  165. }
  166. } else {
  167. const res = specialAreaList.find(f => val.includes(f.e));
  168. if (res) area = res.to;
  169. else obj['no_area'] = true;
  170. }
  171. obj[key] = area;
  172. } else if (ci === 6) {
  173. // 分离人员和电话
  174. const strReg = /([\u4e00-\u9fa5]{3}|[\u4e00-\u9fa5]{2})/g;
  175. const strRes = val.match(strReg);
  176. const numRes = val.replace(strReg, '').replace('\n', '');
  177. if (isArray(strRes)) obj['contacts'] = strRes.join(';');
  178. if (isArray(numRes)) obj['tel'] = numRes.join(';');
  179. if (numRes) obj['tel'] = numRes;
  180. } else if (key) obj[key] = val;
  181. });
  182. allData.push(obj);
  183. }
  184. });
  185. const res = await this.demandModel.insert(allData);
  186. return res;
  187. }
  188. requirementMeta() {
  189. return {
  190. 2: 'field',
  191. 3: 'area',
  192. 4: 'company',
  193. 5: 'brief',
  194. 6: 'contacts',
  195. 7: 'year',
  196. };
  197. }
  198. async importAchieveFromExcel() {
  199. const p = path.resolve(__dirname, '../../../importData/20240611', '成果库.xlsx');
  200. const wb = new Excel.Workbook();
  201. await wb.xlsx.readFile(p);
  202. const sheet = wb.getWorksheet(1);
  203. const meta = this.achieveMeta();
  204. const allData = [];
  205. sheet.eachRow((row, ri) => {
  206. if (ri === 1 || ri === 2) {
  207. // 不处理
  208. } else {
  209. const obj = {};
  210. row.eachCell((cell, ci) => {
  211. const val = cell.value;
  212. const key = meta[ci];
  213. if (key) obj[key] = val;
  214. });
  215. allData.push(obj);
  216. }
  217. });
  218. return await this.achievementModel.insert(allData);
  219. }
  220. achieveMeta() {
  221. return {
  222. 2: 'field',
  223. 3: 'name',
  224. 4: 'brief',
  225. 5: 'source',
  226. 6: 'person',
  227. 7: 'tel',
  228. };
  229. }
  230. async importExpertFromExcel() {
  231. const p = path.resolve(__dirname, '../../../importData/20240611', '专家库.xlsx');
  232. const wb = new Excel.Workbook();
  233. await wb.xlsx.readFile(p);
  234. const sheet = wb.getWorksheet(1);
  235. const rows = sheet.getRows(3, 200);
  236. const meta = this.exportsMeta();
  237. const allData = [];
  238. for (const row of rows) {
  239. const obj = {};
  240. row.eachCell((cell, index) => {
  241. let val = cell.value as string;
  242. if (index === 4) {
  243. const varr = val.split('').filter(f => f !== ' ');
  244. val = varr.join('');
  245. }
  246. const key = meta[index];
  247. obj[key] = val;
  248. });
  249. allData.push(obj);
  250. }
  251. const res = await this.expertModel.insert(allData);
  252. return res;
  253. }
  254. exportsMeta() {
  255. return {
  256. 1: 'industry_type',
  257. 2: 'industry',
  258. 3: 'work_type',
  259. 4: 'name',
  260. 5: 'work',
  261. 6: 'title',
  262. };
  263. }
  264. }