|
|
@@ -0,0 +1,89 @@
|
|
|
+package com.cec.plugins.service.task;
|
|
|
+
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.cec.plugins.config.properties.ProjectProperties;
|
|
|
+import com.cec.plugins.domain.DtoPolicy;
|
|
|
+import com.cec.plugins.enumerate.EstimateEnum;
|
|
|
+import com.cec.plugins.service.RedisClientEvaluate;
|
|
|
+import com.cec.plugins.service.RedisClientSource;
|
|
|
+import com.cec.plugins.service.TaskService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
|
|
+import org.springframework.scheduling.support.CronTrigger;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.concurrent.ScheduledFuture;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author zhang
|
|
|
+ * @date 2023/8/31 11:27
|
|
|
+ * @description 采集数据定时上报
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class TaskCollectService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProjectProperties properties;
|
|
|
+ @Autowired
|
|
|
+ private RedisClientSource redisClientSource;
|
|
|
+ @Autowired
|
|
|
+ private RedisClientEvaluate redisClientEvaluate;
|
|
|
+ @Autowired
|
|
|
+ private TaskService taskService;
|
|
|
+ @Autowired
|
|
|
+ private ThreadPoolTaskScheduler threadPoolTaskScheduler;
|
|
|
+ private ScheduledFuture<?> future;
|
|
|
+
|
|
|
+ public void startReported(DtoPolicy policyDto) {
|
|
|
+ stopReported();
|
|
|
+ String cron = properties.getPlatform().getCollectCron();
|
|
|
+ future = threadPoolTaskScheduler.schedule(() -> {
|
|
|
+ log.info("###### 执行上报采集数据 ######");
|
|
|
+ reportPolicy(policyDto);
|
|
|
+ }, triggerContext -> new CronTrigger(cron).nextExecutionTime(triggerContext));
|
|
|
+ log.info("###### 开始上报采集数据定时,cron: {} ######", cron);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void stopReported() {
|
|
|
+ if (future != null) {
|
|
|
+ future.cancel(true);
|
|
|
+ }
|
|
|
+ log.info("###### 停止上报采集数据定时 ######");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Async
|
|
|
+ public void reportPolicy(DtoPolicy policyDto) {
|
|
|
+ DtoPolicy.ReportPolicy report = new DtoPolicy.ReportPolicy();
|
|
|
+ // 拷贝父类(BaseData)的属性
|
|
|
+ BeanUtils.copyProperties(policyDto, report);
|
|
|
+ List<DtoPolicy.ReportPolicyConfig> configList = new ArrayList<>();
|
|
|
+ for (DtoPolicy.PolicyConfig config : policyDto.getPolicy()) {
|
|
|
+ DtoPolicy.ReportPolicyConfig reportItem = new DtoPolicy.ReportPolicyConfig();
|
|
|
+ BeanUtils.copyProperties(config, reportItem);
|
|
|
+ for (DtoPolicy.PolicyItem policy : config.getCollect()) {
|
|
|
+ DtoPolicy.ReportPolicyItem item = new DtoPolicy.ReportPolicyItem();
|
|
|
+ BeanUtils.copyProperties(policy, item);
|
|
|
+ item.setValue(redisClientSource.getCacheStr(item.getKey()));
|
|
|
+ EstimateEnum estimateEnum = EstimateEnum.findEstimateEnum(item.getKey());
|
|
|
+ item.setGroup(Optional.ofNullable(estimateEnum).map(EstimateEnum::getGroup).orElse(""));
|
|
|
+ item.setScore(StrUtil.emptyToDefault(redisClientEvaluate.getCacheStr(item.getKey()), "0"));
|
|
|
+ reportItem.addCollect(item);
|
|
|
+ }
|
|
|
+ // 计算平均值
|
|
|
+ Double avg = reportItem.getCollect().stream().map(DtoPolicy.ReportPolicyItem::getScore).map(item -> Convert.toDouble(item, 0D)).collect(Collectors.averagingDouble(Double::doubleValue));
|
|
|
+ reportItem.setScore(Convert.toStr(avg));
|
|
|
+ configList.add(reportItem);
|
|
|
+ }
|
|
|
+ report.setData(configList);
|
|
|
+ taskService.reportPlatform("/data/api/v1/collectData", report);
|
|
|
+ }
|
|
|
+}
|