fix(tools): 修复台账节点查询和数据补录功能

- 修复 QUALITYFLAG 字段默认值从 1 改为 0
- 添加 selectNodeById 查询方法用于精确节点查找
- 重构 requireLedger 方法增加节点名称参数和详细错误提示
- 新增 levelName 辅助方法统一层级名称显示
- 更新 InfluxDB 配置地址从 192.168.1.68 改为 127.0.0.1
- 扩展 add-data 模块支持 InfluxDB 数据补录功能
- 新增 AddDataInfluxTaskController 提供 InfluxDB 补数任务接口
- 实现 AddDataInfluxFieldMapper 完成字段到 InfluxDB 测量值映射
- 添加 AddDataInfluxTaskExecutor 处理 InfluxDB 异步补数任务
- 更新 README 文档说明 InfluxDB 写入功能和配置要求
This commit is contained in:
2026-05-20 08:33:37 +08:00
parent bff89bede0
commit 89efc55119
21 changed files with 1259 additions and 18 deletions

View File

@@ -15,6 +15,8 @@ public interface AddLedgerLedgerMapper extends BaseMapper<AddLedgerLedgerPO> {
AddLedgerLedgerPO selectActiveNode(@Param("id") String id, @Param("level") Integer level);
AddLedgerLedgerPO selectNodeById(@Param("id") String id);
List<AddLedgerLedgerPO> selectActiveSubtree(@Param("id") String id);
int softDeleteByIds(@Param("ids") List<String> ids, @Param("updateBy") String updateBy);

View File

@@ -36,6 +36,20 @@
LIMIT 1
</select>
<select id="selectNodeById" resultType="com.njcn.gather.tool.addledger.pojo.po.AddLedgerLedgerPO">
SELECT Id AS id,
Pid AS pid,
Pids AS pids,
Name AS name,
Level AS level,
Sort AS sort,
Remark AS remark,
State AS state
FROM cs_ledger
WHERE Id = #{id}
LIMIT 1
</select>
<select id="selectActiveSubtree" resultType="com.njcn.gather.tool.addledger.pojo.po.AddLedgerLedgerPO">
SELECT Id AS id,
Pid AS pid,

View File

@@ -60,7 +60,7 @@ public class AddLedgerServiceImpl implements AddLedgerService {
@Override
public AddLedgerDetailVO detail(String id, Integer level) {
AddLedgerLedgerPO ledger = requireLedger(id, level);
AddLedgerLedgerPO ledger = requireLedger(id, level, levelName(level) + "节点");
if (AddLedgerConst.LEVEL_ENGINEERING == level) {
return buildEngineeringDetail(ledger, requireEngineering(id));
}
@@ -109,9 +109,10 @@ public class AddLedgerServiceImpl implements AddLedgerService {
String id = create ? AddLedgerIdUtil.nextId() : param.getId().trim();
AddLedgerLedgerPO parentLedger;
if (create) {
parentLedger = requireLedger(param.getEngineeringId(), AddLedgerConst.LEVEL_ENGINEERING);
parentLedger = requireLedger(param.getEngineeringId(), AddLedgerConst.LEVEL_ENGINEERING, "父级工程节点");
} else {
parentLedger = requireLedger(requireLedger(id, AddLedgerConst.LEVEL_PROJECT).getPid(), AddLedgerConst.LEVEL_ENGINEERING);
AddLedgerLedgerPO projectLedger = requireLedger(id, AddLedgerConst.LEVEL_PROJECT, "项目节点");
parentLedger = requireLedger(projectLedger.getPid(), AddLedgerConst.LEVEL_ENGINEERING, "项目所属工程节点");
}
AddLedgerProjectPO project = create ? new AddLedgerProjectPO() : requireProject(id);
@@ -139,11 +140,12 @@ public class AddLedgerServiceImpl implements AddLedgerService {
String id = create ? AddLedgerIdUtil.nextId() : param.getId().trim();
AddLedgerLedgerPO projectLedger;
if (create) {
projectLedger = requireLedger(param.getProjectId(), AddLedgerConst.LEVEL_PROJECT);
projectLedger = requireLedger(param.getProjectId(), AddLedgerConst.LEVEL_PROJECT, "父级项目节点");
} else {
projectLedger = requireLedger(requireLedger(id, AddLedgerConst.LEVEL_EQUIPMENT).getPid(), AddLedgerConst.LEVEL_PROJECT);
AddLedgerLedgerPO equipmentLedger = requireLedger(id, AddLedgerConst.LEVEL_EQUIPMENT, "设备节点");
projectLedger = requireLedger(equipmentLedger.getPid(), AddLedgerConst.LEVEL_PROJECT, "设备所属项目节点");
}
AddLedgerLedgerPO engineeringLedger = requireLedger(projectLedger.getPid(), AddLedgerConst.LEVEL_ENGINEERING);
AddLedgerLedgerPO engineeringLedger = requireLedger(projectLedger.getPid(), AddLedgerConst.LEVEL_ENGINEERING, "项目所属工程节点");
AddLedgerEquipmentPO equipment = create ? new AddLedgerEquipmentPO() : requireEquipment(id);
equipment.setId(id);
@@ -181,9 +183,10 @@ public class AddLedgerServiceImpl implements AddLedgerService {
String id = create ? AddLedgerIdUtil.nextId() : param.getLineId().trim();
AddLedgerLedgerPO equipmentLedger;
if (create) {
equipmentLedger = requireLedger(param.getDeviceId(), AddLedgerConst.LEVEL_EQUIPMENT);
equipmentLedger = requireLedger(param.getDeviceId(), AddLedgerConst.LEVEL_EQUIPMENT, "父级设备节点");
} else {
equipmentLedger = requireLedger(requireLedger(id, AddLedgerConst.LEVEL_LINE).getPid(), AddLedgerConst.LEVEL_EQUIPMENT);
AddLedgerLedgerPO lineLedger = requireLedger(id, AddLedgerConst.LEVEL_LINE, "测点节点");
equipmentLedger = requireLedger(lineLedger.getPid(), AddLedgerConst.LEVEL_EQUIPMENT, "测点所属设备节点");
}
assertLineNoUnique(equipmentLedger.getId(), param.getLineNo(), create ? null : id);
@@ -223,7 +226,7 @@ public class AddLedgerServiceImpl implements AddLedgerService {
@Override
public List<Integer> availableLineNos(String deviceId, String lineId) {
AddLedgerLedgerPO equipmentLedger = requireLedger(deviceId, AddLedgerConst.LEVEL_EQUIPMENT);
AddLedgerLedgerPO equipmentLedger = requireLedger(deviceId, AddLedgerConst.LEVEL_EQUIPMENT, "设备节点");
List<Integer> usedLineNos = lineMapper.selectUsedLineNos(equipmentLedger.getId(), trimToNull(lineId));
return AddLedgerLineNoUtil.resolveAvailableLineNos(usedLineNos, null);
}
@@ -268,7 +271,7 @@ public class AddLedgerServiceImpl implements AddLedgerService {
@Override
@Transactional
public boolean deleteNode(String id, Integer level) {
requireLedger(id, level);
requireLedger(id, level, levelName(level) + "节点");
List<AddLedgerLedgerPO> subtree = ledgerMapper.selectActiveSubtree(id);
if (subtree.isEmpty()) {
return false;
@@ -350,18 +353,38 @@ public class AddLedgerServiceImpl implements AddLedgerService {
}
}
private AddLedgerLedgerPO requireLedger(String id, Integer level) {
private AddLedgerLedgerPO requireLedger(String id, Integer level, String nodeName) {
String nodeId = requireText(id, "台账节点 ID 不能为空");
if (level == null) {
throw new IllegalArgumentException("台账节点层级不能为空");
}
AddLedgerLedgerPO ledger = ledgerMapper.selectActiveNode(nodeId, level);
if (ledger == null) {
throw new IllegalArgumentException("台账节点不存在或已删除");
throwLedgerNotActive(nodeId, level, nodeName);
}
return ledger;
}
private void throwLedgerNotActive(String id, Integer expectedLevel, String nodeName) {
AddLedgerLedgerPO ledger = ledgerMapper.selectNodeById(id);
String context = isBlank(nodeName) ? "台账节点" : nodeName;
if (ledger == null) {
if (Integer.valueOf(AddLedgerConst.LEVEL_LINE).equals(expectedLevel)) {
throw new IllegalArgumentException(context + "不存在id=" + id
+ "。如果是新增监测点,请不要传 lineId如果是编辑监测点请传已存在的测点 ID");
}
throw new IllegalArgumentException(context + "不存在id=" + id + ",期望层级=" + expectedLevel);
}
if (!expectedLevel.equals(ledger.getLevel())) {
throw new IllegalArgumentException(context + "层级不匹配id=" + id
+ ",实际层级=" + ledger.getLevel() + ",期望层级=" + expectedLevel);
}
if (!Integer.valueOf(AddLedgerConst.STATE_NORMAL).equals(ledger.getState())) {
throw new IllegalArgumentException(context + "已删除id=" + id + "State=" + ledger.getState());
}
throw new IllegalArgumentException(context + "不存在或已删除id=" + id + ",期望层级=" + expectedLevel);
}
private AddLedgerEngineeringPO requireEngineering(String id) {
AddLedgerEngineeringPO engineering = engineeringMapper.selectOne(new LambdaQueryWrapper<AddLedgerEngineeringPO>()
.eq(AddLedgerEngineeringPO::getId, id)
@@ -415,7 +438,7 @@ public class AddLedgerServiceImpl implements AddLedgerService {
}
private void updateLedgerName(String id, Integer level, String name) {
AddLedgerLedgerPO ledger = requireLedger(id, level);
AddLedgerLedgerPO ledger = requireLedger(id, level, levelName(level) + "节点");
ledger.setName(name);
ledgerMapper.updateById(ledger);
}
@@ -532,6 +555,22 @@ public class AddLedgerServiceImpl implements AddLedgerService {
return trimToNull(value) == null;
}
private String levelName(Integer level) {
if (Integer.valueOf(AddLedgerConst.LEVEL_ENGINEERING).equals(level)) {
return "工程";
}
if (Integer.valueOf(AddLedgerConst.LEVEL_PROJECT).equals(level)) {
return "项目";
}
if (Integer.valueOf(AddLedgerConst.LEVEL_EQUIPMENT).equals(level)) {
return "设备";
}
if (Integer.valueOf(AddLedgerConst.LEVEL_LINE).equals(level)) {
return "测点";
}
return "台账";
}
private List<String> normalizeIds(List<String> ids) {
if (ids == null || ids.isEmpty()) {
return Collections.emptyList();

View File

@@ -0,0 +1,66 @@
package com.njcn.gather.tool.addledger.service.impl;
import com.njcn.gather.tool.addledger.component.AddLedgerTreeBuilder;
import com.njcn.gather.tool.addledger.mapper.AddLedgerEngineeringMapper;
import com.njcn.gather.tool.addledger.mapper.AddLedgerEquipmentMapper;
import com.njcn.gather.tool.addledger.mapper.AddLedgerLedgerMapper;
import com.njcn.gather.tool.addledger.mapper.AddLedgerLineMapper;
import com.njcn.gather.tool.addledger.mapper.AddLedgerProjectMapper;
import com.njcn.gather.tool.addledger.pojo.constant.AddLedgerConst;
import com.njcn.gather.tool.addledger.pojo.param.AddLedgerLineSaveParam;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class AddLedgerServiceImplTest {
private final AddLedgerEngineeringMapper engineeringMapper = mock(AddLedgerEngineeringMapper.class);
private final AddLedgerProjectMapper projectMapper = mock(AddLedgerProjectMapper.class);
private final AddLedgerEquipmentMapper equipmentMapper = mock(AddLedgerEquipmentMapper.class);
private final AddLedgerLineMapper lineMapper = mock(AddLedgerLineMapper.class);
private final AddLedgerLedgerMapper ledgerMapper = mock(AddLedgerLedgerMapper.class);
private final AddLedgerTreeBuilder treeBuilder = mock(AddLedgerTreeBuilder.class);
private final AddLedgerServiceImpl service = new AddLedgerServiceImpl(
engineeringMapper,
projectMapper,
equipmentMapper,
lineMapper,
ledgerMapper,
treeBuilder);
@Test
void saveLineShouldExplainLineIdWhenCreatingWithUnknownLineId() {
String lineId = "25e263294c2f47559258941bb75f1de8";
AddLedgerLineSaveParam param = buildValidLineParam();
param.setLineId(lineId);
when(ledgerMapper.selectActiveNode(eq(lineId), eq(AddLedgerConst.LEVEL_LINE))).thenReturn(null);
when(ledgerMapper.selectNodeById(eq(lineId))).thenReturn(null);
IllegalArgumentException exception = Assertions.assertThrows(IllegalArgumentException.class,
() -> service.saveLine(param));
Assertions.assertEquals("测点节点不存在id=" + lineId
+ "。如果是新增监测点,请不要传 lineId如果是编辑监测点请传已存在的测点 ID", exception.getMessage());
}
private AddLedgerLineSaveParam buildValidLineParam() {
AddLedgerLineSaveParam param = new AddLedgerLineSaveParam();
param.setDeviceId("device-001");
param.setName("测试测点");
param.setLineNo(1);
param.setConType(0);
param.setVolGrade(new BigDecimal("10"));
param.setCtRatio(BigDecimal.ONE);
param.setCt2Ratio(BigDecimal.ONE);
param.setPtRatio(BigDecimal.ONE);
param.setPt2Ratio(BigDecimal.ONE);
return param;
}
}