package org.springblade.mdm.program.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.mdm.flow.service.FlowProgramFileService; import org.springblade.mdm.flow.service.TaskDispatchService; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.entity.NcNodeHis; import org.springblade.mdm.program.service.NcNodeHisService; import org.springblade.mdm.program.service.NcNodeService; import org.springblade.mdm.program.service.ProgramFlowStatusQueryService; import org.springblade.mdm.program.vo.CompareDataVO; import org.springblade.mdm.program.vo.NcNodeOldQueryVO; import org.springblade.mdm.program.vo.NcNodeQueryVO; import org.springblade.mdm.program.vo.NcNodeVO; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * 程序节点 * * @author yangys */ @NonDS @RestController @RequestMapping("/program/nodehis") @AllArgsConstructor @Tag(name = "程序节点", description = "程序节点") @Slf4j public class NcNodeHisController { private final NcNodeService ncNodeService; private final NcNodeHisService nodeHisService; private final FlowProgramFileService flowProgramFileService; @GetMapping("/history-by-nodeid") @Operation(summary = "根据绑定节点id获取历史列表", description = "程序历史列表,仅‘程序包’字典值60的数据。用于显示程序的‘历史版本’") public R> historyByBindNodeId(@Parameter(description="节点ID(nodeType=60的节点id)")@RequestParam Long id) { return R.data(this.nodeHisService.historyByNodeId(id)); } @GetMapping("/files-by-parent-id") @Operation(summary = "获取历史程序包文件列表", description = "获取历史程序包文件列表") public R> filesByParentNodeId(@Parameter(description="节点ID(nodeType=60的节点id)")@RequestParam Long id) { List nodes = nodeHisService.lambdaQuery().eq(NcNodeHis::getParentId,id).orderByDesc(NcNodeHis::getCreateTime).list(); List voList = new ArrayList<>(nodes.stream().map(nh -> {NcNodeVO vo = new NcNodeVO(); BeanUtils.copyProperties(nh,vo); return vo; }).toList()); NcNodeHis pkgNode = nodeHisService.getById(id); //文件,按照先程序,后其他排序 if(!voList.isEmpty()) { if (voList.get(0).getNodeType().equals(NcNode.TYPE_PROGRAM_FILE)) { Comparator cp = new Comparator<>() { @Override public int compare(NcNodeVO n1, NcNodeVO n2) { if (n1.getName().startsWith(pkgNode.getName()) && !n2.getName().startsWith(pkgNode.getName())) { return -1; } else { return 1; } } }; voList.sort(cp.thenComparing(NcNodeVO::getName)); } } return R.data(voList); } @GetMapping("/content-by-nodeid") @Operation(summary = "根据节点获取文件内容", description = "仅限文本格式的内容,二进制文件将返回空串") public R fileContentByNodeId(@Parameter(description = "节点id") Long nodeId) { try { NcNodeHis node = this.nodeHisService.getById(nodeId); if(node.getFlowProgramFileId() != null) { return R.data(flowProgramFileService.getFileContent(node.getFlowProgramFileId())); }else{ return R.data("找不到文件"); } }catch(Exception e) { log.error("获取文件内容失败",e); return R.fail(e.getMessage()); } } }