合同开始日期:2023-01-01,结束日期:2026-01-01,免租起始期:2023-01-01,免租终止日期:023-01-31,计费面积:100平方米,月租单价20/平方米,计算方式:按1个月计算一次,收款方式为按3个月收一次,提前收款期为1个月,基本租期1年,超过基本租期后按1年一个递增周期,递增周期内月租单价按上一周期内月租单价递增一次,年递增率为6%,按java7的语法:按计算方式产生合同期内含收款日期、租期起始日期、租期终止日期、租期单价、租期(月数)租金的计划列表,生成一个完整示例并配上代码说明
时间: 2023-12-23 13:05:40 浏览: 96
好的,以下是按照你给出的要求生成的一个示例及代码说明:
```java
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
public class RentCalculator {
// 合同开始日期
private static final LocalDate START_DATE = LocalDate.of(2023, 1, 1);
// 合同结束日期
private static final LocalDate END_DATE = LocalDate.of(2026, 1, 1);
// 免租起始日期
private static final LocalDate FREE_START_DATE = LocalDate.of(2023, 1, 1);
// 免租终止日期
private static final LocalDate FREE_END_DATE = LocalDate.of(2023, 1, 31);
// 计费面积
private static final BigDecimal AREA = BigDecimal.valueOf(100);
// 月租单价
private static final BigDecimal UNIT_PRICE = BigDecimal.valueOf(20);
// 计算方式:按1个月计算一次
private static final int CALCULATE_INTERVAL = 1;
// 收款方式:按3个月收一次
private static final int PAYMENT_INTERVAL = 3;
// 提前收款期:1个月
private static final int ADVANCE_PAYMENT_PERIOD = 1;
// 基本租期:1年
private static final int BASE_RENTAL_PERIOD = 12;
// 递增周期:1年
private static final int INCREASE_PERIOD = 12;
// 年递增率:6%
private static final double ANNUAL_INCREASE_RATE = 0.06;
/**
* 计算合同期内含收款日期、租期起始日期、租期终止日期、租期单价、租期(月数)租金的计划列表
* @return 租金计划列表
*/
public static List<RentalPlan> calculateRentalPlan() {
List<RentalPlan> planList = new ArrayList<>();
LocalDate startDate = START_DATE;
LocalDate endDate = startDate.plusMonths(BASE_RENTAL_PERIOD).minusDays(1);
BigDecimal unitPrice = UNIT_PRICE;
int period = BASE_RENTAL_PERIOD;
BigDecimal rental = calculateRental(startDate, endDate, unitPrice, AREA);
planList.add(new RentalPlan(startDate, endDate, startDate, endDate, unitPrice, period, rental));
while (endDate.isBefore(END_DATE)) {
startDate = endDate.plusDays(1);
// 计算新的租期单价
unitPrice = calculateUnitPrice(unitPrice);
endDate = startDate.plusMonths(INCREASE_PERIOD).minusDays(1);
// 计算新的租期
period = calculatePeriod(startDate, endDate);
rental = calculateRental(startDate, endDate, unitPrice, AREA);
planList.add(new RentalPlan(startDate, endDate, startDate, endDate, unitPrice, period, rental));
}
return planList;
}
/**
* 计算租期单价
* @param unitPrice 上一个周期的租期单价
* @return 本周期的租期单价
*/
private static BigDecimal calculateUnitPrice(BigDecimal unitPrice) {
return unitPrice.multiply(BigDecimal.ONE.add(BigDecimal.valueOf(ANNUAL_INCREASE_RATE)));
}
/**
* 计算租期(月数)
* @param startDate 租期起始日期
* @param endDate 租期终止日期
* @return 租期(月数)
*/
private static int calculatePeriod(LocalDate startDate, LocalDate endDate) {
return (int) ChronoUnit.MONTHS.between(startDate, endDate) + 1;
}
/**
* 计算租金
* @param startDate 租期起始日期
* @param endDate 租期终止日期
* @param unitPrice 租期单价
* @param area 计费面积
* @return 租金
*/
private static BigDecimal calculateRental(LocalDate startDate, LocalDate endDate, BigDecimal unitPrice, BigDecimal area) {
int period = calculatePeriod(startDate, endDate);
return unitPrice.multiply(area).multiply(BigDecimal.valueOf(period));
}
public static void main(String[] args) {
List<RentalPlan> planList = calculateRentalPlan();
// 打印租金计划列表
for (RentalPlan plan : planList) {
System.out.println(plan);
}
}
}
/**
* 租金计划
*/
class RentalPlan {
// 含收款日期
private LocalDate paymentDate;
// 租期起始日期
private LocalDate startDate;
// 租期终止日期
private LocalDate endDate;
// 租期单价
private BigDecimal unitPrice;
// 租期(月数)
private int period;
// 租金
private BigDecimal rental;
public RentalPlan(LocalDate paymentDate, LocalDate startDate, LocalDate endDate, BigDecimal unitPrice, int period, BigDecimal rental) {
this.paymentDate = paymentDate;
this.startDate = startDate;
this.endDate = endDate;
this.unitPrice = unitPrice;
this.period = period;
this.rental = rental;
}
public LocalDate getPaymentDate() {
return paymentDate;
}
public LocalDate getStartDate() {
return startDate;
}
public LocalDate getEndDate() {
return endDate;
}
public BigDecimal getUnitPrice() {
return unitPrice;
}
public int getPeriod() {
return period;
}
public BigDecimal getRental() {
return rental;
}
@Override
public String toString() {
return "RentalPlan{" +
"paymentDate=" + paymentDate +
", startDate=" + startDate +
", endDate=" + endDate +
", unitPrice=" + unitPrice +
", period=" + period +
", rental=" + rental +
'}';
}
}
```
代码说明:
1. 定义了一个 `RentCalculator` 类,其中包含了计算租金计划的方法 `calculateRentalPlan`。
2. 租金计划使用 `RentalPlan` 类表示,包含了租金计划中的各项信息。
3. `calculateRentalPlan` 方法实现了租金计划的计算逻辑:
- 首先计算基本租期内的租金计划,并加入到租金计划列表中。
- 然后根据递增周期不断计算新的租期和租期单价,并加入到租金计划列表中,直到计算到合同结束日期为止。
4. 租期单价和租期的计算分别使用了 `calculateUnitPrice` 和 `calculatePeriod` 方法。
5. 租金的计算使用了 `calculateRental` 方法。
6. 在 `main` 方法中,调用 `calculateRentalPlan` 方法生成租金计划列表,并打印出来。
阅读全文