Sfoglia il codice sorgente

feature 代码提交

xiahan 4 mesi fa
parent
commit
880759f156

+ 16 - 9
zhsw-common/src/main/java/com/rongwei/zhsw/system/importListener/MeterReadingRecordListener.java

@@ -34,8 +34,8 @@ 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 List<ImportMeterReadingRecordVo> recordList = new ArrayList<>();
-
+    private  ThreadLocal<List<ImportMeterReadingRecordVo>> recordList = ThreadLocal.withInitial(ArrayList::new);
+    private  ThreadLocal<List<SwWaterUsageEntryDo>> saveList = ThreadLocal.withInitial(ArrayList::new);
     private SwUserManagementServiceImpl swUserManagementService;
     private SwWaterUsageEntryServiceImpl swWaterUsageEntryService;
 
@@ -65,16 +65,16 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
                 .eq(SwWaterUsageEntryDo::getUsernumber, importMeterReadingRecordVo.getAccountNumber())
                 .ge(SwWaterUsageEntryDo::getCurrentreadingdate, importMeterReadingRecordVo.getReadingDate()));
         if(count==0) {
-            recordList.add(importMeterReadingRecordVo);
+            recordList.get().add(importMeterReadingRecordVo);
         }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        if(recordList.isEmpty()){
+        if(recordList.get().isEmpty()){
             return;
         }
-        List<String> accountNumList = recordList.stream().map(ImportMeterReadingRecordVo::getAccountNumber).distinct().collect(Collectors.toList());
+        List<String> accountNumList = recordList.get().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>()
@@ -82,9 +82,8 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
                     .in(SwUserManagementDo::getUsernumber, accountNumList)));
         });
         SysUserVo currentUser = getCurrentUser();
-        List<SwWaterUsageEntryDo> saveList= new ArrayList<>();
         Calendar calendar = Calendar.getInstance();
-        recordList.forEach(record->{
+        recordList.get().forEach(record->{
             SwUserManagementDo swUserManagementDo = allAccountData.stream().filter(accountInfo -> accountInfo.getUsernumber().equals(record.getAccountNumber()))
                     .findFirst()
                     .orElse(null);
@@ -118,9 +117,11 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
             swWaterUsageEntryDo.setMonth(calendar.get(Calendar.MONTH)+1);
             swWaterUsageEntryDo.setIsds(String.valueOf(0));
             ZHSWCommonUtils.initModelGeneralParameters(swWaterUsageEntryDo,currentUser);
-            saveList.add(swWaterUsageEntryDo);
+            saveList.get().add(swWaterUsageEntryDo);
         });
-        save(saveList);
+        save(saveList.get());
+
+        recordList.remove();
     }
     @Transactional
     public void save(List<SwWaterUsageEntryDo> saveList){
@@ -128,4 +129,10 @@ public class MeterReadingRecordListener extends AnalysisEventListener<ImportMete
             swWaterUsageEntryService.saveBatch(saveList,500);
         }
     }
+
+    public List<SwWaterUsageEntryDo> getDatas() {
+        List<SwWaterUsageEntryDo> swWaterUsageEntryDos = saveList.get();
+        saveList.remove();
+        return swWaterUsageEntryDos;
+    }
 }

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

@@ -5,13 +5,19 @@ 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;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+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;
 import java.math.RoundingMode;
@@ -37,6 +43,8 @@ public class BillGenerationServiceImpl {
     private SwUserManagementServiceImpl swUserManagementService;
     @Autowired
     private SwBillManagementUnpaidServiceImpl swBillManagementUnpaidService;
+    @Autowired
+    private DataSourceTransactionManager transactionManager;
 
     private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
 
@@ -45,7 +53,7 @@ public class BillGenerationServiceImpl {
             return formatter.format(date);
         }
     }
-
+    @Async(value = "customThreadPool")
     public void generateBill(List<SwWaterUsageEntryDo> swWaterUsageEntryDoList) {
         log.info("开始生成账单信息");
         if (swWaterUsageEntryDoList == null || swWaterUsageEntryDoList.isEmpty()) {
@@ -165,15 +173,26 @@ public class BillGenerationServiceImpl {
      * @param userSaveList  用户信息
      * @param saveUsageEntryList 抄表记录
      */
-    @Transactional(rollbackFor = Exception.class, propagation = REQUIRED)
+
     public void dataSave(List<SwBillManagementUnpaidDo> swBillManagementUnpaidDos, List<SwUserManagementDo> userSaveList,
                          List<SwWaterUsageEntryDo> saveUsageEntryList) {
-        // 抄表记录状态更新
-        swWaterUsageEntryService.updateBatchById(saveUsageEntryList,4000);
-        // 账单保存
-        swBillManagementUnpaidService.saveBatch(swBillManagementUnpaidDos, 1000);
-        // 更新用户表的本次抄表时间和本次抄表度数
-        swUserManagementService.updateBatchById(userSaveList);
+        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+        TransactionStatus status = transactionManager.getTransaction(def);
+        try {
+            // 抄表记录状态更新
+            swWaterUsageEntryService.updateBatchById(saveUsageEntryList,4000);
+            // 账单保存
+            swBillManagementUnpaidService.saveBatch(swBillManagementUnpaidDos, 1000);
+            // 更新用户表的本次抄表时间和本次抄表度数
+            swUserManagementService.updateBatchById(userSaveList);
+            // 事务性操作
+            transactionManager.commit(status);
+        } catch (Exception e) {
+            transactionManager.rollback(status);
+            log.error("账单保存异常");
+        }
+
     }
 
 

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

@@ -1,6 +1,7 @@
 package com.rongwei.zhsw.system.service.impl;
 
 import com.alibaba.excel.EasyExcel;
+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;
@@ -22,6 +23,9 @@ import org.xml.sax.helpers.DefaultHandler;
 import org.xml.sax.helpers.XMLReaderFactory;
 
 import java.io.File;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 
 import static com.rongwei.rwcommon.utils.UtilsChecks.parameterCheck;
 
@@ -39,6 +43,8 @@ public class ImportExcelServiceImpl implements ImportExcelService {
     private SwUserManagementServiceImpl userManagementService;
     @Autowired
     private SwWaterUsageEntryServiceImpl waterUsageEntryService;
+    @Autowired
+    private BillGenerationServiceImpl billGenerationService;
     /**
      * 抄表记录生成
      * @param fileId
@@ -47,7 +53,12 @@ public class ImportExcelServiceImpl implements ImportExcelService {
     @Override
     public R meterReadingRecord(String fileId) {
         File file = readFile(fileId);
-        EasyExcel.read(file, ImportMeterReadingRecordVo.class,new MeterReadingRecordListener(userManagementService,waterUsageEntryService)).sheet().doRead();
+        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);
         return R.ok();
     }