winter 1 год назад
Родитель
Сommit
6bc9cce43b
3 измененных файлов: 119 добавлений и 74 удалений
  1. +1
    -1
      mallinkService/src/main/java/com/iformall/domain/po/WxPropertyContract.java
  2. +15
    -11
      mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java
  3. +103
    -62
      mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java

+ 1
- 1
mallinkService/src/main/java/com/iformall/domain/po/WxPropertyContract.java Просмотреть файл

@@ -161,7 +161,7 @@ public class WxPropertyContract extends TenantEntity {
@io.swagger.annotations.ApiModelProperty(value = "租赁商铺类型", name = "rentShopType")
private Integer rentShopType;

@io.swagger.annotations.ApiModelProperty(value = "计租周期", name = "计租周期")
@io.swagger.annotations.ApiModelProperty(value = "计租周期EnumRentContractAdjustPeriod", name = "计租周期")
private Integer adjustPeriod;

@TableField(exist = false)


+ 15
- 11
mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java Просмотреть файл

@@ -596,17 +596,21 @@ public class WxRentContractHelper {
}
public static void main(String[] args) {
Date start = DateUtils.str2Date("2024-08-01 00:00:00").getTime();
Date end = DateUtils.str2Date("2024-08-01 23:59:59").getTime();
int[] diffs = DateUtils.getDiff(start, end);
System.out.println(diffs[0]+">>>"+diffs[1]);
Date d1 = DateUtils.str2Date("2026-08-09 00:00:00").getTime();
Date d2 = DateUtils.str2Date("2026-09-08 00:00:00").getTime();
List<Date> f1 = DateUtils.getAllDays(d1, d2);
Date endMonthDate = DateUtils.getDaySet(start, Calendar.MONTH, 2);
System.out.println(DateUtils.date2String(endMonthDate));
Date start = DateUtils.str2Date("2024-08-14 00:00:00").getTime();
Date end = DateUtils.str2Date("2024-10-30 00:00:00").getTime();
Date startFirstDay = DateUtils.getFirstDayForCurrMonth(start);
Date endLastDay = DateUtils.getLastDayForMonth(end);
int[] rdiffs = DateUtils.getDiff(startFirstDay, endLastDay);
// int[] diffs = DateUtils.getDiff(start, end);
System.out.println(rdiffs[0]+">>>"+rdiffs[1]);
// System.out.println(DateUtils.daysBetween(start, end)+1);
//
// Date d1 = DateUtils.str2Date("2026-08-09 00:00:00").getTime();
// Date d2 = DateUtils.str2Date("2026-09-08 00:00:00").getTime();
// List<Date> f1 = DateUtils.getAllDays(d1, d2);
//
// Date endMonthDate = DateUtils.getDaySet(start, Calendar.MONTH, 2);
// System.out.println(DateUtils.date2String(endMonthDate));
// Date d3 = DateUtils.str2Date("2024-09-01 00:00:00").getTime();
// Date d4 = DateUtils.str2Date("2024-09-30 00:00:00").getTime();


+ 103
- 62
mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java Просмотреть файл

@@ -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());;
}


Загрузка…
Отмена
Сохранить