From 3299b986fa3951ce78bbdd63f1ab1d69238701eb Mon Sep 17 00:00:00 2001 From: luozukai Date: Sat, 25 May 2019 14:07:19 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=90=88=E5=90=8C=E4=BC=98=E5=8C=96][?= =?UTF-8?q?=E4=BF=AE=E6=94=B9][=E4=BF=AE=E6=94=B9=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E8=B4=A6=E5=8D=95]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/WxPropertyContractServiceImpl.java | 285 ++++-------------- .../impl/WxRentContractServiceImpl.java | 17 +- 2 files changed, 62 insertions(+), 240 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java index 9c8b870a6..125e9e08f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java @@ -9,6 +9,7 @@ import com.iformall.common.IdWorker; import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.*; +import com.iformall.domain.vo.BillTimeVo; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; @@ -247,9 +248,6 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService if (record.getPrice().longValue() <= 0) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "物业费要大于0"); } - if (record.getDeposit().longValue() <= 0) { - return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "押金要大于0"); - } WxPropertyContract propertyContract = new WxPropertyContract(); propertyContract.setTenantId(record.getTenantId()); @@ -508,6 +506,8 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService int billcount = 0; List resultList = new ArrayList<>(); + + List yearList = new ArrayList<>(); for (int i = 0; i < size; i++) { Calendar instance = Calendar.getInstance(); Date startDate; @@ -525,241 +525,79 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService instance.add(Calendar.MONTH, month * i); startDate = instance.getTime(); } - Map resultMap = buildRent(leaseArr[i], receivePeriod, priceArr[i], startDate, Calendar.MONTH, wxPropertyContract, userId, wxMerchant, billcount, isPreview, shopInfo,i==size-1?true:false); - List billRentList = (List)resultMap.get("billList"); - billcount = (Integer)resultMap.get("billcount"); - resultList.addAll(billRentList); + yearList.add(startDate); } + Map resultMap = buildRent(receivePeriod, priceArr, yearList, Calendar.MONTH, wxPropertyContract, userId, wxMerchant, billcount, isPreview, shopInfo); + List billRentList = (List)resultMap.get("billList"); + resultList.addAll(billRentList); return resultList; } - public boolean isFirstDay(Date date){ - int dateInt = Integer.parseInt(new SimpleDateFormat("d").format(date)); - if(dateInt == 1){ - return true; - } - return false; - } - - public boolean isCrossMonth(Date start,Date end){ - int startInt = Integer.parseInt(new SimpleDateFormat("M").format(start)); - int endInt = Integer.parseInt(new SimpleDateFormat("M").format(end)); - - if(startInt != endInt){ - return true; - } - return false; - } - - public Map buildRent(int lease, int receivePeriod, long price, Date startdate, int dayType, WxPropertyContract wxPropertyContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview, Map shopInfo, boolean isLastYesr) { + public Map buildRent(int receivePeriod,long[] priceArrs, List yearList,int dayType, WxPropertyContract wxPropertyContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview,Map shopInfo) { + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); Map resultMap = new HashedMap(); List resultList = new ArrayList<>(); - int extralease = lease % receivePeriod; - int extracount = extralease > 0 ? 1 : 0; - int paycount = lease / receivePeriod + extracount; - int index = paycount - 1; final IdWorker idWorker = IdWorker.get(); - //自然月,而且残月,周期整除,n+1,最后一个周期作为残月 - if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode()) - && !isFirstDay(wxPropertyContract.getRentalStartDate()) - && (wxPropertyContract.getLease() % wxPropertyContract.getReceivePeriod() == 0) - && isLastYesr - && isCrossMonth(wxPropertyContract.getRentalStartDate(),wxPropertyContract.getRentalEndDate()) - ){ - paycount ++; - } - for(int i = 0; i < paycount; i++){ - WxBillProperty wxBillProperty = new WxBillProperty(); - wxBillProperty.setIsPreview(isPreview); - wxBillProperty.setId(idWorker.nextId()); - wxBillProperty.setPropertyContractId(wxPropertyContract.getId()); - wxBillProperty.setPay(0L); - long needpay = new BigDecimal(price).multiply(new BigDecimal(receivePeriod)).longValue(); - - Date date = new Date(); - Calendar instance = Calendar.getInstance(); - instance.setTime(startdate); - instance.add(dayType, receivePeriod * i); - if(!wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())) { - instance.add(Calendar.DAY_OF_MONTH, -1); - } - Date time = instance.getTime(); - wxBillProperty.setReceiveDate(time); - - //账单开始时间 - instance.clear(); - instance.setTime(wxBillProperty.getReceiveDate()); - if(!wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())) { - instance.add(Calendar.DAY_OF_MONTH, 1); - } - wxBillProperty.setStarttime(instance.getTime()); - //账单结束时间 - instance.clear(); - instance.setTime(wxBillProperty.getStarttime()); - instance.add(dayType, receivePeriod); - instance.add(Calendar.DAY_OF_MONTH, -1); - wxBillProperty.setEndtime(instance.getTime()); + Date endDate = null; + if(yearList.size() > 1){ + endDate = yearList.get(1); + } - if (extracount > 0 && i == index) { - //账单开始时间 - instance.clear(); - instance.setTime(wxBillProperty.getReceiveDate()); - if(!wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())) { - instance.add(Calendar.DAY_OF_MONTH, 1); - } - wxBillProperty.setStarttime(instance.getTime()); - //账单结束时间 - instance.clear(); - instance.setTime(wxBillProperty.getStarttime()); - instance.add(dayType, extralease); - instance.add(Calendar.DAY_OF_MONTH, -1); - wxBillProperty.setEndtime(instance.getTime()); - needpay = new BigDecimal(price).multiply(new BigDecimal(extralease)).longValue(); - } + List billTimeVoList = WxRentContractServiceImpl.initBillTimeList(wxPropertyContract.getRentalStartDate(),wxPropertyContract.getRentalEndDate(),wxPropertyContract.getAdjustPeriod(),dayType,receivePeriod); - //自然月,开始日期、缴款日,结束日期 - if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){ - int rentStartDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxPropertyContract.getRentalStartDate())); - int startDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxBillProperty.getStarttime())); - int endDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxPropertyContract.getRentalEndDate())); - - if(i == 0){//第一周期 - double oneDayProce = (double) price / DateUtils.getMonthDayCount(wxBillProperty.getStarttime()); - double needPayDouble; - - if(receivePeriod <= 1) {//周期为一个月 - wxBillProperty.setEndtime(DateUtils.getLastDayForMonth(wxBillProperty.getStarttime())); - needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxBillProperty.getStarttime())-startDateInt+1); - }else{ //周期大于一个月 - Date firstDay = DateUtils.getFirstDayForCurrMonth(wxBillProperty.getStarttime()); - instance.clear(); - instance.setTime(firstDay); - //最后一个期有余,加上残月,不整除时,最后一个月有余,否则为0 - if(extralease > 0 && (i == paycount - 1)){ - instance.add(dayType, extralease); - instance.add(Calendar.DAY_OF_MONTH, rentStartDateInt-1); - }else{ - instance.add(dayType, receivePeriod); - } - instance.add(Calendar.DAY_OF_MONTH, -1); - - wxBillProperty.setEndtime(instance.getTime()); - if(isLastYesr && (i == paycount - 1)){ //最后一年 最后一期 - needPayDouble = 0; - oneDayProce = (double) price/DateUtils.getMonthDayCount(wxBillProperty.getEndtime()); - if(receivePeriod > 1) { - needPayDouble += price * extralease; - } - if(!isFirstDay(wxPropertyContract.getRentalStartDate())) { //残月才加 - needPayDouble += oneDayProce * endDateInt; - } - }else{ - //[A/31 *(31-12+1)]+A+A - needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxBillProperty.getStarttime())-startDateInt+1); - needPayDouble += price * (receivePeriod - 1); - } - } - DecimalFormat format = new DecimalFormat("0"); - needpay = Long.parseLong(format.format(needPayDouble)); //分做四舍五入 - }else if(i < paycount - 1){//中间周期 - Date receiveDate = DateUtils.getFirstDayOfNextMonth(startdate,receivePeriod * i); - wxBillProperty.setReceiveDate(receiveDate); - wxBillProperty.setStarttime(receiveDate); - wxBillProperty.setEndtime(DateUtils.getLastDayForMonth(wxBillProperty.getStarttime(),receivePeriod * i)); - - instance.clear(); - instance.setTime(receiveDate); - instance.add(dayType, receivePeriod); - instance.add(Calendar.DAY_OF_MONTH, -1); - wxBillProperty.setEndtime(instance.getTime()); - }else if(i == paycount - 1) {//最后周期 - //receivePeriod * i 得到开始日期 - Date receiveDate = DateUtils.getFirstDayOfNextMonth(startdate,receivePeriod * i); - wxBillProperty.setReceiveDate(receiveDate); - wxBillProperty.setStarttime(receiveDate); - - //得到开始日期第一天 - Date firstDay = DateUtils.getFirstDayForCurrMonth(wxBillProperty.getStarttime()); - instance.clear(); - instance.setTime(firstDay); - - //若最后一期有余,带上残月,(不整除时,最后一个月有余,否则extralease=0) - if(isFirstDay(wxPropertyContract.getRentalStartDate())){ //月第一天起租 - if(receivePeriod > 1){ - if(isLastYesr && extralease > 0){ - instance.add(dayType, extralease); - }else{ - instance.add(dayType, receivePeriod); - } - }else{ - instance.add(dayType, receivePeriod); - } - }else{ - if(isLastYesr) { - instance.add(dayType, extralease); - instance.add(Calendar.DAY_OF_MONTH, rentStartDateInt - 1); - }else{ - instance.add(dayType, receivePeriod); - } - } + int index = 0; + for (BillTimeVo billTimeVo : billTimeVoList){ + if(yearList.size() > 1) { + if (sd.format(billTimeVo.getStartDate()).equals(sd.format(endDate)) || billTimeVo.getStartDate().after(endDate)) { + logger.info("=====billTimeVo.getStartDate():"+sd.format(billTimeVo.getStartDate())+" endDate:"+sd.format(endDate)); - //先减一个月 后加上残月 - instance.add(Calendar.DAY_OF_MONTH, -1); - wxBillProperty.setEndtime(instance.getTime()); - - //逻辑同计算endtime - double needPayDouble = 0; - double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxBillProperty.getEndtime()); - if(isFirstDay(wxPropertyContract.getRentalStartDate())){ - if(receivePeriod > 1) { - if(isLastYesr && extralease > 0) { - needPayDouble += price * extralease; - }else{ - needPayDouble += price * receivePeriod; - } - }else { - needPayDouble += price * receivePeriod; - } - }else{ - if(isLastYesr) { - needPayDouble += price * extralease; - needPayDouble += oneDayProce * endDateInt; - }else{ - needPayDouble += price * receivePeriod; - } + index++; + if(index >= yearList.size()-1){ + endDate = wxPropertyContract.getRentalEndDate(); + }else { + endDate = yearList.get(index); } - DecimalFormat format = new DecimalFormat("0"); - needpay = Long.parseLong(format.format(needPayDouble)); //分做四舍五入 + logger.info("==========cross:"+sd.format(endDate)); } } - //最后一期截止到结束日期 - if(i == paycount - 1 && isLastYesr){ - wxBillProperty.setEndtime(wxPropertyContract.getRentalEndDate()); - //当天也算,加1天 - Date newEndDate = DateUtils.getDaySet(wxBillProperty.getEndtime(),Calendar.DATE,1); - //按日 - if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_DAY.getCode())){ - int dayCount = DateUtils.daysBetween(wxBillProperty.getStarttime(),newEndDate); - needpay = dayCount*price; - }else{ - //按月 - int[] diff = DateUtils.getDiff(wxBillProperty.getStarttime(),newEndDate); - needpay = diff[0]*price; + //获取price 、shopInfo + long price = priceArrs[index]; - double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxPropertyContract.getRentalEndDate()); - needpay += diff[1] * oneDayProce; - } - } + WxBillProperty wxBillProperty = new WxBillProperty(); + wxBillProperty.setIsPreview(isPreview); + wxBillProperty.setId(idWorker.nextId()); + wxBillProperty.setPropertyContractId(wxPropertyContract.getId()); + wxBillProperty.setPay(0L); + wxBillProperty.setStarttime(billTimeVo.getStartDate()); + wxBillProperty.setEndtime(billTimeVo.getEndDate()); + wxBillProperty.setReceiveDate(billTimeVo.getReceiveDate()); + + long needpay; + + //当天也算,加1天 + Date newEndDate = DateUtils.getDaySet(wxBillProperty.getEndtime(),Calendar.DATE,1); + //按日 + if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_DAY.getCode())){ + int dayCount = DateUtils.daysBetween(wxBillProperty.getStarttime(),newEndDate); + needpay = dayCount*price; + }else{ + //按月 + int[] diff = DateUtils.getDiff(wxBillProperty.getStarttime(),newEndDate); + needpay = diff[0]*price; + double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxPropertyContract.getRentalEndDate()); + needpay += diff[1] * oneDayProce; + } wxBillProperty.setNeedPay(needpay); wxBillProperty.setOwe(needpay); wxBillProperty.setReceivePay(needpay); //截止收租日在当前时间之前 + Date date = new Date(); if (wxBillProperty.getReceiveDate().before(date)) { - long day = (time.getTime() - date.getTime()) / (24 * 60 * 60 * 1000); + long day = (wxBillProperty.getReceiveDate().getTime() - date.getTime()) / (24 * 60 * 60 * 1000); wxBillProperty.setStatus(EnumBillRentStatus.NOT_PAID.getCode()); wxBillProperty.setExpiredDay(day); } else {//截止收租日在当前时间之后 @@ -775,7 +613,6 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService wxBillProperty.setExpiredDay(0L); } } - wxBillProperty.setTenantId(wxMerchant.getTenantId()); wxBillProperty.setIsDel(0); wxBillProperty.setMerchantId(wxMerchant.getId()); @@ -789,14 +626,10 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService if (shopInfo != null) { wxBillProperty.setShopInfo(JSONObject.toJSONString(shopInfo)); } - try { - wxBillPropertyMapper.insertSelective(wxBillProperty); - resultList.add(wxBillProperty); - } catch (Exception e) { - logger.error("添加租赁账单失败,e:" + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); - } + wxBillPropertyMapper.insertSelective(wxBillProperty); + resultList.add(wxBillProperty); } + resultMap.put("billcount",billcount); resultMap.put("billList",resultList); return resultMap; @@ -840,9 +673,9 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService result = buildRentMonth(wxMerchant, userId, propertyContract, receivePeriod, lease, rentalStartDate, price,isPreview); } else { //如果按日 - //处理lease - lease = DateUtils.daysBetween(propertyContract.getRentalStartDate(),propertyContract.getRentalEndDate()); - Map resultMap = buildRent(lease, receivePeriod, price, rentalStartDate, Calendar.DAY_OF_MONTH, propertyContract, userId, wxMerchant, 0, isPreview, null,false); + List yearList = new ArrayList<>(); + yearList.add(rentalStartDate); + Map resultMap = buildRent(receivePeriod,new long[]{price}, yearList, Calendar.DAY_OF_MONTH, propertyContract, userId, wxMerchant, 0, isPreview, null); result = (List)resultMap.get("billList"); } } 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 c8c47fe86..9552d974a 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -855,14 +855,11 @@ public class WxRentContractServiceImpl implements WxRentContractService { Map resultMap = buildRent(receivePeriod, priceArrs, yearList, Calendar.MONTH, wxRentContract, userId, wxMerchant, billcount, isPreview, shopInfos); List billRentList = (List)resultMap.get("billList"); - billcount = (Integer)resultMap.get("billcount"); resultList.addAll(billRentList); return resultList; } public Map buildRent(int receivePeriod,long[] priceArrs, List yearList,int dayType, WxRentContract wxRentContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview,List> shopInfoList) { -// System.out.println("------+receivePeriod:"+receivePeriod+"price:"+price+"start:"+DateUtils.date2String(startdate,"yyyy-MM-dd") -// +"dayType:"+dayType+"billcount:"+billcount); SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); Map resultMap = new HashedMap(); List resultList = new ArrayList<>(); @@ -873,21 +870,13 @@ public class WxRentContractServiceImpl implements WxRentContractService { endDate = yearList.get(1); } - if(endDate == null){ - // endDate = wxRentContract.getRentalEndDate(); - }else{ - //- 1天 - //endDate = DateUtils.getDaySet(endDate,Calendar.DATE,-1); - } List billTimeVoList = initBillTimeList(wxRentContract.getRentalStartDate(),wxRentContract.getRentalEndDate(),wxRentContract.getAdjustPeriod(),dayType,receivePeriod); int index = 0; - for (BillTimeVo billTimeVo : billTimeVoList){ if(yearList.size() > 1) { - if (billTimeVo.getStartDate().after(endDate)) { - System.out.println("==========billTimeVo.getStartDate():"+sd.format(billTimeVo.getStartDate())); - System.out.println("==========endDate:"+sd.format(endDate)); + if (sd.format(billTimeVo.getStartDate()).equals(sd.format(endDate)) || billTimeVo.getStartDate().after(endDate)) { + logger.info("=====billTimeVo.getStartDate():"+sd.format(billTimeVo.getStartDate())+" endDate:"+sd.format(endDate)); index++; if(index >= yearList.size()-1){ @@ -895,7 +884,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { }else { endDate = yearList.get(index); } - System.out.println("==========cross:"+sd.format(endDate)); + logger.info("==========cross:"+sd.format(endDate)); } }