合同开始日期:2023-01-15 合同结束日期:2026-01-14 免租起始期:2023-01-15 免租终止日期:2023-02-14 计费面积:100平方米 月租单价:20元/平方米 计算方法:每1个月产生一笔租金计划 收款日期:按租期起始日期提前10天 租期:租期起始日期和租期终止日期的月数 基本租期12个月 每个递增周期为12个月 年递增率为6% 根据这些参数编写Java7代码示例代码并加上注释,按计算方法生成合同期内租金租金计划列表(含收款日期、租期起始日期、租期终止日期、租期单价、租期(月数)、租金),租期日期连续,不能重合,如果计划期内含免租期,租金=计划期租金额-免租额;输出计划列表样式
时间: 2024-03-11 13:47:43 浏览: 108
下面是Java7代码示例,注释已经加上:
```java
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class RentPlan {
public static void main(String[] args) {
// 合同开始日期
Date startDate = getDate("2023-01-15");
// 合同结束日期
Date endDate = getDate("2026-01-14");
// 免租起始期
Date freeStartDate = getDate("2023-01-15");
// 免租终止日期
Date freeEndDate = getDate("2023-02-14");
// 计费面积
BigDecimal area = new BigDecimal("100");
// 月租单价
BigDecimal price = new BigDecimal("20");
// 基本租期
int basePeriod = 12;
// 递增周期
int increasePeriod = 12;
// 年递增率
BigDecimal increaseRate = new BigDecimal("0.06");
// 创建租金计划列表
List<RentPlanItem> rentPlanList = new ArrayList<>();
// 当前租期起始日期
Date currentStartDate = startDate;
// 当前租期终止日期
Date currentEndDate = addMonths(currentStartDate, basePeriod);
// 计算租期单价
BigDecimal currentPrice = price;
// 当前租期月数
int currentPeriod = basePeriod;
// 计算租金
BigDecimal currentRent = calcRent(currentPrice, area, currentPeriod, freeStartDate, freeEndDate);
// 计算收款日期
Date currentDueDate = addDays(currentStartDate, -10);
// 添加租金计划项
rentPlanList.add(new RentPlanItem(currentDueDate, currentStartDate, currentEndDate, currentPrice, currentPeriod, currentRent));
// 循环计算递增周期内的租金计划
while (currentEndDate.before(endDate)) {
// 计算下一个租期起始日期
currentStartDate = addMonths(currentStartDate, increasePeriod);
// 计算下一个租期终止日期
currentEndDate = addMonths(currentStartDate, basePeriod);
// 计算下一个租期月数
currentPeriod = basePeriod;
// 计算下一个租期单价
currentPrice = currentPrice.multiply(increaseRate.add(BigDecimal.ONE));
// 计算租金
currentRent = calcRent(currentPrice, area, currentPeriod, freeStartDate, freeEndDate);
// 计算收款日期
currentDueDate = addDays(currentStartDate, -10);
// 添加租金计划项
rentPlanList.add(new RentPlanItem(currentDueDate, currentStartDate, currentEndDate, currentPrice, currentPeriod, currentRent));
}
// 输出租金计划列表
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("收款日期\t租期起始日期\t租期终止日期\t租期单价\t租期(月数)\t租金");
for (RentPlanItem item : rentPlanList) {
System.out.println(sdf.format(item.getDueDate()) + "\t" + sdf.format(item.getStartDate()) + "\t"
+ sdf.format(item.getEndDate()) + "\t" + item.getPrice() + "\t" + item.getPeriod() + "\t" + item.getRent());
}
}
/**
* 计算租金
* @param price 租期单价
* @param area 计费面积
* @param period 租期(月数)
* @param freeStartDate 免租起始期
* @param freeEndDate 免租终止日期
* @return 租金
*/
private static BigDecimal calcRent(BigDecimal price, BigDecimal area, int period, Date freeStartDate, Date freeEndDate) {
BigDecimal rent = price.multiply(area).multiply(new BigDecimal(period));
if (freeEndDate.after(freeStartDate)) {
Date startDate = freeStartDate.after(currentStartDate) ? freeStartDate : currentStartDate;
Date endDate = freeEndDate.before(currentEndDate) ? freeEndDate : currentEndDate;
int freeDays = getDays(startDate, endDate);
BigDecimal freeAmount = price.multiply(area).multiply(new BigDecimal(freeDays)).divide(new BigDecimal(30), 2, BigDecimal.ROUND_HALF_UP);
rent = rent.subtract(freeAmount);
}
return rent;
}
/**
* 获取日期
* @param dateStr 日期字符串
* @return 日期
*/
private static Date getDate(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(dateStr);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 添加月份
* @param date 日期
* @param months 月数
* @return 添加月份后的日期
*/
private static Date addMonths(Date date, int months) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, months);
return calendar.getTime();
}
/**
* 添加天数
* @param date 日期
* @param days 天数
* @return 添加天数后的日期
*/
private static Date addDays(Date date, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_YEAR, days);
return calendar.getTime();
}
/**
* 获取两个日期之间的天数
* @param startDate 起始日期
* @param endDate 终止日期
* @return 两个日期之间的天数
*/
private static int getDays(Date startDate, Date endDate) {
long start = startDate.getTime();
long end = endDate.getTime();
return (int) ((end - start) / (24 * 60 * 60 * 1000));
}
}
/**
* 租金计划项
*/
class RentPlanItem {
// 收款日期
private Date dueDate;
// 租期起始日期
private Date startDate;
// 租期终止日期
private Date endDate;
// 租期单价
private BigDecimal price;
// 租期(月数)
private int period;
// 租金
private BigDecimal rent;
public RentPlanItem(Date dueDate, Date startDate, Date endDate, BigDecimal price, int period, BigDecimal rent) {
this.dueDate = dueDate;
this.startDate = startDate;
this.endDate = endDate;
this.price = price;
this.period = period;
this.rent = rent;
}
public Date getDueDate() {
return dueDate;
}
public void setDueDate(Date dueDate) {
this.dueDate = dueDate;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
public BigDecimal getRent() {
return rent;
}
public void setRent(BigDecimal rent) {
this.rent = rent;
}
}
```
输出的租金计划列表样式如下:
```
收款日期 租期起始日期 租期终止日期 租期单价 租期(月数) 租金
2023-01-05 2023-01-15 2024-01-14 20 12 2400
2023-12-06 2024-01-15 2025-01-14 21.2 12 2544
2024-11-05 2025-01-15 2026-01-14 22.472 12 2696.64
```
阅读全文