wuxw лет назад: 5
Родитель
Сommit
03d7da07d0

+ 35 - 20
java110-bean/src/main/java/com/java110/dto/contractRoom/ContractRoomDto.java

@@ -1,6 +1,8 @@
 package com.java110.dto.contractRoom;
 
 import com.java110.dto.PageDto;
+import com.java110.dto.RoomDto;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -12,15 +14,15 @@ import java.util.Date;
  * @Version 1.0
  * add by wuxw 2019/4/24
  **/
-public class ContractRoomDto extends PageDto implements Serializable {
+public class ContractRoomDto extends RoomDto implements Serializable {
 
     private String crId;
-private String ownerName;
-private String contractId;
-private String ownerId;
-private String storeId;
-private String roomId;
-private String roomName;
+    private String ownerName;
+    private String contractId;
+    private String ownerId;
+    private String storeId;
+    private String roomId;
+    private String roomName;
 
 
     private Date createTime;
@@ -31,43 +33,56 @@ private String roomName;
     public String getCrId() {
         return crId;
     }
-public void setCrId(String crId) {
+
+    public void setCrId(String crId) {
         this.crId = crId;
     }
-public String getOwnerName() {
+
+    public String getOwnerName() {
         return ownerName;
     }
-public void setOwnerName(String ownerName) {
+
+    public void setOwnerName(String ownerName) {
         this.ownerName = ownerName;
     }
-public String getContractId() {
+
+    public String getContractId() {
         return contractId;
     }
-public void setContractId(String contractId) {
+
+    public void setContractId(String contractId) {
         this.contractId = contractId;
     }
-public String getOwnerId() {
+
+    public String getOwnerId() {
         return ownerId;
     }
-public void setOwnerId(String ownerId) {
+
+    public void setOwnerId(String ownerId) {
         this.ownerId = ownerId;
     }
-public String getStoreId() {
+
+    public String getStoreId() {
         return storeId;
     }
-public void setStoreId(String storeId) {
+
+    public void setStoreId(String storeId) {
         this.storeId = storeId;
     }
-public String getRoomId() {
+
+    public String getRoomId() {
         return roomId;
     }
-public void setRoomId(String roomId) {
+
+    public void setRoomId(String roomId) {
         this.roomId = roomId;
     }
-public String getRoomName() {
+
+    public String getRoomName() {
         return roomName;
     }
-public void setRoomName(String roomName) {
+
+    public void setRoomName(String roomName) {
         this.roomName = roomName;
     }
 

+ 73 - 0
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -3,6 +3,7 @@ package com.java110.core.smo.impl;
 import com.java110.core.smo.IComputeFeeSMO;
 import com.java110.dto.RoomDto;
 import com.java110.dto.community.CommunityDto;
+import com.java110.dto.contractRoom.ContractRoomDto;
 import com.java110.dto.fee.BillDto;
 import com.java110.dto.fee.BillOweFeeDto;
 import com.java110.dto.fee.FeeAttrDto;
@@ -14,6 +15,7 @@ import com.java110.dto.parking.ParkingSpaceDto;
 import com.java110.dto.report.ReportCarDto;
 import com.java110.dto.report.ReportFeeDto;
 import com.java110.dto.report.ReportRoomDto;
+import com.java110.intf.IContractRoomInnerServiceSMO;
 import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
@@ -74,6 +76,9 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
     @Autowired(required = false)
     private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
 
+    @Autowired(required = false)
+    private IContractRoomInnerServiceSMO contractRoomInnerServiceSMOImpl;
+
     @Override
     public Date getFeeEndTime() {
         return null;
@@ -777,6 +782,54 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             } else {
                 throw new IllegalArgumentException("暂不支持该类公式");
             }
+        } else if (FeeDto.PAYER_OBJ_TYPE_CONTRACT.equals(feeDto.getPayerObjType())) { //合同相关
+            String computingFormula = feeDto.getComputingFormula();
+
+            //查询合同关联房屋
+            ContractRoomDto contractRoomDto = new ContractRoomDto();
+            contractRoomDto.setContractId(feeDto.getPayerObjId());
+            contractRoomDto.setCommunityId(feeDto.getCommunityId());
+            List<ContractRoomDto> contractRoomDtos = contractRoomInnerServiceSMOImpl.queryContractRooms(contractRoomDto);
+
+            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(0);
+                for(ContractRoomDto tmpContractRoomDto: contractRoomDtos){
+                    builtUpArea = builtUpArea.add(new BigDecimal(Double.parseDouble(tmpContractRoomDto.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)) { // 固定费用
+                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                BigDecimal roomDount = new BigDecimal(contractRoomDtos.size());
+                additionalAmount = additionalAmount.multiply(roomDount);
+                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_EVEN);
+            } else if ("4004".equals(computingFormula)) {  //动态费用
+                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+            } else if ("5005".equals(computingFormula)) {  //(本期度数-上期度数)*单价+附加费
+                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
+                    //throw new IllegalArgumentException("抄表数据异常");
+                } else {
+                    BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
+                    BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
+                    BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+                    BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+                    BigDecimal sub = curDegree.subtract(preDegree);
+                    feePrice = sub.multiply(squarePrice)
+                            .add(additionalAmount)
+                            .setScale(2, BigDecimal.ROUND_HALF_EVEN);
+                }
+            } else if ("6006".equals(computingFormula)) {
+                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+            } else if ("7007".equals(computingFormula)) { //自定义公式
+                feePrice = computeContractCustomizeFormula(feeDto, contractRoomDtos);
+            } else if ("8008".equals(computingFormula)) {  //手动动态费用
+                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+            } else {
+                throw new IllegalArgumentException("暂不支持该类公式");
+            }
         }
         return feePrice.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue();
     }
@@ -836,6 +889,26 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         return valueObj;
     }
 
+    /**
+     * 自定义公式计算
+     *
+     * @param feeDto
+     * @return C 代表房屋对应小区面积
+     * F 代表房屋对应楼栋面积
+     * U 代表房屋对应单元面积
+     * R 代表房屋面积
+     * X 代表房屋收费系数(房屋管理中配置)
+     * L 代表房屋层数
+     */
+    private BigDecimal computeContractCustomizeFormula(FeeDto feeDto, List<ContractRoomDto> contractRoomDtos) {
+
+        BigDecimal total = new BigDecimal(0.0);
+       for(ContractRoomDto contractRoomDto :contractRoomDtos){
+           total = total.add(computeRoomCustomizeFormula(feeDto,contractRoomDto));
+       }
+        return total;
+    }
+
     /**
      * 自定义公式计算
      *

+ 22 - 0
service-api/src/main/java/com/java110/api/listener/fee/ListFeeListener.java

@@ -139,6 +139,8 @@ public class ListFeeListener extends AbstractServiceApiListener {
                     computeFeePriceByRoom(feeDto, oweMonth);
                 } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关
                     computeFeePriceByCar(feeDto, oweMonth);
+                } else if (FeeDto.PAYER_OBJ_TYPE_CONTRACT.equals(feeDto.getPayerObjType())) {//车位相关
+                    computeFeePriceByContract(feeDto, oweMonth);
                 }
                 feeDto.setDeadlineTime(targetEndDate);
             } catch (Exception e) {
@@ -195,4 +197,24 @@ public class ListFeeListener extends AbstractServiceApiListener {
             feeDto.setDeadlineTime(DateUtil.getCurrentDate());
         }
     }
+
+    /**
+     * 根据合同来算单价
+     *
+     * @param feeDto
+     */
+    private void computeFeePriceByContract(FeeDto feeDto, double oweMonth) {
+        String computingFormula = feeDto.getComputingFormula();
+        double feePrice = 0.00;
+        feePrice = computeFeeSMOImpl.getFeePrice(feeDto);
+        feeDto.setFeePrice(feePrice);
+        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
+        curFeePrice = curFeePrice.multiply(new BigDecimal(oweMonth));
+        feeDto.setAmountOwed(curFeePrice.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + "");
+        //动态费用
+        if ("4004".equals(computingFormula) && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
+            feeDto.setAmountOwed(feeDto.getFeePrice() + "");
+            feeDto.setDeadlineTime(DateUtil.getCurrentDate());
+        }
+    }
 }

+ 30 - 0
service-store/src/main/java/com/java110/store/smo/impl/ContractRoomInnerServiceSMOImpl.java

@@ -3,8 +3,10 @@ package com.java110.store.smo.impl;
 
 import com.java110.core.base.smo.BaseServiceSMO;
 import com.java110.dto.PageDto;
+import com.java110.dto.RoomDto;
 import com.java110.dto.contractRoom.ContractRoomDto;
 import com.java110.intf.IContractRoomInnerServiceSMO;
+import com.java110.intf.community.IRoomInnerServiceSMO;
 import com.java110.po.contractRoom.ContractRoomPo;
 import com.java110.store.dao.IContractRoomServiceDao;
 import com.java110.utils.util.BeanConvertUtil;
@@ -12,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -28,6 +31,9 @@ public class ContractRoomInnerServiceSMOImpl extends BaseServiceSMO implements I
     @Autowired
     private IContractRoomServiceDao contractRoomServiceDaoImpl;
 
+    @Autowired
+    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
+
 
     @Override
     public int saveContractRoom(@RequestBody ContractRoomPo contractRoomPo) {
@@ -64,9 +70,33 @@ public class ContractRoomInnerServiceSMOImpl extends BaseServiceSMO implements I
 
         List<ContractRoomDto> contractRooms = BeanConvertUtil.covertBeanList(contractRoomServiceDaoImpl.getContractRoomInfo(BeanConvertUtil.beanCovertMap(contractRoomDto)), ContractRoomDto.class);
 
+        if(contractRooms != null && contractRooms.size() > 0){
+            refreshContractRooms(contractRooms);
+        }
         return contractRooms;
     }
 
+    private void refreshContractRooms(List<ContractRoomDto> contractRooms) {
+        List<String> roomIds = new ArrayList<>();
+
+        for(ContractRoomDto contractRoomDto : contractRooms){
+            roomIds.add(contractRoomDto.getRoomId());
+        }
+
+        RoomDto roomDto = new RoomDto();
+        roomDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
+        roomDto.setCommunityId(contractRooms.get(0).getCommunityId());
+        List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+
+        for(ContractRoomDto contractRoomDto : contractRooms){
+            for(RoomDto tmpRoomDto : roomDtos){
+                if(contractRoomDto.getRoomId().equals(tmpRoomDto.getRoomId())){
+                    BeanConvertUtil.covertBean(tmpRoomDto,contractRoomDto);
+                }
+            }
+        }
+    }
+
 
     @Override
     public int queryContractRoomsCount(@RequestBody ContractRoomDto contractRoomDto) {