Ver código fonte

优化代码

java110 5 anos atrás
pai
commit
beefed457a

+ 80 - 0
java110-core/src/main/java/com/java110/core/factory/Java110ThreadPoolFactory.java

@@ -0,0 +1,80 @@
+/*
+ * Copyright 2017-2020 吴学文 and java110 team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.java110.core.factory;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Vector;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * @ClassName Java110ThreadPoolFactory
+ * @Description java110提供线程池工厂类
+ * @Author wuxw
+ * @Date 2021/1/14 21:04
+ * @Version 1.0
+ * add by wuxw 2021/1/14
+ **/
+public class Java110ThreadPoolFactory<T> {
+
+    public static final int JAVA110_DEFAULT_THREAD_NUM = 200;
+    private Vector<Future<T>> futureList = null;
+    ExecutorService executor = null;
+
+    public static Java110ThreadPoolFactory getInstance() {
+        return new Java110ThreadPoolFactory();
+    }
+
+    /**
+     * 创建 线程池
+     *
+     * @param defaultThreadNum 线程数量
+     * @return
+     */
+    public Java110ThreadPoolFactory<T> createThreadPool(int defaultThreadNum) {
+        futureList = new Vector<>();
+        executor = Executors.newFixedThreadPool(defaultThreadNum);
+        return this;
+    }
+
+
+    public Java110ThreadPoolFactory submit(Callable<T> task) {
+        Future<T> result = executor.submit(task);
+        futureList.add(result);
+        return this;
+    }
+
+    public List<T> get() {
+        List<T> result = new LinkedList<>();
+        for (Future<T> future :
+                futureList) {
+            try {
+                result.add(future.get());
+            } catch (Exception e) {
+                result.add(null);
+            }
+
+        }
+        return result;
+    }
+
+    public void stop() {
+        executor.shutdown();
+    }
+}

+ 5 - 0
java110-core/src/main/java/com/java110/core/smo/IComputeFeeSMO.java

@@ -1,5 +1,6 @@
 package com.java110.core.smo;
 
+import com.java110.dto.RoomDto;
 import com.java110.dto.fee.FeeDto;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.report.ReportCarDto;
