|
@@ -1,12 +1,29 @@
|
|
|
package com.jjt.risk.service.impl;
|
|
|
|
|
|
-import java.util.List;
|
|
|
- import com.jjt.common.utils.DateUtils;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import com.jjt.risk.mapper.RiskAnalysisMapper;
|
|
|
+import com.alibaba.fastjson2.JSONArray;
|
|
|
+import com.alibaba.fastjson2.JSONObject;
|
|
|
+import com.jjt.biz.domain.BizObj;
|
|
|
+import com.jjt.biz.domain.BizObjMetrics;
|
|
|
+import com.jjt.biz.domain.BizObjMetricsData;
|
|
|
+import com.jjt.biz.service.IBizObjMetricsDataService;
|
|
|
+import com.jjt.biz.service.IBizObjMetricsService;
|
|
|
+import com.jjt.biz.service.IBizObjService;
|
|
|
+import com.jjt.common.utils.DateUtils;
|
|
|
+import com.jjt.common.utils.http.HttpUtils;
|
|
|
import com.jjt.risk.domain.RiskAnalysis;
|
|
|
+import com.jjt.risk.domain.RiskModel;
|
|
|
+import com.jjt.risk.domain.RiskObj;
|
|
|
+import com.jjt.risk.mapper.RiskAnalysisMapper;
|
|
|
import com.jjt.risk.service.IRiskAnalysisService;
|
|
|
+import com.jjt.risk.service.IRiskModelService;
|
|
|
+import com.jjt.system.service.ISysConfigService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 风险分析结果Service业务层处理
|
|
@@ -18,6 +35,16 @@ import javax.annotation.Resource;
|
|
|
public class RiskAnalysisServiceImpl implements IRiskAnalysisService {
|
|
|
@Resource
|
|
|
private RiskAnalysisMapper riskAnalysisMapper;
|
|
|
+ @Resource
|
|
|
+ private IRiskModelService riskModelService;
|
|
|
+ @Resource
|
|
|
+ private IBizObjService objService;
|
|
|
+ @Resource
|
|
|
+ private IBizObjMetricsService objMetricsService;
|
|
|
+ @Resource
|
|
|
+ private IBizObjMetricsDataService dataService;
|
|
|
+ @Resource
|
|
|
+ private ISysConfigService configService;
|
|
|
|
|
|
/**
|
|
|
* 查询风险分析结果
|
|
@@ -49,8 +76,8 @@ public class RiskAnalysisServiceImpl implements IRiskAnalysisService {
|
|
|
*/
|
|
|
@Override
|
|
|
public int insertRiskAnalysis(RiskAnalysis riskAnalysis) {
|
|
|
- riskAnalysis.setCreateTime(DateUtils.getNowDate());
|
|
|
- return riskAnalysisMapper.insertRiskAnalysis(riskAnalysis);
|
|
|
+ riskAnalysis.setCreateTime(DateUtils.getNowDate());
|
|
|
+ return riskAnalysisMapper.insertRiskAnalysis(riskAnalysis);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -61,7 +88,7 @@ public class RiskAnalysisServiceImpl implements IRiskAnalysisService {
|
|
|
*/
|
|
|
@Override
|
|
|
public int updateRiskAnalysis(RiskAnalysis riskAnalysis) {
|
|
|
- riskAnalysis.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ riskAnalysis.setUpdateTime(DateUtils.getNowDate());
|
|
|
return riskAnalysisMapper.updateRiskAnalysis(riskAnalysis);
|
|
|
}
|
|
|
|
|
@@ -86,4 +113,138 @@ public class RiskAnalysisServiceImpl implements IRiskAnalysisService {
|
|
|
public int deleteRiskAnalysisByResultId(Long resultId) {
|
|
|
return riskAnalysisMapper.deleteRiskAnalysisByResultId(resultId);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 立即分析
|
|
|
+ *
|
|
|
+ * @param rm 风险对象
|
|
|
+ * @param time 时间
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public RiskAnalysis risk(RiskModel rm, Date time) {
|
|
|
+ String uri = configService.selectConfigByKey("risk.api.uri");
|
|
|
+ List<Long> objIds = new ArrayList<>();
|
|
|
+ //找到对象
|
|
|
+ if ("1".equals(rm.getObjType())) {
|
|
|
+ //1.所有对象
|
|
|
+ List<BizObj> list = objService.selectBizObjListByMetricsId(rm.getMetricsId());
|
|
|
+ if (list != null) {
|
|
|
+ objIds = list.stream().map(BizObj::getObjId).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //2.选择的对象
|
|
|
+ List<RiskObj> objList = rm.getRiskObjList();
|
|
|
+ if (objList != null) {
|
|
|
+ objIds = objList.stream().map(RiskObj::getObjId).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ BizObjMetrics queryOm = new BizObjMetrics();
|
|
|
+ queryOm.setMetricsId(rm.getMetricsId());
|
|
|
+ List<BizObjMetrics> allMetrics = objMetricsService.selectBizObjMetricsList(queryOm);
|
|
|
+ Map<Long, List<BizObjMetrics>> objMap = allMetrics.stream().collect(Collectors.groupingBy(BizObjMetrics::getObjId));
|
|
|
+ if ("3".equals(rm.getRiskType())) {
|
|
|
+ List<Long> finalObjIds = objIds;
|
|
|
+ List<BizObjMetrics> list = allMetrics.stream().filter(om -> finalObjIds.contains(om.getObjId())).collect(Collectors.toList());
|
|
|
+ list = list.stream().sorted(Comparator.comparing(BizObjMetrics::getDValue).reversed()).collect(Collectors.toList());
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
+ JSONArray dataArr = new JSONArray();
|
|
|
+ JSONArray inputArr = new JSONArray();
|
|
|
+ list.forEach(bom -> {
|
|
|
+ dataArr.add(bom.getDValue().floatValue());
|
|
|
+ JSONObject temp = new JSONObject();
|
|
|
+ temp.put("id", bom.getObjMetricsId());
|
|
|
+ temp.put("name", bom.getObjName() + "-" + bom.getMetricsName());
|
|
|
+ temp.put("num", bom.getDValue().floatValue());
|
|
|
+ inputArr.add(temp);
|
|
|
+ });
|
|
|
+ jsonObject.put("data", dataArr);
|
|
|
+ JSONObject result = JSONObject.parseObject(HttpUtils.dataPost(uri + "/api/sas/diff", jsonObject));
|
|
|
+ RiskAnalysis ra = new RiskAnalysis();
|
|
|
+ ra.setRiskId(rm.getRiskId());
|
|
|
+ ra.setAnalyseTime(time);
|
|
|
+ // 假设jsonArray是已有的JSONArray对象
|
|
|
+ ra.setInput(inputArr.toString());
|
|
|
+ ra.setImgPath("data:image/png;base64," + result.getJSONObject("data").getString("diff"));
|
|
|
+ insertRiskAnalysis(ra);
|
|
|
+ return ra;
|
|
|
+ } else {
|
|
|
+ LocalDateTime endTime = LocalDateTime.now();
|
|
|
+ LocalDateTime beginTime = endTime.minusDays(7);
|
|
|
+ Map<String, Object> currParams = new HashMap<>(16);
|
|
|
+ currParams.put("beginTime", beginTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
+ currParams.put("endTime", endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
+
|
|
|
+ endTime = beginTime;
|
|
|
+ beginTime = endTime.minusDays(7);
|
|
|
+ Map<String, Object> lastParams = new HashMap<>(16);
|
|
|
+ lastParams.put("beginTime", beginTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
+ lastParams.put("endTime", endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
+
|
|
|
+ for (Long objId : objIds) {
|
|
|
+ List<BizObjMetrics> list = objMap.get(objId);
|
|
|
+ list.forEach(om -> {
|
|
|
+ //查询2周的数据,调用python接口,并且存储?
|
|
|
+ BizObjMetricsData currQ = new BizObjMetricsData();
|
|
|
+ currQ.setObjMetricsId(om.getObjMetricsId());
|
|
|
+ currQ.setParams(currParams);
|
|
|
+ BizObjMetricsData lastQ = new BizObjMetricsData();
|
|
|
+ lastQ.setObjMetricsId(om.getObjMetricsId());
|
|
|
+ lastQ.setParams(lastParams);
|
|
|
+ List<BizObjMetricsData> currList = dataService.selectBizObjMetricsDataList(currQ);
|
|
|
+ List<BizObjMetricsData> lastList = dataService.selectBizObjMetricsDataList(lastQ);
|
|
|
+
|
|
|
+
|
|
|
+ JSONArray currArr = new JSONArray();
|
|
|
+ JSONArray lastArr = new JSONArray();
|
|
|
+ JSONArray sortArr = new JSONArray();
|
|
|
+ //用于补数据,因为需要本周的长度与上周相等
|
|
|
+ int dataSize = currList.size();
|
|
|
+ if (lastList.size() > dataSize) {
|
|
|
+ dataSize = lastList.size();
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < dataSize; i++) {
|
|
|
+ int currIndex = i;
|
|
|
+ int lastIndex = i;
|
|
|
+ if (currIndex >= currList.size()) {
|
|
|
+ currIndex = currIndex - currList.size();
|
|
|
+ }
|
|
|
+ if (lastIndex >= lastList.size()) {
|
|
|
+ lastIndex = lastIndex - lastList.size();
|
|
|
+ }
|
|
|
+ BizObjMetricsData curr = currList.get(currIndex);
|
|
|
+ currArr.add(curr.getdValue().floatValue());
|
|
|
+
|
|
|
+ BizObjMetricsData last = lastList.get(lastIndex);
|
|
|
+ lastArr.add(last.getdValue().floatValue());
|
|
|
+ sortArr.add(i + 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
+ jsonObject.put("level", rm.getConfidenceLevel().floatValue());
|
|
|
+ jsonObject.put("curr", currArr);
|
|
|
+ jsonObject.put("last", lastArr);
|
|
|
+ jsonObject.put("sort", sortArr);
|
|
|
+ JSONObject result = JSONObject.parseObject(HttpUtils.dataPost(uri + "/api/sas/trend", jsonObject));
|
|
|
+ JSONObject data = result.getJSONObject("data");
|
|
|
+ RiskAnalysis ra = new RiskAnalysis();
|
|
|
+ ra.setRiskId(rm.getRiskId());
|
|
|
+ //这里要使用对象指标ID
|
|
|
+ ra.setObjId(om.getObjMetricsId());
|
|
|
+ ra.setInput(jsonObject.toString());
|
|
|
+ ra.setResult(data.getString("trend"));
|
|
|
+ ra.setAvgValue(data.getString("ttest"));
|
|
|
+ ra.setNormalValid(data.getString("shapiro"));
|
|
|
+ ra.setVarianceValid(data.getString("levene"));
|
|
|
+ ra.setConfidenceLevel(rm.getConfidenceLevel().toString());
|
|
|
+ ra.setAnalyseTime(time);
|
|
|
+ insertRiskAnalysis(ra);
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|