fix:更新任务所有结构细化完成时间、工位升级时间、清单下发时间

This commit is contained in:
2026-01-28 15:25:42 +08:00
parent fad77a674d
commit 57b1905d5e
5 changed files with 266 additions and 3 deletions

View File

@@ -2,6 +2,10 @@ package com.sdm.project.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sdm.project.model.entity.SimulationTaskExtra;
import com.sdm.project.model.req.SpdmNodeExtraReq;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
@@ -13,4 +17,14 @@ import com.sdm.project.model.entity.SimulationTaskExtra;
*/
public interface SimulationTaskExtraMapper extends BaseMapper<SimulationTaskExtra> {
/**
* 批量新增任务扩展属性
*/
int addTaskExtraBatch(@Param("list") List<SpdmNodeExtraReq> list);
/**
* 更新任务扩展属性支持设置null值
*/
int editTaskExtraWithNull(@Param("taskExtra") SpdmNodeExtraReq taskExtra);
}

View File

@@ -2,6 +2,10 @@ package com.sdm.project.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sdm.project.model.entity.SimulationTaskExtra;
import com.sdm.project.model.req.SpdmNodeExtraReq;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -13,4 +17,26 @@ import com.sdm.project.model.entity.SimulationTaskExtra;
*/
public interface ISimulationTaskExtraService extends IService<SimulationTaskExtra> {
/**
* 批量查询任务扩展属性并分组
* @param taskIds 任务ID列表
* @param propertyNames 属性名称列表
* @return taskId -> (propertyName -> TaskExtra) 的嵌套Map
*/
Map<String, Map<String, SimulationTaskExtra>> batchGetTaskExtraMap(List<String> taskIds, List<String> propertyNames);
/**
* 批量新增任务扩展属性
* @param taskExtras 任务扩展属性列表
* @return 新增成功数量
*/
int batchInsert(List<SpdmNodeExtraReq> taskExtras);
/**
* 批量更新任务扩展属性支持null值
* @param taskExtras 任务扩展属性列表
* @return 更新成功数量
*/
int batchUpdate(List<SpdmNodeExtraReq> taskExtras);
}

View File