@@ -114,6 +115,9 @@ public interface IComputeFeeSMO {
      */
     double getFeePrice(FeeDto feeDto);
 
+
+    public double getFeePrice(FeeDto feeDto, RoomDto roomDto);
+
     /**
      * 时间差 按天折算
      *
@@ -126,4 +130,5 @@ public interface IComputeFeeSMO {
     double getReportFeePrice(ReportFeeDto tmpReportFeeDto, ReportRoomDto reportRoomDto, ReportCarDto reportCarDto);
 
     void computeEveryOweFee(FeeDto tmpFeeDto);
+    void computeEveryOweFee(FeeDto tmpFeeDto, RoomDto roomDto);
 }

+ 35 - 27
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -2,7 +2,11 @@ package com.java110.core.smo.impl;
 
 import com.java110.core.smo.IComputeFeeSMO;
 import com.java110.dto.RoomDto;
-import com.java110.dto.fee.*;
+import com.java110.dto.fee.BillDto;
+import com.java110.dto.fee.BillOweFeeDto;
+import com.java110.dto.fee.FeeAttrDto;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDto;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.parking.ParkingSpaceDto;
 import com.java110.dto.report.ReportCarDto;
@@ -25,7 +29,12 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
-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;
 
 /**
  * 费用计算 服务类
@@ -63,9 +72,12 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
      * @param tmpFeeDto
      */
     public void computeEveryOweFee(FeeDto tmpFeeDto) {
+        computeEveryOweFee(tmpFeeDto, null);
+    }
 
-        computeFeePrice(tmpFeeDto);
-
+    @Override
+    public void computeEveryOweFee(FeeDto tmpFeeDto, RoomDto roomDto) {
+        computeFeePrice(tmpFeeDto, roomDto);
     }
 
     /**
@@ -77,7 +89,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         String billType = tmpFeeDto.getBillType();
 
         if (FeeConfigDto.BILL_TYPE_EVERY.equals(billType)) {
-            computeFeePrice(tmpFeeDto);
+            computeFeePrice(tmpFeeDto, null);
             return;
         }
         BillDto billDto = new BillDto();
@@ -107,10 +119,10 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         tmpFeeDto.setFeePrice(Double.parseDouble(billOweFeeDtos.get(0).getAmountOwed()));
     }
 
-    private void computeFeePrice(FeeDto feeDto) {
+    private void computeFeePrice(FeeDto feeDto, RoomDto roomDto) {
 
         if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //房屋相关
-            computeFeePriceByRoom(feeDto);
+            computeFeePriceByRoom(feeDto, roomDto);
         } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关
             computeFeePriceByParkingSpace(feeDto);
         }
@@ -152,21 +164,10 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
      *
      * @param feeDto
      */
-    private void computeFeePriceByRoom(FeeDto feeDto) {
+    private void computeFeePriceByRoom(FeeDto feeDto, RoomDto roomDto) {
         Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
         Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
         double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
-//        RoomDto roomDto = new RoomDto();
-//        roomDto.setCommunityId(feeDto.getCommunityId());
-//        roomDto.setRoomId(feeDto.getPayerObjId());
-//        List<RoomDto> roomDtos = feeDto.getCacheRooms();
-//        if(roomDtos == null || roomDtos.size() < 1) {
-//            roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
-//        }
-//
-//        if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
-//            return;
-//        }
 
         String computingFormula = feeDto.getComputingFormula();
         double feePrice = getFeePrice(feeDto);
@@ -585,21 +586,28 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
 
     @Override
     public double getFeePrice(FeeDto feeDto) {
+        return getFeePrice(feeDto, null);
+    }
+
+    @Override
+    public double getFeePrice(FeeDto feeDto, RoomDto roomDto) {
         BigDecimal feePrice = new BigDecimal(0.0);
         if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //房屋相关
             String computingFormula = feeDto.getComputingFormula();
-            RoomDto roomDto = new RoomDto();
-            roomDto.setRoomId(feeDto.getPayerObjId());
-            roomDto.setCommunityId(feeDto.getCommunityId());
-            List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
-            if (roomDtos == null || roomDtos.size() != 1) {
-                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据");
+            if(roomDto == null) {
+                roomDto = new RoomDto();
+                roomDto.setRoomId(feeDto.getPayerObjId());
+                roomDto.setCommunityId(feeDto.getCommunityId());
+                List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+                if (roomDtos == null || roomDtos.size() != 1) {
+                    throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据");
+                }
+                roomDto = roomDtos.get(0);
             }
-            roomDto = roomDtos.get(0);
             if ("1001".equals(computingFormula)) { //面积*单价+附加费
                 //feePrice = Double.parseDouble(feeDto.getSquarePrice()) * Double.parseDouble(roomDtos.get(0).getBuiltUpArea()) + Double.parseDouble(feeDto.getAdditionalAmount());
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
-                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
+                BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDto.getBuiltUpArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
                 feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_EVEN);
             } else if ("2002".equals(computingFormula)) { // 固定费用

+ 54 - 26
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 org.springframework.stereotype.Service;
 
 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 {
@@ -176,39 +182,61 @@ public class QueryOweFeeImpl implements IQueryOweFee {
             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);
-
-            if (feeDtos == null || feeDtos.size() < 1) {
-                feeDtos = new ArrayList<>();
-                return ResultVo.createResponseEntity(feeDtos);
+        List<RoomDto> tempRooms = new ArrayList<>();
+        int threadNum = 20;
+        for (int roomIndex = 0; roomIndex < roomDtos.size(); roomIndex++) {
+            tempRooms.add(roomDtos.get(roomIndex));
+            if (roomIndex % threadNum == 0 && roomIndex != 0) {
+                tmpRoomDtos.addAll(doGetTmpRoomDto(tempRooms, feeDto, threadNum));
+                tempRooms = new ArrayList();
             }
+        }
+        if (tempRooms.size() > 0) {
+            tmpRoomDtos.addAll(doGetTmpRoomDto(tempRooms, feeDto, tempRooms.size()));
+        }
 
-            List<FeeDto> tmpFeeDtos = new ArrayList<>();
-            for (FeeDto tempFeeDto : feeDtos) {
+        return ResultVo.createResponseEntity(tmpRoomDtos);
+    }
 
-                computeFeeSMOImpl.computeEveryOweFee(tempFeeDto);//计算欠费金额
-                //如果金额为0 就排除
-                if (tempFeeDto.getFeePrice() > 0 && tempFeeDto.getEndTime().getTime() <= DateUtil.getCurrentDate().getTime()) {
-                    tmpFeeDtos.add(tempFeeDto);
-                }
-            }
+    private List<RoomDto> doGetTmpRoomDto(List<RoomDto> roomDtos, FeeDto feeDto, int threadNum) {
+        Java110ThreadPoolFactory java110ThreadPoolFactory = Java110ThreadPoolFactory.getInstance().createThreadPool(threadNum);
+        for (RoomDto roomDto1 : roomDtos) {
+            java110ThreadPoolFactory.submit(() -> {
+                return getTmpRoomDtos(roomDto1, feeDto);
+            });
+        }
+        return java110ThreadPoolFactory.get();
+    }
 
-            if (tmpFeeDtos.size() < 1) {
-                continue;
+    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.queryFees(feeDto);
+
+        if (feeDtos == null || feeDtos.size() < 1) {
+            return null;
+        }
+
+        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);
             }
-            tmpRoomDto.setFees(tmpFeeDtos);
-            tmpRoomDtos.add(tmpRoomDto);
         }
 
-        return ResultVo.createResponseEntity(tmpRoomDtos);
+        if (tmpFeeDtos.size() < 1) {
+            return null;
+        }
+        tmpRoomDto.setFees(tmpFeeDtos);
+        return tmpRoomDto;
     }
 
     private boolean freshFeeDtoParam(FeeDto feeDto) {

+ 1 - 0
service-job/src/main/java/com/java110/job/smo/impl/JobServiceSMOImpl.java

@@ -123,4 +123,5 @@ public class JobServiceSMOImpl extends BaseServiceSMO implements IJobServiceSMO
     }
 
 
+
 }