yangys
2025-09-20 fcee672452c02cc29e0e17ebc27a8c51698c6d0d
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java
@@ -1,29 +1,29 @@
package org.springblade.mdm.program.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema;
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.basesetting.machine.vo.MachineQueryVO;
import org.springblade.mdm.basesetting.machine.vo.MachineVO;
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.NcProgram;
import org.springblade.mdm.program.service.NcNodeHisService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramService;
import org.springblade.mdm.program.service.ProgramFlowStatusQueryService;
import org.springblade.mdm.program.vo.*;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.rmi.ServerError;
import java.util.Comparator;
import java.util.List;
/**
@@ -38,10 +38,11 @@
@Tag(name = "程序节点", description = "程序节点")
@Slf4j
public class NcNodeController {
   private final NcProgramService ncProgramService;
   private final NcNodeService ncNodeService;
   private final NcNodeHisService nodeHisService;
   private final ProgramFlowStatusQueryService programFlowStatusQueryService;
   private final FlowProgramFileService flowProgramFileService;
   private final TaskDispatchService taskDispatchService;
   /**
    * 新增
    */
@@ -49,7 +50,7 @@
   @Operation(summary = "新增节点", description = "节点信息,id保持空")
   public R<Boolean> save(@RequestBody NcNodeVO vo) {
      ncNodeService.saveNcCode(vo);
      return R.<Boolean>status(true);
      return R.status(true);
   }
@@ -57,14 +58,33 @@
   @Operation(summary = "修改节点", description = "节点信息,必须传入ID")
   public R<Boolean> update(@RequestBody NcNodeVO vo) {
      ncNodeService.updateNcNode(vo);
      return R.<Boolean>status(true);
      return R.status(true);
   }
   @PostMapping("/remove")
   @Operation(summary = "删除节点")
   public R<Boolean> remove(Long id) {
      ncNodeService.removeById(id);
      return R.<Boolean>status(true);
      return R.status(true);
   }
   @PostMapping("/lock")
   @Operation(summary = "锁定节点(程序包名)")
   public R<Boolean> lock(@Parameter(description="程序包名节点id)")Long id,@Parameter(description="锁定原因)")String remark) {
      ncNodeService.lock(id,remark);
      return R.status(true);
   }
   @GetMapping("/query-lock-remark")
   @Operation(summary = "查询锁定原因")
   public R<String> queryLockRemark(@Parameter(description="程序包名节点id)")Long id) {
      NcNode node = ncNodeService.getById(id);
      if(node.hasLocked()){
         return R.data(node.getRemark());
      }else{
         return R.data(StringUtils.EMPTY);
      }
   }
   @GetMapping("/lazy-list")
