From bf216778b0484d153201866577f76ec1682ec7b9 Mon Sep 17 00:00:00 2001 From: winter Date: Wed, 14 Aug 2024 21:29:24 +0800 Subject: [PATCH] fix --- .../contract/WxRentContractController.java | 1 + .../com/iformall/domain/po/WxAllBill.java | 2 + .../service/helper/WxRentContractHelper.java | 11 ++- .../impl/WxRentContractServiceImpl.java | 93 +++++++++++++------ .../main/resources/mapper/WxAllBillMapper.xml | 1 + 5 files changed, 75 insertions(+), 33 deletions(-) diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java b/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java index 4bf1f148e..c5d12939f 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/contract/WxRentContractController.java @@ -833,6 +833,7 @@ public class WxRentContractController extends WxContractBaseController { bq.setIsPreview(EnumYesOrNo.NO.getCode()); bq.setBillType(EnumBillAllType.RENT.getCode()); bq.setEnergyFeesId(EnumBillAllType.RENT.getEnergyFeesId()); + bq.setNoExtraCreateFrom(EnumYesOrNo.YES.getCode()); bq.setSortColumn(" starttime asc"); List billList = wxAllBillService.list(bq); 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 503105f4c..d81f3bd89 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxAllBill.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxAllBill.java @@ -357,4 +357,6 @@ public class WxAllBill extends TenantEntity { public Date salesTime; @TableField(exist = false) public String moneyChangeDetail; + @TableField(exist = false) + public Integer noExtraCreateFrom; } 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 4ba3ee63d..8616b800b 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,22 @@ public class WxRentContractHelper { } public static void main(String[] args) { - Date start = DateUtils.str2Date("2026-08-10 00:00:00").getTime(); - Date end = DateUtils.str2Date("2026-09-30 23:59:59").getTime(); + 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 d3 = DateUtils.str2Date("2024-09-01 00:00:00").getTime(); // Date d4 = DateUtils.str2Date("2024-09-30 00:00:00").getTime(); // f1.addAll(DateUtils.getAllDays(d3, d4)); - System.out.println(getValidDays(start,end,f1)); +// System.out.println(getValidDays(start,end,f1)); // Date start = DateUtils.str2Date("2024-08-05 00:00:00").getTime(); // Date end = DateUtils.str2Date("2025-11-04 23:59:59").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 b689aa5ba..5e46db973 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -2324,9 +2324,20 @@ public class WxRentContractServiceImpl implements WxRentContractService { } private BigDecimal calcuteUnitPrice(Date startDate,Date endDate,BigDecimal salesDeciaml,Integer priceUnit, - Integer dayPriceCalcute,Integer mothAverageDays) { + Integer dayPriceCalcute,Integer mothAverageDays,Integer receivePeriod,Integer receivePeriodUnit) { BigDecimal unitPrice = new BigDecimal(0); - int[] diffs = DateUtils.getDiff(startDate, endDate); + + //是否正好为一个周期 + 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); if (priceUnit.equals(EnumPriceUnit.D.getCode())){ int allDays = 0; if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) { @@ -2337,33 +2348,50 @@ 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)) { - //每一年的单价 - BigDecimal years = new BigDecimal(diffs[0]/12); - int extraMonths = diffs[0]%12; - if (dayPriceCalcute.intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) { - int days = extraMonths*mothAverageDays + diffs[1]; - years = years.add(new BigDecimal(days).divide(new BigDecimal(12*mothAverageDays),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP)); + //按照当前金额,当前时间区间,计算每一年的单价 + //如果是一个周期结束,则 + if (isPeriodEnd) { + //判断是不是一个完整的周期 + //按月,那就得、12 + unitPrice = salesDeciaml.multiply(new BigDecimal(12)).divide(new BigDecimal(diffs[0]),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP); }else { - int days = DateUtils.daysBetween(startDate, endDate)+1; - years = years.add(new BigDecimal(days).divide(new BigDecimal(365),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP)); - } - //每一天的单价 - unitPrice = salesDeciaml.divide(years,Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP); + //当前时间有多少个月 + 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); + } + } }else if(EnumPriceUnit.M.getCode().equals(priceUnit)) { - //每一月的单价 - 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)); + if (isPeriodEnd) { + //按月 + unitPrice = salesDeciaml.divide(new BigDecimal(diffs[0]),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP); }else { - Date extraStartDay = DateUtils.getTimeAfterMonths(diffs[0], startDate); - int extraDays = DateUtils.daysBetween(extraStartDay, endDate)+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); + //每一月的单价 + 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); + } } return unitPrice; } @@ -2372,7 +2400,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { 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.getPriceUnit(),propertyContract.getDayPriceCalcute(),propertyContract.getMonthAverageDays(),propertyContract.getReceivePeriod(),propertyContract.getReceivePeriodUnit()); //如果租金是按天计算 if (rentcontract.getPriceUnit().equals(EnumPriceUnit.D.getCode())){ //物业也是按天 @@ -2502,7 +2530,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { //根据销售额来计算价格均值 BigDecimal unitRevenuePrice = calcuteUnitPrice(rentBill.getStarttime(), rentBill.getEndtime(),salesDeciaml, - rentcontract.getPriceUnit(),rentcontract.getDayPriceCalcute(),rentcontract.getMonthAverageDays()); + rentcontract.getPriceUnit(),rentcontract.getDayPriceCalcute(),rentcontract.getMonthAverageDays(),rentcontract.getReceivePeriod(),rentcontract.getReceivePeriodUnit()); //设置保底营业额 rentcontract.setRevenue(unitRevenuePrice.toPlainString()); //联营扣点 @@ -2657,9 +2685,9 @@ public class WxRentContractServiceImpl implements WxRentContractService { if (yearDays == 365) { }else { if (rentcontract.getDayPriceCalcute().intValue() == EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode()) { - jumpRevenuePay = jumpRevenuePay.multiply(new BigDecimal(yearDays)).divide(new BigDecimal(12*rentcontract.getMonthAverageDays()),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP); + jumpRevenuePay = jumpRevenuePay.multiply(new BigDecimal(yearDays)).divide(new BigDecimal(12*rentcontract.getMonthAverageDays()),rentcontract.getDecimalSize(),BigDecimal.ROUND_HALF_UP); }else { - jumpRevenuePay = jumpRevenuePay.multiply(new BigDecimal(yearDays)).divide(new BigDecimal(365),Constant.default_long_decimal_size,BigDecimal.ROUND_HALF_UP); + jumpRevenuePay = jumpRevenuePay.multiply(new BigDecimal(yearDays)).divide(new BigDecimal(365),rentcontract.getDecimalSize(),BigDecimal.ROUND_HALF_UP); } } @@ -2745,4 +2773,9 @@ public class WxRentContractServiceImpl implements WxRentContractService { public List findJumpList(WxRentContractRevenueJump jump) { return wxRentContractRevenueJumpMapper.findList(jump); } + + public static void main(String[] args) { + Date date = DateUtils.stringToDate("2025-04-01 00:00:00",DateUtils.DATE_TIME_PATTERN); + System.out.println(date.getTime()); + } } diff --git a/mallinkService/src/main/resources/mapper/WxAllBillMapper.xml b/mallinkService/src/main/resources/mapper/WxAllBillMapper.xml index b843462b1..62a90ce18 100644 --- a/mallinkService/src/main/resources/mapper/WxAllBillMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxAllBillMapper.xml @@ -73,6 +73,7 @@ and `starttime` = #{starttimeEqual} and `endtime` = #{endtimeEqual} and `extra_create_from` = #{extraCreateFrom} + and `extra_create_from` is null and date_format(starttime,'%Y-%m') <= #{month} and date_format(endtime,'%Y-%m') >= #{month}