diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxAllBill.java b/mallinkService/src/main/java/com/iformall/domain/po/WxAllBill.java index d81f3bd89..5b861495f 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxAllBill.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxAllBill.java @@ -89,7 +89,10 @@ public class WxAllBill extends TenantEntity { @TableField(exist = false) public String billTypeName; public String getBillTypeName() { - return EnumBillAllType.RENT.getMessage(); + if (null != billType) { + billTypeName = EnumBillAllType.getEnum(billType).getMessage(); + } + return billTypeName; } @io.swagger.annotations.ApiModelProperty(value = "支付方式", name = "payWay") diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPropertyContract.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPropertyContract.java index 75356d07b..379698003 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxPropertyContract.java +++ b/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) diff --git a/mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java b/mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java index 8616b800b..c21bbd7e8 100644 --- a/mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java +++ b/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 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 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(); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java index 5e46db973..136d222ab 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/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 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());; }