diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/RatioVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/RatioVo.java new file mode 100644 index 000000000..ff1c59b15 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/RatioVo.java @@ -0,0 +1,13 @@ +package com.iformall.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; + +@Data +public class RatioVo { + + //扣点率 + private Integer ratio = 0; + //超出部分金额 + private BigDecimal balance; +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxBillRentServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxBillRentServiceImpl.java index 8fd47de1c..b31899f0b 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxBillRentServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxBillRentServiceImpl.java @@ -268,56 +268,6 @@ public class WxBillRentServiceImpl implements WxBillRentService { return months; } - - /** - * 获取设置的跳点率 - * ["1000-1200:10",">3000:20"] - * @param record - */ - public Integer getPayRatio(WxBillRent record,WxRentContract wxRentContract,EnumMissTimeType timeType){ - wxRentContract.setPayRatio(0); - BigDecimal revenue = new BigDecimal(record.getRevenue()).divide(new BigDecimal(1000000)).setScale(4, RoundingMode.HALF_EVEN); - List ratioList = JSONArray.parseArray(wxRentContract.getBusDiscountRatio(), String.class); - long dayCount = DateUtils.startToEnd(record.getStarttime(),record.getEndtime()); - - for (String e:ratioList) { - String[] array = e.split(":"); - Integer ratio = Integer.parseInt(array[1]); - - if(e.indexOf("-") >= 0){ - String[] revenueArray = array[0].split("-"); - BigDecimal start = new BigDecimal(revenueArray[0]); - BigDecimal end = new BigDecimal(revenueArray[1]); - - //残年 (小金额 / 365 * 账单周期天数 )--(大金额 / 365 * 账单周期天数) - if(EnumMissTimeType.YEAR.getCode().equals(timeType.getCode())){ - start = new BigDecimal(revenueArray[0]).divide(new BigDecimal(365),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); - end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(365),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); - }else if(EnumMissTimeType.MONTH.getCode().equals(timeType.getCode())){ - start = new BigDecimal(revenueArray[0]).divide(new BigDecimal(30),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); - end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(30),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); - } - if (revenue.compareTo(start) >= 0 && revenue.compareTo(end)<= 0){ - return ratio; - } - }if(e.indexOf(">") >= 0){ - String[] revenueArray = array[0].split(">"); - BigDecimal end = new BigDecimal(revenueArray[1]); - - //残年 (小金额 / 365 * 账单周期天数 )--(大金额 / 365 * 账单周期天数) - if(EnumMissTimeType.YEAR.getCode().equals(timeType.getCode())){ - end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(365),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); - }else if(EnumMissTimeType.MONTH.getCode().equals(timeType.getCode())){ - end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(30),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); - } - if (revenue.compareTo(end) >= 0){ - return ratio; - } - } - } - return 0; - } - @Override @Transactional(rollbackFor = {Exception.class}) public ResultData updateRevenue(WxBillRent record, MallUserInfo user) { @@ -334,19 +284,21 @@ public class WxBillRentServiceImpl implements WxBillRentService { Integer ratio = 0; if(StringUtils.isNotBlank(wxRentContract.getBusDiscountRatio())){ + long dayCount = DateUtils.startToEnd(record.getStarttime(),record.getEndtime()); + if(EnumBusRatioTime.YEAR.getCode().equals(wxRentContract.getBusDiscountTime())){ if(startInt == endInt && months == 12){ //刚好1年 - ratio = getPayRatio(wxBillRent,wxRentContract,EnumMissTimeType.OTHER); + ratio = WxRentContractServiceImpl.getPayRatio(wxBillRent.getRevenue(),wxRentContract.getBusDiscountRatio(),EnumMissTimeType.OTHER.getCode(),dayCount).getRatio(); }else{ - ratio = getPayRatio(wxBillRent,wxRentContract,EnumMissTimeType.YEAR); + ratio = WxRentContractServiceImpl.getPayRatio(wxBillRent.getRevenue(),wxRentContract.getBusDiscountRatio(),EnumMissTimeType.YEAR.getCode(),dayCount).getRatio(); } }else if(EnumBusRatioTime.MONTH.getCode().equals(wxRentContract.getBusDiscountTime())){ if(startInt == endInt && months == 1){ //刚好1个月 - ratio = getPayRatio(wxBillRent,wxRentContract,EnumMissTimeType.OTHER); + ratio = WxRentContractServiceImpl.getPayRatio(wxBillRent.getRevenue(),wxRentContract.getBusDiscountRatio(),EnumMissTimeType.OTHER.getCode(),dayCount).getRatio(); }else{ - ratio = getPayRatio(wxBillRent,wxRentContract,EnumMissTimeType.MONTH); + ratio = WxRentContractServiceImpl.getPayRatio(wxBillRent.getRevenue(),wxRentContract.getBusDiscountRatio(),EnumMissTimeType.MONTH.getCode(),dayCount).getRatio(); } } } 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 1a06c2a6c..17db2e675 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -10,6 +10,7 @@ import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.domain.po.*; import com.iformall.domain.vo.BillTimeVo; +import com.iformall.domain.vo.RatioVo; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; @@ -250,17 +251,12 @@ public class WxRentContractServiceImpl implements WxRentContractService { /** * 获取设置的跳点率 - * 合同这,不需要年份月份转换 * ["1000-1200:10",">3000:20"] - * @param record */ - public BigDecimal getPayRatio(WxRentContract record){ - record.setPayRatio(0); - if(StringUtils.isBlank(record.getBusDiscountRatio())){ - return null; - } - BigDecimal revenue = new BigDecimal(record.getRevenue()).divide(new BigDecimal(1000000)).setScale(4, RoundingMode.HALF_EVEN); - List ratioList = JSONArray.parseArray(record.getBusDiscountRatio(), String.class); + public static RatioVo getPayRatio(Long revenueLong,String busDiscountRatio,int timeType,long dayCount){ + RatioVo ratioVo = new RatioVo(); + BigDecimal revenue = new BigDecimal(revenueLong).divide(new BigDecimal(1000000)).setScale(4, RoundingMode.HALF_EVEN); + List ratioList = JSONArray.parseArray(busDiscountRatio, String.class); for (int i = 0; i < ratioList.size(); i++) { String e = ratioList.get(i); @@ -271,20 +267,40 @@ public class WxRentContractServiceImpl implements WxRentContractService { String[] revenueArray = array[0].split("-"); BigDecimal start = new BigDecimal(revenueArray[0]); BigDecimal end = new BigDecimal(revenueArray[1]); + + //残年 (小金额 / 365 * 账单周期天数 )--(大金额 / 365 * 账单周期天数) + if(EnumMissTimeType.YEAR.getCode().equals(timeType)){ + start = new BigDecimal(revenueArray[0]).divide(new BigDecimal(365),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); + end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(365),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); + //revenue = revenue.divide(new BigDecimal(365)); + }else if(EnumMissTimeType.MONTH.getCode().equals(timeType)){ + start = new BigDecimal(revenueArray[0]).divide(new BigDecimal(30),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); + end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(30),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); + //revenue = revenue.divide(new BigDecimal(30)); + } + if (revenue.compareTo(start) >= 0 && revenue.compareTo(end)<= 0){ - record.setPayRatio(ratio); + ratioVo.setRatio(ratio); break; } - - }if(e.indexOf(">") >= 0){ + }else if(e.indexOf(">") >= 0){ String[] revenueArray = array[0].split(">"); BigDecimal end = new BigDecimal(revenueArray[1]); + + //残年 (小金额 / 365 * 账单周期天数 )--(大金额 / 365 * 账单周期天数) + if(EnumMissTimeType.YEAR.getCode().equals(timeType)){ + end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(365),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); + //revenue = revenue.divide(new BigDecimal(365)); + }else if(EnumMissTimeType.MONTH.getCode().equals(timeType)){ + end = new BigDecimal(revenueArray[1]).divide(new BigDecimal(30),10,BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(dayCount)); + //revenue = revenue.divide(new BigDecimal(30)); + } if (revenue.compareTo(end) >= 0){ - record.setPayRatio(ratio); + ratioVo.setRatio(ratio); //计算超出部分 - BigDecimal payRatio = new BigDecimal(record.getPayRatio() == null ? 0 : record.getPayRatio()).divide(new BigDecimal(10000)); - BigDecimal balance = new BigDecimal(record.getRevenue()).subtract(end.multiply(new BigDecimal(1000000))); + BigDecimal payRatio = new BigDecimal(ratio).divide(new BigDecimal(10000)); + BigDecimal balance = new BigDecimal(revenueLong).subtract(end.multiply(new BigDecimal(1000000))); BigDecimal price = balance.multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN); array = ratioList.get(i-1).split(":"); @@ -292,11 +308,12 @@ public class WxRentContractServiceImpl implements WxRentContractService { BigDecimal frontRatio = new BigDecimal(frontatio).divide(new BigDecimal(10000)); BigDecimal frontPrice = end.multiply(new BigDecimal(1000000).multiply(frontRatio).setScale(2, RoundingMode.HALF_EVEN)); - return price.add(frontPrice); + ratioVo.setBalance(price.add(frontPrice)); + return ratioVo; } } } - return null; + return ratioVo; } @Transactional(rollbackFor = {Exception.class}) @@ -322,18 +339,24 @@ public class WxRentContractServiceImpl implements WxRentContractService { } if (record.getType().equals(EnumRentContractType.RENT_BY_JOINT.getCode())) { - BigDecimal balance = getPayRatio(record); //有超出部分 - BigDecimal hundred = new BigDecimal(100); - BigDecimal revenue = new BigDecimal(record.getRevenue() == null ? 0 : record.getRevenue()).divide(hundred); - BigDecimal payRatio = new BigDecimal(record.getPayRatio() == null ? 0 : record.getPayRatio()).divide(new BigDecimal(10000)); - - BigDecimal price; - if(balance != null){ - //计算超出部分 - record.setPrice(balance.longValue()); + if(record.getRevenue() == null || record.getRevenue().longValue() <=0){ + record.setPrice(0l); }else{ - price = revenue.multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN); - record.setPrice(price.multiply(hundred).longValue()); + int dayCount = record.getReceivePeriod() * 30; + RatioVo ratioVo = getPayRatio(record.getRevenue(),record.getBusDiscountRatio(),record.getBusDiscountTime(),dayCount); + record.setPayRatio(ratioVo.getRatio()); + BigDecimal hundred = new BigDecimal(100); + BigDecimal revenue = new BigDecimal(record.getRevenue() == null ? 0 : record.getRevenue()).divide(hundred); + BigDecimal payRatio = new BigDecimal(record.getPayRatio() == null ? 0 : record.getPayRatio()).divide(new BigDecimal(10000)); + + BigDecimal price; + if(ratioVo.getBalance() != null){ + //计算超出部分 + record.setPrice(ratioVo.getBalance().longValue()); + }else{ + price = revenue.multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN); + record.setPrice(price.multiply(hundred).longValue()); + } } } else { if (StringUtils.isNotEmpty(record.getPriceStr())) { @@ -540,6 +563,8 @@ public class WxRentContractServiceImpl implements WxRentContractService { wxBillRentMapper.insertBills(record.getPreviewBillRentList()); } + + public ResultData getResultDataForUpdate(WxRentContract record, Long userId,int from,Date oldRentStartDate) { //更新租赁合同信息 WxRentContract wxRentContract = wxRentContractMapper.selectByPrimaryKey(record.getId()); @@ -556,16 +581,18 @@ public class WxRentContractServiceImpl implements WxRentContractService { instance.add(dayType, record.getLease()); instance.add(Calendar.DAY_OF_MONTH, -1); - if(from != 1){ + if(!EnumFromType.SWITCH.getCode().equals(from)){ if (record.getType().equals(EnumRentContractType.RENT_BY_JOINT.getCode())) { - BigDecimal balance = getPayRatio(record); + int dayCount = record.getReceivePeriod() * 30; + RatioVo ratioVo = getPayRatio(record.getRevenue(),record.getBusDiscountRatio(),record.getBusDiscountTime(),dayCount); + record.setPayRatio(ratioVo.getRatio()); BigDecimal hundred = new BigDecimal(100); BigDecimal revenue = new BigDecimal(record.getRevenue() == null ? 0 : record.getRevenue()).divide(hundred); BigDecimal payRatio = new BigDecimal(record.getPayRatio() == null ? 0 : record.getPayRatio()).divide(new BigDecimal(10000)); BigDecimal price; - if(balance != null){ - record.setPrice(balance.longValue()); + if(ratioVo.getBalance() != null){ + record.setPrice(ratioVo.getBalance().longValue()); }else { price = revenue.multiply(payRatio).setScale(2, RoundingMode.HALF_EVEN); record.setPrice(price.multiply(hundred).longValue()); @@ -2091,12 +2118,6 @@ public class WxRentContractServiceImpl implements WxRentContractService { Double total = new Double(0); int[] diff; - System.out.println(sd.format(start)); - System.out.println(sd.format(end)); - if(sd.format(end).equals("2020-08-18")){ - System.out.println(); - } - //同一天 if(sd.format(start).equals(sd.format(end))){ int dayCount = DateUtils.getMonthDayCount(start);