KpiComputeImportServiceImpl.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. package com.kcim.service.impl;
  2. import cn.hutool.core.date.DatePattern;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUtil;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.kcim.common.constants.Constant;
  7. import com.kcim.common.constants.NumberConstant;
  8. import com.kcim.common.exception.CostException;
  9. import com.kcim.common.file.MinioConfig;
  10. import com.kcim.common.file.MinioFileUtil;
  11. import com.kcim.common.util.DateUtils;
  12. import com.kcim.common.util.PageUtils;
  13. import com.kcim.common.util.UserContext;
  14. import com.kcim.dao.model.KpiComputeImport;
  15. import com.kcim.dao.repository.KpiComputeImportRepository;
  16. import com.kcim.service.CenterService;
  17. import com.kcim.service.KpiComputeImportService;
  18. import com.kcim.vo.CommonTitleVo;
  19. import com.kcim.vo.DictDataVo;
  20. import com.kcim.vo.SheetImportResultVO;
  21. import com.kcim.vo.UserInfoVO;
  22. import lombok.SneakyThrows;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.apache.commons.io.FileUtils;
  25. import org.apache.ibatis.jdbc.SqlRunner;
  26. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  27. import org.apache.poi.ss.usermodel.*;
  28. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  29. import org.springframework.beans.factory.annotation.Value;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.transaction.annotation.Propagation;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import org.springframework.util.CollectionUtils;
  34. import org.springframework.web.multipart.MultipartFile;
  35. import java.io.File;
  36. import java.io.FileInputStream;
  37. import java.io.IOException;
  38. import java.io.InputStream;
  39. import java.nio.file.Files;
  40. import java.nio.file.StandardCopyOption;
  41. import java.sql.Connection;
  42. import java.sql.DriverManager;
  43. import java.sql.SQLException;
  44. import java.util.*;
  45. import java.util.stream.Collectors;
  46. /**
  47. * @program: CostAccount
  48. * @description:
  49. * @author: Wang.YS
  50. * @create: 2024-06-03 13:58
  51. **/
  52. @Service("kpiComputeImportService")
  53. @Slf4j
  54. public class KpiComputeImportServiceImpl implements KpiComputeImportService {
  55. private final KpiComputeImportRepository repository;
  56. private final MinioConfig minioConfig;
  57. private final MinioFileUtil minioFileUtil;
  58. private final CenterService centerService;
  59. @Value("${spring.datasource.driver-class-name}")
  60. private String driver;
  61. @Value("${spring.datasource.url}")
  62. private String url;
  63. @Value("${spring.datasource.username}")
  64. private String username;
  65. @Value("${spring.datasource.password}")
  66. private String password;
  67. public KpiComputeImportServiceImpl(KpiComputeImportRepository repository, MinioConfig minioConfig, MinioFileUtil minioFileUtil, CenterService centerService) {
  68. this.repository = repository;
  69. this.minioConfig = minioConfig;
  70. this.minioFileUtil = minioFileUtil;
  71. this.centerService = centerService;
  72. }
  73. /**
  74. * 查询导入列表
  75. *
  76. * @param current 当前页
  77. * @param pageSize 页容量
  78. * @param computeDate 核算年月
  79. * @param tableName 表名
  80. * @return 导入列表
  81. */
  82. @Override
  83. public Object getList(Integer current, Integer pageSize, String computeDate, String tableName) {
  84. List<UserInfoVO> centerEmployee = centerService.getCenterUserInfo(null);
  85. Map<Long, String> userName = centerEmployee.stream().collect(Collectors.toMap(UserInfoVO::getId, UserInfoVO::getName, (a, b) -> b));
  86. DictDataVo dict = centerService.getDict(Constant.SPECIAL_SHEET_MAP);
  87. if (Objects.isNull(dict)) {
  88. throw new CostException("未找到特殊项目导入字典");
  89. }
  90. List<DictDataVo> dataVoList = dict.getDataVoList();
  91. if (CollectionUtils.isEmpty(dataVoList)) {
  92. throw new CostException("未找到特殊项目导入字典");
  93. }
  94. Map<String, String> dictionaryCodeNameMap = dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
  95. Page<KpiComputeImport> page = repository.getPage(current, pageSize, computeDate, tableName);
  96. List<KpiComputeImport> list = page.getRecords();
  97. if (CollectionUtils.isEmpty(list)) {
  98. return new PageUtils(new ArrayList<>(), NumberConstant.ZERO, pageSize, current);
  99. }
  100. for (KpiComputeImport computeImport : list) {
  101. computeImport.setCreateUserName(userName.get(Long.valueOf(computeImport.getCreateUser())));
  102. computeImport.setTableNameDisplay(dictionaryCodeNameMap.get(computeImport.getTableName()));
  103. }
  104. return new PageUtils(list, Math.toIntExact(page.getTotal()), pageSize, current);
  105. }
  106. /**
  107. * @return
  108. */
  109. @Override
  110. public Object getTableList() {
  111. DictDataVo dict = centerService.getDict(Constant.SPECIAL_SHEET_MAP);
  112. if (Objects.isNull(dict)) {
  113. throw new CostException("未找到特殊项目导入字典");
  114. }
  115. List<DictDataVo> dataVoList = dict.getDataVoList();
  116. if (CollectionUtils.isEmpty(dataVoList)) {
  117. throw new CostException("未找到特殊项目导入字典");
  118. }
  119. Map<String, String> dictionaryCodeNameMap = dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
  120. List<CommonTitleVo> list = new ArrayList<>();
  121. if (!CollectionUtils.isEmpty(dictionaryCodeNameMap)) {
  122. list = dictionaryCodeNameMap.keySet().stream().map(s -> new CommonTitleVo(s, dictionaryCodeNameMap.get(s))).collect(Collectors.toList());
  123. }
  124. return list;
  125. }
  126. /**
  127. * 导入数据
  128. *
  129. * @param computeDate 核算年月
  130. * @param tableName 表名
  131. * @param file 导入文件
  132. */
  133. @Override
  134. @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
  135. public void importData(String computeDate, String tableName, MultipartFile file) {
  136. //excel 数据导入
  137. String fileName = file.getOriginalFilename();
  138. //导入文件上传
  139. String uploadFileUrl = uploadFile(file, fileName);
  140. //导入记录添加
  141. KpiComputeImport kpiComputeImport = new KpiComputeImport();
  142. kpiComputeImport.setComputeDate(computeDate);
  143. kpiComputeImport.setImportStatus(NumberConstant.ZERO);
  144. kpiComputeImport.setCreateTime(new Date());
  145. kpiComputeImport.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  146. kpiComputeImport.setUrl(uploadFileUrl);
  147. kpiComputeImport.setTableName(tableName);
  148. kpiComputeImport.setFileName(fileName);
  149. kpiComputeImport.setHospId(UserContext.getCurrentLoginHospId());
  150. kpiComputeImport.setDelFlag(NumberConstant.ZERO);
  151. repository.save(kpiComputeImport);
  152. insertExcelData(kpiComputeImport.getId(), tableName, file, fileName, computeDate);
  153. }
  154. private void insertExcelData(Integer id, String tableName, MultipartFile file, String fileName, String computeDate) {
  155. try {
  156. assert fileName != null;
  157. File file1 = new File(fileName);
  158. FileUtils.copyInputStreamToFile(file.getInputStream(), file1);
  159. String excelSql = readExcelSql(file1, tableName, id, computeDate);
  160. SqlRunner sqlRunner = new SqlRunner(getConnection());
  161. sqlRunner.insert(excelSql);
  162. //更新新增人和时间
  163. String updateSql = "update " + "`" + tableName + "`" + "set" +
  164. "`create_user` = '" + UserContext.getCurrentUser().getId() + "' , `create_time` = '" + DateUtils.formatDate2String(new Date()) +
  165. "' where `compute_date` = '" + computeDate + "' and `hosp_id` = " + UserContext.getCurrentLoginHospId() +
  166. ";";
  167. sqlRunner.run(updateSql);
  168. } catch (IOException | SQLException | ClassNotFoundException e) {
  169. throw new RuntimeException(e);
  170. }
  171. }
  172. private String uploadFile(MultipartFile file, String fileName) {
  173. DateTime date = DateUtil.date();
  174. int month = DateUtil.month(date) + 1;
  175. int year = DateUtil.year(date);
  176. int day = DateUtil.dayOfMonth(date);
  177. Long hospId = UserContext.getCurrentLoginHospId();
  178. String fileUrl = "";
  179. try {
  180. String format = DateUtil.format(date, DatePattern.PURE_DATETIME_PATTERN);
  181. String originalFilename = format + fileName;
  182. String dataDirectory = minioConfig.getBucketName();
  183. String uploadFileName = "upload" + "/" + hospId + "/" + year + "/" + month + "/" + day + "/" + originalFilename;
  184. InputStream inputStream = file.getInputStream();
  185. minioFileUtil.putObject(dataDirectory, uploadFileName, inputStream);
  186. fileUrl = minioFileUtil.getObjectUrl(dataDirectory, uploadFileName);
  187. } catch (IOException e) {
  188. throw new RuntimeException(e);
  189. }
  190. return fileUrl;
  191. }
  192. /**
  193. * 作废导入数据
  194. *
  195. * @param id 记录id
  196. */
  197. @Override
  198. @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
  199. public void removeImport(Integer id) {
  200. KpiComputeImport kpiComputeImport = repository.getById(id);
  201. if (Objects.nonNull(kpiComputeImport)) {
  202. //更新表信息
  203. // String computeDate = kpiComputeImport.getComputeDate();
  204. String tableName = kpiComputeImport.getTableName();
  205. Long hospId = kpiComputeImport.getHospId();
  206. // TODO: 2023/7/24 导入的数据可能不是这个月的,用记录id 进行删除,有问题再看
  207. StringBuilder delSql = new StringBuilder().append("update " + "`").append(tableName).append("`").append("set")
  208. .append("`del_flag` = 1 , `update_user` = '").append(UserContext.getCurrentUser().getId())
  209. .append("' , `update_time` = '").append(DateUtils.formatDate2String(new Date())).append("' where `hosp_id` = ").append(hospId)
  210. .append(" and `import_id` = ").append(id).append(";");
  211. try {
  212. log.info("执行的sql语句:" + delSql);
  213. SqlRunner sqlRunner = new SqlRunner(getConnection());
  214. sqlRunner.run(delSql.toString());
  215. } catch (ClassNotFoundException | SQLException e) {
  216. throw new RuntimeException("删除导入数据错误" + e);
  217. }
  218. //更新 记录表信息
  219. kpiComputeImport.setImportStatus(NumberConstant.ONE);
  220. kpiComputeImport.setUpdateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  221. kpiComputeImport.setUpdateTime(new Date());
  222. repository.updateById(kpiComputeImport);
  223. }
  224. }
  225. @Override
  226. @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
  227. public List<SheetImportResultVO> importMultipleSheets(String computeDate, MultipartFile file) {
  228. List<CommonTitleVo> tableList = (List<CommonTitleVo>) getTableList();
  229. String fileName = file.getOriginalFilename();
  230. String uploadFileUrl = uploadFile(file, fileName);
  231. List<SheetImportResultVO> sheetResults = new ArrayList<>();
  232. try {
  233. // 使用系统临时目录显式创建临时文件
  234. File tempDir = new File(System.getProperty("java.io.tmpdir"));
  235. File tempFile = new File(tempDir, "excel-" + UUID.randomUUID() + ".tmp");
  236. // 确保文件存在并正确关闭流
  237. try (InputStream inputStream = file.getInputStream()) {
  238. Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
  239. }
  240. try (Workbook workbook = WorkbookFactory.create(tempFile)) {
  241. for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
  242. Sheet sheet = workbook.getSheetAt(i);
  243. String sheetName = sheet.getSheetName();
  244. SheetImportResultVO resultItem = new SheetImportResultVO();
  245. resultItem.setSheetName(sheetName);
  246. resultItem.setSheetIndex(i);
  247. Optional<CommonTitleVo> mapping = tableList.stream()
  248. .filter(t -> t.getName().equals(sheetName))
  249. .findFirst();
  250. if (!mapping.isPresent()) {
  251. log.warn("未找到sheet页 '{%s}' 对应的数据表配置,跳过导入", sheetName);
  252. resultItem.setSuccess(false);
  253. resultItem.setErrorMessage("未找到对应的数据库表配置");
  254. sheetResults.add(resultItem);
  255. continue;
  256. }
  257. String tableName = mapping.get().getCode();
  258. resultItem.setTableName(tableName);
  259. try {
  260. KpiComputeImport kpiComputeImport = new KpiComputeImport();
  261. kpiComputeImport.setComputeDate(computeDate);
  262. kpiComputeImport.setImportStatus(NumberConstant.ZERO);
  263. kpiComputeImport.setCreateTime(new Date());
  264. kpiComputeImport.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  265. kpiComputeImport.setUrl(uploadFileUrl);
  266. kpiComputeImport.setTableName(tableName);
  267. kpiComputeImport.setFileName(String.format("%s_%s", fileName, sheetName));
  268. kpiComputeImport.setHospId(UserContext.getCurrentLoginHospId());
  269. kpiComputeImport.setDelFlag(NumberConstant.ZERO);
  270. repository.save(kpiComputeImport);
  271. insertExcelDataForSheet(kpiComputeImport.getId(), tableName, file, fileName, computeDate, sheet);
  272. resultItem.setSuccess(true);
  273. resultItem.setImportId(kpiComputeImport.getId());
  274. resultItem.setImportTime(kpiComputeImport.getCreateTime());
  275. } catch (Exception e) {
  276. log.error(String.format("sheet页 '%s' 导入失败: %s", sheetName, e.getMessage()));
  277. resultItem.setSuccess(false);
  278. resultItem.setErrorMessage("导入失败: " + e.getMessage());
  279. }
  280. sheetResults.add(resultItem);
  281. }
  282. } finally {
  283. // 删除临时文件
  284. if (tempFile.exists()) {
  285. tempFile.delete();
  286. }
  287. }
  288. } catch (Exception e) {
  289. throw new RuntimeException("导入发生异常: " + e.getMessage(), e);
  290. }
  291. return sheetResults;
  292. }
  293. @SneakyThrows
  294. private void insertExcelDataForSheet(Integer id, String tableName, MultipartFile file, String fileName, String computeDate, Sheet sheet) {
  295. // 将MultipartFile转换为InputStream
  296. InputStream inputStream = file.getInputStream();
  297. // 这里假设有一个方法可以从给定的InputStream和sheet对象中读取SQL语句
  298. List<String> excelSql = readExcelSqlFromSheet(inputStream, sheet, tableName, id, computeDate);
  299. // 执行SQL插入操作
  300. SqlRunner sqlRunner = new SqlRunner(getConnection());
  301. for (String sql : excelSql) {
  302. sqlRunner.insert(sql);
  303. }
  304. // 更新新增人和时间
  305. String updateSql = "UPDATE `" + tableName + "` SET " +
  306. "`create_user` = '" + UserContext.getCurrentUser().getId() + "', " +
  307. "`create_time` = '" + DateUtils.formatDate2String(new Date()) + "' " +
  308. "WHERE `import_id` = '" + id + "';";
  309. sqlRunner.run(updateSql);
  310. }
  311. private static final int BATCH_SIZE = 500; // 每批次插入的记录数
  312. private List<String> readExcelSqlFromSheet(InputStream inputStream, Sheet sheet, String tableName, Integer id, String computeDate) throws IOException {
  313. List<String> sqlList = new ArrayList<>();
  314. boolean firstRow = true;
  315. Row headerRow = null;
  316. DataFormatter dataFormatter = new DataFormatter();
  317. int rowCount = 0;
  318. boolean hasComputeDateField = false;
  319. // 第一次遍历获取字段信息并判断是否有 compute_date 字段
  320. for (Row row : sheet) {
  321. if (rowCount == 0) {
  322. headerRow = row;
  323. // 检查字段中是否包含 compute_date
  324. for (int i = 0; i < headerRow.getLastCellNum(); i++) {
  325. Cell headerCell = headerRow.getCell(i);
  326. if (headerCell != null && "compute_date".equals(headerCell.getStringCellValue())) {
  327. hasComputeDateField = true;
  328. break;
  329. }
  330. }
  331. rowCount++;
  332. continue;
  333. }
  334. break; // 只需要读取第一行判断字段
  335. }
  336. // 第二次遍历处理数据行
  337. StringBuilder currentBatchValues = new StringBuilder();
  338. int batchCount = 0;
  339. // 新增变量用于记录实际数据行数
  340. int actualRowCount = 0;
  341. for (Row row : sheet) {
  342. if (actualRowCount < 2) {
  343. actualRowCount++;
  344. continue; // 跳过前两行(标题行 + 说明行)
  345. }
  346. StringBuilder valueSb = new StringBuilder();
  347. valueSb.append("(");
  348. for (int i = 0; i < row.getLastCellNum(); i++) {
  349. if (i > 0) {
  350. valueSb.append(", ");
  351. }
  352. Cell cell = row.getCell(i);
  353. if (cell == null) {
  354. valueSb.append("NULL");
  355. continue;
  356. }
  357. cell.setCellType(CellType.STRING);
  358. valueSb.append("'").append(cell.getStringCellValue().replace("'", "''")).append("'");
  359. }
  360. // 添加 import_id 和 hosp_id
  361. valueSb.append(", ").append(id)
  362. .append(", ").append(UserContext.getCurrentLoginHospId());
  363. // 如果字段中没有 compute_date,才手动添加
  364. if (!hasComputeDateField) {
  365. valueSb.append(", '").append(computeDate).append("'");
  366. }
  367. valueSb.append(")");
  368. if (batchCount == 0) {
  369. // 构建字段名部分
  370. currentBatchValues.setLength(0); // 清空之前的缓存
  371. currentBatchValues.append("INSERT INTO `").append(tableName).append("` (");
  372. for (int i = 0; i < headerRow.getLastCellNum(); i++) {
  373. if (i > 0) {
  374. currentBatchValues.append(", ");
  375. }
  376. Cell headerCell = headerRow.getCell(i);
  377. currentBatchValues.append("`").append(headerCell.getStringCellValue()).append("`");
  378. }
  379. currentBatchValues.append(", `import_id`, `hosp_id`");
  380. if (!hasComputeDateField) {
  381. currentBatchValues.append(", `compute_date`");
  382. }
  383. currentBatchValues.append(") VALUES ");
  384. } else {
  385. currentBatchValues.append(", ");
  386. }
  387. currentBatchValues.append(valueSb.toString());
  388. batchCount++;
  389. // 如果达到批次大小,保存当前批次并重置
  390. if (batchCount >= BATCH_SIZE) {
  391. sqlList.add(currentBatchValues.toString());
  392. batchCount = 0;
  393. }
  394. actualRowCount++; // 使用独立变量追踪实际行数
  395. }
  396. // 添加最后一批未满的数据
  397. if (batchCount > 0) {
  398. sqlList.add(currentBatchValues.toString());
  399. }
  400. return sqlList;
  401. }
  402. /**
  403. * 复原导入数据
  404. *
  405. * @param id 记录id
  406. */
  407. @Override
  408. @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRED)
  409. public void recoverImport(Integer id) {
  410. KpiComputeImport kpiComputeImport = repository.getById(id);
  411. if (Objects.nonNull(kpiComputeImport)) {
  412. //更新表信息
  413. String computeDate = kpiComputeImport.getComputeDate();
  414. String tableName = kpiComputeImport.getTableName();
  415. Long hospId = kpiComputeImport.getHospId();
  416. StringBuilder delSql = new StringBuilder().append("update " + "`").append(tableName).append("`").append("set")
  417. .append("`del_flag` = 0 , `update_user` = '").append(UserContext.getCurrentUser().getId())
  418. .append("' , `update_time` = '").append(DateUtils.formatDate2String(new Date())).append("' where `hosp_id` = ").append(hospId)
  419. .append(" and `import_id` = ").append(id).append(";");
  420. try {
  421. log.info("执行的sql语句:" + delSql);
  422. SqlRunner sqlRunner = new SqlRunner(getConnection());
  423. sqlRunner.run(delSql.toString());
  424. } catch (ClassNotFoundException | SQLException e) {
  425. throw new RuntimeException("复原数据错误" + e);
  426. }
  427. //更新 记录表信息
  428. kpiComputeImport.setImportStatus(NumberConstant.ZERO);
  429. kpiComputeImport.setUpdateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  430. kpiComputeImport.setUpdateTime(new Date());
  431. repository.updateById(kpiComputeImport);
  432. }
  433. }
  434. public static String readExcelSql(File file, String tableName, Integer id, String computeDate) throws IOException {
  435. // 获取excel工作簿对象
  436. String sql = null;
  437. String fileName = file.getName();
  438. String substring = fileName.substring(fileName.lastIndexOf("."));
  439. if (".xls".equals(substring)) {
  440. HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));
  441. for (Sheet sheet : workbook) {
  442. List<String> headerList = new ArrayList<>();
  443. List<Map<String, Object>> dataList = new ArrayList<>();
  444. System.out.println(sheet.getSheetName());
  445. int i = 0;
  446. for (Row row : sheet) {
  447. if (i == 1) {
  448. i++;
  449. continue;
  450. }
  451. if (i == 0) {
  452. if (i == 0) {
  453. for (Cell cell : row) {
  454. headerList.add(cell.getStringCellValue());
  455. }
  456. // if(headerList.size() > 0) {
  457. // String createTableSql = createTable(headerList, sheetName);
  458. // System.out.println("生成的创建表语句:"+ createTableSql);
  459. // }
  460. }
  461. } else {
  462. Map<String, Object> map = new HashMap<>();
  463. int j = 0;
  464. for (Cell cell : row) {
  465. //设置单元格类型
  466. cell.setCellType(CellType.STRING);
  467. map.put(headerList.get(j), cell.getStringCellValue());
  468. j++;
  469. }
  470. dataList.add(map);
  471. }
  472. i++;
  473. }
  474. //组装记录表和hospId
  475. setCommonData(id, dataList, computeDate);
  476. sql = insertFromMap(dataList, tableName);
  477. }
  478. } else if (".xlsx".equals(substring)) {
  479. XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(file));
  480. for (Sheet sheet : workbook) {
  481. List<String> headerList = new ArrayList<>();
  482. List<Map<String, Object>> dataList = new ArrayList<>();
  483. System.out.println(sheet.getSheetName());
  484. String sheetName = sheet.getSheetName();
  485. int i = 0;
  486. for (Row row : sheet) {
  487. if (i == 1) {
  488. i++;
  489. continue;
  490. }
  491. if (i == 0) {
  492. if (i == 0) {
  493. for (Cell cell : row) {
  494. headerList.add(cell.getStringCellValue());
  495. }
  496. // if(headerList.size() > 0) {
  497. // String createTableSql = createTable(headerList, sheetName);
  498. // System.out.println("生成的创建表语句:"+ createTableSql);
  499. // }
  500. }
  501. } else {
  502. Map<String, Object> map = new HashMap<>();
  503. int j = 0;
  504. for (Cell cell : row) {
  505. //设置单元格类型
  506. cell.setCellType(CellType.STRING);
  507. map.put(headerList.get(j), cell.getStringCellValue());
  508. j++;
  509. }
  510. dataList.add(map);
  511. }
  512. i++;
  513. }
  514. setCommonData(id, dataList, computeDate);
  515. sql = insertFromMap(dataList, tableName);
  516. }
  517. }
  518. return sql;
  519. }
  520. private static void setCommonData(Integer id, List<Map<String, Object>> dataList, String computeDate) {
  521. if (!CollectionUtils.isEmpty(dataList)) {
  522. dataList.forEach(stringObjectMap -> {
  523. stringObjectMap.put("hosp_id", UserContext.getCurrentLoginHospId());
  524. //Excel字段里没有传核算年月的,用传入的核算年月
  525. if (!stringObjectMap.containsKey("compute_date")) {
  526. stringObjectMap.put("compute_date", computeDate);
  527. }
  528. stringObjectMap.put("import_id", id);
  529. });
  530. }
  531. }
  532. /**
  533. * 生成创建表结构
  534. *
  535. * @param headerList 表头
  536. * @param sheetName sheet名
  537. * @return
  538. */
  539. public static String createTable(List<String> headerList, String sheetName) {
  540. StringBuffer createTableSql = new StringBuffer();
  541. if (headerList.size() > 0) {
  542. createTableSql.append("SET NAMES utf8mb4;\n");
  543. createTableSql.append("SET FOREIGN_KEY_CHECKS = 0;\n");
  544. createTableSql.append("DROP TABLE IF EXISTS `" + sheetName + "`;\n");
  545. createTableSql.append("CREATE TABLE `" + sheetName + "`");
  546. createTableSql.append("(\n");
  547. createTableSql.append("`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',\n");
  548. int k = 0;
  549. for (String key : headerList) {
  550. createTableSql.append("`" + key + "` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n");
  551. k++;
  552. if (k == headerList.size()) {
  553. createTableSql.append("PRIMARY KEY (`id`) USING BTREE)\n");
  554. createTableSql.append("ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '' ROW_FORMAT = Dynamic;\n");
  555. createTableSql.append("SET FOREIGN_KEY_CHECKS = 1;");
  556. }
  557. }
  558. }
  559. return createTableSql.toString();
  560. }
  561. /**
  562. * map对象生成insert插入语句
  563. *
  564. * @param dataList
  565. * @param tableName
  566. */
  567. public static String insertFromMap(List<Map<String, Object>> dataList, String tableName) {
  568. String sql = null;
  569. if (dataList.size() > 0) {
  570. int i = 0;
  571. StringBuilder strKey = new StringBuilder();
  572. //插入sql语句
  573. StringBuilder insertSql = new StringBuilder().append("INSERT INTO " + "`").append(tableName).append("`");
  574. StringBuilder value = new StringBuilder();
  575. for (Map<String, Object> map : dataList) {
  576. //存入key的字符串数组
  577. //存入value的字符串数组
  578. ArrayList<Object> arrValue = new ArrayList<>();
  579. //拼接sql
  580. ArrayList<Object> arrKey = new ArrayList<>(map.keySet());
  581. for (String keys : map.keySet()) {
  582. arrValue.add(map.get(keys));
  583. }
  584. if (i == 0) {
  585. //遍历存的key字符串数组拼接sql
  586. for (int j = 0; j < arrKey.size(); j++) {
  587. strKey.append("`").append(arrKey.get(j)).append("`");
  588. if (j != arrKey.size() - 1) {//拼上","最后一个不拼
  589. strKey.append(",");
  590. }
  591. }
  592. }
  593. i++;
  594. StringBuilder strVal = new StringBuilder();
  595. //遍历存的value字符串数组拼接sql
  596. for (int j = 0; j < arrValue.size(); j++) {
  597. if (null != arrValue.get(j) && !"".equals(arrValue.get(j))) {
  598. strVal.append("'").append(arrValue.get(j)).append("'");//拼接单引号
  599. } else if ("".equals(arrValue.get(j))) {
  600. strVal.append((String) null);
  601. } else {
  602. strVal.append(arrValue.get(j));
  603. }
  604. if (j != arrValue.size() - 1) {//拼上","最后一个不拼
  605. strVal.append(",");
  606. }
  607. }
  608. String stringEntryVal = strVal.toString();
  609. value.append("(").append(stringEntryVal).append(")");
  610. if (i < dataList.size()) {
  611. value.append(",");
  612. }
  613. }
  614. insertSql.append("(").append(strKey).append(")");
  615. insertSql.append(" VALUES ");
  616. insertSql.append(value).append(";");
  617. System.out.println("生成插入数据sql:" + insertSql.toString());
  618. sql = insertSql.toString();
  619. }
  620. return sql;
  621. }
  622. private Connection getConnection() throws ClassNotFoundException, SQLException {
  623. Class.forName(driver);
  624. return DriverManager.getConnection(url, username, password);
  625. }
  626. }