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:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user