initOne.service.ts 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. // 2024-06-11 导入
  11. @Provide()
  12. export class initOneService {
  13. // 本次导入公共标签
  14. tags = ['240611'];
  15. @InjectEntityModel(Demand)
  16. demandModel: Repository<Demand>;
  17. @InjectEntityModel(Achievement)
  18. achievementModel: Repository<Achievement>;
  19. @InjectEntityModel(Expert)
  20. expertModel: Repository<Expert>;
  21. async initData() {
  22. console.log('in initData');
  23. // await this.importRequirementFromExcel();
  24. // await this.importAchieveFromExcel();
  25. // await this.importExpertFromExcel();
  26. }
  27. async addImportDataTags() {
  28. // 查询achievementModel和expertModel的所有数据,并为其添加标签
  29. const achieveTags: any = [...this.tags, '成果'];
  30. const expertTags: any = [...this.tags, '专家'];
  31. await this.achievementModel.update({}, { tags: achieveTags });
  32. await this.expertModel.update({}, { tags: expertTags });
  33. // 查询demandModel 2024-06-10 至 2024-06-12 (其实就是2024-06-11)的数据,添加标签,之后24号的数据在initTwo中添加
  34. const demandTags: any = [...this.tags, '需求'];
  35. const list = await this.demandModel.createQueryBuilder().update().set({ tags: demandTags }).where('created_time BETWEEN :start AND :end', { start: '2024-06-10', end: '2024-06-12' }).execute();
  36. console.log(list);
  37. }
  38. async importRequirementFromExcel() {
  39. const p = path.resolve(__dirname, '../../../importData/20240611', '需求库.xlsx');
  40. const wb = new Excel.Workbook();
  41. await wb.xlsx.readFile(p);
  42. const sheet = wb.getWorksheet(1);
  43. const meta = this.requirementMeta();
  44. const allData = [];
  45. const cityArr = ['长春', '吉林', '通化', '白山', '辽源', '四平', '白城', '松原', '延边州', '延边'];
  46. const areaArr = [
  47. '五棵树经济开发区',
  48. '南关区',
  49. '宽城区',
  50. '朝阳区',
  51. '二道区',
  52. '绿园区',
  53. '双阳区',
  54. '九台区',
  55. '公主岭市',
  56. '榆树市',
  57. '德惠市',
  58. '农安县',
  59. '昌邑区',
  60. '龙潭区',
  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. const specialList = [
  110. { e: '高新区', to: '高新技术产业开发区' },
  111. { e: '高新', to: '高新技术产业开发区' },
  112. { e: '经开', to: '经济技术开发区' },
  113. { e: '五棵树', to: '五棵树经济开发区' },
  114. { e: '北湖', to: '北湖科技开发区' },
  115. { e: '净月', to: '净月高新技术产业开发区' },
  116. { e: '绿园经济', to: '绿园经济开发区' },
  117. ];
  118. const ignoreArea = ['吉林', '长春', '白城'];
  119. const specialAreaList = [
  120. { e: '梅河口', to: ['吉林省', '通化市', '梅河口市'] },
  121. { e: '德惠', to: ['吉林省', '长春市', '德惠市'] },
  122. { e: '敦化', to: ['吉林省', '延边州', '敦化市'] },
  123. { e: '延吉', to: ['吉林省', '延边州', '延吉市'] },
  124. { e: '柳河', to: ['吉林省', '通化市', '柳河县'] },
  125. ];
  126. sheet.eachRow((row, ri) => {
  127. if (ri === 1 || ri === 2) {
  128. // 不处理
  129. } else {
  130. const obj = {};
  131. row.eachCell((cell, ci) => {
  132. const val = cell.value as string;
  133. const key = meta[ci];
  134. if (ci === 3) {
  135. let area = ['吉林省'];
  136. // 处理地区
  137. const res = cityArr.find(f => val.includes(f));
  138. if (res) {
  139. // 有市级关键词的, 延边州不需要处理
  140. if (res === '延边') area.push('延边州');
  141. else if (res !== '延边州') area.push(`${res}市`);
  142. else area.push(res);
  143. const elseStr = val.replace(res, '');
  144. if (elseStr !== '' && !ignoreArea.includes(elseStr)) {
  145. const areaVal = areaArr.find(f => f.includes(elseStr));
  146. if (areaVal) area.push(areaVal);
  147. else {
  148. const rs = specialList.find(f => elseStr.includes(f.e));
  149. if (rs) area.push(rs.to);
  150. }
  151. }
  152. } else {
  153. const res = specialAreaList.find(f => val.includes(f.e));
  154. if (res) area = res.to;
  155. else obj['no_area'] = true;
  156. }
  157. obj[key] = area;
  158. } else if (ci === 6) {
  159. // 分离人员和电话
  160. const strReg = /([\u4e00-\u9fa5]{3}|[\u4e00-\u9fa5]{2})/g;
  161. const strRes = val.match(strReg);
  162. const numRes = val.replace(strReg, '').replace('\n', '');
  163. if (isArray(strRes)) obj['contacts'] = strRes.join(';');
  164. if (isArray(numRes)) obj['tel'] = numRes.join(';');
  165. if (numRes) obj['tel'] = numRes;
  166. } else if (key) obj[key] = val;
  167. });
  168. allData.push(obj);
  169. }
  170. });
  171. const res = await this.demandModel.insert(allData);
  172. return res;
  173. }
  174. requirementMeta() {
  175. return {
  176. 2: 'field',
  177. 3: 'area',
  178. 4: 'company',
  179. 5: 'brief',
  180. 6: 'contacts',
  181. 7: 'year',
  182. };
  183. }
  184. async importAchieveFromExcel() {
  185. const p = path.resolve(__dirname, '../../../importData/20240611', '成果库.xlsx');
  186. const wb = new Excel.Workbook();
  187. await wb.xlsx.readFile(p);
  188. const sheet = wb.getWorksheet(1);
  189. const meta = this.achieveMeta();
  190. const allData = [];
  191. sheet.eachRow((row, ri) => {
  192. if (ri === 1 || ri === 2) {
  193. // 不处理
  194. } else {
  195. const obj = {};
  196. row.eachCell((cell, ci) => {
  197. const val = cell.value;
  198. const key = meta[ci];
  199. if (key) obj[key] = val;
  200. });
  201. allData.push(obj);
  202. }
  203. });
  204. return await this.achievementModel.insert(allData);
  205. }
  206. achieveMeta() {
  207. return {
  208. 2: 'field',
  209. 3: 'name',
  210. 4: 'brief',
  211. 5: 'source',
  212. 6: 'person',
  213. 7: 'tel',
  214. };
  215. }
  216. async importExpertFromExcel() {
  217. const p = path.resolve(__dirname, '../../../importData/20240611', '专家库.xlsx');
  218. const wb = new Excel.Workbook();
  219. await wb.xlsx.readFile(p);
  220. const sheet = wb.getWorksheet(1);
  221. const rows = sheet.getRows(3, 200);
  222. const meta = this.exportsMeta();
  223. const allData = [];
  224. for (const row of rows) {
  225. const obj = {};
  226. row.eachCell((cell, index) => {
  227. let val = cell.value as string;
  228. if (index === 4) {
  229. const varr = val.split('').filter(f => f !== ' ');
  230. val = varr.join('');
  231. }
  232. const key = meta[index];
  233. obj[key] = val;
  234. });
  235. allData.push(obj);
  236. }
  237. const res = await this.expertModel.insert(allData);
  238. return res;
  239. }
  240. exportsMeta() {
  241. return {
  242. 1: 'industry_type',
  243. 2: 'industry',
  244. 3: 'work_type',
  245. 4: 'name',
  246. 5: 'work',
  247. 6: 'title',
  248. };
  249. }
  250. }