|
|
@@ -305,6 +305,7 @@ public class EvaluationController extends BaseApiController {
|
|
|
return fc.getIncome();
|
|
|
}).collect(Collectors.toList());
|
|
|
List<Long> sysForecast = calcSysForecast(userForecast, industryAverageRate, timeLeft);
|
|
|
+ calcUserForecast(userForecast, timeLeft);
|
|
|
List<Long> measuredForecast = calcMeasuredForecast(userForecast, sysForecast);
|
|
|
|
|
|
Map<String, Integer> profitScores = getProfitScores(step2, step3);
|
|
|
@@ -317,7 +318,6 @@ public class EvaluationController extends BaseApiController {
|
|
|
BigDecimal taxRate = new BigDecimal(step6.getTaxRate());
|
|
|
|
|
|
BigDecimal discountRate = calcDiscountRate(discountRates, taxRate, governmentLoanRoR);
|
|
|
-
|
|
|
result.put("userForecast", userForecast);
|
|
|
result.put("sysForecast", sysForecast);
|
|
|
result.put("measuredForecast", measuredForecast);
|
|
|
@@ -455,9 +455,27 @@ public class EvaluationController extends BaseApiController {
|
|
|
return DISCOUNT_SCORES[idx];
|
|
|
}
|
|
|
|
|
|
+ private void calcUserForecast(List<Long> userForecast, Integer timeLeft) {
|
|
|
+ Assert.isTrue(userForecast.get(0) > 0 && userForecast.get(1) > 0, ErrorConstants.EVALUATE_PARAM);
|
|
|
+ BigDecimal second = new BigDecimal(userForecast.get(1));
|
|
|
+ BigDecimal lastYear = new BigDecimal(userForecast.get(2));
|
|
|
+ BigDecimal rate = lastYear.divide(second, 2, RoundingMode.HALF_UP)
|
|
|
+ .subtract(BigDecimal.ONE).add(second
|
|
|
+ .divide(new BigDecimal(userForecast.get(0)), 2, RoundingMode.HALF_UP).subtract(BigDecimal.ONE))
|
|
|
+ .divide(new BigDecimal(2));
|
|
|
+ BigDecimal step = new BigDecimal(0.1, DEFAULT_PRECISION);
|
|
|
+ int size = userForecast.size();
|
|
|
+ for (int i = size; i < timeLeft; i++) {
|
|
|
+ if (i < 6) {
|
|
|
+ lastYear = lastYear.multiply(
|
|
|
+ BigDecimal.ONE.add(rate.multiply(rate.subtract(step.multiply(new BigDecimal(i - size))))));
|
|
|
+ }
|
|
|
+ userForecast.add(lastYear.longValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private List<Long> calcSysForecast(List<Long> userForecast, BigDecimal industryAverageRate, Integer timeLeft) {
|
|
|
List<Long> sysForecast = new ArrayList<>();
|
|
|
- BigDecimal rate = BigDecimal.ONE;
|
|
|
BigDecimal lastYear = BigDecimal.ZERO;
|
|
|
BigDecimal step = new BigDecimal(0.1, DEFAULT_PRECISION);
|
|
|
industryAverageRate = industryAverageRate.multiply(PERCENTAGE);
|
|
|
@@ -465,8 +483,8 @@ public class EvaluationController extends BaseApiController {
|
|
|
if (i == 0) {
|
|
|
lastYear = new BigDecimal(userForecast.get(0)).multiply(new BigDecimal(0.9, DEFAULT_PRECISION));
|
|
|
} else if (i < 6) {
|
|
|
- lastYear = lastYear.multiply(BigDecimal.ONE
|
|
|
- .add(industryAverageRate.multiply(rate.subtract(step.multiply(new BigDecimal(i))))));
|
|
|
+ lastYear = lastYear.multiply(BigDecimal.ONE.add(
|
|
|
+ industryAverageRate.multiply(BigDecimal.ONE.subtract(step.multiply(new BigDecimal(i - 1))))));
|
|
|
}
|
|
|
sysForecast.add(lastYear.longValue());
|
|
|
}
|
|
|
@@ -476,11 +494,7 @@ public class EvaluationController extends BaseApiController {
|
|
|
private List<Long> calcMeasuredForecast(List<Long> userForecast, List<Long> sysForecast) {
|
|
|
List<Long> measuredForecast = new ArrayList<>();
|
|
|
for (int i = 0; i < sysForecast.size(); i++) {
|
|
|
- if (i < userForecast.size()) {
|
|
|
- measuredForecast.add((userForecast.get(i) + sysForecast.get(i)) >> 1);
|
|
|
- } else {
|
|
|
- measuredForecast.add(sysForecast.get(i));
|
|
|
- }
|
|
|
+ measuredForecast.add((userForecast.get(i) + sysForecast.get(i)) >> 1);
|
|
|
}
|
|
|
return measuredForecast;
|
|
|
}
|