old mode 100644
new mode 100755
| | |
| | | package com.java110.fee.bmo.impl; |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.java110.core.factory.CommunitySettingFactory; |
| | | import com.java110.core.factory.Java110ThreadPoolFactory; |
| | | import com.java110.core.log.LoggerFactory; |
| | | import com.java110.core.smo.IComputeFeeSMO; |
| | | import com.java110.dto.RoomDto; |
| | | import com.java110.dto.fee.FeeConfigDto; |
| | |
| | | import com.java110.utils.exception.ListenerExecuteException; |
| | | import com.java110.utils.util.Assert; |
| | | import com.java110.utils.util.DateUtil; |
| | | import com.java110.utils.util.NumberUtil; |
| | | import com.java110.utils.util.StringUtil; |
| | | import com.java110.vo.ResultVo; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.http.ResponseEntity; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | //键 |
| | | public static final String RECEIVED_AMOUNT_SWITCH = "RECEIVED_AMOUNT_SWITCH"; |
| | | |
| | | //禁用电脑端提交收费按钮 |
| | | public static final String OFFLINE_PAY_FEE_SWITCH = "OFFLINE_PAY_FEE_SWITCH"; |
| | | |
| | | @Override |
| | | public ResponseEntity<String> query(FeeDto feeDto) { |
| | | |
| | |
| | | feeDtos = new ArrayList<>(); |
| | | return ResultVo.createResponseEntity(feeDtos); |
| | | } |
| | | String val = CommunitySettingFactory.getValue(feeDtos.get(0).getCommunityId(), TOTAL_FEE_PRICE); |
| | | if (StringUtil.isEmpty(val)) { |
| | | val = MappingCache.getValue(DOMAIN_COMMON, TOTAL_FEE_PRICE); |
| | | } |
| | | List<FeeDto> tmpFeeDtos = new ArrayList<>(); |
| | | for (FeeDto tmpFeeDto : feeDtos) { |
| | | computeFeeSMOImpl.computeEveryOweFee(tmpFeeDto);//计算欠费金额 |
| | | //如果金额为0 就排除 |
| | | if (tmpFeeDto.getFeePrice() > 0 && tmpFeeDto.getEndTime().getTime() <= DateUtil.getCurrentDate().getTime()) { |
| | | tmpFeeDtos.add(tmpFeeDto); |
| | | try { |
| | | computeFeeSMOImpl.computeEveryOweFee(tmpFeeDto);//计算欠费金额 |
| | | //如果金额为0 就排除 |
| | | //if (tmpFeeDto.getFeePrice() > 0 && tmpFeeDto.getEndTime().getTime() <= DateUtil.getCurrentDate().getTime()) { |
| | | tmpFeeDto.setVal(val); |
| | | if (tmpFeeDto.getFeePrice() > 0) { |
| | | tmpFeeDtos.add(tmpFeeDto); |
| | | } |
| | | } catch (Exception e) { |
| | | logger.error("可能费用资料有问题导致算费失败", e); |
| | | } |
| | | } |
| | | |
| | |
| | | if (feeDtos == null || feeDtos.size() < 1) { |
| | | return ResultVo.success(); |
| | | } |
| | | |
| | | String cycel = null; |
| | | String custEndTime = null; |
| | | if (!StringUtil.isEmpty(feeDto.getCycle())) { |
| | | cycel = feeDto.getCycle(); |
| | | } |
| | | if (!StringUtil.isEmpty(feeDto.getCustEndTime())) { |
| | | custEndTime = feeDto.getCustEndTime(); |
| | | } |
| | | feeDto = feeDtos.get(0); |
| | | if (!StringUtil.isEmpty(cycel)) { |
| | | feeDto.setCycle(cycel); |
| | | } |
| | | if (!StringUtil.isEmpty(custEndTime)) { |
| | | feeDto.setCustEndTime(custEndTime); |
| | | } |
| | | |
| | | if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //房屋相关 |
| | | RoomDto roomDto = new RoomDto(); |
| | |
| | | |
| | | } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关 |
| | | OwnerCarDto ownerCarDto = new OwnerCarDto(); |
| | | ownerCarDto.setCarTypeCd("1001"); //业主车辆 |
| | | ownerCarDto.setCommunityId(feeDto.getCommunityId()); |
| | | ownerCarDto.setCarId(feeDto.getPayerObjId()); |
| | | List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto); |
| | |
| | | feeDto.setPayerObjName(ownerCarDto.getCarNum() + "(" + parkingSpaceDto.getAreaNum() + "停车场" + parkingSpaceDto.getNum() + "车位)"); |
| | | feeDto.setBuiltUpArea(parkingSpaceDto.getArea()); |
| | | } |
| | | double feePrice = computeFeeSMOImpl.getFeePrice(feeDto); |
| | | feeDto.setFeePrice(feePrice); |
| | | Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDto); |
| | | feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString())); |
| | | feeDto.setFeeTotalPrice(Double.parseDouble(feePriceAll.get("feeTotalPrice").toString())); |
| | | |
| | | if (!StringUtil.isEmpty(custEndTime)) { |
| | | Date date = DateUtil.getDateFromStringB(custEndTime); |
| | | computeFeeSMOImpl.dealRentRateCustEndTime(feeDto, date); |
| | | } else { |
| | | computeFeeSMOImpl.dealRentRateCycle(feeDto, NumberUtil.getDouble(feeDto.getCycle())); |
| | | } |
| | | |
| | | |
| | | //应收款取值 |
| | | String val = MappingCache.getValue(DOMAIN_COMMON, TOTAL_FEE_PRICE); |
| | | //先取单小区的如果没有配置 取 全局的 |
| | | String val = CommunitySettingFactory.getValue(feeDto.getCommunityId(), TOTAL_FEE_PRICE); |
| | | if (StringUtil.isEmpty(val)) { |
| | | val = MappingCache.getValue(DOMAIN_COMMON, TOTAL_FEE_PRICE); |
| | | } |
| | | feeDto.setVal(val); |
| | | String received_amount_switch = MappingCache.getValue(DOMAIN_COMMON, RECEIVED_AMOUNT_SWITCH); |
| | | //先取单小区的如果没有配置 取 全局的 |
| | | String received_amount_switch = CommunitySettingFactory.getValue(feeDto.getCommunityId(), RECEIVED_AMOUNT_SWITCH); |
| | | if (StringUtil.isEmpty(received_amount_switch)) { |
| | | received_amount_switch = MappingCache.getValue(DOMAIN_COMMON, RECEIVED_AMOUNT_SWITCH); |
| | | } |
| | | //关闭 线下收银功能 |
| | | if (StringUtil.isEmpty(received_amount_switch)) { |
| | | feeDto.setReceivedAmountSwitch("1");//默认启用实收款输入框 |
| | | } else { |
| | | feeDto.setReceivedAmountSwitch(received_amount_switch); |
| | | } |
| | | //先取单小区的如果没有配置 取 全局的 |
| | | String offlinePayFeeSwitch = CommunitySettingFactory.getValue(feeDto.getCommunityId(), OFFLINE_PAY_FEE_SWITCH); |
| | | if (StringUtil.isEmpty(offlinePayFeeSwitch)) { |
| | | offlinePayFeeSwitch = MappingCache.getValue(DOMAIN_COMMON, OFFLINE_PAY_FEE_SWITCH); |
| | | } |
| | | feeDto.setOfflinePayFeeSwitch(offlinePayFeeSwitch); |
| | | return ResultVo.createResponseEntity(feeDto); |
| | | } |
| | | |
| | |
| | | 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(tmpFeeDto); |
| | | } |
| | | } |
| | | |
| | | 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()) { |
| | | if (tempFeeDto.getFeePrice() > 0) { |
| | | tmpFeeDtos.add(tempFeeDto); |
| | | } |
| | | } |
| | | |
| | | if (tmpFeeDtos.size() < 1) { |
| | | return null; |
| | | } |
| | | tmpRoomDto.setFees(tmpFeeDtos); |
| | | return tmpRoomDto; |
| | | } |
| | | |
| | | private boolean freshFeeDtoParam(FeeDto feeDto) { |
| | |
| | | |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); |
| | | feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); |
| | | } else if ("3003".equals(computingFormula)) { // 固定费用 |
| | | feePrice = 0.0; |
| | | } else if ("1101".equals(computingFormula)) { // 租金 |
| | | feePrice = 0.0; |
| | | } else if ("1102".equals(computingFormula)) { // 租金 |
| | | feePrice = 0.0; |
| | | } else if ("4004".equals(computingFormula)) { |
| | | feePrice = Double.parseDouble(feeDto.getAmount()); |
| | | } else if ("5005".equals(computingFormula)) { |
| | |
| | | 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).doubleValue(); |
| | | } |
| | | } else if ("9009".equals(computingFormula)) { //(本期度数-上期度数)*动态单价+附加费 |
| | | if (StringUtil.isEmpty(feeDto.getCurDegrees())) { |
| | | feePrice = -1.00; |
| | | } else { |
| | | BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees())); |
| | | BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees())); |
| | | BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getMwPrice())); |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); |
| | | BigDecimal sub = curDegree.subtract(preDegree); |
| | | feePrice = sub.multiply(squarePrice) |
| | |
| | | feeDto.setAmountOwed(price.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + ""); |
| | | feeDto.setDeadlineTime(targetEndDate); |
| | | //动态费用 |
| | | if ("4004".equals(computingFormula)) { |
| | | if ("4004".equals(computingFormula) |
| | | && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) |
| | | ) { |
| | | feeDto.setAmountOwed(feeDto.getFeePrice() + ""); |
| | | feeDto.setDeadlineTime(DateUtil.getCurrentDate()); |
| | | } |
| | |
| | | } else if ("2002".equals(computingFormula)) { // 固定费用 |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); |
| | | feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); |
| | | } else if ("3003".equals(computingFormula)) { // 固定费用 |
| | | BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice())); |
| | | BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(tmpRoomDto.getRoomArea())); |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); |
| | | feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue(); |
| | | } else if ("1101".equals(computingFormula)) { // 租金 |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpRoomDto.getRoomRent())); |
| | | feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue(); |
| | | } else if ("1102".equals(computingFormula)) { // 租金 |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpRoomDto.getRoomRent())); |
| | | feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue(); |
| | | } else if ("4004".equals(computingFormula)) { |
| | | feePrice = Double.parseDouble(feeDto.getAmount()); |
| | | } else if ("5005".equals(computingFormula)) { |
| | |
| | | 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).doubleValue(); |
| | | } |
| | | } else if ("9009".equals(computingFormula)) { |
| | | |
| | | if (StringUtil.isEmpty(feeDto.getCurDegrees())) { |
| | | feePrice = -1.00; |
| | | } else { |
| | | BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees())); |
| | | BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees())); |
| | | BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getMwPrice())); |
| | | BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount())); |
| | | BigDecimal sub = curDegree.subtract(preDegree); |
| | | feePrice = sub.multiply(squarePrice) |
| | |
| | | return targetEndDateAndOweMonth; |
| | | } |
| | | if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) { |
| | | if (!StringUtil.isEmpty(feeDto.getCurDegrees())) { |
| | | if (feeDto.getDeadlineTime() != null) { |
| | | targetEndDate = feeDto.getDeadlineTime(); |
| | | } else if (!StringUtil.isEmpty(feeDto.getCurDegrees())) { |
| | | targetEndDate = feeDto.getCurReadingTime(); |
| | | } else if (feeDto.getImportFeeEndTime() == null) { |
| | | targetEndDate = feeDto.getConfigEndTime(); |