|
|
|
@@ -2324,20 +2324,11 @@ public class WxRentContractServiceImpl implements WxRentContractService { |
|
|
|
}
|
|
|
|
|
|
|
|
private BigDecimal calcuteUnitPrice(Date startDate,Date endDate,BigDecimal salesDeciaml,Integer priceUnit,
|
|
|
|
Integer dayPriceCalcute,Integer mothAverageDays,Integer receivePeriod,Integer receivePeriodUnit) {
|
|
|
|
Integer dayPriceCalcute,Integer mothAverageDays,Integer adjustPeriod,Integer receivePeriodUnit) {
|
|
|
|
BigDecimal unitPrice = new BigDecimal(0);
|
|
|
|
|
|
|
|
//是否正好为一个周期
|
|
|
|
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
Calendar instance = Calendar.getInstance();
|
|
|
|
instance.setTime(startDate);
|
|
|
|
instance = EnumContractReceivePeriodUnit.getAfterCalendarDay(instance, receivePeriod, receivePeriodUnit);
|
|
|
|
boolean isPeriodEnd= false;
|
|
|
|
if(sd.format(instance.getTime()).equals(sd.format(endDate))){
|
|
|
|
isPeriodEnd = true;
|
|
|
|
}
|
|
|
|
Date realEndStart = DateUtils.getDaySet(endDate, Calendar.SECOND, 1);
|
|
|
|
int[] diffs = DateUtils.getDiff(startDate, realEndStart);
|
|
|
|
Date realEndStart = DateUtils.getDaySet(endDate, Calendar.SECOND, 1);
|
|
|
|
int[] diffs = DateUtils.getDiff(startDate, realEndStart);
|
|
|
|
if (priceUnit.equals(EnumPriceUnit.D.getCode())){
|
|
|
|
int allDays = 0;
|
|
|
|
if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) {
|
|
|
|
@@ -2349,58 +2340,98 @@ public class WxRentContractServiceImpl implements WxRentContractService { |
|
|
|
unitPrice = salesDeciaml.divide(new BigDecimal(allDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}else if(EnumPriceUnit.Y.getCode().equals(priceUnit)) {
|
|
|
|
//按照当前金额,当前时间区间,计算每一年的单价
|
|
|
|
//如果是一个周期结束,则
|
|
|
|
if (isPeriodEnd) {
|
|
|
|
//判断是不是一个完整的周期
|
|
|
|
//按月,那就得、12
|
|
|
|
unitPrice = salesDeciaml.multiply(new BigDecimal(12)).divide(new BigDecimal(diffs[0]),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
//当前时间有多少个月
|
|
|
|
int months = diffs[0];
|
|
|
|
//计算当前区间算多少年
|
|
|
|
if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) {
|
|
|
|
int days = DateUtils.daysBetween(startDate, endDate)+1;
|
|
|
|
BigDecimal _months = new BigDecimal(days).divide(new BigDecimal(mothAverageDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP).add(new BigDecimal(months));
|
|
|
|
unitPrice = salesDeciaml.multiply(new BigDecimal(12)).divide(_months,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}else {
|
|
|
|
//当前时间有多少个月
|
|
|
|
int months = diffs[0];
|
|
|
|
int days = diffs[1];
|
|
|
|
//计算当前区间算多少年
|
|
|
|
if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) {
|
|
|
|
BigDecimal _months = new BigDecimal(days).divide(new BigDecimal(mothAverageDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP).add(new BigDecimal(months));
|
|
|
|
unitPrice = salesDeciaml.multiply(new BigDecimal(12)).divide(_months,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}else {
|
|
|
|
Date lastMonthStartDate = DateUtils.getDaySet(startDate, Calendar.MONTH, months);
|
|
|
|
int realDays = DateUtils.daysBetween(lastMonthStartDate, endDate)+1;
|
|
|
|
Date extraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(lastMonthStartDate);
|
|
|
|
Date extraStartDayMonthEnd = DateUtils.getLastDayForMonth(lastMonthStartDate);
|
|
|
|
int monthDays = DateUtils.daysBetween(extraStartDayMonthStart, extraStartDayMonthEnd)+1;
|
|
|
|
BigDecimal _months = new BigDecimal(realDays).divide(new BigDecimal(monthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP).add(new BigDecimal(months));
|
|
|
|
unitPrice = salesDeciaml.multiply(new BigDecimal(12)).divide(_months,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BigDecimal _months = getMonthsByRealDays(months,startDate,endDate,mothAverageDays,adjustPeriod,receivePeriodUnit);
|
|
|
|
unitPrice = salesDeciaml.multiply(new BigDecimal(12)).divide(_months,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}
|
|
|
|
}else if(EnumPriceUnit.M.getCode().equals(priceUnit)) {
|
|
|
|
if (isPeriodEnd) {
|
|
|
|
//按月
|
|
|
|
unitPrice = salesDeciaml.divide(new BigDecimal(diffs[0]),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
//每一月的单价
|
|
|
|
BigDecimal months = new BigDecimal(diffs[0]);
|
|
|
|
if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) {
|
|
|
|
int days = DateUtils.daysBetween(startDate, endDate)+1;
|
|
|
|
months = new BigDecimal(days).divide(new BigDecimal(mothAverageDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}else {
|
|
|
|
//每一月的单价
|
|
|
|
BigDecimal months = new BigDecimal(diffs[0]);
|
|
|
|
if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) {
|
|
|
|
months = months.add(new BigDecimal(diffs[1]).divide(new BigDecimal(mothAverageDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}else {
|
|
|
|
Date extraStartDay = DateUtils.getTimeAfterMonths(diffs[0], startDate);
|
|
|
|
int extraDays = DateUtils.daysBetween(extraStartDay, realEndStart)+1;
|
|
|
|
Date extraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(extraStartDay);
|
|
|
|
Date extraStartDayMonthEnd = DateUtils.getLastDayForMonth(extraStartDay);
|
|
|
|
int monthDays = DateUtils.daysBetween(extraStartDayMonthStart, extraStartDayMonthEnd)+1;
|
|
|
|
months = months.add(new BigDecimal(extraDays).divide(new BigDecimal(monthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}
|
|
|
|
//每一天的单价
|
|
|
|
unitPrice = salesDeciaml.divide(months,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}
|
|
|
|
months = getMonthsByRealDays(diffs[0],startDate,endDate,mothAverageDays,adjustPeriod,receivePeriodUnit);
|
|
|
|
}
|
|
|
|
unitPrice = salesDeciaml.divide(months,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP);
|
|
|
|
}
|
|
|
|
return unitPrice;
|
|
|
|
}
|
|
|
|
|
|
|
|
private BigDecimal getMonthsByRealDays(int months,Date startDate,Date endDate,Integer mothAverageDays,Integer adjustPeriod,Integer receivePeriodUnit) {
|
|
|
|
BigDecimal _months = new BigDecimal(0);
|
|
|
|
//如果是自然月或者自然季度,则是到月底
|
|
|
|
if (adjustPeriod == EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode() ||
|
|
|
|
receivePeriodUnit == EnumContractReceivePeriodUnit.QUARTER.getCode()) {
|
|
|
|
//需要查询到真实的自然月份有多少
|
|
|
|
Date startFirstDay = DateUtils.getFirstDayForCurrMonth(startDate);
|
|
|
|
Date endLastStartDay = DateUtils.getLastDayForMonth(endDate);
|
|
|
|
int[] rdiffs = DateUtils.getDiff(startFirstDay, endLastStartDay);
|
|
|
|
int rmonths = rdiffs[0];
|
|
|
|
if (rmonths > 0 ) {
|
|
|
|
//第一个个月是start到月底,最后一个是1号到end
|
|
|
|
Date startLastDay = DateUtils.getLastDayForMonth(startDate);
|
|
|
|
int firstdays = DateUtils.daysBetween(startDate, startLastDay)+1;
|
|
|
|
int firstmonthdays = DateUtils.daysBetween(startFirstDay, startLastDay)+1;
|
|
|
|
_months = _months.add(new BigDecimal(firstdays).divide(new BigDecimal(firstmonthdays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
if (rmonths == 1) {
|
|
|
|
Date endFirstDay = DateUtils.getDaySet(startLastDay, Calendar.SECOND, 1);
|
|
|
|
int enddays = DateUtils.daysBetween(endFirstDay, endDate)+1;
|
|
|
|
Date endlastday = DateUtils.getLastDayForMonth(endDate);
|
|
|
|
int endmonthdays = DateUtils.daysBetween(endFirstDay, endlastday)+1;
|
|
|
|
_months = _months.add(new BigDecimal(enddays).divide(new BigDecimal(endmonthdays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}else {
|
|
|
|
_months = _months.add(new BigDecimal(rmonths-1));
|
|
|
|
Date endFirstDay = DateUtils.getDaySet(DateUtils.getDaySet(startLastDay, Calendar.MONTH, rmonths-1), Calendar.SECOND, 1);
|
|
|
|
int enddays = DateUtils.daysBetween(endFirstDay, endDate)+1;
|
|
|
|
Date endlastday = DateUtils.getLastDayForMonth(endDate);
|
|
|
|
int endmonthdays = DateUtils.daysBetween(endFirstDay, endlastday)+1;
|
|
|
|
_months = _months.add(new BigDecimal(enddays).divide(new BigDecimal(endmonthdays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
//相当于在同一个月份
|
|
|
|
int days = DateUtils.daysBetween(startDate, endDate)+1;
|
|
|
|
Date startLastDay = DateUtils.getLastDayForMonth(startDate);
|
|
|
|
int monthdays = DateUtils.daysBetween(startDate, startLastDay)+1;
|
|
|
|
_months = _months.add(new BigDecimal(days).divide(new BigDecimal(monthdays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
_months = _months.add(new BigDecimal(months));
|
|
|
|
Date prelastMonthStartDate = DateUtils.getDaySet(startDate, Calendar.MONTH, months);
|
|
|
|
Date extraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(prelastMonthStartDate);
|
|
|
|
Date extraStartDayMonthEnd = DateUtils.getLastDayForMonth(prelastMonthStartDate);
|
|
|
|
int premonthDays = DateUtils.daysBetween(extraStartDayMonthStart, extraStartDayMonthEnd)+1;
|
|
|
|
int prelastdays = 0;
|
|
|
|
if (extraStartDayMonthEnd.after(endDate) || extraStartDayMonthEnd.equals(endDate)) {
|
|
|
|
prelastdays = DateUtils.daysBetween(prelastMonthStartDate, endDate)+1;
|
|
|
|
_months = _months.add(new BigDecimal(prelastdays).divide(new BigDecimal(premonthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}else {
|
|
|
|
prelastdays = DateUtils.daysBetween(prelastMonthStartDate, extraStartDayMonthEnd)+1;
|
|
|
|
_months = _months.add(new BigDecimal(prelastdays).divide(new BigDecimal(premonthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
//跨月
|
|
|
|
Date lastMonthStart = DateUtils.getDaySet(extraStartDayMonthEnd, Calendar.SECOND, 1);
|
|
|
|
int lastdays = DateUtils.daysBetween(lastMonthStart, endDate)+1;
|
|
|
|
Date lastextraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(lastMonthStart);
|
|
|
|
Date lastextraStartDayMonthEnd = DateUtils.getLastDayForMonth(lastMonthStart);
|
|
|
|
int lastmonthDays = DateUtils.daysBetween(lastextraStartDayMonthStart, lastextraStartDayMonthEnd)+1;
|
|
|
|
_months = _months.add(new BigDecimal(lastdays).divide(new BigDecimal(lastmonthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return _months;
|
|
|
|
}
|
|
|
|
|
|
|
|
//根据租金合同来计算附加物业费
|
|
|
|
private BigDecimal calcuteRentPropertyPrice(WxRentContract rentcontract,WxPropertyContract propertyContract,Date startDate,Date endDate,BigDecimal money) {
|
|
|
|
//计算物业费的单价
|
|
|
|
BigDecimal unitPropertyPrice = calcuteUnitPrice(startDate, endDate,money,
|
|
|
|
propertyContract.getPriceUnit(),propertyContract.getDayPriceCalcute(),propertyContract.getMonthAverageDays(),propertyContract.getReceivePeriod(),propertyContract.getReceivePeriodUnit());
|
|
|
|
propertyContract.getPriceUnit(),propertyContract.getDayPriceCalcute(),propertyContract.getMonthAverageDays(),propertyContract.getAdjustPeriod(),propertyContract.getReceivePeriodUnit());
|
|
|
|
//如果租金是按天计算
|
|
|
|
if (rentcontract.getPriceUnit().equals(EnumPriceUnit.D.getCode())){
|
|
|
|
//物业也是按天
|
|
|
|
@@ -2441,14 +2472,24 @@ public class WxRentContractServiceImpl implements WxRentContractService { |
|
|
|
}else {
|
|
|
|
//此处就无法计算月了。
|
|
|
|
//计算月份值。
|
|
|
|
int[] diffs = DateUtils.getDiff(startDate, endDate);
|
|
|
|
Date realEndStart = DateUtils.getDaySet(endDate, Calendar.SECOND, 1);
|
|
|
|
int[] diffs = DateUtils.getDiff(startDate, realEndStart);
|
|
|
|
BigDecimal months = new BigDecimal(diffs[0]);
|
|
|
|
Date extraStartDay = DateUtils.getTimeAfterMonths(diffs[0], startDate);
|
|
|
|
int extraDays = DateUtils.daysBetween(extraStartDay, endDate)+1;
|
|
|
|
Date extraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(extraStartDay);
|
|
|
|
Date extraStartDayMonthEnd = DateUtils.getLastDayForMonth(extraStartDay);
|
|
|
|
Date preextraStartDay = DateUtils.getTimeAfterMonths(diffs[0], startDate);
|
|
|
|
Date extraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(preextraStartDay);
|
|
|
|
Date extraStartDayMonthEnd = DateUtils.getLastDayForMonth(preextraStartDay);
|
|
|
|
int monthDays = DateUtils.daysBetween(extraStartDayMonthStart, extraStartDayMonthEnd)+1;
|
|
|
|
months = months.add(new BigDecimal(extraDays).divide(new BigDecimal(monthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
int predays = DateUtils.daysBetween(preextraStartDay, extraStartDayMonthEnd)+1;
|
|
|
|
months = months.add(new BigDecimal(predays).divide(new BigDecimal(monthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
//有可能会跨月
|
|
|
|
if (extraStartDayMonthEnd.before(endDate)) {
|
|
|
|
Date lastMonthStart = DateUtils.getDaySet(extraStartDayMonthEnd, Calendar.SECOND, 1);
|
|
|
|
int lastdays = DateUtils.daysBetween(lastMonthStart, endDate)+1;
|
|
|
|
Date lastextraStartDayMonthStart = DateUtils.getFirstDayForCurrMonth(lastMonthStart);
|
|
|
|
Date lastextraStartDayMonthEnd = DateUtils.getLastDayForMonth(lastMonthStart);
|
|
|
|
int lastmonthDays = DateUtils.daysBetween(lastextraStartDayMonthStart, lastextraStartDayMonthEnd)+1;
|
|
|
|
months = months.add(new BigDecimal(lastdays).divide(new BigDecimal(lastmonthDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP));
|
|
|
|
}
|
|
|
|
return unitPropertyPrice.multiply(months);
|
|
|
|
}
|
|
|
|
}else if (propertyContract.getPriceUnit().equals(EnumPriceUnit.Y.getCode())) {
|
|
|
|
@@ -2521,7 +2562,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { |
|
|
|
propertyBillq.setEnergyFeesId(EnumBillAllType.PROPERTY.getEnergyFeesId());
|
|
|
|
propertyBillq.setIsPreview(EnumYesOrNo.NO.getCode());
|
|
|
|
propertyBillq.setStarttimeEqual(rentBill.getStarttime());
|
|
|
|
propertyBillq.setStarttimeEqual(rentBill.getEndtime());
|
|
|
|
propertyBillq.setEndtimeEqual(rentBill.getEndtime());
|
|
|
|
List<WxAllBill> propertyBillList = wxAllBillMapper.findList(propertyBillq);
|
|
|
|
if (null != propertyBillList && propertyBillList.size() > 0) {
|
|
|
|
propertyBill = propertyBillList.get(0);
|
|
|
|
@@ -2530,7 +2571,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { |
|
|
|
|
|
|
|
//根据销售额来计算价格均值
|
|
|
|
BigDecimal unitRevenuePrice = calcuteUnitPrice(rentBill.getStarttime(), rentBill.getEndtime(),salesDeciaml,
|
|
|
|
rentcontract.getPriceUnit(),rentcontract.getDayPriceCalcute(),rentcontract.getMonthAverageDays(),rentcontract.getReceivePeriod(),rentcontract.getReceivePeriodUnit());
|
|
|
|
rentcontract.getPriceUnit(),rentcontract.getDayPriceCalcute(),rentcontract.getMonthAverageDays(),rentcontract.getAdjustPeriod(),rentcontract.getReceivePeriodUnit());
|
|
|
|
//设置保底营业额
|
|
|
|
rentcontract.setRevenue(unitRevenuePrice.toPlainString());
|
|
|
|
//联营扣点
|
|
|
|
@@ -2544,7 +2585,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { |
|
|
|
BigDecimal rentPrice = new BigDecimal(rentcontract.getPrice());
|
|
|
|
//有可能物业的单价时间跟租金的不一致,需要根据物业的单价重新计算
|
|
|
|
BigDecimal propertyPrice = calcuteRentPropertyPrice(rentcontract, propertyContract, rentBill.getStarttime(), rentBill.getEndtime(),
|
|
|
|
new BigDecimal(propertyBill.getReceivePay()));
|
|
|
|
new BigDecimal(propertyBill.getNeedPay()));
|
|
|
|
|
|
|
|
rentcontract.setPrice(rentPrice.add(propertyPrice).toPlainString());; |
|
|
|
}
|
|
|
|
|