Browse Source

Merge branch 'master' of https://git.coding.net/aft/AFT.git

Antiloveg 8 years ago
parent
commit
d46aa35321

+ 14 - 0
schema/init.sql

@@ -1654,6 +1654,20 @@ CREATE TABLE `user_role` (
 -- Table structure for table `value_evaluation`
 --
 
+DROP TABLE IF EXISTS `value_evaluation`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `value_evaluation` (
+  `id` bigint(18) NOT NULL,
+  `uid` varchar(36) DEFAULT NULL COMMENT '用户id',
+  `create_time` datetime NOT NULL DEFAULT current_timestamp() COMMENT '创建时间',
+  `name` varchar(128) DEFAULT NULL COMMENT '技术名称',
+  `value` bigint(18) DEFAULT NULL COMMENT '评估值',
+  `step` int(2) DEFAULT NULL COMMENT '当前步骤',
+  `log` longtext DEFAULT NULL COMMENT '步骤记录',
+  PRIMARY KEY (`id`),
+  KEY `uid_index` (`uid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 /*!40101 SET character_set_client = @saved_cs_client */;
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

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