fix:更新任务所有结构细化完成时间、工位升级时间、清单下发时间
This commit is contained in:
@@ -21,6 +21,9 @@ public class BatchUpdateWorkspaceExtraReq {
|
||||
@Valid
|
||||
private List<WorkspaceExtraData> workspaceExtras;
|
||||
|
||||
@Schema(description = "是否同步更新任务扩展属性,false-仅更新工位,true-同步更新工位下所有任务", example = "false")
|
||||
private Boolean syncToTask = false;
|
||||
|
||||
/**
|
||||
* 工位扩展属性数据
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user