1、调整对接第三方接口逻辑

This commit is contained in:
2025-12-24 09:31:19 +08:00
parent 1945601897
commit 6a0f0e0364

View File

@@ -28,6 +28,10 @@ import com.sdm.common.log.CoreLogger;
import com.sdm.common.utils.DateUtils;
import com.sdm.common.utils.RandomUtil;
import com.sdm.common.utils.excel.ExcelUtil;
import com.sdm.outbridge.entity.LyricVMainPlanDM;
import com.sdm.outbridge.entity.LyricVTodoEmulationInfoDM;
import com.sdm.outbridge.service.lyric.LyricVMainPlanDMService;
import com.sdm.outbridge.service.lyric.LyricVTodoInfoService;
import com.sdm.project.dao.SimulationDemandMapper;
import com.sdm.project.dao.SimulationNodeMapper;
import com.sdm.project.dao.SimulationProjectMapper;
@@ -114,7 +118,10 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
public static final String SYNC_PROJECT_SOURCE = "同步";
@Autowired
private ILyricInternalService lyricInternalService;
private LyricVMainPlanDMService lyricVMainPlanDMService;
@Autowired
private LyricVTodoInfoService lyricVTodoInfoService;
@Transactional
@@ -166,9 +173,9 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
String nodeType = addNode.getNodeType();
if (SYNC_PROJECT_SOURCE.equals(projectSource) && NodeTypeEnum.PROJECT.getValue().equals(nodeType)) {
// 同步待办信息
lyricInternalService.getTodoListByProjectNum(addNode.getNodeCode());
getTodoListByProjectNum(addNode.getNodeCode());
// TODO 同步主计划信息
lyricInternalService.getMainPlanListByProjectId(addNode.getProjectId(),addNode.getUuid());
getMainPlanListByProjectId(addNode.getProjectId(),addNode.getUuid());
}
}
return SdmResponse.success(addNodeList);
@@ -1717,4 +1724,385 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
return SdmResponse.success();
}
public SdmResponse getTodoListByProjectNum(String projectNum) {
log.info("同步代办时,项目号为:{}", projectNum);
if (StringUtils.isBlank(projectNum)) {
log.error("同步待办时,项目号不能为空");
return SdmResponse.failed("同步待办时,项目号不能为空");
}
// 查询
List<LyricVTodoEmulationInfoDM> todoInfoList = lyricVTodoInfoService.lambdaQuery().eq(LyricVTodoEmulationInfoDM::getProject, projectNum)
.list();
log.info("同步代办时todoInfoList{}", todoInfoList);
// 过滤掉数据库中已经有的需求
if (CollectionUtils.isEmpty(todoInfoList)) {
log.info("未同步到待办");
return SdmResponse.success();
}
log.info("同步到{}条待办", todoInfoList.size());
List<SpdmDemandVo> allDemandList = demandMapper.getAllList();
if (CollectionUtils.isNotEmpty(allDemandList)) {
List<String> demandCodeList = allDemandList.stream().map(SpdmDemandVo::getDemandCode).toList();
todoInfoList = todoInfoList.stream().filter(todoInfo -> !demandCodeList.contains(String.valueOf(todoInfo.getTodoId()))).toList();
if (CollectionUtils.isEmpty(todoInfoList)) {
log.info("本次同步到的待办都已经进行过同步");
return SdmResponse.success();
}
}
Long tenantId = ThreadLocalContext.getTenantId();
Long jobNumber = ThreadLocalContext.getUserId();
String uuid;
String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
for (LyricVTodoEmulationInfoDM emulation : todoInfoList) {
try {
List<SpdmDemandExtraReq> extras = new ArrayList<>();
List<SpdmDemandRelateMemberReq> allMemberList = new ArrayList<>();
// 需求的基础属性
SpdmAddDemandReq spdmAddDemandReq = new SpdmAddDemandReq();
uuid = RandomUtil.generateString(32);
spdmAddDemandReq.setUuid(uuid);
spdmAddDemandReq.setDemandName(emulation.getEmulationDemand());
if (ObjectUtils.isNotEmpty(emulation.getTodoId())) {
spdmAddDemandReq.setDemandCode(String.valueOf(emulation.getTodoId()));
}
spdmAddDemandReq.setDemandType(emulation.getEmulationType());
spdmAddDemandReq.setDemandStatus("0");
spdmAddDemandReq.setAchieveStatus("0");
spdmAddDemandReq.setProgress(0);
spdmAddDemandReq.setBeginTime(emulation.getPlanStartTime());
spdmAddDemandReq.setEndTime(emulation.getClosedTime());
spdmAddDemandReq.setProjectId(emulation.getProject());
spdmAddDemandReq.setPhaseId(emulation.getProjectStage());
spdmAddDemandReq.setDemandSource(SYNC_PROJECT_SOURCE);
// 需求的额外属性
SpdmDemandExtraReq extraReq1 = new SpdmDemandExtraReq();
extraReq1.setDemandId(uuid);
extraReq1.setPropertyName("emulationResult");
extraReq1.setPropertyValue(emulation.getEmulationResult());
extras.add(extraReq1);
SpdmDemandExtraReq extraReq2 = new SpdmDemandExtraReq();
extraReq2.setDemandId(uuid);
extraReq2.setPropertyName("robotBrand");
extraReq2.setPropertyValue(emulation.getRobotBrand());
extras.add(extraReq2);
SpdmDemandExtraReq extraReq3 = new SpdmDemandExtraReq();
extraReq3.setDemandId(uuid);
extraReq3.setPropertyName("axis");
extraReq3.setPropertyValue(emulation.getAxis());
extras.add(extraReq3);
SpdmDemandExtraReq extraReq4 = new SpdmDemandExtraReq();
extraReq4.setDemandId(uuid);
extraReq4.setPropertyName("beatRequirements");
extraReq4.setPropertyValue(emulation.getBeatRequirements());
extras.add(extraReq4);
SpdmDemandExtraReq extraReq5 = new SpdmDemandExtraReq();
extraReq5.setDemandId(uuid);
extraReq5.setPropertyName("threeDimensionalReposito");
extraReq5.setPropertyValue(emulation.getThreeDimensionalRepositoryPath());
extras.add(extraReq5);
SpdmDemandExtraReq extraReq6 = new SpdmDemandExtraReq();
extraReq6.setDemandId(uuid);
extraReq6.setPropertyName("resultPath");
extraReq6.setPropertyValue(emulation.getResultPath());
extras.add(extraReq6);
SpdmDemandExtraReq extraReq7 = new SpdmDemandExtraReq();
extraReq7.setDemandId(uuid);
extraReq7.setPropertyName("resultDescribe");
extraReq7.setPropertyValue(emulation.getResultDescribe());
extras.add(extraReq7);
SpdmDemandExtraReq extraReq8 = new SpdmDemandExtraReq();
extraReq8.setDemandId(uuid);
extraReq8.setPropertyName("analysisType");
extraReq8.setPropertyValue(emulation.getAnalysisType());
extras.add(extraReq8);
SpdmDemandExtraReq extraReq11 = new SpdmDemandExtraReq();
extraReq11.setDemandId(uuid);
extraReq11.setPropertyName("software");
extraReq11.setPropertyValue(emulation.getSoftware());
extras.add(extraReq11);
SpdmDemandExtraReq extraReq12 = new SpdmDemandExtraReq();
extraReq12.setDemandId(uuid);
extraReq12.setPropertyName("type");
extraReq12.setPropertyValue(emulation.getType());
extras.add(extraReq12);
SpdmDemandExtraReq extraReq13 = new SpdmDemandExtraReq();
extraReq13.setDemandId(uuid);
extraReq13.setPropertyName("resultFileId");
extraReq13.setPropertyValue(emulation.getResultFileId());
extras.add(extraReq13);
SpdmDemandExtraReq extraReq14 = new SpdmDemandExtraReq();
extraReq14.setDemandId(uuid);
extraReq14.setPropertyName("difficulty");
extraReq14.setPropertyValue(emulation.getDifficulty());
extras.add(extraReq14);
SpdmDemandExtraReq extraReq15 = new SpdmDemandExtraReq();
extraReq15.setDemandId(uuid);
extraReq15.setPropertyName("requiredTime");
extraReq15.setPropertyValue(emulation.getRequiredTime());
extras.add(extraReq15);
SpdmDemandExtraReq extraReq20 = new SpdmDemandExtraReq();
extraReq20.setDemandId(uuid);
extraReq20.setPropertyName("subject");
extraReq20.setPropertyValue(emulation.getSubject());
extras.add(extraReq20);
SpdmDemandExtraReq extraReq21 = new SpdmDemandExtraReq();
extraReq21.setDemandId(uuid);
extraReq21.setPropertyName("todoNum");
extraReq21.setPropertyValue(emulation.getTodoNum());
extras.add(extraReq21);
SpdmDemandExtraReq extraReq22 = new SpdmDemandExtraReq();
extraReq22.setDemandId(uuid);
extraReq22.setPropertyName("status");
extraReq22.setPropertyValue(emulation.getStatus());
extras.add(extraReq22);
SpdmDemandExtraReq extraReq26 = new SpdmDemandExtraReq();
extraReq26.setDemandId(uuid);
extraReq26.setPropertyName("projectName");
extraReq26.setPropertyValue(emulation.getProjectName());
extras.add(extraReq26);
SpdmDemandExtraReq extraReq27 = new SpdmDemandExtraReq();
extraReq27.setDemandId(uuid);
extraReq27.setPropertyName("projectModel");
extraReq27.setPropertyValue(emulation.getProjectModel());
extras.add(extraReq27);
SpdmDemandExtraReq extraReq28 = new SpdmDemandExtraReq();
extraReq28.setDemandId(uuid);
extraReq28.setPropertyName("projectType");
extraReq28.setPropertyValue(emulation.getProjectType());
extras.add(extraReq28);
SpdmDemandExtraReq extraReq31 = new SpdmDemandExtraReq();
extraReq31.setDemandId(uuid);
extraReq31.setPropertyName("stationNum");
extraReq31.setPropertyValue(emulation.getStationNum());
extras.add(extraReq31);
SpdmDemandExtraReq extraReq32 = new SpdmDemandExtraReq();
extraReq32.setDemandId(uuid);
extraReq32.setPropertyName("planStartTime");
extraReq32.setPropertyValue(emulation.getPlanStartTime());
extras.add(extraReq32);
SpdmDemandExtraReq extraReq33 = new SpdmDemandExtraReq();
extraReq33.setDemandId(uuid);
extraReq33.setPropertyName("requirementsTime");
extraReq33.setPropertyValue(emulation.getRequiredTime());
extras.add(extraReq33);
SpdmDemandExtraReq extraReq34 = new SpdmDemandExtraReq();
extraReq34.setDemandId(uuid);
extraReq34.setPropertyName("pausedTime");
extraReq34.setPropertyValue(emulation.getPausedTime());
extras.add(extraReq34);
SpdmDemandExtraReq extraReq35 = new SpdmDemandExtraReq();
extraReq35.setDemandId(uuid);
extraReq35.setPropertyName("performer");
extraReq35.setPropertyValue(emulation.getPerformer());
extras.add(extraReq35);
SpdmDemandExtraReq extraReq36 = new SpdmDemandExtraReq();
extraReq36.setDemandId(uuid);
extraReq36.setPropertyName("performerName");
extraReq36.setPropertyValue(emulation.getPerformerName());
extras.add(extraReq36);
SpdmDemandExtraReq extraReq37 = new SpdmDemandExtraReq();
extraReq37.setDemandId(uuid);
extraReq37.setPropertyName("verifier");
extraReq37.setPropertyValue(emulation.getVerifier());
extras.add(extraReq37);
SpdmDemandExtraReq extraReq39 = new SpdmDemandExtraReq();
extraReq39.setDemandId(uuid);
extraReq39.setPropertyName("workHourPlan");
extraReq39.setPropertyValue(emulation.getWorkHourPlan());
extras.add(extraReq39);
SpdmDemandExtraReq extraReq40 = new SpdmDemandExtraReq();
extraReq40.setDemandId(uuid);
extraReq40.setPropertyName("realWorkHour");
extraReq40.setPropertyValue(emulation.getRealWorkHour());
extras.add(extraReq40);
SpdmDemandExtraReq extraReq41 = new SpdmDemandExtraReq();
extraReq41.setDemandId(uuid);
extraReq41.setPropertyName("standardWorkHour");
extraReq41.setPropertyValue(emulation.getStandardWorkHour());
extras.add(extraReq41);
SpdmDemandExtraReq extraReq42 = new SpdmDemandExtraReq();
extraReq42.setDemandId(uuid);
extraReq42.setPropertyName("turnDownReason");
extraReq42.setPropertyValue(emulation.getTurnDownReason());
extras.add(extraReq42);
// 需求的成员
// 仿真负责人
String emulationPerformer = emulation.getEmulationPerformer();
if (StringUtils.isNotBlank(emulationPerformer)) {
SpdmDemandRelateMemberReq pMemberReq = new SpdmDemandRelateMemberReq();
pMemberReq.setDemandId(uuid);
pMemberReq.setType(0);
String pUserId = emulationPerformer.split("-")[0];
if (isConvertibleToLong(pUserId)) {
pMemberReq.setUserId(Long.valueOf(pUserId));
}
pMemberReq.setCreateTime(curDateStr);
pMemberReq.setCreator(jobNumber);
allMemberList.add(pMemberReq);
}
// 仿真执行人
String emulationExecutor = emulation.getEmulationExecutor();
if (StringUtils.isNotBlank(emulationExecutor)) {
SpdmDemandRelateMemberReq eMemberReq = new SpdmDemandRelateMemberReq();
eMemberReq.setDemandId(uuid);
eMemberReq.setType(1);
String eUserId = emulationExecutor.split("-")[0];
if (isConvertibleToLong(eUserId)) {
eMemberReq.setUserId(Long.valueOf(eUserId));
}
eMemberReq.setCreateTime(curDateStr);
eMemberReq.setCreator(jobNumber);
allMemberList.add(eMemberReq);
}
// 3D负责人
String threeDimensionalPerformer = emulation.getThreeDimensionalPerformer();
if (StringUtils.isNotBlank(emulationExecutor)) {
SpdmDemandRelateMemberReq tMemberReq = new SpdmDemandRelateMemberReq();
tMemberReq.setDemandId(uuid);
tMemberReq.setType(2);
String tUserId = threeDimensionalPerformer.split("-")[0];
if (isConvertibleToLong(tUserId)) {
tMemberReq.setUserId(Long.valueOf(tUserId));
}
tMemberReq.setCreateTime(curDateStr);
tMemberReq.setCreator(jobNumber);
allMemberList.add(tMemberReq);
}
demandMapper.addDemand(spdmAddDemandReq, tenantId, jobNumber);
// 更新文件权限
UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
updatePermissionReq.setUserId(jobNumber);
updatePermissionReq.setUuid(uuid);
Map<Long, Byte> userPermissions = new HashMap<>();
userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue());
updatePermissionReq.setUserPermissions(userPermissions);
log.info("同步需求时,更新用户权限的参数为:{}", updatePermissionReq);
SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
log.info("同步需求时,更新用户权限的返回值为:{}", updatePermissionResponse);
demandMapper.addDemandMember(allMemberList);
for (SpdmDemandExtraReq extra : extras) {
extra.setCreateTime(curDateStr);
extra.setCreator(jobNumber);
}
demandMapper.addDemandExtra(extras);
CreateDirReq createDirReq = new CreateDirReq();
createDirReq.setUuId(uuid);
createDirReq.setParentUuId(null);
createDirReq.setDirName(spdmAddDemandReq.getDemandName());
createDirReq.setDirType(DirTypeEnum.PROJECT_NODE_DIR.getValue());
log.info("同步待办创建需求时,调用创建文件夹的参数为:{}", createDirReq);
SdmResponse response = dataFeignClient.createDir(createDirReq);
log.info("同步代办创建需求时,调用创建文件夹的返回值为:{}", response);
} catch (Exception e) {
log.error("同步代办时有异常:{}", e.getMessage());
}
}
return SdmResponse.success();
}
public SdmResponse getMainPlanListByProjectId(Integer projectId, String projectUuid) {
log.info("同步主计划projectId{}projectUuid{}", projectId, projectUuid);
if (ObjectUtils.isEmpty(projectId) || ObjectUtils.isEmpty(projectUuid)) {
log.error("同步主计划时项目id和uuid都不能为空");
return SdmResponse.failed("同步主计划时项目id和uuid都不能为空");
}
Long tenantId = ThreadLocalContext.getTenantId();
Long jobNumber = ThreadLocalContext.getUserId();
String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
List<LyricVMainPlanDM> mainPlanList = lyricVMainPlanDMService.lambdaQuery().eq(LyricVMainPlanDM::getProjectId, String.valueOf(projectId)).list();
log.info("mainPlanList为{}", mainPlanList);
if (CollectionUtils.isEmpty(mainPlanList)) {
log.info("mainPlanList为空");
return SdmResponse.success();
}
List<SimulationNode> nodeList = this.lambdaQuery().eq(SimulationNode::getProjectSource, SYNC_PROJECT_SOURCE)
.eq(SimulationNode::getNodeType, NodeTypeEnum.PHASE.getValue())
.list();
if (CollectionUtils.isNotEmpty(nodeList)) {
List<String> nodeNameList = nodeList.stream().map(SimulationNode::getNodeName).toList();
log.info("nodeNameList为{}", nodeNameList);
mainPlanList = mainPlanList.stream().filter(planInfo -> !nodeNameList.contains(String.valueOf(planInfo.getSubject()))).toList();
if (CollectionUtils.isEmpty(mainPlanList)) {
log.info("本次同步到的主计划都已经进行过同步");
return SdmResponse.success();
}
}
log.info("同步到的主计划编号集合为:{}", mainPlanList.stream().map(LyricVMainPlanDM::getSubject).toList());
List<SimulationNode> simulationNodeList = new ArrayList<>();
for (LyricVMainPlanDM newPhaseInfo : mainPlanList) {
String uuid = RandomUtil.generateString(32);
SimulationNode simulationNode = new SimulationNode();
simulationNode.setUuid(uuid);
simulationNode.setOwnRootNodeUuid(uuid);
simulationNode.setNodeName(StringUtils.isNotBlank(newPhaseInfo.getSubject()) ? newPhaseInfo.getSubject() : "默认阶段");
simulationNode.setNodeType(NodeTypeEnum.PHASE.getValue());
simulationNode.setNodeStatus("0");
simulationNode.setNodeLevel(1);
simulationNode.setTenantId(tenantId);
simulationNode.setExeStatus("0");
simulationNode.setCreator(jobNumber);
simulationNode.setCreateTime(curDateStr);
simulationNode.setTag1(projectUuid);
simulationNode.setTag2(uuid);
try {
createDir(simulationNode.getUuid(), simulationNode.getNodeType(), simulationNode.getTag1(), simulationNode.getNodeName());
} catch (Exception e) {
log.error("同步主计划创建文件夹时有异常:{}", e.getMessage());
}
simulationNodeList.add(simulationNode);
}
this.saveBatch(simulationNodeList);
// 更新文件权限
for (SimulationNode simulationNode : simulationNodeList) {
UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
updatePermissionReq.setUserId(jobNumber);
updatePermissionReq.setUuid(simulationNode.getUuid());
Map<Long, Byte> userPermissions = new HashMap<>();
userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue());
updatePermissionReq.setUserPermissions(userPermissions);
log.info("同步主计划时,更新用户权限的参数为:{}", updatePermissionReq);
SdmResponse updatePermissionResponse = null;
try {
updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
} catch (Exception e) {
log.error("同步主计划更新用户权限时有异常:{}", e.getMessage());
}
log.info("同步主计划时,更新用户权限的返回值为:{}", updatePermissionResponse);
}
return SdmResponse.success();
}
/**
* 判断字符串是否可以安全转换为Long类型
*
* @param str 待校验的字符串
* @return true-可以转换false-不可以转换
*/
public static boolean isConvertibleToLong(String str) {
// 1. 处理null、空字符串、全空格字符串
if (str == null || str.trim().isEmpty()) {
return false;
}
String trimmedStr = str.trim();
// 2. 正则校验数字格式(支持正负号,纯数字)
// 正则说明:^-? 匹配开头的负号(可选);\\d+ 匹配1个及以上数字$ 匹配结尾
if (!trimmedStr.matches("^-?\\d+$")) {
return false;
}
// 3. 校验数值范围,避免溢出
try {
// 直接调用Long.parseLong利用其自带的范围校验
Long.parseLong(trimmedStr);
return true;
} catch (NumberFormatException e) {
// 捕获数值超出Long范围的异常
return false;
}
}
}