1、同步待办时,逻辑修改

This commit is contained in:
2026-02-10 08:41:37 +08:00
parent bcf3cfd84f
commit fa43e36a0b
19 changed files with 280 additions and 72 deletions

8
.idea/compiler.xml generated
View File

@@ -24,10 +24,10 @@
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.5.2.Final/mapstruct-processor-1.5.2.Final.jar" />
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.5.2.Final/mapstruct-1.5.2.Final.jar" />
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok-mapstruct-binding/0.2.0/lombok-mapstruct-binding-0.2.0.jar" />
<entry name="$PROJECT_DIR$/../../mvn_repository/org/mapstruct/mapstruct-processor/1.5.2.Final/mapstruct-processor-1.5.2.Final.jar" />
<entry name="$PROJECT_DIR$/../../mvn_repository/org/mapstruct/mapstruct/1.5.2.Final/mapstruct-1.5.2.Final.jar" />
<entry name="$PROJECT_DIR$/../../mvn_repository/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
<entry name="$PROJECT_DIR$/../../mvn_repository/org/projectlombok/lombok-mapstruct-binding/0.2.0/lombok-mapstruct-binding-0.2.0.jar" />
</processorPath>
<module name="data" />
</profile>

View File

@@ -12,6 +12,8 @@ import com.sdm.project.model.req.ep.EpSyncPhaseReq;
import com.sdm.project.service.IDemandService;
import com.sdm.project.service.ILyricInternalService;
import com.sdm.project.service.ISimulationLyricNodeService;
import com.sdm.project.service.ISimulationTaskService;
import com.sdm.project.service.impl.TaskServiceImpl;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +38,11 @@ public class SimulationLyricNodeController {
@Resource
private IDemandService demandService;
@Autowired
private TaskServiceImpl taskServiceImpl;
@Autowired
private ISimulationTaskService simulationTaskService;
@GetMapping("/updateApprovalStatus")
@Operation(summary = "仿真节点审批状态更新", description = "仿真节点审批状态更新")
@@ -51,8 +58,8 @@ public class SimulationLyricNodeController {
@GetMapping("/optimisedGetTodoList")
@Operation(summary = "获取待办列表(优化版)", description = "获取待办列表(优化版)")
public SdmResponse optimisedGetTodoList(@RequestParam(value = "startTime") @Validated String startTime,@RequestParam(value = "endTime") @Validated String endTime) {
return lyricInternalService.optimisedGetTodoList("http",startTime,endTime);
public SdmResponse optimisedGetTodoList() {
return lyricInternalService.optimisedGetTodoList("http");
}
@GetMapping("/getProjectList")

View File

@@ -6,6 +6,9 @@ import com.sdm.common.entity.resp.project.SpdmTaskVo;
import com.sdm.outbridge.mode.SimulationTaskSyncExBo;
import com.sdm.project.model.entity.SimulationTask;
import com.sdm.common.entity.resp.project.TaskNodeExtraPo;
import com.sdm.project.model.entity.SimulationTaskAttention;
import com.sdm.project.model.entity.SimulationTaskExtra;
import com.sdm.project.model.entity.SimulationTaskMember;
import com.sdm.project.model.req.SpdmAnalysisTaskListReq;
import com.sdm.project.model.req.*;
import com.sdm.project.model.vo.*;
@@ -72,4 +75,11 @@ public interface SimulationTaskMapper extends BaseMapper<SimulationTask> {
List<SimulationTaskSyncExBo> queryLyricAllTasksDatas(@Param("offset")int offset, @Param("pageSize")int pageSize);
void saveBatchTask(@Param("list") List<SimulationTask> tasksToCreate);
void saveBatchTaskExtra(@Param("list") List<SimulationTaskExtra> taskExtrasToCreate);
void saveBatchTaskMember(@Param("list") List<SimulationTaskMember> taskMembersToCreate);
void saveBatchTaskAttention(@Param("list") List<SimulationTaskAttention> taskAttentionsToCreate);
}

View File

@@ -57,4 +57,7 @@ public class SimulationTaskAttention implements Serializable {
@TableField("update_time")
private String updateTime;
@TableField(exist = false)
private Long creatorValue;
}

View File

@@ -27,5 +27,6 @@ public class SpdmDemandRelateMemberReq extends BaseEntity {
private String name;
private Long userId;
private String userIdStr;
}

View File

@@ -36,7 +36,7 @@ public class LyricTodoListSchedule {
ThreadLocalContext.setTenantId(paramJson.getLong("tenantId"));
ThreadLocalContext.setUserId(paramJson.getLong("userId"));
long startTime = System.currentTimeMillis();
SdmResponse response = lyricInternalService.getTodoList("schedule");
SdmResponse response = lyricInternalService.optimisedGetTodoList("schedule");
long endTime = System.currentTimeMillis();
long second = (endTime - startTime) / 1000;
log.info("{} lyricTodoListHandler cost [{}] s", traceId,second);

View File

@@ -52,5 +52,5 @@ public interface ILyricInternalService {
SdmResponse listNoPermission(SpdmNodeListReq req);
SdmResponse optimisedGetTodoList(String http,String startTime,String endTime);
SdmResponse optimisedGetTodoList(String http);
}

View File

@@ -99,9 +99,10 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
private static final String CACHE_NAME_SYNC_TODO = "syncTodo";
private static final String CACHE_KEY_TODO = "todo";
private static final long SYNC_INTERVAL_MS = 30 * 1000L;
private static final long SYNC_INTERVAL_MS = 60 * 1000L;
private static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final int UUID_LENGTH = 32;
private static final String PROJECT_STAGE = "PROJECT_STAGE";
// 同步待办锁
private final ReentrantLock syncTodoInfoLock = new ReentrantLock();
@@ -185,8 +186,8 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 同步待办时,查询待办的最大时间间隔,单位:天
// @Value("${lyricTodoInterval:7}")
// private int lyricTodoInterval;
@Value("${lyricTodoInterval:90}")
private int lyricTodoInterval;
/**
* 判断字符串是否可以安全转换为Long类型
@@ -389,12 +390,13 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
// 1. 构建需求基础参数 + 成员 + 权限
SpdmAddDemandReq demandReq = buildDemandReq(todo, demandUuid, curDateStr);
List<SpdmDemandRelateMemberReq> memberList = buildDemandMemberList(todo, demandUuid, jobNumber, curDateStr);
List<SpdmDemandExtraReq> demandExtraList = buildDemandExtraList(todo, demandUuid, jobNumber, curDateStr);
// 2. 构建权限更新参数
buildPermissionReqList(demandUuid, jobNumber, todo, updatePermissionList, usernameToUserIdMap);
// 3. 构建需求文件夹节点
demandDirNodeList.add(buildDemandDirNode(demandUuid, projectNode, demandReq.getDemandName()));
// 4. 异步保存需求数据
asyncSaveDemandData(demandReq, memberList, tenantId, jobNumber, usernameToUserIdMap);
asyncSaveDemandData(demandReq, memberList, tenantId, jobNumber, usernameToUserIdMap,demandExtraList);
SimulationDemand demand = new SimulationDemand();
BeanUtils.copyProperties(demandReq, demand);
@@ -429,6 +431,17 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
}
}
private List<SpdmDemandExtraReq> buildDemandExtraList(LyricVTodoEmulationInfoDM todo, String demandUuid, Long jobNumber, String curDateStr) {
List<SpdmDemandExtraReq> demandExtraReqList = new ArrayList<>();
SpdmDemandExtraReq spdmDemandExtraReq = new SpdmDemandExtraReq();
spdmDemandExtraReq.setDemandId(demandUuid);
spdmDemandExtraReq.setPropertyName(PROJECT_STAGE);
spdmDemandExtraReq.setPropertyValue(todo.getProjectStage());
spdmDemandExtraReq.setCreateTime(curDateStr);
demandExtraReqList.add(spdmDemandExtraReq);
return demandExtraReqList;
}
/**
* 构建项目级文件夹创建参数
*/
@@ -462,6 +475,7 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
req.setEndTime(todo.getClosedTime());
req.setCreateTime(curDateStr);
req.setDemandSource(SYNC_PROJECT_SOURCE);
req.setCreator(Long.valueOf(todo.getIntroduceBy()));
// 补充项目/阶段/工位ID
fillProjectPhaseWorkspaceId(req, todo);
@@ -526,11 +540,11 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
List<SpdmDemandRelateMemberReq> memberList = new ArrayList<>();
// 仿真负责人
addDemandMember(todo.getEmulationPerformer(), 0, demandUuid, jobNumber, curDateStr, memberList);
addDemandMember(todo.getVerifierNo(), MemberTypeEnum.PRINCIPAL.getCode(), demandUuid, jobNumber, curDateStr, memberList);
// 仿真执行人
addDemandMember(todo.getEmulationExecutor(), 1, demandUuid, jobNumber, curDateStr, memberList);
addDemandMember(todo.getFollowBy(), MemberTypeEnum.EXECUTOR.getCode(), demandUuid, jobNumber, curDateStr, memberList);
// 3D负责人
addDemandMember(todo.getThreeDimensionalPerformer(), 2, demandUuid, jobNumber, curDateStr, memberList);
// addDemandMember(todo.getThreeDimensionalPerformer(), MemberTypeEnum.THREED.getCode(), demandUuid, jobNumber, curDateStr, memberList);
return memberList;
}
@@ -548,18 +562,25 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
return;
}
SpdmDemandRelateMemberReq memberReq = new SpdmDemandRelateMemberReq();
memberReq.setDemandId(demandUuid);
memberReq.setType(type);
memberReq.setCreateTime(curDateStr);
memberReq.setCreator(jobNumber);
String userIdStr = memberStr.split("-")[0];
if (isConvertibleToLong(userIdStr)) {
memberReq.setUserId(Long.valueOf(userIdStr));
String[] userIdStr;
if (MemberTypeEnum.PRINCIPAL.getCode().equals(type) || MemberTypeEnum.EXECUTOR.getCode().equals(type)) {
userIdStr = memberStr.split(",");
} {
userIdStr = memberStr.split("-");
}
if (ObjectUtils.isEmpty(userIdStr)) {
return;
}
for (String userId : userIdStr) {
SpdmDemandRelateMemberReq memberReq = new SpdmDemandRelateMemberReq();
memberReq.setDemandId(demandUuid);
memberReq.setType(type);
memberReq.setCreateTime(curDateStr);
memberReq.setCreator(jobNumber);
memberReq.setUserIdStr(userId);
memberList.add(memberReq);
}
memberList.add(memberReq);
}
/**
@@ -574,9 +595,32 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
// permissionList.add(buildUpdatePermissionReq(demandUuid, currentUserId, null));
// 仿真负责人权限
addPermissionReq(usernameToUserIdMap.get(todo.getVerifier()), demandUuid, permissionList, MemberTypeEnum.PRINCIPAL.getCode());
String verifier = todo.getVerifier();
if (StringUtils.isNotBlank(verifier)) {
String[] pArray = verifier.split(",");
for (String pUserId : pArray) {
addPermissionReq(usernameToUserIdMap.get(pUserId), demandUuid, permissionList, MemberTypeEnum.PRINCIPAL.getCode());
}
}
// 需求创建人权限
addPermissionReq(usernameToUserIdMap.get(todo.getIntroduceBy()), demandUuid, permissionList, MemberTypeEnum.CREATOR.getCode());
String introduceBy = todo.getIntroduceBy();
if (StringUtils.isNotBlank(introduceBy)) {
String[] iArray = introduceBy.split(",");
for (String iUserId : iArray) {
addPermissionReq(usernameToUserIdMap.get(iUserId), demandUuid, permissionList, MemberTypeEnum.CREATOR.getCode());
}
}
// 需求执行人权限
String followBy = todo.getFollowBy();
if (StringUtils.isNotBlank(followBy)) {
String[] fArray = followBy.split(",");
for (String fUserId : fArray) {
addPermissionReq(usernameToUserIdMap.get(fUserId), demandUuid, permissionList, MemberTypeEnum.EXECUTOR.getCode());
}
}
}
/**
@@ -627,10 +671,11 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
List<SpdmDemandRelateMemberReq> memberList,
Long tenantId,
Long jobNumber,
Map<String, Long> usernameToUserIdMap) {
Map<String, Long> usernameToUserIdMap,
List<SpdmDemandExtraReq> demandExtraList) {
CompletableFuture.runAsync(() -> {
try {
demandMapper.addDemand(demandReq, tenantId, jobNumber);
demandMapper.addDemand(demandReq, tenantId, demandReq.getCreator());
if (CollectionUtils.isNotEmpty(memberList)) {
for (SpdmDemandRelateMemberReq member : memberList) {
Long cidUserId = usernameToUserIdMap.get(String.valueOf(member.getUserId()));
@@ -640,6 +685,9 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
}
demandMapper.addDemandMember(memberList);
}
if (CollectionUtils.isNotEmpty(demandExtraList)) {
demandMapper.addDemandExtra(demandExtraList);
}
} catch (Exception e) {
log.error("异步保存需求[{}]数据异常: ", demandReq.getDemandCode(), e);
}
@@ -2118,7 +2166,7 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
}
@Override
public SdmResponse optimisedGetTodoList(String http, String startTime, String endTime) {
public SdmResponse optimisedGetTodoList(String http) {
Long tenantId = ThreadLocalContext.getTenantId();
Long jobNumber = ThreadLocalContext.getUserId();
@@ -2129,19 +2177,19 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
}
// TODO 现场手动同步完成后,根据配置文件动态计算拉取待办的开始、结束时间
// String[] timeArray = calculateTimeRange(lyricTodoInterval);
// String startTime = timeArray[0];
// String endTime = timeArray[1];
String[] timeArray = calculateTimeRange(lyricTodoInterval);
String startTime = timeArray[0];
String endTime = timeArray[1];
// 先查询系统内所有待办90天内仿真类型,同步历史待办时先取startTime和endTime同步固定某段时间内的待办
List<LyricVTodoEmulationInfoDM> lyricVTodoEmulationInfoDMList = queryTodoListWithFixedTime(startTime, endTime);
log.info("{}天内,共有{}个待办",lyricTodoInterval,lyricVTodoEmulationInfoDMList.size());
// 待办信息在系统中是否都已经存在
if (CollectionUtils.isEmpty(lyricVTodoEmulationInfoDMList)) {
log.info("lyricVTodoEmulationInfoDMList为空");
return SdmResponse.success();
}
log.info("本次共同步待办:{}个",lyricVTodoEmulationInfoDMList.stream());
log.info("本次共同步待办:{}个",lyricVTodoEmulationInfoDMList.size());
// 根据待办关联的项目情况,分为关联的项目已在系统和关联的项目未在系统两部分数据
List<LyricVTodoEmulationInfoDM> noRelatedProjectVTodoEmulationInfoDMList;
@@ -2480,6 +2528,7 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
folderItemReq.setFolderUuid(RandomUtil.generateString(32));
folderItemReqList.add(folderItemReq);
batchCreateNormalDirReq.setFolderItems(folderItemReqList);
batchCreateNormalDirReq.setSkipPermissionCheck(true);
log.info("创建【项目文件】文件夹请求参数:{}", batchCreateNormalDirReq);
try {
SdmResponse response = dataFeignClient.batchCreateNormalDirs(batchCreateNormalDirReq);
@@ -2513,12 +2562,14 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
spdmProjectNodeEditReq.setCreator(jobNumber);
spdmProjectNodeEditReq.setTenantId(tenantId);
spdmProjectNodeEditReq.setProjectSource(SYNC_PROJECT_SOURCE);
spdmProjectNodeEditReq.setProjectId(Math.toIntExact(lyricVProjectToDM.getId()));
spdmProjectNodeEditReq.setNodeSubType("self_develop");
addNodeList.add(spdmProjectNodeEditReq);
// 根据projectId查询项目机台工位信息的视图
List<LyricVProjectStationToDM> projectStationList = new ArrayList<>();
try {
projectStationList = lyricVProjectStationToDmService.lambdaQuery()
.eq(LyricVProjectStationToDM::getProjectId, spdmProjectNodeEditReq.getProjectId())
.eq(LyricVProjectStationToDM::getProjectId, lyricVProjectToDM.getId())
.list();
} catch (MyBatisSystemException ex) {
// 查询发生异常,记录异常日志(可能是测试环境预期异常)
@@ -2666,27 +2717,27 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
// 批量创建文件夹
batchCreateNodeDir(addNodeList);
// 批量更新权限
List<BatchUpdatePermissionReq.FilePermissionItem> filePermissions = new ArrayList<>();
for (SpdmProjectNodeEditReq addNode : addNodeList) {
BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem();
item.setUuid(addNode.getUuid());
Map<Long, Byte> userPermissions = new HashMap<>();
// 2026-02-09 因为项目视图中没有项目经理,这里将项目创建人当成项目经理
userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue());
item.setUserPermissions(userPermissions);
filePermissions.add(item);
}
if (CollectionUtils.isNotEmpty(filePermissions)) {
BatchUpdatePermissionReq batchReq = new BatchUpdatePermissionReq();
batchReq.setFilePermissions(filePermissions);
log.info("创建项目阶段时,批量更新权限,任务数量:{}", filePermissions.size());
SdmResponse response = dataFeignClient.batchUpdatePermission(batchReq);
log.info("创建项目阶段时,批量更新权限结果:{}", response);
if (!response.isSuccess()) {
log.error("批量更新权限失败:{}", response.getMessage());
}
}
// 批量更新权限 2026-02-09 先不授予权限,待后面设置项目经理时授予权限 (设置项目经理的权限需要控制好)
// List<BatchUpdatePermissionReq.FilePermissionItem> filePermissions = new ArrayList<>();
// for (SpdmProjectNodeEditReq addNode : addNodeList) {
// BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem();
// item.setUuid(addNode.getUuid());
// Map<Long, Byte> userPermissions = new HashMap<>();
// // 2026-02-09 因为项目视图中没有项目经理,这里将项目创建人当成项目经理
// userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue());
// item.setUserPermissions(userPermissions);
// filePermissions.add(item);
// }
// if (CollectionUtils.isNotEmpty(filePermissions)) {
// BatchUpdatePermissionReq batchReq = new BatchUpdatePermissionReq();
// batchReq.setFilePermissions(filePermissions);
// log.info("创建项目阶段时,批量更新权限,任务数量:{}", filePermissions.size());
// SdmResponse response = dataFeignClient.batchUpdatePermission(batchReq);
// log.info("创建项目阶段时,批量更新权限结果:{}", response);
// if (!response.isSuccess()) {
// log.error("批量更新权限失败:{}", response.getMessage());
// }
// }
}

View File

@@ -1171,6 +1171,25 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
log.info("新增项目阶段时,更新用户权限的返回值为:{}",updatePermissionResponse);
}
/**
* 删除权限
*
* @param userId
* @param uuid
*/
private void deletePermission(Long userId, String uuid) {
// 删除文件权限
UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
updatePermissionReq.setUserId(userId);
updatePermissionReq.setUuid(uuid);
Map<Long, Byte> userPermissions = new HashMap<>();
userPermissions.put(userId, FilePermissionEnum.ZERO.getValue());
updatePermissionReq.setUserPermissions(userPermissions);
log.info("编辑节点时,删除用户权限的参数为:{}", updatePermissionReq);
SdmResponse updatePermissionResponse = dataClientFeignClient.updatePermission(updatePermissionReq);
log.info("编辑节点时,删除用户权限的返回值为:{}", updatePermissionResponse);
}
private boolean editNode(List<SpdmNodeDetailReq> editNodeList, Long tenantId, Long jobNumber) {
log.info("editNode参数为{}", editNodeList);
String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
@@ -1210,10 +1229,18 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
}
}
// 先删除所有成员
nodeMapper.deleteNodeMemberBatch(editNodeList.stream().map(SpdmNodeDetailReq::getUuid).toList());
if (CollectionUtils.isNotEmpty(allNodeManagerList)) {
List<SpdmNodeMemberVo> nodeMemberList = nodeMapper.getNodeMemberListByNodeIdList(nodeIdList);
if (CollectionUtils.isNotEmpty(nodeMemberList)) {
// 先删除所有成员
nodeMapper.deleteNodeMemberBatch(editNodeList.stream().map(SpdmNodeDetailReq::getUuid).toList());
// 删除权限
for (SpdmNodeMemberVo spdmNodeMemberVo : nodeMemberList) {
deletePermission(spdmNodeMemberVo.getUserId(),spdmNodeMemberVo.getNodeId());
}
}
allNodeManagerList.forEach(node -> {
node.setCreateTime(curDateStr);
node.setCreator(jobNumber);
@@ -1221,6 +1248,12 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
if (nodeMapper.addNodeMemberBatch(allNodeManagerList) <= 0) {
return false;
}
for (SpdmNodeDetailReq editNode : editNodeList) {
// 新增权限
for (SpdmNodeRelateMemberReq spdmNodeRelateMemberReq : allNodeManagerList) {
updatePermission(spdmNodeRelateMemberReq.getUserId(),editNode.getUuid());
}
}
}
if (CollectionUtils.isNotEmpty(allExtraList)) {

View File

@@ -175,15 +175,22 @@ public class SimulationTaskServiceImpl extends ServiceImpl<SimulationTaskMapper,
}
// 批量保存任务主表、扩展表、成员表、关注表
this.saveBatch(tasksToCreate);
// this.saveBatch(tasksToCreate);
this.baseMapper.saveBatchTask(tasksToCreate);
if (CollectionUtils.isNotEmpty(taskExtrasToCreate)) {
simulationTaskExtraService.saveBatch(taskExtrasToCreate);
// simulationTaskExtraService.saveBatch(taskExtrasToCreate);
this.baseMapper.saveBatchTaskExtra(taskExtrasToCreate);
}
if (CollectionUtils.isNotEmpty(taskMembersToCreate)) {
simulationTaskMemberService.saveBatch(taskMembersToCreate);
// simulationTaskMemberService.saveBatch(taskMembersToCreate);
this.baseMapper.saveBatchTaskMember(taskMembersToCreate);
}
if (CollectionUtils.isNotEmpty(taskAttentionsToCreate)) {
simulationTaskAttentionService.saveBatch(taskAttentionsToCreate);
// simulationTaskAttentionService.saveBatch(taskAttentionsToCreate);
for (SimulationTaskAttention simulationTaskAttention : taskAttentionsToCreate) {
simulationTaskAttention.setCreatorValue(Long.valueOf(simulationTaskAttention.getCreator()));
}
this.baseMapper.saveBatchTaskAttention(taskAttentionsToCreate);
}
}
@@ -258,7 +265,7 @@ public class SimulationTaskServiceImpl extends ServiceImpl<SimulationTaskMapper,
private List<SimulationTaskMember> createTaskMembers(SimulationDemand demand, String taskUuid) {
LambdaQueryWrapper<SimulationDemandMember> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SimulationDemandMember::getDemandId, demand.getUuid());
queryWrapper.in(SimulationDemandMember::getType, DemandMemberTypeEnum.SIMULATION_LEADER.getCode(), DemandMemberTypeEnum.FOLLOWER.getCode());
queryWrapper.in(SimulationDemandMember::getType, DemandMemberTypeEnum.SIMULATION_LEADER.getCode(), DemandMemberTypeEnum.SIMULATION_EXECUTOR.getCode());
List<SimulationDemandMember> demandMembers = simulationDemandMemberService.list(queryWrapper);

View File

@@ -3911,6 +3911,10 @@ public class TaskServiceImpl implements ITaskService {
SpdmBatchTaskOprTagReq spdmBatchTaskOprTagReq = new SpdmBatchTaskOprTagReq();
SpringBeanCopyUtil.copyPropertiesIgnoreNull(task, spdmBatchTaskOprTagReq);
SpringBeanCopyUtil.copyPropertiesIgnoreNull(req, task);
// task设置nodeId
String maxNonEmptyTaskTag = getMaxNonEmptyTagForTask(task);
log.info("maxNonEmptyTaskTag为{}",maxNonEmptyTaskTag);
task.setNodeId(maxNonEmptyTaskTag);
if (!simulationTaskService.updateById(task)) {
throw new RuntimeException("编辑任务:" + task.getTaskName() + "失败");
}
@@ -4070,6 +4074,42 @@ public class TaskServiceImpl implements ITaskService {
return SdmResponse.success();
}
public static String getMaxNonEmptyTagForTask(SimulationTask req) {
// 空对象校验
if (req == null) {
return null;
}
// 按编号从大到小检查,找到第一个非空值立即返回
if (StringUtils.isNotBlank(req.getTag8())) {
return req.getTag8();
}
if (StringUtils.isNotBlank(req.getTag7())) {
return req.getTag7();
}
if (StringUtils.isNotBlank(req.getTag6())) {
return req.getTag6();
}
if (StringUtils.isNotBlank(req.getTag5())) {
return req.getTag5();
}
if (StringUtils.isNotBlank(req.getTag4())) {
return req.getTag4();
}
if (StringUtils.isNotBlank(req.getTag3())) {
return req.getTag3();
}
if (StringUtils.isNotBlank(req.getTag2())) {
return req.getTag2();
}
if (StringUtils.isNotBlank(req.getTag1())) {
return req.getTag1();
}
// 所有 tag 都为空
return null;
}
/**
* 返回 tag 数字最大的不为空的值
* @param req SpdmBatchTaskOprTagReq 对象

View File

@@ -183,4 +183,8 @@ xxl:
# 通过标识判断是否走查询现场视图逻辑0不查询1查询
lyricFlag : 0
lyricFlag : 0
# 同步待办时,查询待办的最大时间间隔,单位:天
lyricTodoInterval : 7

View File

@@ -182,4 +182,7 @@ xxl:
# xxljob 配置结束
# 通过标识判断是否走查询现场视图逻辑0不查询1查询
lyricFlag : 0
lyricFlag : 0
# 同步待办时,查询待办的最大时间间隔,单位:天
lyricTodoInterval : 7

View File

@@ -191,4 +191,4 @@ xxl:
lyricFlag : 0
# 同步待办时,查询待办的最大时间间隔,单位:天
#lyricTodoInterval : 7
lyricTodoInterval : 7

View File

@@ -184,4 +184,7 @@ xxl:
# 通过标识判断是否走查询现场视图逻辑0不查询1查询
lyricFlag : 1
lyricFlag : 1
# 同步待办时,查询待办的最大时间间隔,单位:天
lyricTodoInterval : 90

View File

@@ -144,4 +144,7 @@ scheduler:
project: 10.11.00
# 通过标识判断是否走查询现场视图逻辑0不查询1查询
lyricFlag : 1
lyricFlag : 1
# 同步待办时,查询待办的最大时间间隔,单位:天
lyricTodoInterval : 7

View File

@@ -137,4 +137,7 @@ scheduler:
project: 10.11.00
# 通过标识判断是否走查询现场视图逻辑0不查询1查询
lyricFlag : 0
lyricFlag : 0
# 同步待办时,查询待办的最大时间间隔,单位:天
lyricTodoInterval : 7

View File

@@ -153,4 +153,7 @@ project:
# 通过标识判断是否走查询现场视图逻辑0不查询1查询
lyricFlag : 0
lyricFlag : 0
# 同步待办时,查询待办的最大时间间隔,单位:天
lyricTodoInterval : 7

View File

@@ -10,6 +10,43 @@
</foreach>
</insert>
<insert id="saveBatchTask" useGeneratedKeys="true" keyProperty="id">
insert into simulation_task (uuid,task_name,task_code,task_pool_name,task_pool_version,node_id,days,standard,fold_id,status,achieve_status,begin_time,end_time,progress,exe_status,confidence,analyse_target,analyse_software,approval_status,description,difficult,tenant_id
,creator,create_time,department,sectionName,groupName,bCapacity,flowTemplate,englishName,demand_id,tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10,imageFileId,discipline) values
<foreach collection='list' item='it' index='index' separator=','>
(#{it.uuid},#{it.taskName},#{it.taskCode},'','',#{it.nodeId},#{it.days},#{it.standard},'',1,0,
#{it.beginTime},#{it.endTime},0,1,#{it.confidence},#{it.analyseTarget},#{it.analyseSoftware},'0',#{it.description},#{it.difficult},#{it.tenantId},
#{it.creator},#{it.createTime},#{it.department},#{it.sectionName},#{it.groupName},#{it.bCapacity},#{it.flowTemplate},#{it.englishName},#{it.demandId},#{it.tag1},#{it.tag2},
#{it.tag3},#{it.tag4},
#{it.tag5},#{it.tag6},
#{it.tag7},#{it.tag8},
#{it.tag9},#{it.tag10},
#{it.imageFileId},#{it.discipline})
</foreach>
</insert>
<insert id="saveBatchTaskMember">
insert into simulation_task_member (task_id,identity,name,user_id,creator,create_time,type) values
<foreach collection='list' item='addNodeMember' index='index' separator=','>
(#{addNodeMember.taskId},#{addNodeMember.identity},#{addNodeMember.name},#{addNodeMember.userId},#{addNodeMember.creator},#{addNodeMember.createTime},#{addNodeMember.type})
</foreach>
</insert>
<insert id="saveBatchTaskExtra">
insert into simulation_task_extra (task_id, property_name, property_value, value_type, property_class, creator, create_time) values
<foreach collection='list' item='taskExtra' index='index' separator=','>
(#{taskExtra.nodeId}, #{taskExtra.propertyName}, #{taskExtra.propertyValue}, #{taskExtra.valueType}, #{taskExtra.propertyClass}, #{taskExtra.creator}, #{taskExtra.createTime})
</foreach>
</insert>
<insert id="saveBatchTaskAttention">
insert into simulation_task_attention (task_id,identity,name,user_id,creator,create_time) values
<foreach collection='list' item='attention' index='index' separator=','>
(#{attention.taskId},null,null,#{attention.userId},#{attention.creatorValue},#{attention.createTime})
</foreach>
</insert>
<update id="updateTask">
update simulation_task
<trim prefix="set" suffixOverrides=",">