package com.ruoyi.system.listener; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.util.ListUtils; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; import com.ruoyi.common.NumberDisplaceChineseUtil; import com.ruoyi.common.enums.ReportingStatusEnum; import com.ruoyi.common.enums.ShowStatusEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.system.domain.TbBasicData; import com.ruoyi.system.domain.TbBasicDataField; import com.ruoyi.system.domain.TbDept; import com.ruoyi.system.domain.TbField; import com.ruoyi.system.service.TbBasicDataFieldService; import com.ruoyi.system.service.TbBasicDataService; import com.ruoyi.system.service.TbFieldService; import lombok.extern.slf4j.Slf4j; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @Slf4j public class BasicDataListener extends AnalysisEventListener> { /** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 10; private List> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); public TbBasicDataService tbBasicDataService; public List fieldList; public TbFieldService tbFieldService; public TbDept dept; public TbBasicDataFieldService tbBasicDataFieldService; public BasicDataListener() { } public BasicDataListener(TbBasicDataService tbBasicDataService, List fieldList, TbFieldService tbFieldService, TbDept dept, TbBasicDataFieldService tbBasicDataFieldService) { this.tbBasicDataService = tbBasicDataService; this.fieldList = fieldList; this.tbFieldService = tbFieldService; this.dept = dept; this.tbBasicDataFieldService = tbBasicDataFieldService; } @Override public void invoke(Map data, AnalysisContext context) { log.info("解析到一条数据:{}", JSON.toJSONString(data)); cachedDataList.add(data); if (cachedDataList.size() >= BATCH_COUNT) { try { saveData(); } catch (Exception e) { throw new RuntimeException(e); } cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { try { saveData(); } catch (Exception e) { throw new RuntimeException(e); } log.info("所有数据解析完成!"); } /** * 加上存储数据库 */ private void saveData() throws Exception { Map headMap = cachedDataList.get(2); Map quarterMap = cachedDataList.get(4); Map dataMap = cachedDataList.get(5); log.info("{}条数据,开始存储数据库!", cachedDataList.size()); log.info("表头:{}", JSON.toJSONString(headMap)); log.info("填写的数据:{}",JSON.toJSONString(dataMap)); int remarkIndex = headMap.size()-1; Map dynamicFieldsMap = headMap.entrySet().stream().filter(entry -> { return !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey()) || entry.getKey() == remarkIndex); }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); List dynamicFields = new ArrayList<>(dynamicFieldsMap.values()); List collect = fieldList.stream().map(TbField::getFieldName).collect(Collectors.toList()); boolean flag = new ArrayList<>(dynamicFields).containsAll(collect); if (dynamicFields.size() != collect.size() || flag){ throw new ServiceException("导入失败,请下载最新的导入模板"); } Date date = new Date(); //当前所在季度 int quarterOfYear = DateUtils.getQuarterOfYear(date); String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear); LocalDate now = LocalDate.now(); TbBasicData tbBasicData = new TbBasicData(); tbBasicData.setQuarter(String.format("%s年%s",now.getYear(),quarterMap.get(1))); tbBasicData.setTransferPaymentScale(dataMap.get(2)); tbBasicData.setCurrentGdp(dataMap.get(3)); tbBasicData.setDeptAreaCode(dept.getAreaCode()); tbBasicData.setRemark(dataMap.get(remarkIndex)); tbBasicData.setStatus(ReportingStatusEnum.MISSING_DATA); tbBasicDataService.saveOrUpdate(tbBasicData); tbBasicDataFieldService.remove(Wrappers.lambdaQuery().eq(TbBasicDataField::getBasicDataId, tbBasicData)); for (Map.Entry integerStringEntry : dynamicFieldsMap.entrySet()) { Optional tbField = tbFieldService.lambdaQuery().eq(TbField::getFieldName, integerStringEntry.getValue()) .eq(TbField::getStatus, ShowStatusEnum.SHOW).oneOpt(); if (tbField.isPresent()) { TbBasicDataField tbBasicDataField = new TbBasicDataField(); tbBasicDataField.setBasicDataId(tbBasicData.getId()); tbBasicDataField.setFieldId(tbField.get().getId()); tbBasicDataField.setFieldValue(dataMap.get(integerStringEntry.getKey())); tbBasicDataFieldService.save(tbBasicDataField); } } log.info("存储数据库成功!"); } }