优化算法分类信号/点位折线图和其他逻辑
This commit is contained in:
		
							parent
							
								
									9fabff6be9
								
							
						
					
					
						commit
						14e10b9a59
					
				| @ -95,17 +95,4 @@ public class AlgorithmClassController { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @PostMapping("/callAlgorithmAnalyse") | ||||
|     @ApiOperation("调用算法分析") | ||||
|     public ResponseResult callAlgorithmAnalyse(String id) { | ||||
|         if (StrUtil.isBlank(id)) { | ||||
|             return ResponseResult.error("算法分类id为空"); | ||||
|         } | ||||
|         boolean isOK = algorithmClassService.deleteAlgorithmClass(id); | ||||
|         if (isOK) { | ||||
|             return ResponseResult.success(); | ||||
|         } else { | ||||
|             return ResponseResult.error(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| package com.yfd.platform.modules.algorithm.controller; | ||||
| 
 | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.hutool.json.JSONObject; | ||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
| import com.yfd.platform.config.ResponseResult; | ||||
| import com.yfd.platform.modules.algorithm.domain.AlgorithmClass; | ||||
| @ -37,11 +39,11 @@ public class AlgorithmParamsController { | ||||
|         return ResponseResult.successData(algorithmClassList); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @GetMapping("/getAlgorithmParamsNameList") | ||||
|     @ApiOperation("根据算法id过去参数名称") | ||||
|     public ResponseResult getAlgorithmParamsNameList(String algorithmId) { | ||||
|         List<Map<String, Object>> algorithmClassList = algorithmParamsService.getAlgorithmParamsNameList(algorithmId); | ||||
|     @ApiOperation("获取参数名称") | ||||
|     public ResponseResult getAlgorithmParamsNameList(String algorithmId, String componentId) { | ||||
|         List<Map<String, Object>> algorithmClassList = algorithmParamsService.getAlgorithmParamsNameList(algorithmId, | ||||
|                 componentId); | ||||
|         return ResponseResult.successData(algorithmClassList); | ||||
|     } | ||||
| 
 | ||||
| @ -88,4 +90,14 @@ public class AlgorithmParamsController { | ||||
|             return ResponseResult.error(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @PostMapping("/callAlgorithmAnalyse") | ||||
|     @ApiOperation("调用算法分析") | ||||
|     public ResponseResult callAlgorithmAnalyse(String id,String componentId) { | ||||
|         if (StrUtil.isBlank(id)) { | ||||
|             return ResponseResult.error("算法分类id为空"); | ||||
|         } | ||||
|         JSONObject data = algorithmParamsService.callAlgorithmAnalyse(id, componentId); | ||||
|         return ResponseResult.successData(data); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -18,5 +18,5 @@ public interface AlgorithmParamsMapper extends BaseMapper<AlgorithmParams> { | ||||
| 
 | ||||
|     List<Map<String, Object>> getAlgorithmParamsList(String algorithmId,String componentId); | ||||
| 
 | ||||
|     List<Map<String, Object>> getAlgorithmParamsNameList(String algorithmId); | ||||
|     List<Map<String, Object>> getAlgorithmParamsNameList(String algorithmId,String componentId); | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package com.yfd.platform.modules.algorithm.service; | ||||
| 
 | ||||
| import cn.hutool.json.JSONObject; | ||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
| import com.yfd.platform.modules.algorithm.domain.AlgorithmParams; | ||||
| import com.baomidou.mybatisplus.extension.service.IService; | ||||
| @ -27,5 +28,8 @@ public interface IAlgorithmParamsService extends IService<AlgorithmParams> { | ||||
| 
 | ||||
|     boolean deleteAlgorithmParams(String id); | ||||
| 
 | ||||
|     List<Map<String, Object>> getAlgorithmParamsNameList(String algorithmId); | ||||
|     List<Map<String, Object>> getAlgorithmParamsNameList(String algorithmId,String componentId); | ||||
| 
 | ||||
|     JSONObject callAlgorithmAnalyse(String id, String componentId); | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package com.yfd.platform.modules.algorithm.service.impl; | ||||
| 
 | ||||
| import cn.hutool.core.date.DateUtil; | ||||
| import cn.hutool.core.util.NumberUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
| @ -11,17 +12,20 @@ import com.yfd.platform.modules.auxcontrol.domain.DeviceSignal; | ||||
| import com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData; | ||||
| import com.yfd.platform.modules.auxcontrol.mapper.DeviceSignalMapper; | ||||
| import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService; | ||||
| import com.yfd.platform.modules.basedata.domain.SubstationDevice; | ||||
| import com.yfd.platform.modules.basedata.mapper.SubstationDeviceMapper; | ||||
| import com.yfd.platform.modules.patroltask.domain.TaskResult; | ||||
| import com.yfd.platform.modules.patroltask.mapper.TaskResultMapper; | ||||
| import com.yfd.platform.utils.SecurityUtils; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import javax.annotation.Resource; | ||||
| import java.time.LocalDateTime; | ||||
| import java.time.ZoneId; | ||||
| import java.time.format.DateTimeFormatter; | ||||
| import java.time.format.DateTimeParseException; | ||||
| import java.time.temporal.ChronoUnit; | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.*; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| /** | ||||
| @ -41,6 +45,10 @@ public class AlgorithmDeviceServiceImpl extends ServiceImpl<AlgorithmDeviceMappe | ||||
|     private DeviceSignalMapper deviceSignalMapper; | ||||
|     @Resource | ||||
|     private IDeviceWorkDataService deviceWorkDataService; | ||||
|     @Resource | ||||
|     private TaskResultMapper taskResultMapper; | ||||
|     @Resource | ||||
|     private SubstationDeviceMapper substationDeviceMapper; | ||||
| 
 | ||||
|     /********************************** | ||||
|      * 用途说明: 批量新增算法分类部件点位关联数据 | ||||
| @ -79,15 +87,23 @@ public class AlgorithmDeviceServiceImpl extends ServiceImpl<AlgorithmDeviceMappe | ||||
|         List<String> deviceIdList = groupedDevices.get("1"); | ||||
|         List<String> signalIdList = groupedDevices.get("2"); | ||||
|         if (deviceIdList != null && deviceIdList.size() > 0) { | ||||
| 
 | ||||
|             List<TaskResult> deviceWorkDataList = taskResultMapper.getResultCurveData(deviceIdList); | ||||
|             Map<String, List<TaskResult>> collect = | ||||
|                     deviceWorkDataList.stream().collect(Collectors.groupingBy(TaskResult::getDeviceId)); | ||||
|             for (String deviceId : collect.keySet()) { | ||||
|                 List<TaskResult> taskResults = collect.get(deviceId); | ||||
|                 Map<String, Object> map = processDeviceData(taskResults, deviceId); | ||||
|                 deviceDataList.add(map); | ||||
|             } | ||||
|         } | ||||
|         if (signalIdList != null && signalIdList.size() > 0) { | ||||
|             List<DeviceWorkData> deviceWorkDataList = deviceWorkDataService.getHistoricalCurveList(signalIdList); | ||||
|             Map<String, List<DeviceWorkData>> collect = | ||||
|                     deviceWorkDataList.stream().collect(Collectors.groupingBy(DeviceWorkData::getSignalId)); | ||||
| 
 | ||||
|             for (String signalId : collect.keySet()) { | ||||
|                 List<DeviceWorkData> deviceWorkDataGroup = collect.get(signalId); | ||||
|                 Map<String, Object> map = processDeviceData(deviceWorkDataGroup, signalId); | ||||
|                 Map<String, Object> map = processSignalData(deviceWorkDataGroup, signalId); | ||||
|                 deviceDataList.add(map); | ||||
|             } | ||||
| 
 | ||||
| @ -96,7 +112,13 @@ public class AlgorithmDeviceServiceImpl extends ServiceImpl<AlgorithmDeviceMappe | ||||
|         return deviceDataList; | ||||
|     } | ||||
| 
 | ||||
|     public Map<String, Object> processDeviceData(List<DeviceWorkData> deviceWorkDataList, String signalId) { | ||||
|     /********************************** | ||||
|     * 用途说明: 绘制信号ECharts折线图 | ||||
|     * 参数说明 deviceWorkDataList 信号数据 | ||||
|     * 参数说明 signalId 信号id | ||||
|     * 返回值说明: java.util.Map<java.lang.String,java.lang.Object> | ||||
|     ***********************************/ | ||||
|     public Map<String, Object> processSignalData(List<DeviceWorkData> deviceWorkDataList, String signalId) { | ||||
|         // 生成过去60分钟的分钟时间槽 | ||||
|         LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES); | ||||
|         LocalDateTime startTime = now.minusMinutes(59); | ||||
| @ -153,4 +175,96 @@ public class AlgorithmDeviceServiceImpl extends ServiceImpl<AlgorithmDeviceMappe | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /********************************** | ||||
|     * 用途说明: 绘制点位ECharts折线图 | ||||
|     * 参数说明 taskResults 点位数据 | ||||
|     * 参数说明 deviceId 点位id | ||||
|     * 返回值说明: java.util.Map<java.lang.String,java.lang.Object> | ||||
|     ***********************************/ | ||||
|     public Map<String, Object> processDeviceData(List<TaskResult> taskResults, String deviceId) { | ||||
|         // 定义时间格式解析器 | ||||
|         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); | ||||
| 
 | ||||
|         // 预处理:过滤无效数据并解析时间 | ||||
|         List<ProcessedData> processedList = new ArrayList<>(); | ||||
|         for (TaskResult result : taskResults) { | ||||
|             try { | ||||
|                 // 解析时间字符串为LocalDateTime(仅用于排序) | ||||
|                 LocalDateTime dateTime = LocalDateTime.parse(result.getPatroldeviceDate(), formatter); | ||||
| 
 | ||||
|                 // 解析数值 | ||||
|                 double value; | ||||
|                 try { | ||||
|                     value = NumberUtil.parseDouble(result.getValue()); | ||||
|                 } catch (Exception e) { | ||||
|                     // 非数值处理为0 | ||||
|                     value = 0.0; | ||||
|                 } | ||||
| 
 | ||||
|                 processedList.add(new ProcessedData( | ||||
|                         result.getPatroldeviceDate(), | ||||
|                         value, | ||||
|                         dateTime | ||||
|                 )); | ||||
|             } catch (DateTimeParseException e) { | ||||
|                 // 时间解析失败时跳过此条记录 | ||||
|                 System.err.println("Invalid date format: " + result.getPatroldeviceDate()); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // 按时间排序(基于解析后的LocalDateTime) | ||||
|         processedList.sort(Comparator.comparing(ProcessedData::getDateTime)); | ||||
| 
 | ||||
|         // 构建ECharts数据结构 | ||||
|         Map<String, Object> result = new LinkedHashMap<>(); | ||||
| 
 | ||||
| 
 | ||||
|         Map<String, Object> xAxis = new LinkedHashMap<>(); | ||||
|         xAxis.put("type", "category");  // 关键变化点 | ||||
|         xAxis.put("data", processedList.stream() | ||||
|                 .map(ProcessedData::getOriginalDate) // 直接使用原始字符串 | ||||
|                 .collect(Collectors.toList())); | ||||
|         result.put("xAxis", xAxis); | ||||
| 
 | ||||
| 
 | ||||
|         Map<String, Object> yAxis = new HashMap<>(); | ||||
|         yAxis.put("type", "value"); | ||||
|         result.put("yAxis", yAxis); | ||||
| 
 | ||||
| 
 | ||||
|         List<Double> seriesData = processedList.stream() | ||||
|                 .map(ProcessedData::getValue) | ||||
|                 .collect(Collectors.toList()); | ||||
| 
 | ||||
|         SubstationDevice substationDevice = substationDeviceMapper.selectById(deviceId); | ||||
|         String name = substationDevice == null ? "" : substationDevice.getDeviceName(); | ||||
|         Map<String, Object> series = new LinkedHashMap<>(); | ||||
|         series.put("name", name); | ||||
|         series.put("type", "line"); | ||||
|         series.put("data", seriesData);  // 直接对应xAxis.data的顺序 | ||||
|         result.put("series", Collections.singletonList(series)); | ||||
| 
 | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private static class ProcessedData { | ||||
|         // 原始时间字符串(用于最终展示) | ||||
|         private final String originalDate; | ||||
|         private final double value; | ||||
|         // 仅用于排序 | ||||
|         private final LocalDateTime dateTime; | ||||
| 
 | ||||
|         public ProcessedData(String originalDate, double value, LocalDateTime dateTime) { | ||||
|             this.originalDate = originalDate; | ||||
|             this.value = value; | ||||
|             this.dateTime = dateTime; | ||||
|         } | ||||
| 
 | ||||
|         public String getOriginalDate() { return originalDate; } | ||||
|         public double getValue() { return value; } | ||||
|         public LocalDateTime getDateTime() { return dateTime; } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| package com.yfd.platform.modules.algorithm.service.impl; | ||||
| 
 | ||||
| import cn.hutool.json.JSONObject; | ||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||
| import com.yfd.platform.modules.algorithm.domain.AlgorithmParams; | ||||
| import com.yfd.platform.modules.algorithm.mapper.AlgorithmDeviceMapper; | ||||
| import com.yfd.platform.modules.algorithm.mapper.AlgorithmParamsMapper; | ||||
| import com.yfd.platform.modules.algorithm.service.IAlgorithmParamsService; | ||||
| import org.springframework.stereotype.Service; | ||||
| @ -23,10 +25,12 @@ public class AlgorithmParamsServiceImpl extends ServiceImpl<AlgorithmParamsMappe | ||||
| 
 | ||||
|     @Resource | ||||
|     private AlgorithmParamsMapper algorithmParamsMapper; | ||||
|     @Resource | ||||
|     private AlgorithmDeviceMapper algorithmDeviceMapper; | ||||
| 
 | ||||
|     @Override | ||||
|     public List<Map<String, Object>> getAlgorithmParamsList(String algorithmId,String componentId) { | ||||
|         return algorithmParamsMapper.getAlgorithmParamsList(algorithmId,componentId); | ||||
|     public List<Map<String, Object>> getAlgorithmParamsList(String algorithmId, String componentId) { | ||||
|         return algorithmParamsMapper.getAlgorithmParamsList(algorithmId, componentId); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -50,7 +54,13 @@ public class AlgorithmParamsServiceImpl extends ServiceImpl<AlgorithmParamsMappe | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public List<Map<String, Object>> getAlgorithmParamsNameList(String algorithmId) { | ||||
|         return algorithmParamsMapper.getAlgorithmParamsNameList(algorithmId); | ||||
|     public List<Map<String, Object>> getAlgorithmParamsNameList(String algorithmId, String componentId) { | ||||
|         return algorithmParamsMapper.getAlgorithmParamsNameList(algorithmId, componentId); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public JSONObject callAlgorithmAnalyse(String id, String componentId) { | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -210,4 +210,6 @@ public interface TaskResultMapper extends BaseMapper<TaskResult> { | ||||
|     List<TaskResult> getNonCoherentResult(String areaId,String bayId,String mainDeviceId,String componentId,String recognitionTypeList,String meterType,String resultId,String taskTodoId,String phase); | ||||
| 
 | ||||
|     Page<Map<String, Object>> getHistoryDevice(Page<Map<String, Object>> page, String startDate, String endDate, String deviceId); | ||||
| 
 | ||||
|     List<TaskResult> getResultCurveData(List<String> deviceIdList); | ||||
| } | ||||
|  | ||||
| @ -14,10 +14,10 @@ | ||||
|         WHERE | ||||
|             ap.param_fixed = '1' | ||||
|         <if test="algorithmId != null and algorithmId != ''"> | ||||
|             AND ad.algorithm_id LIKE CONCAT('%',#{algorithmId},'%') | ||||
|             AND ad.algorithm_id = #{algorithmId} | ||||
|         </if> | ||||
|         <if test="componentId != null and componentId != ''"> | ||||
|             AND ad.component_id LIKE CONCAT('%',#{componentId},'%') | ||||
|             AND ad.component_id =#{componentId} | ||||
|         </if> | ||||
|     </select> | ||||
|     <select id="getAlgorithmDeviceType" resultType="java.util.Map"> | ||||
| @ -30,10 +30,10 @@ | ||||
|         WHERE | ||||
|             ap.param_fixed = '0' | ||||
|         <if test="algorithmId != null and algorithmId != ''"> | ||||
|             AND ad.algorithm_id LIKE CONCAT('%',#{algorithmId},'%') | ||||
|             AND ad.algorithm_id =#{algorithmId} | ||||
|         </if> | ||||
|         <if test="componentId != null and componentId != ''"> | ||||
|             AND ad.component_id LIKE CONCAT('%',#{componentId},'%') | ||||
|             AND ad.component_id =#{componentId} | ||||
|         </if> | ||||
|     </select> | ||||
| </mapper> | ||||
|  | ||||
| @ -34,15 +34,20 @@ | ||||
|     </select> | ||||
|     <select id="getAlgorithmParamsNameList" resultType="java.util.Map"> | ||||
|         SELECT | ||||
|             id, | ||||
|             param_name, | ||||
|             param_type, | ||||
|             param_unit | ||||
|         ap.param_unit, | ||||
|         ap.param_name, | ||||
|         ap.id | ||||
|         FROM | ||||
|             iis_algorithm_params | ||||
|             WHERE 1=1 | ||||
|         iis_algorithm_params ap | ||||
|         LEFT JOIN iis_algorithm_device ad | ||||
|         ON ap.id = ad.param_id | ||||
|         <!-- 动态添加 component_id 匹配条件 --> | ||||
|         <if test="componentId != null and componentId != ''"> | ||||
|             AND ad.component_id = #{componentId} | ||||
|         </if> | ||||
|         WHERE 1=1 AND ap.param_fixed='0' | ||||
|         <if test="algorithmId != null and algorithmId != ''"> | ||||
|             AND algorithm_id = #{algorithmId} | ||||
|             AND ap.algorithm_id = #{algorithmId} | ||||
|         </if> | ||||
|     </select> | ||||
| </mapper> | ||||
|  | ||||
| @ -911,4 +911,28 @@ ORDER BY | ||||
|             AND t.patroldevice_date <= #{endDate} | ||||
|         </if> | ||||
|     </select> | ||||
|     <select id="getResultCurveData" resultType="com.yfd.platform.modules.patroltask.domain.TaskResult"> | ||||
|         SELECT | ||||
|         device_id, | ||||
|         value, | ||||
|         patroldevice_date | ||||
|         FROM ( | ||||
|         SELECT | ||||
|         *, | ||||
|         ROW_NUMBER() OVER ( | ||||
|         PARTITION BY device_id | ||||
|         ORDER BY patroldevice_date DESC | ||||
|         ) AS row_num | ||||
|         FROM iis_task_result | ||||
|         WHERE flag='2' AND device_id  IN | ||||
|         <foreach collection="deviceIdList" item="deviceId" open="(" separator="," | ||||
|                  close=")"> | ||||
|             #{deviceId} | ||||
|         </foreach> | ||||
| 
 | ||||
|         ) AS ranked | ||||
|         WHERE row_num <= 60 | ||||
|         ORDER BY device_id, patroldevice_date DESC; | ||||
| 
 | ||||
|     </select> | ||||
| </mapper> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 weitang
						weitang