Quellcode durchsuchen

feature 逻辑优化

xiahan vor 3 Monaten
Ursprung
Commit
b62d3bb3c8

+ 51 - 46
zhsw-common/src/main/java/com/rongwei/zhsw/system/importListener/MeterReadingRecordListener.java

@@ -15,11 +15,8 @@ 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.math.BigDecimal;
 import java.text.SimpleDateFormat;
@@ -40,7 +37,8 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
     private List<SwWaterUsageEntryDo> saveList = new ArrayList<>();
     private SwUserManagementServiceImpl swUserManagementService;
     private SwWaterUsageEntryServiceImpl swWaterUsageEntryService;
-    private Date nowDate;
+    private Map<String, SwUserManagementDo> ownerMap;
+    private final Date nowDate;
 
     // 出现重复记录的数据
     private List<ImportMeterReadingRecordVo> duplicateRecordList = new ArrayList<>();
@@ -48,6 +46,7 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
     private List<ImportMeterReadingRecordVo> timeAnomalyList = new ArrayList<>();
 
     private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+
     public MeterReadingRecordListener(SwUserManagementServiceImpl userManagementService, SwWaterUsageEntryServiceImpl waterUsageEntryService) {
         this.swUserManagementService = userManagementService;
         this.swWaterUsageEntryService = waterUsageEntryService;
@@ -63,18 +62,18 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
     @Override
     public void invoke(ImportMeterReadingRecordVo importMeterReadingRecordVo, AnalysisContext analysisContext) {
         Integer currentRowNum = analysisContext.readRowHolder().getRowIndex();
-        if(StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber()) && importMeterReadingRecordVo.getReadingDate() == null &&importMeterReadingRecordVo.getConsumption() == null){
+        if (StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber()) && importMeterReadingRecordVo.getReadingDate() == null && importMeterReadingRecordVo.getConsumption() == null) {
             return;
         }
 
         if (StringUtils.isBlank(importMeterReadingRecordVo.getAccountNumber())) {
-            throw new CustomException("第"+currentRowNum+"行户号为空");
+            throw new CustomException("第" + currentRowNum + "行户号为空");
         }
         if (importMeterReadingRecordVo.getReadingDate() == null) {
-            throw new CustomException("第"+currentRowNum+"行抄表日期");
+            throw new CustomException("第" + currentRowNum + "行抄表日期");
         }
         if (importMeterReadingRecordVo.getConsumption() == null && importMeterReadingRecordVo.getConsumption().compareTo(BigDecimal.ZERO) <= 0) {
-            throw new CustomException("第"+currentRowNum+"行读数为空,抄表数小于0");
+            throw new CustomException("第" + currentRowNum + "行读数为空,抄表数小于0");
         }
         // 判断数据是否重复
         boolean b = recordList.stream().anyMatch(record -> record.getAccountNumber().equals(importMeterReadingRecordVo.getAccountNumber())
@@ -114,51 +113,52 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
 
         // 获取数据中的所有户号
         List<String> accountNumList = recordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
-
-        List<SwUserManagementDo> allAccountData = new ArrayList<>();
         // 获取户号信息
-        Lists.partition(accountNumList, 5000).forEach(accountNum -> {
-            allAccountData.addAll(swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
-                    .select(SwUserManagementDo::getId,
-                            SwUserManagementDo::getUsernumber,
-                            SwUserManagementDo::getMetermaxvalue,
-                            SwUserManagementDo::getWaterprice,
-                            SwUserManagementDo::getVillagename,
-                            SwUserManagementDo::getVolumeno,
-                            SwUserManagementDo::getUsernumber,
-                            SwUserManagementDo::getUsername,
-                            SwUserManagementDo::getUsertype,
-                            SwUserManagementDo::getUsertypeid,
-                            SwUserManagementDo::getAddress,
-                            SwUserManagementDo::getExemptionamount,
-                            SwUserManagementDo::getExemptionwater,
-                            SwUserManagementDo::getWatertype,
-                            SwUserManagementDo::getLastmeterreaddate,
-                            SwUserManagementDo::getLastmeterreading
-                    )
-                    .eq(BaseDo::getDeleted, "0")
-                    .in(SwUserManagementDo::getUsernumber, accountNumList)));
-        });
+        ownerMap = Lists.partition(accountNumList, 2500).stream().map(accountNum ->
+                        swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
+                                .select(SwUserManagementDo::getId,
+                                        SwUserManagementDo::getUsernumber,
+                                        SwUserManagementDo::getMetermaxvalue,
+                                        SwUserManagementDo::getWaterprice,
+                                        SwUserManagementDo::getVillagename,
+                                        SwUserManagementDo::getVolumeno,
+                                        SwUserManagementDo::getUsernumber,
+                                        SwUserManagementDo::getUsername,
+                                        SwUserManagementDo::getUsertype,
+                                        SwUserManagementDo::getUsertypeid,
+                                        SwUserManagementDo::getAddress,
+                                        SwUserManagementDo::getExemptionamount,
+                                        SwUserManagementDo::getExemptionwater,
+                                        SwUserManagementDo::getWatertype,
+                                        SwUserManagementDo::getLastmeterreaddate,
+                                        SwUserManagementDo::getLastmeterreading
+                                )
+                                .eq(BaseDo::getDeleted, "0")
+                                .in(SwUserManagementDo::getUsernumber, accountNum)))
+                .flatMap(Collection::stream).collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
+                        Collectors.reducing(
+                                null, // 初始值(可能为 null)
+                                (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
+                        )));
+
 
         // 校验导入的时间是否小于对应户号的最大抄表日期
         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()))