@@ -73,55 +93,81 @@
      List<NcNodeVO> list = ncNodeService.lazyList(parentId);
      if(list != null && !list.isEmpty()) {
         for(NcNodeVO ncNodeVO : list) {
            if(!"60".equals(ncNodeVO.getNodeType())){
               break;
            if(NcNode.TYPE_PROGRAM_PACKAGE.equals(ncNodeVO.getNodeType())){
               ncNodeVO.setFlowStatus(programFlowStatusQueryService.queryFlowStatus(ncNodeVO.getProcessInstanceId()));
            }
            ncNodeVO.setFlowStatus(programFlowStatusQueryService.queryFlowStatus(ncNodeVO.getProcessInstanceId()));
         }
         //文件,按照先程序,后其他排序
         if(list.get(0).getNodeType().equals(NcNode.TYPE_PROGRAM_FILE)){
            NcNode parentNode = ncNodeService.getById(parentId);
            //list.sort(Comparator.comparing().thenComparing(NcNodeVO::getName));
            Comparator<NcNodeVO> cp = new Comparator<NcNodeVO>() {
               @Override
               public int compare(NcNodeVO n1, NcNodeVO n2) {
                  if (n1.getName().startsWith(parentNode.getName()) && !n2.getName().startsWith(parentNode.getName())) {
                     return -1;
                  } else {
                     return 1;
                  }
               }
            };
            list.sort(cp.thenComparing(NcNodeVO::getName));
            /*
            list.sort((n1, n2) -> {
               if(n1.getName().startsWith(parentNode.getName())){
                  return 1;
               }else{
                  return n1.getName().compareTo(n2.getName());
               }
            });*/
            /*
            Collections.sort(userList, new Comparator<User>() {
               @Override
               public int compare(User u1, User u2) {
                  return u1.getName().compareTo(u2.getName());
               }
            });*/
         }
      }
      return R.data(list);
   }
   @GetMapping("/search-list")
   @Operation(summary = "查询树状列表", description = "程序目录树形结构(查询专用)")
   public R<List<NcNodeVO>> searchList(NcNodeQueryVO queryVO) {
   public R<List<NcNodeVO>> searchList(NcNodeOldQueryVO queryVO) {
      if(Func.isEmpty(queryVO.getName())){
         return R.fail("请输入名称");
      }
      List<NcNodeVO> list = ncNodeService.searchList(queryVO);
      /*
      if(list != null && !list.isEmpty()) {
         for(NcNodeVO ncNodeVO : list) {
            if(!"70".equals(ncNodeVO.getNodeType())){
               break;
            }
            NcProgram program = ncProgramService.getByBindNodeId(ncNodeVO.getId());
            if(program != null) {
               ncNodeVO.setProcessEdition(program.getProcessEdition());
               ncNodeVO.setDrawingNo(program.getDrawingNo());
               ncNodeVO.setMachineCode(program.getMachineCode());
               ncNodeVO.setProcessName(program.getProcessName());
               ncNodeVO.setVersionNumber(program.getVersionNumber());
               //record中找不到时未启动0;找到了需要查询流程实例id,是否运行中
               ncNodeVO.setFlowStatus(programFlowStatusQueryService.queryFlowStatus(program.getId()));
            }
         }
      return R.data(list);
   }
   @GetMapping("/search-list2")
   @Operation(summary = "涉密网首页搜索", description = "搜索指定零组件号")
      public R<List<NcNodeVO>> search(NcNodeQueryVO queryVO) {
      if(Func.isEmpty(queryVO.getDrawingNo())){
         return R.fail("请输入零组件号");
      }
      List<NcNodeVO> list = ncNodeService.searchList2(queryVO);
       */
      return R.data(list);
   }
   @GetMapping("/history-by-nodeid")
   @Operation(summary = "根据绑定节点id获取历史列表", description = "程序历史列表,仅‘程序包’字典值70的数据。用于显示程序的‘历史版本’")
   public R<List<NcNodeVO>> historyByBindNodeId(@Parameter(description="节点ID(nodeType=70的节点id)")@RequestParam Long id) {
      return R.data(this.ncNodeService.historyByNodeId(id));
   @GetMapping("/drawing-no-pick")
   @Operation(summary = "首页搜索零组件下拉数据", description = "搜索指定零组件号")
   public R<List<String>> drawingNoPick(String drawingNo) {
      return R.data(taskDispatchService.drawingNoSeletDropList(drawingNo));
   }
/*
   @GetMapping("/history-by-nodeid")
   @Operation(summary = "根据绑定节点id获取历史列表", description = "程序历史列表,仅‘程序包’字典值60的数据。用于显示程序的‘历史版本’")
   public R<List<NcNodeVO>> historyByBindNodeId(@Parameter(description="节点ID(nodeType=60的节点id)")@RequestParam Long id) {
      return R.data(this.nodeHisService.historyByNodeId(id));
   }
*/
   @GetMapping("/compare-content")
   @Operation(summary = "对比内容数据", description = "查询对比内容的2个文本数据")
@@ -131,12 +177,15 @@
      NcNode node2 = ncNodeService.getById(id2);
      if(node1.getFlowProgramFileId() != null) {
         vo.setContent1(flowProgramFileService.getFileContent(node1.getFlowProgramFileId()));
      }
      if(node2.getFlowProgramFileId() != null) {
         vo.setContent1(flowProgramFileService.getFileContent(node2.getFlowProgramFileId()));
         vo.setContent2(flowProgramFileService.getFileContent(node2.getFlowProgramFileId()));
      }
      return R.data(vo);
   }
}