Просмотр исходного кода

[合同][修改][开发账单结算]

release_toaliyun_real
luozukai 6 лет назад
Родитель
Сommit
bf6b7e5318
3 измененных файлов: 78 добавлений и 92 удалений
  1. +13
    -0
      mallinkService/src/main/java/com/iformall/domain/vo/RatioVo.java
  2. +6
    -54
      mallinkService/src/main/java/com/iformall/service/impl/WxBillRentServiceImpl.java
  3. +59
    -38
      mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java

+ 13
- 0
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;
}

+ 6
- 54
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<String> 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();
}
}
}


+ 59
- 38
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<String> 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<String> 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);


Загрузка…
Отмена
Сохранить