+                        {
+                            SwUserManagementDo ownerData = ownerMap.getOrDefault(record.getAccountNumber(), null);
+                            if (ownerData == null) {
+                                return false;
+                            }
+                            return ownerData.getLastmeterreaddate() != null && ownerData.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 );
+                    "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();
@@ -169,7 +169,7 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
                 .collect(Collectors.groupingBy(ImportMeterReadingRecordVo::getAccountNumber, Collectors.toList()));
 
         collect.forEach((accountNum, v) -> {
-            SwUserManagementDo swUserManagementDo = userMap.getOrDefault(accountNum,null);
+            SwUserManagementDo swUserManagementDo = ownerMap.getOrDefault(accountNum, null);
             SwWaterUsageEntryDo waterUsageEntryDo;
             // 循环数据
             SwUserManagementDo saveUserDo;
@@ -210,8 +210,13 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
     }
 
 
-
+    // 获取Excel 中的数据
     public List<SwWaterUsageEntryDo> getData() {
         return saveList;
     }
+
+    // 获取业主信息
+    public Map<String, SwUserManagementDo> getOwnerMap() {
+        return ownerMap;
+    }
 }

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

@@ -66,56 +66,56 @@ public class BillGenerationServiceImpl {
      * @param attributes
      */
     @Async(value = "zhswThreadPool")
-    public void asyncGenerateBill(List<SwWaterUsageEntryDo> swWaterUsageEntryDoList) {
+    public void asyncGenerateBill(List<SwWaterUsageEntryDo> swWaterUsageEntryDoList, Map<String, SwUserManagementDo> ownerMap) {
         if (swWaterUsageEntryDoList == null || swWaterUsageEntryDoList.isEmpty()) {
             log.error("暂无需要生成账单的信息");
             return;
         }
-        generateBill(swWaterUsageEntryDoList);
+        generateBill(swWaterUsageEntryDoList, ownerMap);
     }
 
-    public void generateBill(List<SwWaterUsageEntryDo> swWaterUsageEntryDoList) {
+    public void generateBill(List<SwWaterUsageEntryDo> swWaterUsageEntryDoList, Map<String, SwUserManagementDo> userMap) {
         String dsKey = ContextHolder.getValue("dsKey");
         log.info("dsKey:{}", dsKey);
         log.debug("需要生成账单的抄表记录为:{}", swWaterUsageEntryDoList);
         long asyncTasksStart = System.currentTimeMillis();
         // 对数据按照抄表日期排序
-        List<SwWaterUsageEntryDo> collect = swWaterUsageEntryDoList.stream()
+        List<SwWaterUsageEntryDo> collect = swWaterUsageEntryDoList.parallelStream()
                 .sorted(Comparator.comparing(SwWaterUsageEntryDo::getCurrentreadingdate))
                 .collect(Collectors.toList());
         /***********需要执行保存操作的数据集合**************/
         List<SwWaterUsageEntryDo> saveUsageEntryList = new ArrayList<>();
         List<SwBillManagementUnpaidDo> saveList = new ArrayList<>();
         List<SwUserManagementDo> userSaveList = new ArrayList<>();
-        /*******当前账单的所有户号******/
-        List<String> accountNumberList = collect.parallelStream().map(SwWaterUsageEntryDo::getUsernumber).collect(Collectors.toList());
-        /*******当前账单的所有户号******/
-        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::getUsertypeid,
-                                SwUserManagementDo::getAddress,
-                                SwUserManagementDo::getExemptionamount,
-                                SwUserManagementDo::getExemptionwater,
-                                SwUserManagementDo::getWatertype,
-                                SwUserManagementDo::getLastmeterreaddate,
-                                SwUserManagementDo::getLastmeterreading
-                        )
-                        .eq(BaseDo::getDeleted, "0")
-                        .in(SwUserManagementDo::getUsernumber, accountNumberList))
-                .parallelStream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
-                        Collectors.reducing(
-                                null, // 初始值(可能为 null)
-                                (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
-                        )));
-
-
+        if (userMap == null) {
+            /*******当前账单的所有户号******/
+            List<String> accountNumberList = collect.parallelStream().map(SwWaterUsageEntryDo::getUsernumber).collect(Collectors.toList());
+            /*******当前账单的所有户号******/
+            userMap = swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
+                            .select(SwUserManagementDo::getId,
+                                    SwUserManagementDo::getUsernumber,
+                                    SwUserManagementDo::getMetermaxvalue,
+                                    SwUserManagementDo::getWaterprice,
+                                    SwUserManagementDo::getVillagename,
+                                    SwUserManagementDo::getUsernumber,
+                                    SwUserManagementDo::getUsername,
+                                    SwUserManagementDo::getUsertype,
+                                    SwUserManagementDo::getUsertypeid,
+                                    SwUserManagementDo::getAddress,
+                                    SwUserManagementDo::getExemptionamount,
+                                    SwUserManagementDo::getExemptionwater,
+                                    SwUserManagementDo::getWatertype,
+                                    SwUserManagementDo::getLastmeterreaddate,
+                                    SwUserManagementDo::getLastmeterreading
+                            )
+                            .eq(BaseDo::getDeleted, "0")
+                            .in(SwUserManagementDo::getUsernumber, accountNumberList))
+                    .parallelStream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
+                            Collectors.reducing(
+                                    null, // 初始值(可能为 null)
+                                    (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
+                            )));
+        }
         SwUserManagementDo swUserManagementDo;
         SwBillManagementUnpaidDo swBillManagementUnpaidDo = null;
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
@@ -179,7 +179,7 @@ public class BillGenerationServiceImpl {
         SwWaterUsageEntryDo swWaterUsageEntryDo = swWaterUsageEntryService.getById(id);
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
         ContextHolder.setValue("dskey", currentUser.getTenantDo().getDskey());
-        this.generateBill(Collections.singletonList(swWaterUsageEntryDo));
+        this.generateBill(Collections.singletonList(swWaterUsageEntryDo), null);
     }
 
 
