| | |
| | | import com.java110.utils.exception.ListenerExecuteException; |
| | | import com.java110.utils.util.*; |
| | | import com.java110.vo.ResultVo; |
| | | import com.java110.vo.api.fee.ApiFeeDataVo; |
| | | import com.java110.vo.api.fee.ApiFeeVo; |
| | | import com.java110.vo.api.feeConfig.ApiFeeConfigDataVo; |
| | | import org.slf4j.Logger; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.http.ResponseEntity; |
| | |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | |
| | | public ResponseEntity<String> query(FeeDto feeDto) { |
| | | |
| | | //查询费用信息arrearsEndTime |
| | | feeDto.setArrearsEndTime(DateUtil.getCurrentDate()); |
| | | // todo 这里考虑预付期的费用 所以查询全量再用费用 |
| | | feeDto.setState(FeeDto.STATE_DOING); |
| | | List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto); |
| | | |
| | | if (feeDtos == null || feeDtos.size() < 1) { |
| | | if (ListUtil.isNull(feeDtos)) { |
| | | feeDtos = new ArrayList<>(); |
| | | return ResultVo.createResponseEntity(feeDtos); |
| | | } |
| | |
| | | List<FeeDto> tmpFeeDtos = new ArrayList<>(); |
| | | for (FeeDto tmpFeeDto : feeDtos) { |
| | | try { |
| | | computeFeeSMOImpl.computeEveryOweFee(tmpFeeDto);//计算欠费金额 |
| | | if (!StringUtil.isEmpty(tmpFeeDto.getAdditionalAmount())) { |
| | | tmpFeeDto.setAdditionalAmount(Double.parseDouble(tmpFeeDto.getAdditionalAmount()) + ""); |
| | | } |
| | | if (!StringUtil.isEmpty(tmpFeeDto.getSquarePrice())) { |
| | | tmpFeeDto.setSquarePrice(Double.parseDouble(tmpFeeDto.getSquarePrice()) + ""); |
| | | } |
| | | |
| | | //todo 有目标结束时间,并且不是一次性费用 |
| | | if (!StringUtil.isEmpty(feeDto.getTargetEndTime()) |
| | | && !FeeDto.FEE_FLAG_ONCE.equals(tmpFeeDto.getFeeFlag()) |
| | | ) { |
| | | computeFeeSMOImpl.computeEveryOweFeeByTargetEndTime(tmpFeeDto, feeDto.getTargetEndTime());//计算欠费金额 |
| | | } else { |
| | | computeFeeSMOImpl.computeEveryOweFee(tmpFeeDto);//计算欠费金额 |
| | | } |
| | | //如果金额为0 就排除 |
| | | tmpFeeDto.setFeeTotalPrice( |
| | | MoneyUtil.computePriceScale( |
| | |
| | | ); |
| | | |
| | | tmpFeeDto.setVal(val); |
| | | if (tmpFeeDto.getFeePrice() > 0) { |
| | | if (tmpFeeDto.getFeeTotalPrice() != 0) { |
| | | tmpFeeDtos.add(tmpFeeDto); |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | |
| | | List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto); |
| | | |
| | | if (feeDtos == null || feeDtos.size() < 1) { |
| | | if (ListUtil.isNull(feeDtos)) { |
| | | return ResultVo.success(); |
| | | } |
| | | String cycel = null; |
| | |
| | | customStartTime = feeDto.getCustomStartTime(); |
| | | customEndTime = feeDto.getCustomEndTime(); |
| | | feeDto = feeDtos.get(0); |
| | | //todo 考虑账单模式 |
| | | if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && StringUtil.isNumber(feeDto.getMonthCycle())) { |
| | | cycel = feeDto.getMonthCycle(); |
| | | } |
| | | if (!StringUtil.isEmpty(cycel)) { |
| | | feeDto.setCycle(cycel); |
| | | } |
| | |
| | | throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据"); |
| | | } |
| | | roomDto = roomDtos.get(0); |
| | | feeDto.setPayerObjName(roomDto.getFloorNum() + "栋" + roomDto.getUnitNum() + "单元" + roomDto.getRoomNum() + "室"); |
| | | feeDto.setPayerObjName(roomDto.getFloorNum() + "-" + roomDto.getUnitNum() + "-" + roomDto.getRoomNum()); |
| | | feeDto.setBuiltUpArea(roomDto.getBuiltUpArea()); |
| | | |
| | | } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//车位相关 |
| | |
| | | parkingSpaceDto.setCommunityId(feeDto.getCommunityId()); |
| | | parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId()); |
| | | List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto); |
| | | if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题 |
| | | if (ListUtil.isNull(parkingSpaceDtos)) { //数据有问题 |
| | | throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到停车位信息,查询多条数据"); |
| | | } |
| | | ownerCarDto = ownerCarDtos.get(0); |
| | |
| | | Integer.parseInt(feeDto.getDecimalPlace()) |
| | | ) |
| | | ); |
| | | |
| | | if (!StringUtil.isEmpty(custEndTime)) { |
| | | Date date = DateUtil.getDateFromStringB(custEndTime); |
| | | computeFeeSMOImpl.dealRentRateCustEndTime(feeDto, date); |
| | |
| | | //去掉多余0 |
| | | feeDto.setSquarePrice(Double.parseDouble(feeDto.getSquarePrice()) + ""); |
| | | feeDto.setAdditionalAmount(Double.parseDouble(feeDto.getAdditionalAmount()) + ""); |
| | | return ResultVo.createResponseEntity(feeDto); |
| | | ApiFeeDataVo apiFeeDataVo = BeanConvertUtil.covertBeanList(feeDtos, ApiFeeDataVo.class).get(0); |
| | | apiFeeDataVo.setStartTime(apiFeeDataVo.getStartTime() == null ? null : apiFeeDataVo.getStartTime().split(" ")[0]); |
| | | apiFeeDataVo.setEndTime(apiFeeDataVo.getEndTime() == null ? null : apiFeeDataVo.getEndTime().split(" ")[0]); |
| | | apiFeeDataVo.setMaxEndTime(apiFeeDataVo.getMaxEndTime() == null ? null : apiFeeDataVo.getMaxEndTime().split(" ")[0]); |
| | | apiFeeDataVo.setDeadlineTime(apiFeeDataVo.getDeadlineTime() == null ? null : apiFeeDataVo.getDeadlineTime().split(" ")[0]); |
| | | if (cycel != null && !"105".equals(cycel)) { // 修正字符串比较方式 |
| | | Date date = feeDto.getEndTime(); |
| | | if (date != null) { // 增加空值检查 |
| | | LocalDateTime localDateTime; |
| | | |
| | | // 处理 java.sql.Date 不支持 toInstant() 的问题 |
| | | if (date instanceof java.sql.Date) { |
| | | // 对于 sql.Date,先转换为 LocalDate 再转为 LocalDateTime |
| | | LocalDate localDate = ((java.sql.Date) date).toLocalDate(); |
| | | localDateTime = localDate.atStartOfDay(); |
| | | } else { |
| | | // 对于 util.Date,正常转换 |
| | | localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); |
| | | } |
| | | |
| | | try { |
| | | // 增加x个月 |
| | | int monthsToAdd = Integer.parseInt(cycel); |
| | | LocalDateTime newLocalDateTime = localDateTime.plusMonths(monthsToAdd).minusDays(1); |
| | | |
| | | // 转换回Date |
| | | Date newDate = Date.from(newLocalDateTime.atZone(ZoneId.systemDefault()).toInstant()); |
| | | apiFeeDataVo.setPayStartDate(feeDto.getEndTime()); |
| | | apiFeeDataVo.setPayEndDate(newDate); |
| | | } catch (NumberFormatException e) { |
| | | // 处理cycel无法转换为整数的异常 |
| | | // 可以根据实际需求记录日志或抛出自定义异常 |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | }else{ |
| | | apiFeeDataVo.setPayStartDate(DateUtil.getDateFromStringB(feeDto.getCustomStartTime())); |
| | | // 获取原始日期 |
| | | Date originalDate = DateUtil.getDateFromStringB(feeDto.getCustomEndTime()); |
| | | if (originalDate != null) { |
| | | // 创建Calendar实例并设置日期 |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.setTime(originalDate); |
| | | |
| | | // 减一天 |
| | | calendar.add(Calendar.DAY_OF_MONTH, -1); |
| | | |
| | | // 获取处理后的日期 |
| | | Date dateMinusOneDay = calendar.getTime(); |
| | | apiFeeDataVo.setPayEndDate(dateMinusOneDay); |
| | | } |
| | | } |
| | | //计算MaxEndTime和payStartDate之间的月数 |
| | | int monthCount = DateUtil.calculateMonths(DateUtil.getFormatTimeStringB(apiFeeDataVo.getPayStartDate()), apiFeeDataVo.getMaxEndTime()); |
| | | apiFeeDataVo.setMonthCount(monthCount); |
| | | return ResultVo.createResponseEntity(apiFeeDataVo); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | private void dealFeePs(ParkingSpaceDto tmpParkingSpaceDto, FeeDto feeDto) { |
| | | // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间 |
| | | Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto); |
| | | Map<String, Object> targetEndDateAndOweMonth = computeFeeSMOImpl.getTargetEndDateAndOweMonth(feeDto); |
| | | Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate"); |
| | | double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth"); |
| | | if (!tmpParkingSpaceDto.getPsId().equals(feeDto.getPayerObjId())) { |
| | |
| | | } |
| | | |
| | | private void dealFeeRoom(RoomDto tmpRoomDto, FeeDto feeDto) { |
| | | Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto); |
| | | Map<String, Object> targetEndDateAndOweMonth = computeFeeSMOImpl.getTargetEndDateAndOweMonth(feeDto); |
| | | Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate"); |
| | | double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth"); |
| | | if (!tmpRoomDto.getRoomId().equals(feeDto.getPayerObjId())) { |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | private Map getTargetEndDateAndOweMonth(FeeDto feeDto) { |
| | | Date targetEndDate = null; |
| | | double oweMonth = 0.0; |
| | | |
| | | Map<String, Object> targetEndDateAndOweMonth = new HashMap<>(); |
| | | |
| | | if (FeeDto.STATE_FINISH.equals(feeDto.getState())) { |
| | | targetEndDate = feeDto.getEndTime(); |
| | | targetEndDateAndOweMonth.put("oweMonth", oweMonth); |
| | | targetEndDateAndOweMonth.put("targetEndDate", targetEndDate); |
| | | return targetEndDateAndOweMonth; |
| | | } |
| | | if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) { |
| | | if (feeDto.getDeadlineTime() != null) { |
| | | targetEndDate = feeDto.getDeadlineTime(); |
| | | } else if (!StringUtil.isEmpty(feeDto.getCurDegrees())) { |
| | | targetEndDate = feeDto.getCurReadingTime(); |
| | | } else if (feeDto.getImportFeeEndTime() == null) { |
| | | targetEndDate = feeDto.getConfigEndTime(); |
| | | } else { |
| | | targetEndDate = feeDto.getImportFeeEndTime(); |
| | | } |
| | | //判断当前费用是不是导入费用 |
| | | oweMonth = 1.0; |
| | | |
| | | } else { |
| | | //当前时间 |
| | | Date billEndTime = DateUtil.getCurrentDate(); |
| | | //开始时间 |
| | | Date startDate = feeDto.getStartTime(); |
| | | //到期时间 |
| | | Date endDate = feeDto.getEndTime(); |
| | | if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) { |
| | | OwnerCarDto ownerCarDto = new OwnerCarDto(); |
| | | ownerCarDto.setCommunityId(feeDto.getCommunityId()); |
| | | ownerCarDto.setCarId(feeDto.getPayerObjId()); |
| | | List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto); |
| | | |
| | | if (ownerCarDtos == null || ownerCarDtos.size() != 1) { |
| | | targetEndDateAndOweMonth.put("oweMonth", 0); |
| | | targetEndDateAndOweMonth.put("targetEndDate", ""); |
| | | return targetEndDateAndOweMonth; |
| | | } |
| | | |
| | | targetEndDate = ownerCarDtos.get(0).getEndTime(); |
| | | //说明没有欠费 |
| | | if (endDate.getTime() >= targetEndDate.getTime()) { |
| | | // 目标到期时间 - 到期时间 = 欠费月份 |
| | | oweMonth = 0; |
| | | targetEndDateAndOweMonth.put("oweMonth", oweMonth); |
| | | targetEndDateAndOweMonth.put("targetEndDate", targetEndDate); |
| | | return targetEndDateAndOweMonth; |
| | | } |
| | | } |
| | | |
| | | //缴费周期 |
| | | long paymentCycle = Long.parseLong(feeDto.getPaymentCycle()); |
| | | // 当前时间 - 开始时间 = 月份 |
| | | double mulMonth = 0.0; |
| | | mulMonth = DateUtil.dayCompare(startDate, billEndTime); |
| | | |
| | | // 月份/ 周期 = 轮数(向上取整) |
| | | double round = 0.0; |
| | | if ("1200".equals(feeDto.getPaymentCd())) { // 预付费 |
| | | round = Math.floor(mulMonth / paymentCycle) + 1; |
| | | } else { //后付费 |
| | | round = Math.floor(mulMonth / paymentCycle); |
| | | } |
| | | // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间 |
| | | targetEndDate = getTargetEndTime(round * paymentCycle, startDate); |
| | | //费用 快结束了 |
| | | if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) { |
| | | targetEndDate = feeDto.getConfigEndTime(); |
| | | } |
| | | //说明没有欠费 |
| | | if (endDate.getTime() < targetEndDate.getTime()) { |
| | | // 目标到期时间 - 到期时间 = 欠费月份 |
| | | oweMonth = DateUtil.dayCompare(endDate, targetEndDate); |
| | | } |
| | | |
| | | if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) { |
| | | targetEndDate = feeDto.getEndTime(); |
| | | } |
| | | } |
| | | |
| | | targetEndDateAndOweMonth.put("oweMonth", oweMonth); |
| | | targetEndDateAndOweMonth.put("targetEndDate", targetEndDate); |
| | | return targetEndDateAndOweMonth; |
| | | } |
| | | |
| | | private Date getTargetEndTime(double v, Date startDate) { |
| | | Calendar endDate = Calendar.getInstance(); |