|
|
|
@ -9,7 +9,9 @@ import com.sztzjy.fund_investment.mapper.ProfitDistributionMapper;
|
|
|
|
|
import com.sztzjy.fund_investment.service.ISysFundraisingService;
|
|
|
|
|
import com.sztzjy.fund_investment.service.PerformanceScoreService;
|
|
|
|
|
import com.sztzjy.fund_investment.service.ProfitDistributionService;
|
|
|
|
|
import com.sztzjy.fund_investment.util.ResultEntity;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
@ -140,13 +142,27 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
/* 收益分配计算提交
|
|
|
|
|
* @author xcj
|
|
|
|
|
* @Date 2023/12/11
|
|
|
|
|
* 分配顺序:①银行借款(本金+利息) ②优先级LP(本金+本金*10%) ③劣后级LP(本金) ④自有资金(本金)
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void submit(ProfitDistribution profitDistribution) {
|
|
|
|
|
public ResultEntity submit(ProfitDistribution profitDistribution) {
|
|
|
|
|
//校验可用资金
|
|
|
|
|
if (profitDistribution.getUserAvailableFunds() == null) {
|
|
|
|
|
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请输入可用资金!");
|
|
|
|
|
}
|
|
|
|
|
//校验优先级LP和自有资金
|
|
|
|
|
if (profitDistribution.getUserRemainingOwnFunds() == null || profitDistribution.getUserRoundOwnFunds() == null ||
|
|
|
|
|
profitDistribution.getUserRoundPreferredLp() == null || profitDistribution.getUserRemainingEarningsPreferredLp() == null) {
|
|
|
|
|
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请输入分配金额!");
|
|
|
|
|
}
|
|
|
|
|
//查看基金募集属于哪种情况
|
|
|
|
|
String flowId = profitDistribution.getFlowId();
|
|
|
|
|
Fundraising fundraising = fundraisingService.selectByFlowId(flowId);
|
|
|
|
|
ExitTime exitTime = exitTimeMapper.selectByPrimaryKey(flowId);
|
|
|
|
|
profitDistribution.setProjectName(exitTime.getProjectName());
|
|
|
|
|
profitDistribution.setInvestmentAmount(exitTime.getInvestmentAmount());
|
|
|
|
|
profitDistribution.setExitStockPrice(exitTime.getExitStockPrice());
|
|
|
|
|
profitDistribution.setFundEarnings(exitTime.getExitFundEarnings());
|
|
|
|
|
BigDecimal fundraisingAmount = fundraising.getFundraisingAmount(); //资金募集总金额
|
|
|
|
|
BigDecimal priorityLp = fundraising.getPriorityLp(); //优先级LP本金
|
|
|
|
|
BigDecimal subordinatedLp = fundraising.getSubordinatedLp();//劣后级LP本金
|
|
|
|
@ -154,8 +170,8 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
BigDecimal exitFundEarnings = exitTime.getExitFundEarnings();//投资收益
|
|
|
|
|
BigDecimal userRoundOwnFunds = profitDistribution.getUserRoundOwnFunds();//用户/第一轮自有资金
|
|
|
|
|
BigDecimal userRoundPreferredLp = profitDistribution.getUserRoundPreferredLp(); //用户/第一轮优先级LP
|
|
|
|
|
BigDecimal remainingOwnFunds = profitDistribution.getRemainingOwnFunds();//用户/第二轮自有资金
|
|
|
|
|
BigDecimal remainingEarningsPreferredLp = profitDistribution.getRemainingEarningsPreferredLp();//用户/第二轮优先级LP
|
|
|
|
|
BigDecimal userRemainingOwnFunds = profitDistribution.getRemainingOwnFunds();//用户/第二轮自有资金
|
|
|
|
|
BigDecimal userRemainingEarningsPreferredLp = profitDistribution.getRemainingEarningsPreferredLp();//用户/第二轮优先级LP
|
|
|
|
|
BigDecimal rightOwnFunds = fundraising.getOwnFunds();//正确/第一轮自有资金
|
|
|
|
|
Integer type = fundraising.getType();
|
|
|
|
|
//计算可用资金是否正确
|
|
|
|
@ -170,21 +186,31 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
if (type == 1) { //1:自有资金/优先级LP
|
|
|
|
|
profitDistribution.setRemainingOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRemainingEarningsPreferredLp(BigDecimal.ZERO);
|
|
|
|
|
if (exitFundEarnings.compareTo(BigDecimal.ZERO) <= 0) { //盈利<0 亏损状态
|
|
|
|
|
if (rightAvailableFunds.compareTo(BigDecimal.ZERO)<=0){
|
|
|
|
|
profitDistribution.setRoundPreferredLp(BigDecimal.ZERO);//可用资金都给优先级LP 其余都为0
|
|
|
|
|
}else {
|
|
|
|
|
if (exitFundEarnings.compareTo(BigDecimal.ZERO) <= 0 || subtract.compareTo(BigDecimal.ZERO) < 0) { //盈利<0 亏损状态
|
|
|
|
|
if (rightAvailableFunds.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
profitDistribution.setRoundPreferredLp(BigDecimal.ZERO);//可用资金>0的情况
|
|
|
|
|
} else {
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightAvailableFunds);//可用资金都给优先级LP 其余都为0
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRoundOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
return;
|
|
|
|
|
//算分
|
|
|
|
|
if (BigDecimal.ZERO.compareTo(userRoundOwnFunds) == 0 && rightAvailableFunds.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
if (subtract.compareTo(rightOwnFunds) <= 0&& subtract.compareTo(BigDecimal.ZERO) > 0) { //如果可用资金 - 优先级LP <= 需要分配的自有资金剩余金额全部给 自有资金,第二轮都为0
|
|
|
|
|
if (subtract.compareTo(rightOwnFunds) <= 0 && subtract.compareTo(BigDecimal.ZERO) >= 0) { //如果可用资金 - 优先级LP <= 需要分配的自有资金剩余金额全部给 自有资金,第二轮都为0
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightFundraisingAmount);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(subtract);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
return;
|
|
|
|
|
//判断算分
|
|
|
|
|
if (subtract.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRoundOwnFunds(rightOwnFunds);
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightFundraisingAmount);
|
|
|
|
@ -196,14 +222,67 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//算分 共五分,可用资金1分,其他共4分,错一个不得分
|
|
|
|
|
if (rightOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(remainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(remainingEarningsPreferredLp) == 0) {
|
|
|
|
|
twoRightOwnFunds.compareTo(userRemainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
} else if (type == 2) { //2:自有资金/优先级LP/劣后级LP
|
|
|
|
|
if (profitDistribution.getUserRemainingEarningsSubordinatedLp() == null || profitDistribution.getUserRoundSubordinatedLp() == null) {
|
|
|
|
|
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请填写劣后级LP分配金额!");
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRemainingOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRemainingEarningsPreferredLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRemainingEarningsSubordinatedLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
BigDecimal userRemainingEarningsSubordinatedLp = profitDistribution.getUserRemainingEarningsSubordinatedLp();//用户/剩余收益劣后级LP
|
|
|
|
|
BigDecimal userRoundSubordinatedLp = profitDistribution.getUserRoundSubordinatedLp();//用户/第一轮劣后级LP
|
|
|
|
|
|
|
|
|
|
if (exitFundEarnings.compareTo(BigDecimal.ZERO) <= 0 || subtract.compareTo(BigDecimal.ZERO) < 0) { //盈利<=0 亏损状态
|
|
|
|
|
if (rightAvailableFunds.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
rightAvailableFunds = BigDecimal.ZERO;
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightAvailableFunds);//可用资金>0的情况
|
|
|
|
|
} else {
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightAvailableFunds);//可用资金都给优先级LP 其余都为0
|
|
|
|
|
}
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//算分
|
|
|
|
|
if (BigDecimal.ZERO.compareTo(userRoundOwnFunds) == 0 && rightAvailableFunds.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRoundSubordinatedLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightFundraisingAmount); //下面的情况优先级LP都足够
|
|
|
|
|
//需要分配的劣后级LP金额 >= 剩余金额 >=0,将剩余的都给劣后级LP,第二轮都为0
|
|
|
|
|
if (subtract.compareTo(subordinatedLp) <= 0 && subtract.compareTo(BigDecimal.ZERO) >= 0) {
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(subtract);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (rightOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
subtract.compareTo(userRoundSubordinatedLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
//分配完优劣LP后剩余的钱
|
|
|
|
|
BigDecimal subtractSubordinatedLp = subtract.subtract(subordinatedLp); //可用资金 - 第一轮/优先级LP - 第一轮劣后优先级LP
|
|
|
|
|
if (subtractSubordinatedLp.compareTo(BigDecimal.ZERO) >= 0 && subtractSubordinatedLp.compareTo(rightOwnFunds) <= 0) {
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(subordinatedLp);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(subtractSubordinatedLp);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (subtractSubordinatedLp.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
subordinatedLp.compareTo(userRoundSubordinatedLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
// 第一轮归还劣后级LP本金
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(subordinatedLp);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(rightOwnFunds);
|
|
|
|
|
residualIncome = residualIncome.subtract(subordinatedLp); //剩余收益
|
|
|
|
|
// 2.剩余收益分配比例为,自有资金25%,优先级LP 30%,劣后级LP 45%
|
|
|
|
|
BigDecimal twoRightOwnFunds = residualIncome.multiply(BigDecimal.valueOf(0.25)).setScale(2, RoundingMode.HALF_UP);//剩余自有资金
|
|
|
|
@ -214,14 +293,67 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
profitDistribution.setRemainingEarningsSubordinatedLp(twoRightSubordinatedLp);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
if (rightOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(remainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(remainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(userRemainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(userRemainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
userRoundSubordinatedLp.compareTo(subordinatedLp) == 0 && userRemainingEarningsSubordinatedLp.compareTo(twoRightSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
} else if (type == 3) { //3:自有资金/优先级LP/银行借款
|
|
|
|
|
BigDecimal userRoundBankLoan = profitDistribution.getUserRoundBankLoan(); //用户/银行借款
|
|
|
|
|
} else if (type == 3) { //3:银行借款/自有资金/优先级LP
|
|
|
|
|
if (profitDistribution.getUserRoundBankLoan() == null) {
|
|
|
|
|
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请填写银行借款分配金额!");
|
|
|
|
|
}
|
|
|
|
|
BigDecimal rightBankLoan = bankLoan.add(bankLoan.multiply(BigDecimal.valueOf(0.0475))).setScale(2, RoundingMode.HALF_UP); //银行借款/+利息4.75%
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightBankLoan);
|
|
|
|
|
profitDistribution.setRemainingOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRemainingEarningsPreferredLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRoundPreferredLp(BigDecimal.ZERO);
|
|
|
|
|
BigDecimal userRoundBankLoan = profitDistribution.getUserRoundBankLoan(); //用户/银行借款
|
|
|
|
|
BigDecimal subtractBankLoan = rightAvailableFunds.subtract(rightBankLoan); //可用资金 - 银行利息
|
|
|
|
|
|
|
|
|
|
if (exitFundEarnings.compareTo(BigDecimal.ZERO) <= 0 || subtractBankLoan.compareTo(BigDecimal.ZERO) < 0) { //盈利<0 亏损状态或者盈利少的状态
|
|
|
|
|
if (rightAvailableFunds.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
rightAvailableFunds = BigDecimal.ZERO;
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightAvailableFunds);//可用资金>0的情况
|
|
|
|
|
} else {
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightAvailableFunds);//可用资金都给银行贷款 其余都为0
|
|
|
|
|
}
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//算分
|
|
|
|
|
if (BigDecimal.ZERO.compareTo(userRoundOwnFunds) == 0 && rightAvailableFunds.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRoundPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightBankLoan); //下面的情况优先级银行贷款都足够
|
|
|
|
|
//需要分配的优先级LP金额 >= 剩余金额 >=0,将剩余的都给优先级LP,第二轮都为0
|
|
|
|
|
if (subtractBankLoan.compareTo(rightFundraisingAmount) <= 0 && subtractBankLoan.compareTo(BigDecimal.ZERO) >= 0) {
|
|
|
|
|
profitDistribution.setRoundPreferredLp(subtractBankLoan);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (BigDecimal.ZERO.compareTo(userRoundOwnFunds) == 0 && rightBankLoan.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
subtractBankLoan.compareTo(userRoundPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
//分配完优先级LP后剩余的钱给自有资金
|
|
|
|
|
BigDecimal subtractRoundOwnFunds = subtract.subtract(rightBankLoan); //可用资金 - 第一轮/优先级LP - 银行利息
|
|
|
|
|
if (subtractRoundOwnFunds.compareTo(BigDecimal.ZERO) >= 0 && subtractRoundOwnFunds.compareTo(rightOwnFunds) <= 0) {
|
|
|
|
|
profitDistribution.setRoundOwnFunds(subtractRoundOwnFunds);
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightFundraisingAmount);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (subtractRoundOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightBankLoan.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightFundraisingAmount);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(rightOwnFunds);
|
|
|
|
|
residualIncome = residualIncome.subtract(rightBankLoan); //剩余收益
|
|
|
|
|
// 2.剩余收益分配比例为,自有资金25%,优先级LP75%
|
|
|
|
|
BigDecimal twoRightOwnFunds = residualIncome.multiply(BigDecimal.valueOf(0.25)).setScale(2, RoundingMode.HALF_UP);//剩余自有资金
|
|
|
|
@ -230,17 +362,92 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
profitDistribution.setRemainingEarningsPreferredLp(twoRightFundraisingAmount);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
if (rightOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(remainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(remainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(userRemainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(userRemainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
rightBankLoan.compareTo(userRoundBankLoan) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
} else { //4:自有资金/优先级LP/劣后级LP/银行借款
|
|
|
|
|
} else { //4:银行借款/优先级LP/劣后级LP/自有资金
|
|
|
|
|
if (profitDistribution.getUserRemainingEarningsSubordinatedLp() == null || profitDistribution.getUserRoundSubordinatedLp() == null) {
|
|
|
|
|
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请填写劣后级LP分配金额!");
|
|
|
|
|
}
|
|
|
|
|
if (profitDistribution.getUserRoundBankLoan() == null) {
|
|
|
|
|
return new ResultEntity<>(HttpStatus.BAD_REQUEST, "请填写银行借款分配金额!");
|
|
|
|
|
}
|
|
|
|
|
BigDecimal rightBankLoan = bankLoan.add(bankLoan.multiply(BigDecimal.valueOf(0.0475))).setScale(2, RoundingMode.HALF_UP); //银行借款/+利息4.75%
|
|
|
|
|
profitDistribution.setRemainingOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRemainingEarningsPreferredLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRemainingEarningsSubordinatedLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRoundPreferredLp(BigDecimal.ZERO);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(BigDecimal.ZERO);
|
|
|
|
|
BigDecimal userRoundBankLoan = profitDistribution.getUserRoundBankLoan(); //用户/银行借款
|
|
|
|
|
BigDecimal subtractBankLoan = rightAvailableFunds.subtract(rightBankLoan); //可用资金 - 银行利息
|
|
|
|
|
BigDecimal userRemainingEarningsSubordinatedLp = profitDistribution.getUserRemainingEarningsSubordinatedLp();//用户/剩余收益劣后级LP
|
|
|
|
|
BigDecimal userRoundSubordinatedLp = profitDistribution.getUserRoundSubordinatedLp();//用户/第一轮劣后级LP
|
|
|
|
|
BigDecimal userRoundBankLoan = profitDistribution.getUserRoundBankLoan(); //用户/银行借款
|
|
|
|
|
|
|
|
|
|
if (exitFundEarnings.compareTo(BigDecimal.ZERO) <= 0 || subtractBankLoan.compareTo(BigDecimal.ZERO) < 0) { //盈利<0 亏损状态或者盈利少的状态
|
|
|
|
|
if (rightAvailableFunds.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
rightAvailableFunds = BigDecimal.ZERO;
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightAvailableFunds);//可用资金>0的情况
|
|
|
|
|
} else {
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightAvailableFunds);//可用资金都给银行贷款 其余都为0
|
|
|
|
|
}
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//算分
|
|
|
|
|
if (BigDecimal.ZERO.compareTo(userRoundOwnFunds) == 0 && rightAvailableFunds.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRoundPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingEarningsSubordinatedLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRoundSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightBankLoan); //下面的情况优先级银行贷款都足够
|
|
|
|
|
//需要分配的优先级LP金额 >= 剩余金额 >=0,将剩余的都给优先级LP,第二轮都为0
|
|
|
|
|
if (subtractBankLoan.compareTo(rightFundraisingAmount) <= 0 && subtractBankLoan.compareTo(BigDecimal.ZERO) >= 0) {
|
|
|
|
|
profitDistribution.setRoundPreferredLp(subtractBankLoan);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (BigDecimal.ZERO.compareTo(userRoundOwnFunds) == 0 && rightBankLoan.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
subtractBankLoan.compareTo(userRoundPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRoundSubordinatedLp) == 0
|
|
|
|
|
&& BigDecimal.ZERO.compareTo(userRemainingEarningsSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
//分配完优先级LP后剩余的钱给劣后级LP
|
|
|
|
|
BigDecimal subtractSubordinatedLp = subtract.subtract(rightBankLoan); //可用资金 - 第一轮/优先级LP - 银行利息
|
|
|
|
|
profitDistribution.setRoundPreferredLp(rightFundraisingAmount);
|
|
|
|
|
if (subtractSubordinatedLp.compareTo(BigDecimal.ZERO) >= 0 && subtractSubordinatedLp.compareTo(subordinatedLp) <= 0) {
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(subtractSubordinatedLp);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (subtractSubordinatedLp.compareTo(userRoundOwnFunds) == 0 && rightBankLoan.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 && BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//分配完优先级LP 和 劣后级LP 剩下的给自有资金
|
|
|
|
|
BigDecimal subtractRoundOwnFunds = subtract.subtract(rightBankLoan).subtract(subordinatedLp); //可用资金 - 第一轮/优先级LP - 银行利息
|
|
|
|
|
if (subtractRoundOwnFunds.compareTo(BigDecimal.ZERO) >= 0 && subtractRoundOwnFunds.compareTo(rightOwnFunds) <= 0) {
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(subordinatedLp);
|
|
|
|
|
profitDistribution.setRoundOwnFunds(subtractRoundOwnFunds);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
//判断算分
|
|
|
|
|
if (subtractRoundOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightBankLoan.compareTo(userRoundBankLoan) == 0 &&
|
|
|
|
|
subordinatedLp.compareTo(userRoundSubordinatedLp) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingOwnFunds) == 0 && subordinatedLp.compareTo(userRoundSubordinatedLp) == 0 &&
|
|
|
|
|
BigDecimal.ZERO.compareTo(userRemainingEarningsPreferredLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
return new ResultEntity<>(HttpStatus.OK, "分配完成!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第一轮归还劣后级LP本金和银行利息
|
|
|
|
|
profitDistribution.setRoundSubordinatedLp(subordinatedLp);
|
|
|
|
|
BigDecimal rightBankLoan = bankLoan.add(bankLoan.multiply(BigDecimal.valueOf(0.0475))); //银行借款/+利息4.75%
|
|
|
|
|
profitDistribution.setRoundBankLoan(rightBankLoan);
|
|
|
|
|
residualIncome = residualIncome.subtract(subordinatedLp).subtract(rightBankLoan); //剩余收益
|
|
|
|
|
//2.剩余收益分配比例为,自有资金25%,优先级LP 30%,劣后级LP 45%
|
|
|
|
@ -252,12 +459,13 @@ public class ProfitDistributionServiceImpl implements ProfitDistributionService
|
|
|
|
|
profitDistribution.setRemainingEarningsSubordinatedLp(twoRightSubordinatedLp);
|
|
|
|
|
profitDistributionMapper.insert(profitDistribution);
|
|
|
|
|
if (rightOwnFunds.compareTo(userRoundOwnFunds) == 0 && rightFundraisingAmount.compareTo(userRoundPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(remainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(remainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
twoRightOwnFunds.compareTo(userRemainingOwnFunds) == 0 && twoRightFundraisingAmount.compareTo(userRemainingEarningsPreferredLp) == 0 &&
|
|
|
|
|
rightBankLoan.compareTo(userRoundBankLoan) == 0 && userRoundSubordinatedLp.compareTo(subordinatedLp) == 0 &&
|
|
|
|
|
userRemainingEarningsSubordinatedLp.compareTo(twoRightSubordinatedLp) == 0) {
|
|
|
|
|
performanceScoreService.calculateScoreByModule("profitDistributionScore", 4, flowId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|