1、提交EP对接接口

This commit is contained in:
2026-01-09 15:36:35 +08:00
parent 2b68984a2b
commit 49e3b6c2f8
11 changed files with 365 additions and 11 deletions

View File

@@ -0,0 +1,8 @@
package com.sdm.outbridge.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sdm.outbridge.entity.LyricVProjectStationToDM;
public interface LyricVProjectStationToDmMapper extends BaseMapper<LyricVProjectStationToDM> {
}

View File

@@ -0,0 +1,44 @@
package com.sdm.outbridge.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* 项目信息视图实体类
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "v_project_station_to_DM", autoResultMap = true)
@Schema(description = "项目——机台——工位信息视图")
public class LyricVProjectStationToDM {
@Schema(description = "项目id")
@TableField(value = "project_id")
private Long projectId;
@Schema(description = "工位编号")
@TableField(value = "station_num")
private String stationNum;
@Schema(description = "工位名称")
@TableField(value = "station_name")
private String stationName;
@Schema(description = "机台编号")
@TableField(value = "machine_number")
private String machineNumber;
@Schema(description = "机台名称")
@TableField(value = "machine_name")
private String machineName;
@Schema(description = "删除标志")
@TableField(value = "delete_source")
private String deleteSource;
}

View File

@@ -271,4 +271,9 @@ public class LyricVTodoEmulationInfoDM implements Serializable {
@Schema(description = "标准工时")
@TableField(value = "standard_work_hour")
private String standardWorkHour;
@Schema(description = "关联任务")
@TableField(value = "relevance_task")
private String relevanceTask;
}

View File

@@ -0,0 +1,13 @@
package com.sdm.outbridge.service.impl.lyric;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.outbridge.dao.LyricVProjectStationToDmMapper;
import com.sdm.outbridge.entity.LyricVProjectStationToDM;
import com.sdm.outbridge.service.lyric.LyricVProjectStationToDmService;
import org.springframework.stereotype.Service;
@Service
public class LyricVProjectStationToDmServiceImpl extends ServiceImpl<LyricVProjectStationToDmMapper, LyricVProjectStationToDM>
implements LyricVProjectStationToDmService {
}

View File

@@ -0,0 +1,8 @@
package com.sdm.outbridge.service.lyric;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sdm.outbridge.entity.LyricVProjectStationToDM;
/* 查询项目信息 */
public interface LyricVProjectStationToDmService extends IService<LyricVProjectStationToDM> {
}

View File

@@ -4,6 +4,7 @@ import com.sdm.common.common.SdmResponse;
import com.sdm.outbridge.mode.GetProcessDataReq;
import com.sdm.project.model.req.PushReportReq;
import com.sdm.project.model.req.ep.EpProjectQueryReq;
import com.sdm.project.model.req.ep.EpSyncPhaseReq;
import com.sdm.project.service.ILyricInternalService;
import com.sdm.project.service.ISimulationLyricNodeService;
import io.swagger.v3.oas.annotations.Operation;
@@ -129,5 +130,16 @@ public class SimulationLyricNodeController {
return lyricInternalService.queryProjectInfoList(req);
}
/**
* 同步阶段机台工位
*
* @return
*/
@PostMapping("/syncPhase")
@Operation(summary = "同步阶段机台工位", description = "同步阶段机台工位")
public SdmResponse syncPhase(@RequestBody @Validated EpSyncPhaseReq req) {
return lyricInternalService.syncPhase(req);
}
}

View File

@@ -0,0 +1,23 @@
package com.sdm.project.model.req.ep;
import com.sdm.project.model.bo.TaskNodeTag;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
@Data
public class EpSyncPhaseReq {
@NotBlank
private String projectId;
@NotBlank
private String nodeCode;
@NotBlank
private String uuid;
private List<TaskNodeTag> tagMap;
}

View File

