From db3f91ece81ce5c24166e24fedae73b011efb9a3 Mon Sep 17 00:00:00 2001 From: winter Date: Tue, 6 Aug 2024 14:44:26 +0800 Subject: [PATCH] fix --- .../market/WxFinanceController.java | 2 +- .../enums/EnumContractReceivePeriodUnit.java | 1 + .../service/helper/WxRentContractHelper.java | 84 +++++++++++++------ .../impl/WxRentContractServiceImpl.java | 19 ++--- 4 files changed, 68 insertions(+), 38 deletions(-) diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java index 094b31ada..29ea3fb8a 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxFinanceController.java @@ -457,7 +457,7 @@ public class WxFinanceController extends BaseController { @GetMapping("getReceiveEndTime") public ResultData getReceiveEndTime() { SysConfig config = sysConfigService.getByKey(SysConfigConstant.finance_receive_end_date, getTenantInfo()); - return new ResultData(config.getConfigItemValue()); + return new ResultData(config); } } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumContractReceivePeriodUnit.java b/mallinkService/src/main/java/com/iformall/enums/EnumContractReceivePeriodUnit.java index e62fa8497..03535ebb2 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumContractReceivePeriodUnit.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumContractReceivePeriodUnit.java @@ -63,6 +63,7 @@ public enum EnumContractReceivePeriodUnit { instance.add(Calendar.MONTH, period); //instance.add(Calendar.DAY_OF_MONTH, -1); instance.add(Calendar.SECOND, -1); + return instance.getTime(); } //几个季度之后 }else if (unit == QUARTER.getCode().intValue()) { 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 c08079436..ff05b076b 100644 --- a/mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java +++ b/mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java @@ -468,29 +468,65 @@ public class WxRentContractHelper { if (null == validDays || validDays.size() <= 0 ) { return "0"; } - NeedPayDTO np = getMonthPay(start, end, price, decimalSize, validDays, dayPriceCalcute, monthAvageDays); + NeedPayDTO np = getCurrentMonthPay(start, end, price, decimalSize, validDays, dayPriceCalcute, monthAvageDays); return np.getMoney().toPlainString(); } - Calendar instance = Calendar.getInstance(); - instance.setTime(start); - instance = EnumContractReceivePeriodUnit.getAfterCalendarDay(instance, receivePeriod, dayType); - if(sd.format(instance.getTime()).equals(sd.format(end))){ - List validDays = getValidDays(start,end,freeDays); - if (null == validDays || validDays.size() <= 0 ) { - return "0"; - } - //不是一个月的。但是按整月算的 - int months = getMonths(sdM.format(start)+"-01",sdM.format(DateUtils.getDaySet(end,Calendar.DATE,1))+"-01"); - for (int i = 0 ; i < months; i++) { - //当前时间到当前月底 - Date currentMonthEnd = DateUtils.getLastDayForMonth(start); - NeedPayDTO np = getMonthPay(start, currentMonthEnd, price, decimalSize, validDays, dayPriceCalcute, monthAvageDays); - start = DateUtils.getDaySet(currentMonthEnd,Calendar.DATE,1); - total = total.add(np.getMoney()); - //TODO 这个月底到下个月 + //正好是一个周期开始 + boolean isPeriodStart = false; + //如果是按自然季度,如果start不是1号,则也不是一个周期 + if (EnumContractReceivePeriodUnit.QUARTER.getCode().intValue() == dayType) { + String startday = sdD.format(start); + if ("1".equals(startday)) { + isPeriodStart = true; } - return total.toPlainString(); + }else { + isPeriodStart = true; + } + if (isPeriodStart) { + Calendar instance = Calendar.getInstance(); + instance.setTime(start); + instance = EnumContractReceivePeriodUnit.getAfterCalendarDay(instance, receivePeriod, dayType); + if(sd.format(instance.getTime()).equals(sd.format(end))){ + List validDays = getValidDays(start,end,freeDays); + if (null == validDays || validDays.size() <= 0 ) { + return "0"; + } + //如果该周期内是全部有效的,则用月份*金额 + int allDays = DateUtils.daysBetween(start,end)+1; + boolean isFull = false; + if (allDays == validDays.size()) { + isFull = true; + } + //不是一个月的。但是按整月算的 + int months = getMonths(sdM.format(start)+"-01",sdM.format(DateUtils.getDaySet(end,Calendar.DATE,1))+"-01"); + if (isFull) { + return price.multiply(new BigDecimal(months)).toPlainString(); + } + //计费每个周期开始时间 + Calendar periodStart = Calendar.getInstance(); + periodStart.setTime(start); + for (int i = 0 ; i < months; i++) { + //每个计费1个月结束时间,可能是跨月的 + Date periodEnd = EnumContractReceivePeriodUnit.getAfterCalendarDay(periodStart, i+1, EnumContractReceivePeriodUnit.MONTH.getCode()).getTime(); + + //当前开始时间到当前月底 + Date currentMonthEnd = DateUtils.getLastDayForMonth(start); + NeedPayDTO np = getCurrentMonthPay(start, currentMonthEnd, price, decimalSize, validDays, dayPriceCalcute, monthAvageDays); + total = total.add(np.getMoney()); + + if(periodEnd.after(currentMonthEnd)) { + start = DateUtils.getDaySet(currentMonthEnd,Calendar.DATE,1); + NeedPayDTO lnp = getCurrentMonthPay(start, periodEnd, price, decimalSize, validDays, dayPriceCalcute, monthAvageDays); + total = total.add(lnp.getMoney()); + }else { + start = DateUtils.getDaySet(currentMonthEnd,Calendar.DATE,1); + periodStart.setTime(start); + } + + } + return total.toPlainString(); + } } //开始到这个月底 @@ -499,7 +535,7 @@ public class WxRentContractHelper { if (null == currValidDays || currValidDays.size() <= 0 ) { return "0"; } - NeedPayDTO np = getMonthPay(start, lastMonthDay, price, decimalSize, currValidDays, dayPriceCalcute, monthAvageDays); + NeedPayDTO np = getCurrentMonthPay(start, lastMonthDay, price, decimalSize, currValidDays, dayPriceCalcute, monthAvageDays); total = total.add(np.getMoney()); System.out.println("首1月>>>>"+DateUtils.date2String(start)+">>>"+DateUtils.date2String(lastMonthDay)+">>>>"+total.toPlainString()); @@ -511,7 +547,7 @@ public class WxRentContractHelper { List _validDays = getValidDays(newStartDate,currentMonthEnd,freeDays); if (null == _validDays ||_validDays.size() <= 0 ) { }else { - NeedPayDTO _np = getMonthPay(newStartDate, currentMonthEnd, price, decimalSize, _validDays, dayPriceCalcute, monthAvageDays); + NeedPayDTO _np = getCurrentMonthPay(newStartDate, currentMonthEnd, price, decimalSize, _validDays, dayPriceCalcute, monthAvageDays); System.out.println(i+2+"月>>>>"+DateUtils.date2String(newStartDate)+">>>>"+DateUtils.date2String(currentMonthEnd)+">>>>"+_np.getMoney().toPlainString()); newStartDate = DateUtils.getDaySet(currentMonthEnd,Calendar.DATE,1); total = total.add(_np.getMoney()); @@ -525,7 +561,7 @@ public class WxRentContractHelper { if (null == lastValidDays || lastValidDays.size() <= 0 ) { return "0"; } - NeedPayDTO enp = getMonthPay(last, end, price, decimalSize, lastValidDays, dayPriceCalcute, monthAvageDays); + NeedPayDTO enp = getCurrentMonthPay(last, end, price, decimalSize, lastValidDays, dayPriceCalcute, monthAvageDays); total = total.add(enp.getMoney()); System.out.println("末月>>>>"+DateUtils.date2String(last)+">>>"+DateUtils.date2String(end)+">>>>"+enp.getMoney().toPlainString()); } @@ -551,7 +587,8 @@ public class WxRentContractHelper { return validDays; } - private static NeedPayDTO getMonthPay(Date start,Date end, BigDecimal priceMonth,Integer decimalSize,List validDays,Integer dayPriceCalcute,Integer monthAvageDays) { + //查询当前月内的金额 + private static NeedPayDTO getCurrentMonthPay(Date start,Date end, BigDecimal priceMonth,Integer decimalSize,List validDays,Integer dayPriceCalcute,Integer monthAvageDays) { NeedPayDTO np = new NeedPayDTO(); //当月实际天数 int md = DateUtils.getMonthDayCount(start);; @@ -762,7 +799,6 @@ public class WxRentContractHelper { //String monthMoney = getMonthNeedPay(freeDays, 2, new BigDecimal(2000), start, end, EnumContractReceivePeriodUnit.QUARTER.getCode(), 1, EnumRentDayPriceCalcute.AVERAGE_DAYS.getCode(), 30); //System.out.println(monthMoney); - } } 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 53fa8fd2c..9874b712f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -1259,6 +1259,9 @@ public class WxRentContractServiceImpl implements WxRentContractService { int index = 0; for (int i = 0; i < billTimeVoList.size(); i++) { BillTimeVo billTimeVo = billTimeVoList.get(i); + if (i == 4) { + String aa = "000"; + } //计算金额 String needpay = "0"; //商业管理费 @@ -1298,6 +1301,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { operatingManageFeeNeedpayFront = WxRentContractHelper.getNeedPayMoney(freePeriods,wxRentContract,operationManagerPriceArrs[index-1],billTimeVo.getStartDate(),endDate,i,billTimeVoList.size(),saveDb,dayType,receivePeriod); } }else{ + //这一年到期和下一年开始的期间,从这一年到期时间分开来进行计算。因为涉及到年租金调整等 TODO 如何把这两块单独生成账单 if(billTimeVo.getStartDate().before(endDate)){ if (EnumRentContractType.RENT_BY_JOINT.getCode().equals(wxRentContract.getType()) && EnumMissTimeType.PERIOD.getCode().equals(0)) { //设置跳点率为年周期 price不变 @@ -1390,6 +1394,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { wxBillRent.setNeedPay(needpay); //wxBillRent.setOwe(needpay); wxBillRent.setReceivePay(needpay); + logger.debug(">>>>"+DateUtils.date2String(billTimeVo.getStartDate())+">>>>"+DateUtils.date2String(billTimeVo.getEndDate())+">>>>"+needpay); //商业管理费 wxBillRent.setBussinessManageFeeNeedPay(bussinessManageFeeNeedpay); //运营管理费 @@ -1897,22 +1902,10 @@ public class WxRentContractServiceImpl implements WxRentContractService { //instance.add(Calendar.DATE, -1); timeVo.setEndDate(instance.getTime()); - //自然月 + //自然月,应该是从本月开始到本月结束 if(adjustPeriod.equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){ if(count == 0){ timeVo.setEndDate(EnumContractReceivePeriodUnit.getAfterCalendarNarDay(timeVo.getStartDate(), receivePeriod, dayType)); - /** - if(receivePeriod == 1) { //周期1个月 头一个月到当月底 头一个月或者头一个季度 - timeVo.setEndDate(DateUtils.getLastDayForMonth(timeVo.getStartDate())); - }else{ - Date firstDay = DateUtils.getFirstDayForCurrMonth(start); - instance.clear(); - instance.setTime(firstDay); - //最后一个期有余,加上残月,不整除时,最后一个月有余,否则为0 - instance.add(dayType, receivePeriod); - instance.add(Calendar.DAY_OF_MONTH, -1); - timeVo.setEndDate(instance.getTime()); - }*/ } }