|
|
@@ -0,0 +1,460 @@
|
|
|
+package com.jjt.dye.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.json.JSONArray;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import com.jjt.common.utils.DateUtils;
|
|
|
+import com.jjt.common.utils.StringUtils;
|
|
|
+import com.jjt.dye.domain.DyeProcAlarm;
|
|
|
+import com.jjt.dye.domain.DyeTypeProcess;
|
|
|
+import com.jjt.dye.mapper.DyeProcAlarmMapper;
|
|
|
+import com.jjt.dye.service.IDyeDeviceService;
|
|
|
+import com.jjt.dye.service.IDyeProcAlarmService;
|
|
|
+import com.jjt.dye.vo.DyeDeviceVO;
|
|
|
+import com.jjt.utils.IotService;
|
|
|
+import com.jjt.utils.Tools;
|
|
|
+import org.apache.ibatis.session.ExecutorType;
|
|
|
+import org.apache.ibatis.session.SqlSession;
|
|
|
+import org.apache.ibatis.session.SqlSessionFactory;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 工艺参数告警信息Service业务层处理
|
|
|
+ *
|
|
|
+ * @author wukai
|
|
|
+ * @date 2025-12-19
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class DyeProcAlarmServiceImpl implements IDyeProcAlarmService {
|
|
|
+ @Resource
|
|
|
+ private DyeProcAlarmMapper dyeProcAlarmMapper;
|
|
|
+ @Resource
|
|
|
+ private IotService iotService;
|
|
|
+ @Resource
|
|
|
+ private SqlSessionFactory factory;
|
|
|
+ @Resource
|
|
|
+ private IDyeDeviceService dyeDeviceService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询工艺参数告警信息
|
|
|
+ *
|
|
|
+ * @param alarmId 工艺参数告警信息主键
|
|
|
+ * @return 工艺参数告警信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public DyeProcAlarm selectDyeProcAlarmByAlarmId(Long alarmId) {
|
|
|
+ return dyeProcAlarmMapper.selectDyeProcAlarmByAlarmId(alarmId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询工艺参数告警信息列表
|
|
|
+ *
|
|
|
+ * @param dyeProcAlarm 工艺参数告警信息
|
|
|
+ * @return 工艺参数告警信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<DyeProcAlarm> selectDyeProcAlarmList(DyeProcAlarm dyeProcAlarm) {
|
|
|
+ return dyeProcAlarmMapper.selectDyeProcAlarmList(dyeProcAlarm);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增工艺参数告警信息
|
|
|
+ *
|
|
|
+ * @param dyeProcAlarm 工艺参数告警信息
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int insertDyeProcAlarm(DyeProcAlarm dyeProcAlarm) {
|
|
|
+ return dyeProcAlarmMapper.insertDyeProcAlarm(dyeProcAlarm);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改工艺参数告警信息
|
|
|
+ *
|
|
|
+ * @param dyeProcAlarm 工艺参数告警信息
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int updateDyeProcAlarm(DyeProcAlarm dyeProcAlarm) {
|
|
|
+ return dyeProcAlarmMapper.updateDyeProcAlarm(dyeProcAlarm);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除工艺参数告警信息
|
|
|
+ *
|
|
|
+ * @param alarmIds 需要删除的工艺参数告警信息主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteDyeProcAlarmByAlarmIds(Long[] alarmIds) {
|
|
|
+ return dyeProcAlarmMapper.deleteDyeProcAlarmByAlarmIds(alarmIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除工艺参数告警信息信息
|
|
|
+ *
|
|
|
+ * @param alarmId 工艺参数告警信息主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteDyeProcAlarmByAlarmId(Long alarmId) {
|
|
|
+ return dyeProcAlarmMapper.deleteDyeProcAlarmByAlarmId(alarmId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 统计上一时段数据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void last() {
|
|
|
+ LocalDateTime ldt = Tools.currWholeTime();
|
|
|
+ //上一个小时
|
|
|
+ ldt = ldt.minusHours(1);
|
|
|
+ LocalDateTime start = ldt;
|
|
|
+ LocalDateTime end = ldt.plusHours(1);
|
|
|
+ calc(start, end);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按指定时间统计
|
|
|
+ *
|
|
|
+ * @param start 开始时间
|
|
|
+ * @param end 结束时间
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void calc(LocalDateTime start, LocalDateTime end) {
|
|
|
+ process(start, end);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询指定时间段内指定类型指定线别告警信息
|
|
|
+ *
|
|
|
+ * @param start 开始时间
|
|
|
+ * @param end 结束时间
|
|
|
+ * @param types 类型
|
|
|
+ * @param lines 线别
|
|
|
+ * @return 告警信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<DyeProcAlarm> searchAlarm(LocalDate start, LocalDate end, String[] types, String[] lines) {
|
|
|
+ DyeProcAlarm dyeProcAlarm = new DyeProcAlarm();
|
|
|
+ Map<String, Object> params = new HashMap<>();
|
|
|
+ params.put("sTime", DateUtils.toDate(start));
|
|
|
+ params.put("eTime", DateUtils.toDate(end));
|
|
|
+ dyeProcAlarm.setParams(params);
|
|
|
+ List<DyeProcAlarm> result = selectDyeProcAlarmList(dyeProcAlarm);
|
|
|
+
|
|
|
+ // 先按paraCode+device_id分组
|
|
|
+ Map<String, List<DyeProcAlarm>> groupedAlarms = result.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ alarm -> alarm.getParaCode() + "_" + alarm.getDeviceId()
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 存储合并后的结果
|
|
|
+ List<DyeProcAlarm> mergedResults = new ArrayList<>();
|
|
|
+
|
|
|
+ // 对每组数据按startTime排序后进行合并处理
|
|
|
+ for (Map.Entry<String, List<DyeProcAlarm>> entry : groupedAlarms.entrySet()) {
|
|
|
+ List<DyeProcAlarm> group = entry.getValue();
|
|
|
+
|
|
|
+ // 按startTime排序
|
|
|
+ group.sort(Comparator.comparing(DyeProcAlarm::getStartTime));
|
|
|
+
|
|
|
+ // 合并相邻且时间间隔在5分钟内的记录
|
|
|
+ List<DyeProcAlarm> mergedGroup = mergeAlarmsInGroup(group);
|
|
|
+ mergedResults.addAll(mergedGroup);
|
|
|
+ }
|
|
|
+
|
|
|
+ return mergedResults;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合并同一组内的告警记录
|
|
|
+ *
|
|
|
+ * @param alarms 按时间排序的告警记录列表
|
|
|
+ * @return 合并后的告警记录列表
|
|
|
+ */
|
|
|
+ private List<DyeProcAlarm> mergeAlarmsInGroup(List<DyeProcAlarm> alarms) {
|
|
|
+ if (alarms.isEmpty()) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ List<DyeProcAlarm> mergedAlarms = new ArrayList<>();
|
|
|
+ DyeProcAlarm currentAlarm = alarms.get(0).clone();
|
|
|
+
|
|
|
+ // 初始化actValue范围
|
|
|
+ if (currentAlarm.getActValue() != null) {
|
|
|
+ String formattedVal = formatBigDecimal(currentAlarm.getActValue());
|
|
|
+ currentAlarm.setActValueRange(formattedVal + "-" + formattedVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置初始endTime为startTime,因为在创建时endTime通常未设置
|
|
|
+ if (currentAlarm.getEndTime() == null && currentAlarm.getStartTime() != null) {
|
|
|
+ currentAlarm.setEndTime(currentAlarm.getStartTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ mergedAlarms.add(currentAlarm);
|
|
|
+
|
|
|
+ for (int i = 1; i < alarms.size(); i++) {
|
|
|
+ DyeProcAlarm nextAlarm = alarms.get(i);
|
|
|
+
|
|
|
+ // 确保下一个告警的endTime也被初始化
|
|
|
+ if (nextAlarm.getEndTime() == null && nextAlarm.getStartTime() != null) {
|
|
|
+ nextAlarm.setEndTime(nextAlarm.getStartTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否需要合并:时间间隔在5分钟内(300000毫秒)
|
|
|
+ // 只有当时间字段都不为null时才进行合并判断
|
|
|
+ if (nextAlarm.getStartTime() != null && currentAlarm.getEndTime() != null) {
|
|
|
+ long timeDiff = nextAlarm.getStartTime().getTime() - currentAlarm.getEndTime().getTime();
|
|
|
+ if (timeDiff >= 0 && timeDiff <= 300000) {
|
|
|
+ // 合并记录:更新endTime为当前记录的endTime
|
|
|
+ if (nextAlarm.getEndTime() != null) {
|
|
|
+ currentAlarm.setEndTime(nextAlarm.getEndTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新actValue范围(最小值-最大值)
|
|
|
+ if (nextAlarm.getActValue() != null) {
|
|
|
+ String existingRange = currentAlarm.getActValueRange();
|
|
|
+ if (existingRange != null && existingRange.contains("-")) {
|
|
|
+ // 解析现有的范围值
|
|
|
+ try {
|
|
|
+ int lastDashIndex = existingRange.lastIndexOf('-');
|
|
|
+ if (lastDashIndex > 0 && lastDashIndex < existingRange.length() - 1) {
|
|
|
+ String minStr = existingRange.substring(0, lastDashIndex);
|
|
|
+ String maxStr = existingRange.substring(lastDashIndex + 1);
|
|
|
+
|
|
|
+ BigDecimal minVal = new BigDecimal(minStr.trim());
|
|
|
+ BigDecimal maxVal = new BigDecimal(maxStr.trim());
|
|
|
+
|
|
|
+ // 更新最小值和最大值
|
|
|
+ if (nextAlarm.getActValue().compareTo(minVal) < 0) {
|
|
|
+ minVal = nextAlarm.getActValue();
|
|
|
+ }
|
|
|
+ if (nextAlarm.getActValue().compareTo(maxVal) > 0) {
|
|
|
+ maxVal = nextAlarm.getActValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 格式化数值,最多保留2位小数
|
|
|
+ String formattedMin = formatBigDecimal(minVal);
|
|
|
+ String formattedMax = formatBigDecimal(maxVal);
|
|
|
+ currentAlarm.setActValueRange(formattedMin + "-" + formattedMax);
|
|
|
+ } else {
|
|
|
+ // 格式不正确,重新初始化
|
|
|
+ String formattedVal = formatBigDecimal(nextAlarm.getActValue());
|
|
|
+ currentAlarm.setActValueRange(formattedVal + "-" + formattedVal);
|
|
|
+ }
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ // 解析失败时,直接使用当前值作为范围
|
|
|
+ String formattedVal = formatBigDecimal(nextAlarm.getActValue());
|
|
|
+ currentAlarm.setActValueRange(formattedVal + "-" + formattedVal);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // actValueRange为空或者格式不对时,初始化范围
|
|
|
+ String formattedVal = formatBigDecimal(nextAlarm.getActValue());
|
|
|
+ currentAlarm.setActValueRange(formattedVal + "-" + formattedVal);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 不满足合并条件,新建记录
|
|
|
+ currentAlarm = nextAlarm.clone();
|
|
|
+
|
|
|
+ // 初始化actValue范围
|
|
|
+ if (currentAlarm.getActValue() != null) {
|
|
|
+ String formattedVal = formatBigDecimal(currentAlarm.getActValue());
|
|
|
+ currentAlarm.setActValueRange(formattedVal + "-" + formattedVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置初始endTime为startTime
|
|
|
+ if (currentAlarm.getEndTime() == null && currentAlarm.getStartTime() != null) {
|
|
|
+ currentAlarm.setEndTime(currentAlarm.getStartTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ mergedAlarms.add(currentAlarm);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 时间字段为null,不能判断是否合并,直接添加为新记录
|
|
|
+ currentAlarm = nextAlarm.clone();
|
|
|
+
|
|
|
+ // 初始化actValue范围
|
|
|
+ if (currentAlarm.getActValue() != null) {
|
|
|
+ String formattedVal = formatBigDecimal(currentAlarm.getActValue());
|
|
|
+ currentAlarm.setActValueRange(formattedVal + "-" + formattedVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置初始endTime为startTime
|
|
|
+ if (currentAlarm.getEndTime() == null && currentAlarm.getStartTime() != null) {
|
|
|
+ currentAlarm.setEndTime(currentAlarm.getStartTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ mergedAlarms.add(currentAlarm);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return mergedAlarms;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理参数字段
|
|
|
+ *
|
|
|
+ * @param code 设备信息
|
|
|
+ * @param paraParameter 参数字段
|
|
|
+ * @param coefficient 系数
|
|
|
+ * @param fields 字段列表
|
|
|
+ */
|
|
|
+ private void handleParameterField(String code, String paraParameter, BigDecimal coefficient, String key,
|
|
|
+ List<String> fields) {
|
|
|
+ if (StringUtils.isNotEmpty(paraParameter)) {
|
|
|
+ String field = "MAX_VALUE(" + code + "." + paraParameter + ")";
|
|
|
+ if (Math.abs(coefficient.doubleValue() - 1.0) > 1e-10) {
|
|
|
+ field = field + "*" + coefficient;
|
|
|
+ }
|
|
|
+ field = field + " AS " + key;
|
|
|
+ fields.add(field);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化BigDecimal数值,最多保留2位小数,去掉末尾的0
|
|
|
+ *
|
|
|
+ * @param value 待格式化的数值
|
|
|
+ * @return 格式化后的字符串
|
|
|
+ */
|
|
|
+ private String formatBigDecimal(BigDecimal value) {
|
|
|
+ if (value == null) {
|
|
|
+ return "0";
|
|
|
+ }
|
|
|
+ // 最多保留2位小数,去掉末尾的0
|
|
|
+ return value.stripTrailingZeros().setScale(Math.min(2, Math.max(0, value.stripTrailingZeros().scale())), RoundingMode.HALF_UP).toPlainString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void process(LocalDateTime start, LocalDateTime end) {
|
|
|
+ Map<String, List<DyeDeviceVO>> deviceByLine = dyeDeviceService.deviceByLine();
|
|
|
+ List<DyeProcAlarm> result = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<DyeDeviceVO>> entry : deviceByLine.entrySet()) {
|
|
|
+ String line = entry.getKey();
|
|
|
+ List<String> fields = new ArrayList<>();
|
|
|
+ String key;
|
|
|
+ List<DyeDeviceVO> devices = entry.getValue();
|
|
|
+ //这个存储iot返回的字段映射 tp_id+device_id
|
|
|
+ Map<String, DyeProcAlarm> alarmMap = new HashMap<>(16);
|
|
|
+ for (DyeDeviceVO device : devices) {
|
|
|
+ List<DyeTypeProcess> typeProcesses = device.getProcParas();
|
|
|
+ for (DyeTypeProcess typeProcess : typeProcesses) {
|
|
|
+ if (!"1".equals(typeProcess.getUpdatedBy())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ DyeProcAlarm alarm = new DyeProcAlarm();
|
|
|
+ alarm.setTypeId(device.getTypeId());
|
|
|
+ alarm.setTypeName(device.getTypeName());
|
|
|
+ alarm.setDeviceId(device.getDeviceId());
|
|
|
+ alarm.setDeviceName(device.getSortNum() + "#" + device.getTypeName().replaceAll("前整", ""));
|
|
|
+ alarm.setParaCode(typeProcess.getParaCode());
|
|
|
+ alarm.setParaName(typeProcess.getParaName());
|
|
|
+ alarm.setValidRange(typeProcess.getValidRange());
|
|
|
+ alarm.setLine(line);
|
|
|
+ alarm.setInRange(true);
|
|
|
+ key = typeProcess.getTpId() + "_" + device.getDeviceId();
|
|
|
+ alarmMap.put(key, alarm);
|
|
|
+ // 处理设定值和实际值
|
|
|
+ handleParameterField(device.getDeviceCode(), typeProcess.getParaSet(), typeProcess.getCoeffSet(), "s_" + key, fields);
|
|
|
+ handleParameterField(device.getDeviceCode(), typeProcess.getParaAct(), typeProcess.getCoeffAct(), "a_" + key, fields);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String sql = "select %s from root.tl.suxi GROUP BY ([%s, %s), 1m)";
|
|
|
+ sql = String.format(sql, String.join(",", fields), DateUtils.parseIso(start), DateUtils.parseIso(end));
|
|
|
+ JSONObject jsonObject = iotService.query(sql);
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ JSONArray values = data.getJSONArray("values");
|
|
|
+ JSONArray timestamps = data.getJSONArray("timestamps");
|
|
|
+ JSONArray columnNames = data.getJSONArray("columnNames");
|
|
|
+ if (values.size() > 0) {
|
|
|
+ for (int j = 0; j < values.size(); j++) {
|
|
|
+ JSONArray da = values.getJSONArray(j);
|
|
|
+ long timestamp = timestamps.getLong(j);
|
|
|
+ Map<String, DyeProcAlarm> timeAlarmMap = alarmMap.entrySet().stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ Map.Entry::getKey,
|
|
|
+ value -> value.getValue().clone()));
|
|
|
+ for (int i = 0; i < da.size(); i++) {
|
|
|
+ Double v = da.getDouble(i);
|
|
|
+ if (v == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String filedName = columnNames.getStr(i);
|
|
|
+ key = filedName.substring(filedName.indexOf("_") + 1);
|
|
|
+ DyeProcAlarm alarm = timeAlarmMap.get(key);
|
|
|
+ alarm.setStartTime(new java.util.Date(timestamp));
|
|
|
+ if (filedName.startsWith("s_")) {
|
|
|
+ alarm.setSetValue(new BigDecimal(v).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ }
|
|
|
+ if (filedName.startsWith("a_")) {
|
|
|
+ alarm.setActValue(new BigDecimal(v).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ }
|
|
|
+ String validRange = alarm.getValidRange();
|
|
|
+ boolean inRange = true;
|
|
|
+ if (StringUtils.isNotEmpty(validRange) && v != null) {
|
|
|
+ String[] rangeParts = validRange.split("-");
|
|
|
+ if (rangeParts.length == 2) {
|
|
|
+ try {
|
|
|
+ double lowerBound = Double.parseDouble(rangeParts[0]);
|
|
|
+ double upperBound = Double.parseDouble(rangeParts[1]);
|
|
|
+ if (v < lowerBound || v > upperBound) {
|
|
|
+ inRange = false;
|
|
|
+ }
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ // 无法解析范围值,保持inRange为true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果需要进一步处理inRange的结果,可以在这里添加代码
|
|
|
+ alarm.setInRange(inRange);
|
|
|
+ }
|
|
|
+ result.addAll(timeAlarmMap.values().stream().filter(alarm -> !alarm.getInRange()).collect(Collectors.toList()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //需要合并记录 tp_id+device_id相同,记录actValue的范围(最小值-最大值)存入actValueRange字段中
|
|
|
+ // startTime记录第一次出现的时间,endTime记录最后一次出现的时间
|
|
|
+ // 只有当两条记录时间间隔在5分钟以内时才进行合并
|
|
|
+
|
|
|
+ // 先按paraCode+device_id分组
|
|
|
+ Map<String, List<DyeProcAlarm>> groupedAlarms = result.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ alarm -> alarm.getParaCode() + "_" + alarm.getDeviceId()
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 存储合并后的结果
|
|
|
+ List<DyeProcAlarm> mergedResults = new ArrayList<>();
|
|
|
+
|
|
|
+ // 对每组数据按startTime排序后进行合并处理
|
|
|
+ for (Map.Entry<String, List<DyeProcAlarm>> entry : groupedAlarms.entrySet()) {
|
|
|
+ List<DyeProcAlarm> group = entry.getValue();
|
|
|
+
|
|
|
+ // 按startTime排序
|
|
|
+ group.sort(Comparator.comparing(DyeProcAlarm::getStartTime));
|
|
|
+
|
|
|
+ // 合并相邻且时间间隔在5分钟内的记录
|
|
|
+ List<DyeProcAlarm> mergedGroup = mergeAlarmsInGroup(group);
|
|
|
+ mergedResults.addAll(mergedGroup);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 使用合并后的记录替换原结果
|
|
|
+ List<DyeProcAlarm> list = mergedResults;
|
|
|
+
|
|
|
+ try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
|
|
|
+ if (list.size() > 0) {
|
|
|
+ DyeProcAlarmMapper mapper = sqlSession.getMapper(DyeProcAlarmMapper.class);
|
|
|
+ list.forEach(mapper::insertDyeProcAlarm);
|
|
|
+ sqlSession.commit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|