@@ -4,6 +4,7 @@ import com.sdm.common.common.SdmResponse;
import com.sdm.outbridge.mode.GetProcessDataReq;
import com.sdm.project.model.req.PushReportReq;
import com.sdm.project.model.req.ep.EpProjectQueryReq;
import com.sdm.project.model.req.ep.EpSyncPhaseReq;
import org.springframework.web.bind.annotation.RequestParam;
public interface ILyricInternalService {
@@ -32,4 +33,6 @@ public interface ILyricInternalService {
SdmResponse queryProjectInfoList(EpProjectQueryReq req);
SdmResponse syncPhase(EpSyncPhaseReq req);
}

View File

@@ -20,17 +20,20 @@ import com.sdm.outbridge.mode.HkUploadFileReq;
import com.sdm.outbridge.service.lyric.*;
import com.sdm.project.common.generator.UniqueFileNameGenerator;
import com.sdm.project.dao.SimulationDemandMapper;
import com.sdm.project.dao.SimulationNodeMapper;
import com.sdm.project.dao.SimulationProjectMapper;
import com.sdm.project.model.bo.TaskNodeTag;
import com.sdm.project.model.entity.SimulationNode;
import com.sdm.project.model.req.PushReportReq;
import com.sdm.project.model.req.SpdmAddDemandReq;
import com.sdm.project.model.req.SpdmDemandExtraReq;
import com.sdm.project.model.req.SpdmDemandRelateMemberReq;
import com.sdm.project.model.po.ProjectNodePo;
import com.sdm.project.model.req.*;
import com.sdm.project.model.req.ep.EpProjectQueryReq;
import com.sdm.project.model.req.ep.EpSyncPhaseReq;
import com.sdm.project.model.vo.SpdmDemandVo;
import com.sdm.project.service.ILyricInternalService;
import com.sdm.project.service.INodeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -38,11 +41,13 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -90,6 +95,12 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
@Resource
private INodeService nodeService;
@Autowired
private LyricVProjectStationToDmService lyricVProjectStationToDmService;
@Resource
private SimulationNodeMapper nodeMapper;
/**
* 判断字符串是否可以安全转换为Long类型
*
@@ -206,6 +217,7 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
spdmAddDemandReq.setDemandCode(String.valueOf(emulation.getTodoId()));
}
spdmAddDemandReq.setDemandType(emulation.getEmulationType());
spdmAddDemandReq.setSimType(emulation.getRelevanceTask());
spdmAddDemandReq.setDemandStatus("0");
spdmAddDemandReq.setAchieveStatus("0");
spdmAddDemandReq.setProgress(0);
@@ -1214,4 +1226,145 @@ public class LyricInternalServiceImpl implements ILyricInternalService {
return response;
}
public static void setTagProperty(Object obj, String propertyName, Object value) throws Exception {
Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField(propertyName);
field.setAccessible(true);
field.set(obj, value);
field.setAccessible(false);
}
@Override
public SdmResponse syncPhase(EpSyncPhaseReq req) {
Long tenantId = ThreadLocalContext.getTenantId();
Long jobNumber = ThreadLocalContext.getUserId();
String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// 根据projectId查询项目机台工位信息的视图
List<LyricVProjectStationToDM> projectStationList = lyricVProjectStationToDmService.lambdaQuery()
.eq(LyricVProjectStationToDM::getProjectId, req.getProjectId())
.list();
if (CollectionUtils.isEmpty(projectStationList)) {
log.error("projectStationList为空");
return SdmResponse.failed("未同步到阶段机台工位的信息");
}
// 同步EP中的节点、机台、工位到DM
// 查询当前阶段
LyricVProjectToDM lyricVProject = lyricVProjectToDmService.lambdaQuery()
.eq(LyricVProjectToDM::getProjectNum, req.getNodeCode())
.one();
List<SpdmProjectNodeEditReq> addNodeList = new ArrayList<>();
if (ObjectUtils.isNotEmpty(lyricVProject)) {
// 当前阶段
String currentPhase = lyricVProject.getStage();
SpdmProjectNodeEditReq phaseNode = new SpdmProjectNodeEditReq();
phaseNode.setUuid(RandomUtil.generateString(32));
phaseNode.setNodeCode(currentPhase);
phaseNode.setNodeName(currentPhase);
phaseNode.setCreateTime(curDateStr);
phaseNode.setCreator(jobNumber);
phaseNode.setTenantId(tenantId);
phaseNode.setProjectSource(SYNC_PROJECT_SOURCE);
phaseNode.setPid(req.getUuid());
addNodeList.add(phaseNode);
// 机台、工位
Map<String, List<LyricVProjectStationToDM>> machineMap = projectStationList.stream().collect(Collectors.groupingBy(LyricVProjectStationToDM::getMachineNumber));
for (Map.Entry<String, List<LyricVProjectStationToDM>> machineEntry : machineMap.entrySet()) {
String machineNumber = machineEntry.getKey();
List<LyricVProjectStationToDM> projectStationByMachineNumberList = machineEntry.getValue();
SpdmProjectNodeEditReq machineNode = new SpdmProjectNodeEditReq();
machineNode.setUuid(RandomUtil.generateString(32));
machineNode.setNodeCode(machineNumber);
machineNode.setNodeName(projectStationByMachineNumberList.get(0).getMachineName());
machineNode.setCreateTime(curDateStr);
machineNode.setCreator(jobNumber);
machineNode.setTenantId(tenantId);
machineNode.setProjectSource(SYNC_PROJECT_SOURCE);
machineNode.setPid(phaseNode.getUuid());
addNodeList.add(machineNode);
for (LyricVProjectStationToDM lyricVProjectStationToDM : projectStationByMachineNumberList) {
SpdmProjectNodeEditReq workspaceNode = new SpdmProjectNodeEditReq();
workspaceNode.setUuid(RandomUtil.generateString(32));
workspaceNode.setNodeCode(lyricVProjectStationToDM.getStationNum());
workspaceNode.setNodeName(lyricVProjectStationToDM.getStationName());
workspaceNode.setCreateTime(curDateStr);
workspaceNode.setCreator(jobNumber);
workspaceNode.setTenantId(tenantId);
workspaceNode.setProjectSource(SYNC_PROJECT_SOURCE);
workspaceNode.setPid(machineNode.getUuid());
addNodeList.add(workspaceNode);
}
}
}
List<TaskNodeTag> tagMap = req.getTagMap();
List<SpdmProjectNodeEditReq> currentNodeList;
HashMap<String, String> idMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(tagMap)) {
// {key: "project", value: "Tag1"}, {key: "phase", value: "Tag2"}
for (TaskNodeTag tagReq : tagMap) {
String currentNodeType = tagReq.getKey(); // project phase
log.info("当前nodeType为{}tag为{}", currentNodeType, tagReq.getValue());
currentNodeList = addNodeList.stream().filter(node -> node.getNodeType().equals(currentNodeType)).toList(); // projectNodeList phaseNodeList
if (CollectionUtils.isEmpty(currentNodeList)) {
log.error("addNodeList中不存在{}类型的节点", currentNodeType);
continue;
}
List<String> currentNodeIdList = new ArrayList<>();
for (SpdmProjectNodeEditReq addNode : currentNodeList) {
// idMap = {"tag1": "uuid1,uuid2", "tag2": "uuid3"}
if (MapUtils.isNotEmpty(idMap)) {
for (Map.Entry<String, String> entry : idMap.entrySet()) {
// 之前的tag
// preTag = entry.getKey() = "tag1"
String preTag = entry.getKey();
log.info("preTag为{}", preTag);
try {
// entry.getValue() = "uuid1,uuid2"
setTagProperty(addNode, preTag, entry.getValue());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
if (StringUtils.isBlank(addNode.getUuid())) {
addNode.setUuid(RandomUtil.generateString(32));
}
// 设置 当前节点所属项目根节点uuid
// addNode.getPid()为空时在创建项目ownRootNodeUuid就是addNode本身uuid
// addNode.getPid()不为空时在创建阶段ownRootNodeUuid就是入参的pid父节点
addNode.setOwnRootNodeUuid(ObjectUtils.isEmpty(addNode.getPid()) ? addNode.getUuid() : addNode.getPid());
addNode.setCreateTime(curDateStr);
addNode.setCreator(jobNumber);
addNode.setTenantId(tenantId);
try {
// tagReq.getValue()="Tag1"
setTagProperty(addNode, tagReq.getValue(), addNode.getUuid());
} catch (Exception e) {
throw new RuntimeException(e);
}
currentNodeIdList.add(addNode.getUuid());
}
// tagReq.getValue()= "tag1" "tag2"
idMap.put(tagReq.getValue(), String.join(",", currentNodeIdList));
}
}
if (nodeMapper.addNodeBatch(addNodeList) <= 0) {
return null;
}
for (SpdmProjectNodeEditReq node : addNodeList) {
createDir(node.getUuid(), node.getNodeType(), req.getUuid(), node.getNodeName());
}
// 更新文件权限
Long userId = ThreadLocalContext.getUserId();
UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
updatePermissionReq.setUserId(userId);
updatePermissionReq.setUuid(req.getUuid());
Map<Long, Byte> userPermissions = new HashMap<>();
userPermissions.put(userId, FilePermissionEnum.ALL.getValue());
updatePermissionReq.setUserPermissions(userPermissions);
log.info("syncPhase更新用户权限的参数为{}",updatePermissionReq);
SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
log.info("syncPhase更新用户权限的返回值为{}",updatePermissionResponse);
return SdmResponse.success();
}
}

View File

@@ -29,8 +29,12 @@ 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.LyricVProjectStationToDM;
import com.sdm.outbridge.entity.LyricVProjectToDM;
import com.sdm.outbridge.entity.LyricVTodoEmulationInfoDM;
import com.sdm.outbridge.service.lyric.LyricVMainPlanDMService;
import com.sdm.outbridge.service.lyric.LyricVProjectStationToDmService;
import com.sdm.outbridge.service.lyric.LyricVProjectToDmService;
import com.sdm.outbridge.service.lyric.LyricVTodoInfoService;
import com.sdm.project.common.MemberTypeEnum;
import com.sdm.project.dao.SimulationDemandMapper;
@@ -131,6 +135,12 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
"workspaceNodeId"
};
@Autowired
private LyricVProjectToDmService lyricVProjectToDmService;
@Autowired
private LyricVProjectStationToDmService lyricVProjectStationToDmService;
@Transactional
@Override
@@ -421,6 +431,69 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
List<SpdmNodeExtraReq> extraList;
List<SpdmNodeExtraReq> allExtraList = new ArrayList<>();
List<SpdmProjectNodeEditReq> currentNodeList;
// 如果项目当前阶段下存在机台、工位的信息则直接拉取到DM系统中
Optional<SpdmProjectNodeEditReq> projectOptional = addNodeList.stream().filter(node -> NodeTypeEnum.PROJECT.getValue().equals(node.getNodeType())).findFirst();
if (projectOptional.isPresent()) {
SpdmProjectNodeEditReq spdmProjectNodeEditReq = projectOptional.get();
String projectSource = spdmProjectNodeEditReq.getProjectSource();
if (SYNC_PROJECT_SOURCE.equals(projectSource)) {
// 根据projectId查询项目机台工位信息的视图
List<LyricVProjectStationToDM> projectStationList = lyricVProjectStationToDmService.lambdaQuery()
.eq(LyricVProjectStationToDM::getProjectId, spdmProjectNodeEditReq.getProjectId())
.list();
if (CollectionUtils.isNotEmpty(projectStationList)) {
// 同步EP中的节点、机台、工位到DM
// 查询当前阶段
LyricVProjectToDM lyricVProject = lyricVProjectToDmService.lambdaQuery()
.like(StringUtils.isNotBlank(spdmProjectNodeEditReq.getNodeCode()), LyricVProjectToDM::getProjectNum, spdmProjectNodeEditReq.getNodeCode())
.one();
if (ObjectUtils.isNotEmpty(lyricVProject)) {
// 当前阶段
String currentPhase = lyricVProject.getStage();
SpdmProjectNodeEditReq phaseNode = new SpdmProjectNodeEditReq();
phaseNode.setUuid(RandomUtil.generateString(32));
phaseNode.setNodeCode(currentPhase);
phaseNode.setNodeName(currentPhase);
phaseNode.setCreateTime(curDateStr);
phaseNode.setCreator(jobNumber);
phaseNode.setTenantId(tenantId);
phaseNode.setProjectSource(SYNC_PROJECT_SOURCE);
phaseNode.setPid(spdmProjectNodeEditReq.getUuid());
addNodeList.add(phaseNode);
// 机台、工位
Map<String, List<LyricVProjectStationToDM>> machineMap = projectStationList.stream().collect(Collectors.groupingBy(LyricVProjectStationToDM::getMachineNumber));
for (Map.Entry<String, List<LyricVProjectStationToDM>> machineEntry : machineMap.entrySet()) {
String machineNumber = machineEntry.getKey();
List<LyricVProjectStationToDM> projectStationByMachineNumberList = machineEntry.getValue();
SpdmProjectNodeEditReq machineNode = new SpdmProjectNodeEditReq();
machineNode.setUuid(RandomUtil.generateString(32));
machineNode.setNodeCode(machineNumber);
machineNode.setNodeName(projectStationByMachineNumberList.get(0).getMachineName());
machineNode.setCreateTime(curDateStr);
machineNode.setCreator(jobNumber);
machineNode.setTenantId(tenantId);
machineNode.setProjectSource(SYNC_PROJECT_SOURCE);
machineNode.setPid(phaseNode.getUuid());
addNodeList.add(machineNode);
for (LyricVProjectStationToDM lyricVProjectStationToDM : projectStationByMachineNumberList) {
SpdmProjectNodeEditReq workspaceNode = new SpdmProjectNodeEditReq();
workspaceNode.setUuid(RandomUtil.generateString(32));
workspaceNode.setNodeCode(lyricVProjectStationToDM.getStationNum());
workspaceNode.setNodeName(lyricVProjectStationToDM.getStationName());
workspaceNode.setCreateTime(curDateStr);
workspaceNode.setCreator(jobNumber);
workspaceNode.setTenantId(tenantId);
workspaceNode.setProjectSource(SYNC_PROJECT_SOURCE);
workspaceNode.setPid(machineNode.getUuid());
addNodeList.add(workspaceNode);
}
}
}
}
}
}
if (CollectionUtils.isNotEmpty(tagMap)) {
// {key: "project", value: "Tag1"}, {key: "phase", value: "Tag2"}
for (TaskNodeTag tagReq : tagMap) {
@@ -448,7 +521,9 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
}
}
}
addNode.setUuid(RandomUtil.generateString(32));
if (StringUtils.isBlank(addNode.getUuid())) {
addNode.setUuid(RandomUtil.generateString(32));
}
// 设置 当前节点所属项目根节点uuid
// addNode.getPid()为空时在创建项目ownRootNodeUuid就是addNode本身uuid
// addNode.getPid()不为空时在创建阶段ownRootNodeUuid就是入参的pid父节点
@@ -492,7 +567,6 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
if (nodeMapper.addNodeBatch(addNodeList) <= 0) {
return null;
}
Optional<SpdmProjectNodeEditReq> projectOptional = addNodeList.stream().filter(node -> NodeTypeEnum.PROJECT.getValue().equals(node.getNodeType())).findFirst();
if (projectOptional.isPresent()) {
SpdmProjectNodeEditReq projectNode = projectOptional.get();
// 创建项目节点的文件夹
@@ -685,6 +759,17 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
}
SpdmNodeDetailVo spdmNodeDetailVo = new SpdmNodeDetailVo();
BeanUtils.copyProperties(projectNode, spdmNodeDetailVo);
if (SYNC_PROJECT_SOURCE.equals(projectNode.getProjectSource())) {
// EP类型项目直接从视图拉取当前阶段的信息
LyricVProjectToDM lyricVProject = lyricVProjectToDmService.lambdaQuery()
.eq(StringUtils.isNotBlank(projectNode.getNodeCode()), LyricVProjectToDM::getProjectNum, projectNode.getNodeCode())
.one();
if (ObjectUtils.isNotEmpty(lyricVProject)) {
spdmNodeDetailVo.setCurrentPhase(lyricVProject.getStage());
return SdmResponse.success(spdmNodeDetailVo);
}
log.error("根据EP项目的项目编号{},未查询到项目信息",projectNode.getNodeCode());
}
// 设置当前阶段
String uuid = spdmNodeDetailVo.getUuid();
List<SimulationNode> phaseNodeList = this.lambdaQuery().eq(SimulationNode::getParentId, uuid).eq(SimulationNode::getNodeType, NodeTypeEnum.PHASE.getValue()).list();

View File

@@ -76,11 +76,11 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
if (StringUtils.isBlank(beginTime) || StringUtils.isBlank(finishTime)) {
return SdmResponse.failed("开始和完成时间都不为空时,才能填写实际工时");
}
Integer maxWorkHour = TimeCalculator.calculateWorkHours(beginTime, finishTime);
log.info("actualWorkHour{}maxWorkHour{}",actualWorkHour,maxWorkHour);
if (actualWorkHour > maxWorkHour) {
return SdmResponse.failed("您填写的工时:" + actualWorkHour + "已超出最大可填写的工时:" + maxWorkHour);
}
// Integer maxWorkHour = TimeCalculator.calculateWorkHours(beginTime, finishTime);
// log.info("actualWorkHour{}maxWorkHour{}",actualWorkHour,maxWorkHour);
// if (actualWorkHour > maxWorkHour) {
// return SdmResponse.failed("您填写的工时:" + actualWorkHour + "已超出最大可填写的工时:" + maxWorkHour);
// }
simulationWorkWrapper.set(SimulationWork::getActualWorkHour, actualWorkHour);
}
updateFlag = simulationWorkWrapper