Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

huangpeng 4 месяцев назад
Родитель
Сommit
bd5a0aa1d1

+ 130 - 68
zhsw-common/src/main/java/com/rongwei/zhsw/system/importListener/MeterReadingRecordListener.java

@@ -15,13 +15,15 @@ import com.rongwei.zhsw.system.service.impl.SwUserManagementServiceImpl;
 import com.rongwei.zhsw.system.service.impl.SwWaterUsageEntryServiceImpl;
 import com.rongwei.zhsw.system.utils.ZHSWCommonUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.rongwei.zhsw.system.utils.ZHSWCommonUtils.getCurrentUser;
@@ -34,105 +36,165 @@ import static com.rongwei.zhsw.system.utils.ZHSWCommonUtils.getCurrentUser;
  */
 public class MeterReadingRecordListener extends AnalysisEventListener<ImportMeterReadingRecordVo> {
     private static final Logger log = LoggerFactory.getLogger(MeterReadingRecordListener.class);
-    private  ThreadLocal<List<ImportMeterReadingRecordVo>> recordList = ThreadLocal.withInitial(ArrayList::new);
-    private  ThreadLocal<List<SwWaterUsageEntryDo>> saveList = ThreadLocal.withInitial(ArrayList::new);
+    private List<ImportMeterReadingRecordVo> recordList = new ArrayList<>();
+    private List<SwWaterUsageEntryDo> saveList = new ArrayList<>();
     private SwUserManagementServiceImpl swUserManagementService;
     private SwWaterUsageEntryServiceImpl swWaterUsageEntryService;
+    private Date nowDate;
 
-    public MeterReadingRecordListener(SwUserManagementServiceImpl userManagementService,SwWaterUsageEntryServiceImpl waterUsageEntryService) {
+    // 出现重复记录的数据
+    private List<ImportMeterReadingRecordVo> duplicateRecordList = new ArrayList<>();
+    // 时间异常的记录
+    private List<ImportMeterReadingRecordVo> timeAnomalyList = new ArrayList<>();
+
+
+    public MeterReadingRecordListener(SwUserManagementServiceImpl userManagementService, SwWaterUsageEntryServiceImpl waterUsageEntryService) {
         this.swUserManagementService = userManagementService;
         this.swWaterUsageEntryService = waterUsageEntryService;
+        this.nowDate = new Date();
     }
 
+    /**
+     * 导入前数据校验
+     *
+     * @param importMeterReadingRecordVo
+     * @param analysisContext
+     */
     @Override
     public void invoke(ImportMeterReadingRecordVo importMeterReadingRecordVo, AnalysisContext analysisContext) {
-
         if (StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber())) {
             throw new CustomException("户号为空");
         }
         if (importMeterReadingRecordVo.getReadingDate() == null) {
             throw new CustomException("抄表日期");
         }
-        if (importMeterReadingRecordVo.getConsumption() == null) {
-            throw new CustomException("读数为空");
+        if (importMeterReadingRecordVo.getConsumption() == null && importMeterReadingRecordVo.getConsumption().compareTo(BigDecimal.ZERO) <= 0) {
+            throw new CustomException("读数为空,抄表数小于0");
         }
-        // 校验户号是否能重复
-
-
-        // 校验当前睡觉是否存在抄表记录
-        int count = swWaterUsageEntryService.count(new LambdaQueryWrapper<SwWaterUsageEntryDo>()
-                .eq(BaseDo::getDeleted, "0")
-                .eq(SwWaterUsageEntryDo::getUsernumber, importMeterReadingRecordVo.getAccountNumber())
-                .ge(SwWaterUsageEntryDo::getCurrentreadingdate, importMeterReadingRecordVo.getReadingDate()));
-        if(count==0) {
-            recordList.get().add(importMeterReadingRecordVo);
+        // 判断数据是否重复
+        boolean b = recordList.stream().anyMatch(record -> record.getAccountNumber().equals(importMeterReadingRecordVo.getAccountNumber())
+                && record.getReadingDate().equals(importMeterReadingRecordVo.getReadingDate())
+        );
+        if (b) {
+            duplicateRecordList.add(importMeterReadingRecordVo);
+            return;
         }
+        // 判断抄表日期和当前日期的关系
+        if (importMeterReadingRecordVo.getReadingDate().compareTo(nowDate) > 0) {
+            timeAnomalyList.add(importMeterReadingRecordVo);
+            return;
+        }
+        /**
+         * 校验导入的日期和当前日期的关系
+         */
+        recordList.add(importMeterReadingRecordVo);
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        if(recordList.get().isEmpty()){
+        if (recordList.isEmpty()) {
             return;
         }
-        List<String> accountNumList = recordList.get().stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
+        if (!duplicateRecordList.isEmpty()) {
+            throw new CustomException(
+                    "Excel表中" +
+                            duplicateRecordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).collect(Collectors.joining("、"))
+                            + "户号存在相同抄表日期记录,请检查!");
+        }
+        if (!timeAnomalyList.isEmpty()) {
+            throw new CustomException(
+                    "Excel表中" +
+                            timeAnomalyList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).collect(Collectors.joining("、"))
+                            + "户号存在抄表日期大于当前日期的记录,请检查!");
+        }
+
+
+        // 获取数据中的所有户号
+        List<String> accountNumList = recordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
+
         List<SwUserManagementDo> allAccountData = new ArrayList<>();
-        Lists.partition(accountNumList,5000).forEach(accountNum -> {
+        // 获取户号信息
+        Lists.partition(accountNumList, 5000).parallelStream().forEach(accountNum -> {
             allAccountData.addAll(swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
                     .eq(BaseDo::getDeleted, "0")
                     .in(SwUserManagementDo::getUsernumber, accountNumList)));
         });
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        // 校验导入的时间是否小于对应户号的最大抄表日期
+        String errorStrDesc = recordList.parallelStream()
+                .filter(record ->
+                        allAccountData.parallelStream().anyMatch(userAccount -> userAccount.getUsernumber()
+                                .equals(record.getAccountNumber()) &&
+                                (userAccount.getLastmeterreaddate() != null && userAccount.getLastmeterreaddate().compareTo(record.getReadingDate()) >= 0))
+                ).map(info -> info.getAccountNumber() + '-' + sdf.format(info.getReadingDate()))
+                .collect(Collectors.joining(" "));
+        if (StringUtils.isNotBlank(errorStrDesc)) {
+            throw new CustomException(
+                    "Excel表中" +
+                            errorStrDesc
+                            + "记录日期小于对应用户最近抄表日期,请检查!");
+        }
+        // 按照户号分组 减少遍历时间
+        Map<String, SwUserManagementDo> userMap = allAccountData.stream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
+        Collectors.reducing(
+                null, // 初始值(可能为 null)
+                (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
+        )));
+
+        // 当前导入用户的操作人
         SysUserVo currentUser = getCurrentUser();
         Calendar calendar = Calendar.getInstance();
-        recordList.get().forEach(record->{
-            SwUserManagementDo swUserManagementDo = allAccountData.stream().filter(accountInfo -> accountInfo.getUsernumber().equals(record.getAccountNumber()))
-                    .findFirst()
-                    .orElse(null);
-            SwWaterUsageEntryDo swWaterUsageEntryDo = new SwWaterUsageEntryDo();
-            if(swUserManagementDo!=null){
-                // 如果时间一致不让当如
-                if(record.getReadingDate().equals(swUserManagementDo.getLastmeterreaddate())){
-                    log.error("本次抄表日期和最后一次抄表日期一致");
-                    return;
+        /**********数据解析开始************/
+        recordList = recordList.stream().sorted(Comparator.comparing(ImportMeterReadingRecordVo::getReadingDate)).collect(Collectors.toList());
+        // 解决同一个excel中出现多次相同的户号数据 要记录上次读数的问题 对数据按照户号分组
+        Map<String, List<ImportMeterReadingRecordVo>> collect = recordList.stream()
+                .collect(Collectors.groupingBy(ImportMeterReadingRecordVo::getAccountNumber, Collectors.toList()));
+
+        collect.forEach((accountNum, v) -> {
+            SwUserManagementDo swUserManagementDo = userMap.getOrDefault(accountNum,null);
+            SwWaterUsageEntryDo waterUsageEntryDo;
+            // 循环数据
+            SwUserManagementDo saveUserDo;
+            for (int i = 0; i < v.size(); i++) {
+                ImportMeterReadingRecordVo importMeterReadingRecordVo = v.get(i);
+                calendar.setTime(importMeterReadingRecordVo.getReadingDate());
+                waterUsageEntryDo = new SwWaterUsageEntryDo();
+                waterUsageEntryDo.setId(SecurityUtil.getUUID());
+                waterUsageEntryDo.setUsernumber(accountNum);
+                waterUsageEntryDo.setThisreading(importMeterReadingRecordVo.getConsumption());
+                waterUsageEntryDo.setCurrentreadingdate(importMeterReadingRecordVo.getReadingDate());
+                waterUsageEntryDo.setReadingsource("1");
+                // 当前户号在系统中不存在
+                if (swUserManagementDo == null) {
+                    // 户号不存在
+                    waterUsageEntryDo.setState(2);
+                } else {
+                    // 增加用户信息
+                    waterUsageEntryDo.setAddress(swUserManagementDo.getAddress());
+                    waterUsageEntryDo.setUsername(swUserManagementDo.getUsername());
+                    waterUsageEntryDo.setUserid(swUserManagementDo.getId());
+                    waterUsageEntryDo.setState(0);
+                    waterUsageEntryDo.setLastreading(swUserManagementDo.getLastmeterreading());
+                    waterUsageEntryDo.setLastreadingdate(swUserManagementDo.getLastmeterreaddate());
+                    waterUsageEntryDo.setCommunityname(swUserManagementDo.getVillagename());
+                    waterUsageEntryDo.setCommunitycode(swUserManagementDo.getVolumeno());
+                    // 修改用户表的最后一次 抄表日期和抄表度数
+                    swUserManagementDo.setLastmeterreading(importMeterReadingRecordVo.getConsumption());
+                    swUserManagementDo.setLastmeterreaddate(importMeterReadingRecordVo.getReadingDate());
                 }
-                swWaterUsageEntryDo.setAddress(swUserManagementDo.getAddress());
-                swWaterUsageEntryDo.setUsername(swUserManagementDo.getUsername());
-                swWaterUsageEntryDo.setUserid(swUserManagementDo.getId());
-                swWaterUsageEntryDo.setState(0);
-                swWaterUsageEntryDo.setLastreading(swUserManagementDo.getLastmeterreading());
-                swWaterUsageEntryDo.setLastreadingdate(swUserManagementDo.getLastmeterreaddate());
-                swWaterUsageEntryDo.setCommunityname(swUserManagementDo.getVillagename());
-                swWaterUsageEntryDo.setCommunitycode(swUserManagementDo.getVolumeno());
-            }else{
-                swWaterUsageEntryDo.setState(2);
+                waterUsageEntryDo.setYear(calendar.get(Calendar.YEAR));
+                waterUsageEntryDo.setMonth(calendar.get(Calendar.MONTH) + 1);
+                waterUsageEntryDo.setIsds(String.valueOf(0));
+                ZHSWCommonUtils.initModelGeneralParameters(waterUsageEntryDo, currentUser);
+                saveList.add(waterUsageEntryDo);
             }
-            calendar.setTime(record.getReadingDate());
-            swWaterUsageEntryDo.setId(SecurityUtil.getUUID());
-            swWaterUsageEntryDo.setUsernumber(record.getAccountNumber());
-            swWaterUsageEntryDo.setThisreading(record.getConsumption());
-
-            swWaterUsageEntryDo.setCurrentreadingdate(record.getReadingDate());
-            swWaterUsageEntryDo.setReadingsource("1");
-
-            swWaterUsageEntryDo.setYear(calendar.get(Calendar.YEAR));
-            swWaterUsageEntryDo.setMonth(calendar.get(Calendar.MONTH)+1);
-            swWaterUsageEntryDo.setIsds(String.valueOf(0));
-            ZHSWCommonUtils.initModelGeneralParameters(swWaterUsageEntryDo,currentUser);
-            saveList.get().add(swWaterUsageEntryDo);
         });
-        save(saveList.get());
-
-        recordList.remove();
-    }
-    @Transactional
-    public void save(List<SwWaterUsageEntryDo> saveList){
-        if(!saveList.isEmpty()){
-            swWaterUsageEntryService.saveBatch(saveList,500);
-        }
     }
 
-    public List<SwWaterUsageEntryDo> getDatas() {
-        List<SwWaterUsageEntryDo> swWaterUsageEntryDos = saveList.get();
-        saveList.remove();
-        return swWaterUsageEntryDos;
+
+
+    public List<SwWaterUsageEntryDo> getData() {
+        return saveList;
     }
 }

+ 47 - 47
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/impl/BillGenerationServiceImpl.java

@@ -5,7 +5,6 @@ import com.rongwe.zhsw.system.domain.SwBillManagementUnpaidDo;
 import com.rongwe.zhsw.system.domain.SwUserManagementDo;
 import com.rongwe.zhsw.system.domain.SwWaterUsageEntryDo;
 import com.rongwei.rwcommon.base.BaseDo;
-import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.zhsw.system.utils.ZHSWCommonUtils;
 import org.slf4j.Logger;
@@ -16,7 +15,6 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.DefaultTransactionDefinition;
 
 import java.math.BigDecimal;
@@ -25,8 +23,6 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static org.springframework.transaction.annotation.Propagation.REQUIRED;
-
 /**
  * BillGenerationServiceImpl class
  *
@@ -46,14 +42,14 @@ public class BillGenerationServiceImpl {
     @Autowired
     private DataSourceTransactionManager transactionManager;
 
-    private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+    private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
 
     public static String formatDate(Date date) {
         synchronized (formatter) {
             return formatter.format(date);
         }
     }
-    @Async(value = "customThreadPool")
+
     public void generateBill(List<SwWaterUsageEntryDo> swWaterUsageEntryDoList) {
         log.info("开始生成账单信息");
         if (swWaterUsageEntryDoList == null || swWaterUsageEntryDoList.isEmpty()) {
@@ -71,24 +67,29 @@ public class BillGenerationServiceImpl {
         /*******当前账单的所有户号******/
         List<String> accountNumberList = collect.stream().map(SwWaterUsageEntryDo::getUsernumber).collect(Collectors.toList());
         /*******当前账单的所有户号******/
-        List<SwUserManagementDo> swUserManagementList = swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
-                .select(SwUserManagementDo::getId,
-                        SwUserManagementDo::getUsernumber,
-                        SwUserManagementDo::getMetermaxvalue,
-                        SwUserManagementDo::getWaterprice,
-                        SwUserManagementDo::getVillagename,
-                        SwUserManagementDo::getUsernumber,
-                        SwUserManagementDo::getUsername,
-                        SwUserManagementDo::getUsertype,
-                        SwUserManagementDo::getAddress,
-                        SwUserManagementDo::getExemptionamount,
-                        SwUserManagementDo::getExemptionwater,
-                        SwUserManagementDo::getWatertype,
-                        SwUserManagementDo::getLastmeterreaddate,
-                        SwUserManagementDo::getLastmeterreading
-                )
-                .eq(BaseDo::getDeleted, "0")
-                .in(SwUserManagementDo::getUsernumber, accountNumberList));
+        Map<String, SwUserManagementDo> userMap = swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
+                        .select(SwUserManagementDo::getId,
+                                SwUserManagementDo::getUsernumber,
+                                SwUserManagementDo::getMetermaxvalue,
+                                SwUserManagementDo::getWaterprice,
+                                SwUserManagementDo::getVillagename,
+                                SwUserManagementDo::getUsernumber,
+                                SwUserManagementDo::getUsername,
+                                SwUserManagementDo::getUsertype,
+                                SwUserManagementDo::getAddress,
+                                SwUserManagementDo::getExemptionamount,
+                                SwUserManagementDo::getExemptionwater,
+                                SwUserManagementDo::getWatertype,
+                                SwUserManagementDo::getLastmeterreaddate,
+                                SwUserManagementDo::getLastmeterreading
+                        )
+                        .eq(BaseDo::getDeleted, "0")
+                        .in(SwUserManagementDo::getUsernumber, accountNumberList))
+                .stream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
+                        Collectors.reducing(
+                                null, // 初始值(可能为 null)
+                                (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
+                        )));
 
         collect.forEach(swWaterUsageEntry -> {
             String usernumber = swWaterUsageEntry.getUsernumber();
@@ -99,9 +100,7 @@ public class BillGenerationServiceImpl {
                 log.error("当前用户:{},时间:{}的抄表记录已生成账单信息", usernumber, currentreadingdate);
                 return;
             }
-            SwUserManagementDo swUserManagementDo = swUserManagementList.stream().filter(data -> data.getUsernumber().equals(swWaterUsageEntry.getUsernumber()))
-                    .findFirst()
-                    .orElse(null);
+            SwUserManagementDo swUserManagementDo = userMap.getOrDefault(swWaterUsageEntry.getUsernumber(), null);
 
             SwWaterUsageEntryDo usageEntryDo = new SwWaterUsageEntryDo();
             usageEntryDo.setId(swWaterUsageEntry.getId());
@@ -110,10 +109,7 @@ public class BillGenerationServiceImpl {
                 usageEntryDo.setState(2);
                 saveUsageEntryList.add(usageEntryDo);
                 return;
-            }else{
-
             }
-
             // 校验是否可以生成账单
             if (swUserManagementDo.getLastmeterreaddate() != null &&
                     swUserManagementDo.getLastmeterreaddate().compareTo(swWaterUsageEntry.getCurrentreadingdate()) > 0) {
@@ -122,18 +118,18 @@ public class BillGenerationServiceImpl {
                 saveUsageEntryList.add(usageEntryDo);
                 return;
             }
-            SwBillManagementUnpaidDo swBillManagementUnpaidDo=null;
+            SwBillManagementUnpaidDo swBillManagementUnpaidDo = null;
             try {
                 // 生成代缴费账单
-                swBillManagementUnpaidDo= produceBill(swUserManagementDo, swWaterUsageEntry);
-            }catch (Exception e) {
+                swBillManagementUnpaidDo = produceBill(swUserManagementDo, swWaterUsageEntry);
+            } catch (Exception e) {
                 e.printStackTrace();
-                log.error("缴费记录生成失败原因:{}",e.getMessage());
+                log.error("缴费记录生成失败原因:{}", e.getMessage());
             }
 
-            if(swBillManagementUnpaidDo==null){
+            if (swBillManagementUnpaidDo == null) {
                 usageEntryDo.setState(4);
-            }else{
+            } else {
                 usageEntryDo.setState(1);
                 saveList.add(swBillManagementUnpaidDo);
                 // 设置本次的抄表日期
@@ -144,15 +140,16 @@ public class BillGenerationServiceImpl {
             userSaveList.add(swUserManagementDo);
             saveUsageEntryList.add(usageEntryDo);
         });
-        dataSave(saveList, userSaveList, saveUsageEntryList);
+        dataSave(saveList, saveUsageEntryList, userSaveList);
     }
 
-
+    @Async(value = "customThreadPool")
     public void generateBill(String id) {
         SwWaterUsageEntryDo swWaterUsageEntryDo = swWaterUsageEntryService.getById(id);
         this.generateBill(Collections.singletonList(swWaterUsageEntryDo));
     }
 
+    @Async(value = "customThreadPool")
     public void generateBill(List<String> ids, boolean a) {
         if (ids.isEmpty()) {
             log.error("抄表记录ID为空");
@@ -161,6 +158,7 @@ public class BillGenerationServiceImpl {
         this.generateBill(swWaterUsageEntryService.getBaseMapper().selectBatchIds(ids));
     }
 
+    @Async(value = "customThreadPool")
     public void generateBill() {
         List<SwWaterUsageEntryDo> list = swWaterUsageEntryService.list(new LambdaQueryWrapper<SwWaterUsageEntryDo>()
                 .eq(SwWaterUsageEntryDo::getDeleted, "0")
@@ -170,26 +168,27 @@ public class BillGenerationServiceImpl {
 
     /**
      * 数据保存
+     *
      * @param swBillManagementUnpaidDos 账单信息
-     * @param userSaveList  用户信息
-     * @param saveUsageEntryList 抄表记录
+     * @param userSaveList              用户信息
+     * @param saveUsageEntryList        抄表记录
      */
 
-    public void dataSave(List<SwBillManagementUnpaidDo> swBillManagementUnpaidDos, List<SwUserManagementDo> userSaveList,
-                         List<SwWaterUsageEntryDo> saveUsageEntryList) {
+    public void dataSave(List<SwBillManagementUnpaidDo> swBillManagementUnpaidDos,
+                         List<SwWaterUsageEntryDo> saveUsageEntryList, List<SwUserManagementDo> userSaveList) {
         DefaultTransactionDefinition def = new DefaultTransactionDefinition();
         def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
         TransactionStatus status = transactionManager.getTransaction(def);
         try {
-            if(!saveUsageEntryList.isEmpty()){
+            if (!saveUsageEntryList.isEmpty()) {
                 // 抄表记录状态更新
-                swWaterUsageEntryService.updateBatchById(saveUsageEntryList,4000);
+                swWaterUsageEntryService.updateBatchById(saveUsageEntryList, 4000);
             }
-            if(!swBillManagementUnpaidDos.isEmpty()){
+            if (!swBillManagementUnpaidDos.isEmpty()) {
                 // 账单保存
                 swBillManagementUnpaidService.saveBatch(swBillManagementUnpaidDos, 1000);
             }
-            if(!userSaveList.isEmpty()){
+            if (!userSaveList.isEmpty()) {
                 // 更新用户表的本次抄表时间和本次抄表度数
                 swUserManagementService.updateBatchById(userSaveList);
             }
@@ -261,7 +260,8 @@ public class BillGenerationServiceImpl {
         swBillManagementUnpaidDo.setOughttohavepaid(waterprice.multiply(waterConsumption));
         swBillManagementUnpaidDo.setWatertype(swUserManagementDo.getWatertype());
         // 实际应缴=原应缴-减免
-        swBillManagementUnpaidDo.setActualdue(swBillManagementUnpaidDo.getOughttohavepaid().subtract(swBillManagementUnpaidDo.getFeewaiver()));
+        BigDecimal subtract = swBillManagementUnpaidDo.getOughttohavepaid().subtract(swBillManagementUnpaidDo.getFeewaiver());
+        swBillManagementUnpaidDo.setActualdue(subtract.compareTo(BigDecimal.ZERO) > 0 ? subtract : BigDecimal.ZERO);
         swBillManagementUnpaidDo.setLastmeterreadingdate(swWaterUsageEntryDo.getLastreadingdate());
         swBillManagementUnpaidDo.setLastmeterreading(swWaterUsageEntryDo.getLastreading());
         swBillManagementUnpaidDo.setThismeterreadingdate(swWaterUsageEntryDo.getCurrentreadingdate());

+ 30 - 16
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/impl/ImportExcelServiceImpl.java

@@ -1,30 +1,25 @@
 package com.rongwei.zhsw.system.service.impl;
 
 import com.alibaba.excel.EasyExcel;
+import com.rongwe.zhsw.system.domain.SwUserManagementDo;
 import com.rongwe.zhsw.system.domain.SwWaterUsageEntryDo;
 import com.rongwe.zhsw.system.vo.ImportMeterReadingRecordVo;
 import com.rongwei.rwcommon.base.R;
-import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommoncomponent.file.dao.SysFileItemDao;
 import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import com.rongwei.zhsw.system.importListener.MeterReadingRecordListener;
 import com.rongwei.zhsw.system.service.ImportExcelService;
 import org.apache.commons.lang.StringUtils;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
-import org.apache.poi.xssf.eventusermodel.XSSFReader;
-import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.helpers.XMLReaderFactory;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.File;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import static com.rongwei.rwcommon.utils.UtilsChecks.parameterCheck;
@@ -45,23 +40,42 @@ public class ImportExcelServiceImpl implements ImportExcelService {
     private SwWaterUsageEntryServiceImpl waterUsageEntryService;
     @Autowired
     private BillGenerationServiceImpl billGenerationService;
+    private static final Logger log = LoggerFactory.getLogger(ImportExcelServiceImpl.class);
     /**
      * 抄表记录生成
+     *
      * @param fileId
      * @return
      */
     @Override
     public R meterReadingRecord(String fileId) {
         File file = readFile(fileId);
+        // 数据读取
+        long startTime = System.currentTimeMillis();
         MeterReadingRecordListener meterReadingRecordListener = new MeterReadingRecordListener(userManagementService, waterUsageEntryService);
-        EasyExcel.read(file, ImportMeterReadingRecordVo.class,meterReadingRecordListener).sheet().doRead();
-        List<SwWaterUsageEntryDo> datas = meterReadingRecordListener.getDatas();
-
-        List<String> ids = datas.stream().map(SwWaterUsageEntryDo::getId).distinct().collect(Collectors.toList());
-        billGenerationService.generateBill(ids,true);
+        EasyExcel.read(file, ImportMeterReadingRecordVo.class, meterReadingRecordListener).sheet().doRead();
+        // 获取处理之后的数据
+        long entTime = System.currentTimeMillis();
+        log.error("excel解析时长:{}",startTime-entTime);
+         startTime = System.currentTimeMillis();
+        List<SwWaterUsageEntryDo> saveList =  meterReadingRecordListener.getData();
+        this.save(saveList);
+        entTime = System.currentTimeMillis();
+        log.error("数据保存时长:{}",startTime-entTime);
+        List<String> ids = saveList.stream().map(SwWaterUsageEntryDo::getId).distinct().collect(Collectors.toList());
+        startTime = System.currentTimeMillis();
+        billGenerationService.generateBill(ids, true);
+        entTime = System.currentTimeMillis();
+        log.error("账单生成时长:{}",startTime-entTime);
         return R.ok();
     }
 
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void save(List<SwWaterUsageEntryDo> datas) {
+        waterUsageEntryService.saveBatch(datas, 1000);
+    }
+
+
     public File readFile(String fileId) {
         parameterCheck(() -> StringUtils.isBlank(fileId), "请上传文件", "文件ID为空");
         SysFileItemDo fileItemDo = sysFileItemDao.selectById(fileId);