@@ -190,7 +190,7 @@ public class BillGenerationServiceImpl {
         }
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
         ContextHolder.setValue("dsKey", currentUser.getTenantDo().getDskey());
-        this.asyncGenerateBill(swWaterUsageEntryService.getBaseMapper().selectBatchIds(ids));
+        this.asyncGenerateBill(swWaterUsageEntryService.getBaseMapper().selectBatchIds(ids), null);
         ContextHolder.clear();
     }
 
@@ -202,7 +202,7 @@ public class BillGenerationServiceImpl {
         log.info("开始给抄表记录:{},生成账单信息", list.stream().map(SwWaterUsageEntryDo::getId).collect(Collectors.toList()));
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
         ContextHolder.setValue("dskey", currentUser.getTenantDo().getDskey());
-        this.asyncGenerateBill(list);
+        this.asyncGenerateBill(list, null);
         ContextHolder.clear();
     }
 

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

@@ -2,6 +2,7 @@ package com.rongwei.zhsw.system.service.impl;
 
 import com.alibaba.excel.EasyExcel;
 import com.google.common.collect.Lists;
+import com.rongwe.zhsw.system.domain.SwUserManagementDo;
 import com.rongwe.zhsw.system.domain.SwWaterUsageEntryDo;
 import com.rongwe.zhsw.system.vo.ImportMeterReadingRecordVo;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
@@ -19,11 +20,10 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.io.File;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 
@@ -73,16 +73,16 @@ public class ImportExcelServiceImpl implements ImportExcelService {
         long entTime = System.currentTimeMillis();
         log.error("excel解析时长:{}", startTime - entTime);
         List<SwWaterUsageEntryDo> saveList = meterReadingRecordListener.getData();
+        Map<String, SwUserManagementDo> ownerMap = meterReadingRecordListener.getOwnerMap();
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
         String dskey = currentUser.getTenantDo().getDskey();
 
-        this.dataSaveAndPostProcessing(saveList, dskey);
+        this.dataSaveAndPostProcessing(saveList, dskey, ownerMap);
 
         return R.ok();
     }
 
-    @Transactional
-    public void dataSaveAndPostProcessing(List<SwWaterUsageEntryDo> saveList, String dskey) {
+    public void dataSaveAndPostProcessing(List<SwWaterUsageEntryDo> saveList, String dskey, Map<String, SwUserManagementDo> ownerMap) {
         long asyncTasksStart = System.currentTimeMillis();
         List<List<SwWaterUsageEntryDo>> partition = Lists.partition(saveList, 1000); // 动态分片
         CompletableFuture<Void> allFutures = CompletableFuture.allOf(
@@ -99,7 +99,7 @@ public class ImportExcelServiceImpl implements ImportExcelService {
         );
         allFutures.thenRun(() -> {
             ContextHolder.setValue("dsKey", dskey);
-            billGenerationService.asyncGenerateBill(saveList); // 同步生成账单
+            billGenerationService.asyncGenerateBill(saveList, ownerMap); // 同步生成账单
             log.debug("数据保存总耗时: {}ms", System.currentTimeMillis() - asyncTasksStart);
         });
     }

+ 1 - 1
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/impl/WaterUsageServiceImpl.java

@@ -82,7 +82,7 @@ public class WaterUsageServiceImpl implements WaterUsageService {
         }
         swWaterUsageEntryDo.setWaterusage(waterConsumption);
         swWaterUsageEntryService.save(swWaterUsageEntryDo);
-        billGenerationService.generateBill(Collections.singletonList(swWaterUsageEntryDo));
+        billGenerationService.generateBill(Collections.singletonList(swWaterUsageEntryDo),null);
         return R.ok();
     }