@@ -2,6 +2,7 @@ package com.sdm.project.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.common.common.ResultCode;
@@ -126,6 +127,9 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
@Autowired
private SimulationProjectMapper projectMapper;
@Autowired
private ISimulationTaskExtraService simulationTaskExtraService;
/**
* 扩展属性名称常量
*/
@@ -1464,9 +1468,20 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
processWorkspaceExtras(context);
executeBatchOperations(context);
log.info("[batchUpdateWorkspaceExtra] 批量更新工位扩展属性成功,工位数量={},更新数量={},新增数量={}",
context.getWorkspaceUuids().size(), context.getUpdateList().size(), context.getInsertList().size());
return SdmResponse.success("批量更新工位扩展属性成功");
// 根据 syncToTask 字段决定是否同步任务扩展属性
if (Boolean.TRUE.equals(req.getSyncToTask())) {
log.info("[batchUpdateWorkspaceExtra] 开启任务扩展属性同步功能");
syncTaskExtras(context);
} else {
log.info("[batchUpdateWorkspaceExtra] 未开启任务扩展属性同步功能");
}
String message = Boolean.TRUE.equals(req.getSyncToTask())
? "批量更新工位及任务扩展属性成功"
: "批量更新工位扩展属性成功";
log.info("[batchUpdateWorkspaceExtra] {},工位数量={},工位更新数量={},工位新增数量={}",
message, context.getWorkspaceUuids().size(), context.getUpdateList().size(), context.getInsertList().size());
return SdmResponse.success(message);
} catch (IllegalArgumentException | IllegalStateException e) {
log.error("[batchUpdateWorkspaceExtra] 批量更新工位扩展属性失败", e);
return SdmResponse.failed(e.getMessage());
@@ -1503,6 +1518,7 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
throw new IllegalArgumentException("属性名称列表不能为空");
}
// nodeId -> (propertyName -> SimulationNodeExtra)
Map<String, Map<String, SimulationNodeExtra>> existingExtrasMap =
simulationNodeExtraService.batchGetNodeExtraMap(workspaceUuids, new ArrayList<>(propertyNames));
@@ -1605,8 +1621,11 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
*/
@Data
private static class BatchUpdateContext {
// 所有待更新的工位扩展属性列表
private final List<BatchUpdateWorkspaceExtraReq.WorkspaceExtraData> workspaceExtrasList;
// 所有待更新的工位UUID列表
private final List<String> workspaceUuids;
// 已存在的工位扩展属性Map: workspaceUuid -> (propertyName -> SimulationNodeExtra)
private final Map<String, Map<String, SimulationNodeExtra>> existingExtrasMap;
private final UserContext userContext;
private final List<SpdmNodeExtraReq> updateList = new ArrayList<>();
@@ -1644,6 +1663,156 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
}
}
/**
* 同步工位扩展属性到其下所有任务
* Why: 确保工位和任务的扩展属性保持一致性
*/
private void syncTaskExtras(BatchUpdateContext context) {
// 1. 查询工位下的所有任务,提前返回避免空查询
List<SimulationTask> allTasks = simulationTaskService.lambdaQuery()
.in(SimulationTask::getNodeId, context.getWorkspaceUuids())
.list();
if (CollectionUtils.isEmpty(allTasks)) {
log.info("[syncTaskExtras] 未找到任务,跳过同步");
return;
}
// 2. 提取任务ID和属性名称
List<String> taskIds = allTasks.stream()
.map(SimulationTask::getUuid)
.collect(Collectors.toList());
List<String> propertyNames = context.getWorkspaceExtrasList().stream()
.flatMap(data -> data.getExtras().stream())
.map(BatchUpdateWorkspaceExtraReq.WorkspaceExtraItem::getPropertyName)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
// 3. 批量查询任务已存在的扩展属性,构建映射关系
// taskId -> (propertyName -> TaskExtra) 的嵌套Map
Map<String, Map<String, SimulationTaskExtra>> taskExtrasMap =
simulationTaskExtraService.batchGetTaskExtraMap(taskIds, propertyNames);
Map<String, List<SimulationTask>> nodeTasksMap = allTasks.stream()
.collect(Collectors.groupingBy(SimulationTask::getNodeId));
// 4. 构建批量操作数据:遍历工位->任务->属性,区分更新和新增
TaskExtraBatchOperations operations = new TaskExtraBatchOperations(context.getUserContext());
context.getWorkspaceExtrasList().forEach(workspaceData -> {
List<SimulationTask> tasks = nodeTasksMap.getOrDefault(
workspaceData.getWorkspaceUuid(), Collections.emptyList());
tasks.forEach(task ->
workspaceData.getExtras().forEach(extraItem -> {
if (StringUtils.isBlank(extraItem.getPropertyName())) {
return;
}
SimulationTaskExtra existingExtra = taskExtrasMap
.getOrDefault(task.getUuid(), Collections.emptyMap())
.get(extraItem.getPropertyName());
SpdmNodeExtraReq taskExtraReq = buildTaskExtraReq(
task.getUuid(), extraItem, existingExtra, operations.getUserContext());
operations.addOperation(taskExtraReq, existingExtra != null);
})
);
});
// 5. 执行批量操作
if (operations.hasUpdates()) {
int updateCount = simulationTaskExtraService.batchUpdate(operations.getUpdateList());
if (updateCount != operations.getUpdateCount()) {
throw new IllegalStateException(
String.format("同步更新失败 - 预期=%d, 实际=%d",
operations.getUpdateCount(), updateCount));
}
}
if (operations.hasInserts()) {
int insertCount = simulationTaskExtraService.batchInsert(operations.getInsertList());
if (insertCount <= 0) {
throw new IllegalStateException("批量新增任务扩展属性失败");
}
}
log.info("[syncTaskExtras] 同步完成 - 任务数={}, 更新={}, 新增={}",
allTasks.size(), operations.getUpdateCount(), operations.getInsertCount());
}
/**
* 构建任务扩展属性请求对象
*/
private SpdmNodeExtraReq buildTaskExtraReq(String taskId,
BatchUpdateWorkspaceExtraReq.WorkspaceExtraItem extraItem,
SimulationTaskExtra existingExtra,
UserContext userContext) {
SpdmNodeExtraReq taskExtraReq = new SpdmNodeExtraReq();
taskExtraReq.setNodeId(taskId);
taskExtraReq.setPropertyName(extraItem.getPropertyName());
taskExtraReq.setPropertyValue(StringUtils.isNotBlank(extraItem.getPropertyValue())
? extraItem.getPropertyValue() : null);
taskExtraReq.setValueType(StringUtils.isNotBlank(extraItem.getValueType())
? extraItem.getValueType() : "string");
taskExtraReq.setPropertyClass(extraItem.getPropertyClass());
if (existingExtra != null) {
taskExtraReq.setId(existingExtra.getId());
taskExtraReq.setUpdater(userContext.getUserId());
taskExtraReq.setUpdateTime(userContext.getCurrentTime());
} else {
taskExtraReq.setCreator(userContext.getUserId());
taskExtraReq.setCreateTime(userContext.getCurrentTime());
}
return taskExtraReq;
}
/**
* 任务扩展属性批量操作数据容器
*/
@Data
private static class TaskExtraBatchOperations {
/** 用户上下文包含userId和currentTime */
private final UserContext userContext;
/** 待更新的任务扩展属性列表 */
private final List<SpdmNodeExtraReq> updateList = new ArrayList<>();
/** 待新增的任务扩展属性列表 */
private final List<SpdmNodeExtraReq> insertList = new ArrayList<>();
/**
* 添加操作到对应列表
* @param taskExtraReq 任务扩展属性请求
* @param isUpdate true=更新, false=新增(值为空时跳过)
*/
public void addOperation(SpdmNodeExtraReq taskExtraReq, boolean isUpdate) {
if (isUpdate) {
updateList.add(taskExtraReq);
} else if (StringUtils.isNotBlank(taskExtraReq.getPropertyValue())) {
insertList.add(taskExtraReq);
}
}
public boolean hasUpdates() {
return !updateList.isEmpty();
}
public boolean hasInserts() {
return !insertList.isEmpty();
}
public int getUpdateCount() {
return updateList.size();
}
public int getInsertCount() {
return insertList.size();
}
}
@Override
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getAllNodeByBodeType(String nodeType, Long nodeId) {
try {

View File

@@ -1,11 +1,19 @@
package com.sdm.project.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.project.dao.SimulationTaskExtraMapper;
import com.sdm.project.model.entity.SimulationTaskExtra;
import com.sdm.project.model.req.SpdmNodeExtraReq;
import com.sdm.project.service.ISimulationTaskExtraService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
* 服务实现类
@@ -17,4 +25,47 @@ import org.springframework.stereotype.Service;
@Service
public class SimulationTaskExtraServiceImpl extends ServiceImpl<SimulationTaskExtraMapper, SimulationTaskExtra> implements ISimulationTaskExtraService {
@Override
public Map<String, Map<String, SimulationTaskExtra>> batchGetTaskExtraMap(List<String> taskIds, List<String> propertyNames) {
if (CollectionUtils.isEmpty(taskIds) || CollectionUtils.isEmpty(propertyNames)) {
return Collections.emptyMap();
}
List<SimulationTaskExtra> taskExtras = this.list(
new LambdaQueryWrapper<SimulationTaskExtra>()
.in(SimulationTaskExtra::getTaskId, taskIds)
.in(SimulationTaskExtra::getPropertyName, propertyNames)
);
return taskExtras.stream()
.collect(Collectors.groupingBy(
SimulationTaskExtra::getTaskId,
Collectors.toMap(
SimulationTaskExtra::getPropertyName,
extra -> extra,
(e1, e2) -> e1
)
));
}
@Override
public int batchInsert(List<SpdmNodeExtraReq> taskExtras) {
if (CollectionUtils.isEmpty(taskExtras)) {
return 0;
}
return baseMapper.addTaskExtraBatch(taskExtras);
}
@Override
public int batchUpdate(List<SpdmNodeExtraReq> taskExtras) {
if (CollectionUtils.isEmpty(taskExtras)) {
return 0;
}
int successCount = 0;
for (SpdmNodeExtraReq taskExtra : taskExtras) {
successCount += baseMapper.editTaskExtraWithNull(taskExtra);
}
return successCount;
}
}