From 6543cd42661e2f55b28bdc354022a57885d549de Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期四, 04 三月 2021 09:19:49 +0800
Subject: [PATCH] 优化公摊问题

---
 service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java |   87 +++++++++++++++++++++++++++++++------------
 1 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java b/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
index 4c0ba16..b99f8ac 100644
--- a/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
+++ b/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
@@ -1,6 +1,7 @@
 package com.java110.fee.bmo.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.java110.core.factory.Java110ThreadPoolFactory;
 import com.java110.core.smo.IComputeFeeSMO;
 import com.java110.dto.RoomDto;
 import com.java110.dto.fee.FeeConfigDto;
@@ -30,7 +31,12 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @Service
 public class QueryOweFeeImpl implements IQueryOweFee {
@@ -171,40 +177,73 @@
         roomDto.setCommunityId(feeDto.getCommunityId());
         roomDto.setRoomId(feeDto.getPayerObjId());
         List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+
+        if (roomDtos == null || roomDtos.size() < 1) {
+            return ResultVo.createResponseEntity(ResultVo.CODE_OK, "鎴愬姛", new JSONArray());
+        }
         //鏌ヨ璐圭敤淇℃伅arrearsEndTime
-        FeeDto tmpFeeDto = null;
         List<RoomDto> tmpRoomDtos = new ArrayList<>();
-        for (RoomDto tmpRoomDto : roomDtos) {
-            tmpFeeDto = new FeeDto();
-            tmpFeeDto.setArrearsEndTime(DateUtil.getCurrentDate());
-            tmpFeeDto.setState(FeeDto.STATE_DOING);
-            tmpFeeDto.setPayerObjId(tmpRoomDto.getRoomId());
-            tmpFeeDto.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
-            List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+        List<RoomDto> tempRooms = new ArrayList<>();
+        int threadNum = Java110ThreadPoolFactory.JAVA110_DEFAULT_THREAD_NUM;
 
-            if (feeDtos == null || feeDtos.size() < 1) {
-                feeDtos = new ArrayList<>();
-                return ResultVo.createResponseEntity(feeDtos);
-            }
-            List<FeeDto> tmpFeeDtos = new ArrayList<>();
-            for (FeeDto tempFeeDto : feeDtos) {
-                computeFeeSMOImpl.computeEveryOweFee(tempFeeDto);//璁$畻娆犺垂閲戦
-                //濡傛灉閲戦涓�0 灏辨帓闄�
-                if (tempFeeDto.getFeePrice() > 0 && tempFeeDto.getEndTime().getTime() <= DateUtil.getCurrentDate().getTime()) {
-                    tmpFeeDtos.add(tempFeeDto);
-                }
-            }
-
-            if (tmpFeeDtos.size() < 1) {
+        tempRooms.addAll(doGetTmpRoomDto(roomDtos, feeDto, threadNum));
+        for(RoomDto tmpRoomDto:tempRooms){
+            if(tmpRoomDto == null){
                 continue;
             }
-            tmpRoomDto.setFees(tmpFeeDtos);
             tmpRoomDtos.add(tmpRoomDto);
         }
 
         return ResultVo.createResponseEntity(tmpRoomDtos);
     }
 
+    private List<RoomDto> doGetTmpRoomDto(List<RoomDto> roomDtos, FeeDto feeDto, int threadNum) {
+        Java110ThreadPoolFactory java110ThreadPoolFactory = null;
+        try {
+            java110ThreadPoolFactory = Java110ThreadPoolFactory.getInstance().createThreadPool(threadNum);
+            for (RoomDto roomDto1 : roomDtos) {
+                java110ThreadPoolFactory.submit(() -> {
+                    return getTmpRoomDtos(roomDto1, feeDto);
+                });
+            }
+            return java110ThreadPoolFactory.get();
+        } finally {
+            if (java110ThreadPoolFactory != null) {
+                java110ThreadPoolFactory.stop();
+            }
+        }
+    }
+
+    private RoomDto getTmpRoomDtos(RoomDto tmpRoomDto, FeeDto feeDto) {
+        FeeDto tmpFeeDto = null;
+        tmpFeeDto = new FeeDto();
+        tmpFeeDto.setArrearsEndTime(DateUtil.getCurrentDate());
+        tmpFeeDto.setState(FeeDto.STATE_DOING);
+        tmpFeeDto.setPayerObjId(tmpRoomDto.getRoomId());
+        tmpFeeDto.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.querySimpleFees(tmpFeeDto);
+
+        if (feeDtos == null || feeDtos.size() < 1) {
+            return null;
+        }
+
+        List<FeeDto> tmpFeeDtos = new ArrayList<>();
+        for (FeeDto tempFeeDto : feeDtos) {
+
+            computeFeeSMOImpl.computeEveryOweFee(tempFeeDto, tmpRoomDto);//璁$畻娆犺垂閲戦
+            //濡傛灉閲戦涓�0 灏辨帓闄�
+            if (tempFeeDto.getFeePrice() > 0 && tempFeeDto.getEndTime().getTime() <= DateUtil.getCurrentDate().getTime()) {
+                tmpFeeDtos.add(tempFeeDto);
+            }
+        }
+
+        if (tmpFeeDtos.size() < 1) {
+            return null;
+        }
+        tmpRoomDto.setFees(tmpFeeDtos);
+        return tmpRoomDto;
+    }
+
     private boolean freshFeeDtoParam(FeeDto feeDto) {
 
         if (StringUtil.isEmpty(feeDto.getPayerObjId())) {

--
Gitblit v1.8.0