Ver código fonte

feature 代码提交 生成账单出错时 不在影响其他账单的生成情况

xiahan 3 meses atrás
pai
commit
2d270ad4bc

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

@@ -88,7 +88,7 @@ public class BillGenerationServiceImpl {
         List<SwBillManagementUnpaidDo> saveList = new ArrayList<>();
         List<SwUserManagementDo> userSaveList = new ArrayList<>();
         /*******当前账单的所有户号******/
-        List<String> accountNumberList = collect.stream().map(SwWaterUsageEntryDo::getUsernumber).collect(Collectors.toList());
+        List<String> accountNumberList = collect.parallelStream().map(SwWaterUsageEntryDo::getUsernumber).collect(Collectors.toList());
         /*******当前账单的所有户号******/
         Map<String, SwUserManagementDo> userMap = swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
                         .select(SwUserManagementDo::getId,
@@ -109,7 +109,7 @@ public class BillGenerationServiceImpl {
                         )
                         .eq(BaseDo::getDeleted, "0")
                         .in(SwUserManagementDo::getUsernumber, accountNumberList))
-                .stream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
+                .parallelStream().collect(Collectors.groupingBy(SwUserManagementDo::getUsernumber,
                         Collectors.reducing(
                                 null, // 初始值(可能为 null)
                                 (a, b) -> a != null ? a : b // 合并规则:保留第一个非 null 元素
@@ -123,20 +123,21 @@ public class BillGenerationServiceImpl {
             String usernumber = swWaterUsageEntry.getUsernumber();
             // 本次抄表日期
             Date currentreadingdate = swWaterUsageEntry.getCurrentreadingdate();
+            log.debug("当前需要生成账单的户号为:{},抄表数:{},抄表时间:{}", usernumber, swWaterUsageEntry.getThisreading(), currentreadingdate);
             // 校验 是否已存在抄表记录
             if (swWaterUsageEntry.getState().equals("1")) {
                 log.error("当前用户:{},时间:{}的抄表记录已生成账单信息", usernumber, currentreadingdate);
-                return;
+                break;
             }
             swUserManagementDo = userMap.getOrDefault(swWaterUsageEntry.getUsernumber(), null);
 
             SwWaterUsageEntryDo usageEntryDo = new SwWaterUsageEntryDo();
             usageEntryDo.setId(swWaterUsageEntry.getId());
             if (swUserManagementDo == null) {
-                log.error("当前户号不存在");
+                log.error("当前户号不存在:{}", swWaterUsageEntry.getUsernumber());
                 usageEntryDo.setState("2");
                 saveUsageEntryList.add(usageEntryDo);
-                return;
+                break;
             }
             // 校验是否可以生成账单
             if (swUserManagementDo.getLastmeterreaddate() != null &&
@@ -144,7 +145,7 @@ public class BillGenerationServiceImpl {
                 log.error("本次抄表日期:{}小于用户表最后一次抄表日期:{}", swUserManagementDo.getLastmeterreaddate(), swWaterUsageEntry.getCurrentreadingdate());
                 usageEntryDo.setState("3");
                 saveUsageEntryList.add(usageEntryDo);
-                return;
+                break;
             }
             try {
                 // 生成代缴费账单
@@ -169,7 +170,7 @@ public class BillGenerationServiceImpl {
         }
         dataSave(saveList, saveUsageEntryList, userSaveList);
         long totalAsyncCost = System.currentTimeMillis() - asyncTasksStart;
-        log.info("账单生成记录耗时: {}ms", totalAsyncCost);
+        log.info("账单生成记录耗时: {}ms,生成的账单数量为:{}", totalAsyncCost, saveUsageEntryList.size());
     }
 
 

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

@@ -13,15 +13,14 @@ import com.rongwei.zhsw.system.importListener.MeterReadingRecordListener;
 import com.rongwei.zhsw.system.service.ImportExcelService;
 import com.rongwei.zhsw.system.utils.ZHSWCommonUtils;
 import org.apache.commons.lang.StringUtils;
-import org.apache.ibatis.session.ExecutorType;
-import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.slf4j.Logger;
 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.support.TransactionTemplate;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.File;
 import java.util.List;
@@ -76,16 +75,16 @@ public class ImportExcelServiceImpl implements ImportExcelService {
         List<SwWaterUsageEntryDo> saveList = meterReadingRecordListener.getData();
         SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
         String dskey = currentUser.getTenantDo().getDskey();
-        ContextHolder.setValue("dsKey", dskey);
+
         this.dataSaveAndPostProcessing(saveList, dskey);
 
         return R.ok();
     }
 
-    // @Transactional(propagation = Propagation.REQUIRES_NEW)
-    public void dataSaveAndPostProcessing(List<SwWaterUsageEntryDo> datas, String dskey) {
+    @Transactional
+    public void dataSaveAndPostProcessing(List<SwWaterUsageEntryDo> saveList, String dskey) {
         long asyncTasksStart = System.currentTimeMillis();
-        List<List<SwWaterUsageEntryDo>> partition = Lists.partition(datas, 1000); // 动态分片
+        List<List<SwWaterUsageEntryDo>> partition = Lists.partition(saveList, 1000); // 动态分片
         CompletableFuture<Void> allFutures = CompletableFuture.allOf(
                 partition.stream()
                         .map(data ->
@@ -98,24 +97,11 @@ public class ImportExcelServiceImpl implements ImportExcelService {
                                 }))
                         .toArray(CompletableFuture[]::new)
         );
-
         allFutures.thenRun(() -> {
-            ContextHolder.setValue("dskey",dskey);
+            ContextHolder.setValue("dsKey", dskey);
+            billGenerationService.asyncGenerateBill(saveList); // 同步生成账单
             log.debug("数据保存总耗时: {}ms", System.currentTimeMillis() - asyncTasksStart);
-            billGenerationService.asyncGenerateBill(datas); // 同步生成账单
-            ContextHolder.clear();
         });
-        // partition.parallelStream().forEach(data -> {
-        //     waterUsageEntryService.getBaseMapper().ListBatchSave(data, dskey);
-        // });
-
-        // CompletableFuture<?>[] futures = partition.parallelStream()
-        //         .map(data -> CompletableFuture.runAsync(() ->
-        //                 waterUsageEntryService.getBaseMapper().ListBatchSave(data, dskey), asyncTaskExecutor)
-        //         )
-        //         .toArray(CompletableFuture[]::new);
-
-
     }
 
     public File readFile(String fileId) {