albertshaw 8 years ago
parent
commit
b39ee222d8

+ 23 - 9
src/main/java/com/goafanti/evaluation/controller/EvaluationController.java

@@ -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;
 	}