diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java b/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java index dcdba0369..00e464089 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java @@ -8,7 +8,9 @@ package com.iformall.enums; public enum EnumRentContractAdjustPeriod { ADJUST_PERIOD_DAY(1, "按日计租"), - ADJUST_PERIOD_MONTH(2, "按月计租"),; + ADJUST_PERIOD_MONTH(2, "按月计租"), + ADJUST_PERIOD_NAR_MONTH(3, "按自然月计租"), + ; public static EnumRentContractAdjustPeriod getEnum(Integer code) { for (EnumRentContractAdjustPeriod value : values()) { 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 ffcc51535..73a32287e 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -37,6 +37,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.net.HttpURLConnection; import java.net.URL; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -574,7 +576,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { return rentList; } - //计算租金 + //计算租金,每年-每个店铺租金 public List computePrice(String rentInfo) { JSONArray rentInfoArray = JSONArray.parseArray(rentInfo); @@ -607,7 +609,6 @@ public class WxRentContractServiceImpl implements WxRentContractService { } public List buildRentMonth(WxMerchant wxMerchant, Long userId, WxRentContract wxRentContract, int receivePeriod, Integer lease, Date rentalStartDate, Integer price,Integer isPreview) { - int size = 0; int[] priceArrs = null; List> shopInfos = new ArrayList<>(); @@ -651,7 +652,6 @@ public class WxRentContractServiceImpl implements WxRentContractService { } } - int month = 12; int divide = lease / month; int mod = lease % month; @@ -678,7 +678,22 @@ public class WxRentContractServiceImpl implements WxRentContractService { return resultList; } + /** + * 是否是残月 + * @param date + * @return + */ + public boolean incompleteMonth(Date date){ + if("01".equals(new SimpleDateFormat("dd").format(date))){ + return false; + } + return true; + } + public Map buildRent(int lease, int receivePeriod, int price, Date startdate, int dayType, WxRentContract wxRentContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview, Map shopInfo) { + //todo:test + wxRentContract.setAdjustPeriod(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode()); + String shopInfoStr = null; if (shopInfo != null) { shopInfoStr = JSONObject.toJSONString(shopInfo); @@ -701,15 +716,13 @@ public class WxRentContractServiceImpl implements WxRentContractService { int needpay = price * receivePeriod; System.out.println("--------needpay:"+needpay); - - Date date = new Date(); Calendar instance = Calendar.getInstance(); + Date date = new Date(); instance.setTime(startdate); instance.add(dayType, receivePeriod * i); instance.add(Calendar.DAY_OF_MONTH, -1); Date time = instance.getTime(); wxBillRent.setReceiveDate(time); - //账单开始时间 instance.clear(); instance.setTime(wxBillRent.getReceiveDate()); @@ -722,6 +735,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { instance.add(Calendar.DAY_OF_MONTH, -1); wxBillRent.setEndtime(instance.getTime()); + //最后一个周期 if (extracount > 0 && i == index) { //账单开始时间 instance.clear(); @@ -736,6 +750,47 @@ public class WxRentContractServiceImpl implements WxRentContractService { wxBillRent.setEndtime(instance.getTime()); needpay = price * extralease; } + + //自然月,开始日期、缴款日,结束日期 + if(wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){ + if(i == 0){//第一周期 + if(receivePeriod <= 1) {//周期为一个月 + wxBillRent.setReceiveDate(wxRentContract.getStartDate()); + wxBillRent.setStarttime(wxRentContract.getStartDate()); + wxBillRent.setEndtime(DateUtils.getLastDayForCurrMonth()); + + double needPayDouble = (double) price / DateUtils.getCurrMonthDayCount(); + int startDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxRentContract.getStartDate())); + // 5月12日 周期:3 [A/31 *(31-12+1)]+A+A + needPayDouble = (needPayDouble * (DateUtils.getCurrMonthDayCount()-startDateInt+1)) + (price * (receivePeriod-1)); + DecimalFormat format = new DecimalFormat("0"); + needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入 + }else{ + wxBillRent.setReceiveDate(wxRentContract.getStartDate()); + wxBillRent.setStarttime(wxRentContract.getStartDate()); + wxBillRent.setEndtime(DateUtils.getFirstDayOfNextMonth(wxRentContract.getStartDate(),receivePeriod - 1)); + + double needPayDouble = (double) price / DateUtils.getCurrMonthDayCount(); + needPayDouble = needPayDouble * DateUtils.daysBetween(DateUtils.getFirstDayForCurrMonth(), wxRentContract.getStartDate()); + DecimalFormat format = new DecimalFormat("0"); + needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入 + } + }else if(i == paycount - 1) {//最后周期 + wxBillRent.setReceiveDate(DateUtils.getFirstDayForCurrMonth()); + wxBillRent.setStarttime(DateUtils.getFirstDayForCurrMonth()); + wxBillRent.setEndtime(wxRentContract.getStartDate()); + + double needPayDouble = (double) price/DateUtils.getCurrMonthDayCount(); + needPayDouble = needPayDouble * DateUtils.daysBetween(DateUtils.getFirstDayForCurrMonth(),wxRentContract.getStartDate()); + DecimalFormat format = new DecimalFormat("0"); + needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入 + }else{//中间周期 + wxBillRent.setReceiveDate(DateUtils.getFirstDayForCurrMonth()); + wxBillRent.setStarttime(DateUtils.getFirstDayForCurrMonth()); + wxBillRent.setEndtime(DateUtils.getLastDayForCurrMonth()); + } + } + wxBillRent.setNeedPay(needpay); wxBillRent.setOwe(needpay); wxBillRent.setReceivePay(needpay); @@ -783,6 +838,12 @@ public class WxRentContractServiceImpl implements WxRentContractService { return resultMap; } + public static void main(String[] args) { + System.out.println(new SimpleDateFormat("d").format(DateUtils.getLastDayForCurrMonth())); + } + + + @Transactional(rollbackFor = {Exception.class}) @Override diff --git a/mallinkService/src/main/java/com/iformall/utils/DateUtils.java b/mallinkService/src/main/java/com/iformall/utils/DateUtils.java index dd24f899d..eb669f7fc 100755 --- a/mallinkService/src/main/java/com/iformall/utils/DateUtils.java +++ b/mallinkService/src/main/java/com/iformall/utils/DateUtils.java @@ -938,4 +938,73 @@ public class DateUtils { return false; } } + + /** + * 获取当前月的第一天 + * @return + */ + public static Date getFirstDayForCurrMonth(){ + Calendar cale = Calendar.getInstance(); + cale.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 + return cale.getTime(); + } + + /** + * 获取当前月的最后一天 + * @return + */ + public static Date getLastDayForCurrMonth(){ + Calendar ca = Calendar.getInstance(); + ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH)); + return ca.getTime(); + } + + /** + * 取得当月天数 + * */ + public static int getCurrMonthDayCount() { + Calendar a = Calendar.getInstance(); + a.set(Calendar.DATE, 1);//把日期设置为当月第一天 + a.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天 + int maxDate = a.get(Calendar.DATE); + return maxDate; + } + + /** + * 计算两个日期相隔多少天 + * @param smdate + * @param bdate + * @return + * @throws ParseException + */ + public static int daysBetween(Date smdate,Date bdate) { + try { + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + smdate=sdf.parse(sdf.format(smdate)); + bdate=sdf.parse(sdf.format(bdate)); + Calendar cal = Calendar.getInstance(); + cal.setTime(smdate); + long time1 = cal.getTimeInMillis(); + cal.setTime(bdate); + long time2 = cal.getTimeInMillis(); + long between_days=(time2-time1)/(1000*3600*24); + return Integer.parseInt(String.valueOf(between_days)); + }catch (Exception e){ + e.printStackTrace(); + } + return 0; + } + + /** + * 获取指定日期n个月后的第一天 + * @return + */ + public static Date getFirstDayOfNextMonth(Date date,int amount){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH,1); + calendar.add(Calendar.MONTH, amount); + return calendar.getTime(); + } + }