|
@@ -9,9 +9,10 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.cglib.beans.BeanMap;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 计算准确率、合格率
|
|
@@ -68,7 +69,11 @@ public class AccuracyPassRateCalculateService {
|
|
|
if (groupingList == null || groupingList.size() == 0) {
|
|
|
return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
|
|
|
}
|
|
|
- } else {
|
|
|
+ // 如果是多日数据,将数据按照日期分组
|
|
|
+ } else if(calculationFormula.getFormula().contains("manyDay")){
|
|
|
+ List<List<Map<String, Object>>> manyDaysList = groupingDaysList(checkedData,"genTime");
|
|
|
+ env.put(CalculateResult.LIST, manyDaysList);
|
|
|
+ }else {
|
|
|
env.put(CalculateResult.LIST, checkedData);
|
|
|
}
|
|
|
|
|
@@ -86,19 +91,12 @@ public class AccuracyPassRateCalculateService {
|
|
|
}
|
|
|
env.put(CalculateResult.MAX_OPEN_CAPACITY, maxOpenCapacity);
|
|
|
|
|
|
-// Map<String, Object> calculateRequestMap = new HashMap<>();
|
|
|
-// // bean 转map
|
|
|
-// BeanMap beanMap = BeanMap.create(calculateRequest);
|
|
|
-// for (Object key : beanMap.keySet()) {
|
|
|
-// calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
|
|
|
-// }
|
|
|
-
|
|
|
// 执行计算并得出结果
|
|
|
try {
|
|
|
// 获取计算结果
|
|
|
Object executeResult = AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(env);
|
|
|
// 过滤计算结果
|
|
|
- String result = filterResult(executeResult, calculationFormula.getIsRate());
|
|
|
+ String result = filterResult(executeResult, calculationFormula.getIsRate(),calculationFormula.getMaxMinLimit());
|
|
|
return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
@@ -112,7 +110,7 @@ public class AccuracyPassRateCalculateService {
|
|
|
* @param result 过滤前的结果
|
|
|
* @return 过滤后的结果
|
|
|
*/
|
|
|
- private String filterResult(Object result, String type) {
|
|
|
+ private String filterResult(Object result, String type ,String maxMinLimit) {
|
|
|
// 如果是map类型,转为jsonString
|
|
|
if (result instanceof HashMap) {
|
|
|
String jsonStr = JSONObject.toJSONString(result);
|
|
@@ -123,15 +121,18 @@ public class AccuracyPassRateCalculateService {
|
|
|
return String.valueOf(result);
|
|
|
}
|
|
|
BigDecimal resultBig = new BigDecimal(String.valueOf(result));
|
|
|
- //当结果为负数时,说明偏差过大,准确率为0
|
|
|
- if (resultBig.compareTo(BigDecimal.ZERO) == -1 || resultBig.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
- log.warn("结果为负数:" + resultBig + "自动转换为0%");
|
|
|
- resultBig = BigDecimal.ZERO;
|
|
|
- }
|
|
|
- // 如果结果大于1,则准确率设为100
|
|
|
- if (resultBig.compareTo(BigDecimal.ONE) == 1) {
|
|
|
- log.warn("结果大于100%:" + resultBig + "自动转换为100%");
|
|
|
- resultBig = BigDecimal.ONE;
|
|
|
+ // 判断计算结果是否限定上下限
|
|
|
+ if(maxMinLimit != null && maxMinLimit.equals(CalculateResult.STR_TRUE)){
|
|
|
+ //当结果为负数时,说明偏差过大,准确率为0
|
|
|
+ if (resultBig.compareTo(BigDecimal.ZERO) == -1 || resultBig.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ log.warn("结果为负数:" + resultBig + "自动转换为0%");
|
|
|
+ resultBig = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ // 如果结果大于1,则准确率设为100
|
|
|
+ if (resultBig.compareTo(BigDecimal.ONE) == 1) {
|
|
|
+ log.warn("结果大于100%:" + resultBig + "自动转换为100%");
|
|
|
+ resultBig = BigDecimal.ONE;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 如果公式结果为带百分号
|
|
@@ -274,6 +275,9 @@ public class AccuracyPassRateCalculateService {
|
|
|
*/
|
|
|
private List<Map<String, Object>> getCalculationInfoList(List<CalculationInfo> calculationInfoList, BigDecimal electricCapacity) {
|
|
|
List<Map<String, Object>> resultList = new ArrayList<>();
|
|
|
+ long time;
|
|
|
+ Date timeDate;
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
// 循环每条数据
|
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
|
// 将bean BeanMap
|
|
@@ -282,6 +286,11 @@ public class AccuracyPassRateCalculateService {
|
|
|
// 将beanMap转为Map
|
|
|
for (Object key : beanMap.keySet()) {
|
|
|
map.put(String.valueOf(key), beanMap.get(key));
|
|
|
+ if("time".equals(key.toString())){
|
|
|
+ time = (long)beanMap.get(key);
|
|
|
+ timeDate = new Date(time);
|
|
|
+ map.put("timeStr", sdf.format(timeDate));
|
|
|
+ }
|
|
|
}
|
|
|
map.put("electricCapacity", electricCapacity);
|
|
|
resultList.add(map);
|
|
@@ -341,6 +350,22 @@ public class AccuracyPassRateCalculateService {
|
|
|
|
|
|
return groupingList;
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 将多日数据分成多组,并放入list中
|
|
|
+ *
|
|
|
+ * @param list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<List<Map<String, Object>>> groupingDaysList(List<Map<String, Object>> list,String groupBy) {
|
|
|
+ List<List<Map<String, Object>>> groupingList = new ArrayList<>();
|
|
|
|
|
|
+ Map<String, List<Map<String, Object>>> groupedMap = list.stream()
|
|
|
+ .collect(Collectors.groupingBy(map -> map.get(groupBy).toString().substring(0,10)));
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<Map<String, Object>>> entry : groupedMap.entrySet()) {
|
|
|
+ groupingList.add(entry.getValue());
|
|
|
+ }
|
|
|
+ return groupingList;
|
|
|
+ }
|
|
|
}
|
|
|
|