yangys
2025-08-02 de19116f884445318620e8436c5b1fbf829c00b5
dnc导出
已修改7个文件
264 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java 203 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java
@@ -39,6 +39,10 @@
     * 数控程序id,这个可能不需要,可以根据关联表mdm_process_prog_ref来获取
     */
    private Long ncProgramId;
    /**
     * 程序包名对应的nodeid
     */
    //private Long ncNodeId;
    private Long userId;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java
@@ -38,6 +38,25 @@
        String processDefinitionKey = flowCommonService.getDefinitionKey(processInstanceId);
        ApproveRecord rec = new ApproveRecord();
        rec.setTaskName(task.getName());
        rec.setComment(comment==null? StringUtils.EMPTY:comment);
        //rec.setNcProgramId(refObj.getNcProgramId());
        rec.setOperateResult(operateResult);//审批结果
        rec.setOperateTime(DateUtil.now());
        rec.setProcessInstanceId(processInstanceId);
        rec.setProcessDefinitionKey(processDefinitionKey);
        rec.setUserId(AuthUtil.getUserId());
        rec.setUserNickname(AuthUtil.getNickName());
        save(rec);
    }
    public void saveApproveRecordsOld(Task task, String processInstanceId, String operateResult, String comment) {
        String processDefinitionKey = flowCommonService.getDefinitionKey(processInstanceId);
        LambdaQueryWrapper<ProcessProgRef> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProcessProgRef::getProcessInstanceId, processInstanceId);
        List<ProcessProgRef> refList =  processProgRefService.list(queryWrapper);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
@@ -33,6 +33,7 @@
     */
    public FlowProgramProperties getProgramProperties(String processInstanceId){
        FlowProgramProperties programProperties = new FlowProgramProperties();
        programProperties.setProcessInstanceId(processInstanceId);
        Map<String, Object> vars = runtimeService.getVariables(processInstanceId);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
@@ -40,4 +40,7 @@
    @Schema(description = "是否有固化程序")
    private String hasCuredProgram;
    @Schema(description = "流程实例id")
    private String processInstanceId;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
@@ -97,7 +97,7 @@
    /**
     * 是否锁定
     */
    //private Integer isLocked;
    private Integer isLocked = 0;
    /**
     * 节点类型:字典
      */
@@ -110,6 +110,18 @@
     * 程序文件节点的数据
     */
    private String processNo;
    /**
     * 产品型号
     */
    private String productModel;
    /**
     * 流程程序文件id,只有程序文件(70)类型的节点有此值
     */
    private Long flowProgramFileId;
    /**
     * 审批时的流程实例id,只有程序包节点有这个字段值
     */
    private String processInstanceId;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
@@ -65,6 +65,7 @@
        node.setProcessNo(programProperties.getProcessNo());
        node.setMachineCode(programProperties.getMachineCode());
        node.setProductModel(programProperties.getProductModel());
        node.setFlowProgramFileId(programFile.getId());
        ncNodeService.save(node);
    }
@@ -90,19 +91,19 @@
        //创建产品型号节点
        //NcNode productModelNode = createProductModelNode(programProperties.getProductModel(), root);
        NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root);
        NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,null);
        //零组件号节点
        NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode);
        NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,null);
        //工艺版次节点
        NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode);
        NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode,null);
        //工序号节
        NcNode processNoNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROCESS_NO, craftEditionNode);
        NcNode processNoNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROCESS_NO, craftEditionNode,null);
        //工序版次节点
        NcNode processEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode);
        NcNode processEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,null);
        //加工机床节点
        NcNode machineCodeNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_MACHINE_CODE, processEditionNode);
        NcNode machineCodeNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_MACHINE_CODE, processEditionNode,null);
        //程序包名节点
        NcNode programPkgNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROGRAM_PACKAGE, machineCodeNode);
        NcNode programPkgNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_PROGRAM_PACKAGE, machineCodeNode,programProperties.getProcessInstanceId());
        return programPkgNode;
        //程序文件节点,多个文件需要循环创建
@@ -129,7 +130,7 @@
     * @param parentNode 父节点
     * @return
     */
    NcNode createNodeIfNotExists(String name,String nodeType,NcNode parentNode){
    NcNode createNodeIfNotExists(String name,String nodeType,NcNode parentNode,String processInstanceId) {
        Optional<NcNode>  nodeOpt = this.ncNodeService.lambdaQuery().eq(NcNode::getName,name).eq(NcNode::getNodeType,nodeType).eq(NcNode::getParentId,parentNode.getId()).oneOpt();
        if(nodeOpt.isPresent()){
            return nodeOpt.get();
@@ -139,6 +140,7 @@
            ncNode.setParentId(parentNode.getId());
            ncNode.setParentIds(parentNode.getParentIds() + "," + parentNode.getId());
            ncNode.setNodeType(nodeType);
            ncNode.setProcessInstanceId(processInstanceId);
            ncNodeService.save(ncNode);
            return ncNode;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -8,6 +8,7 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springblade.core.mp.base.BizEntity;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
@@ -15,7 +16,9 @@
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.ApproveRecordService;
import org.springblade.mdm.flow.service.FlowProgramFileService;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.NcProgramApproved;
@@ -46,7 +49,7 @@
    private final ApproveRecordService approveRecordService;
    private final NcNodeService ncNodeService;
    private final OssTemplate ossTemplate;
    private final FlowProgramFileService flowProgramFileService;
    public static final String PROGRAM_JSON_FILE = "exp_mdm_nc_program.json";
    public static final String NODE_JSON_FILE = "exp_mdm_nc_node.json";
    public static final String APPROVE_RECORD_JSON_FILE = "exp_mdm_approve_record.json";
@@ -81,87 +84,135 @@
        //FileOutputStream fos = new FileOutputStream("d:/exportDnc.zip");
        try (ZipOutputStream zipOut = new ZipOutputStream(os);) {//os
            ArrayList<Long> programIdList = new ArrayList<Long>();
            ArrayList<Long> programPackageNodeIdList = new ArrayList<Long>();
            for (Long approvedId : approvedIdArr) {
                NcProgramApproved approved = approvedService.getById(approvedId);
                //programIdList.add(approved.getNcProgramId());
                programPackageNodeIdList.add(approved.getNodeId());
                //NcProgram prog = progService.getById(approved.getNcProgramId());
                /*
                String filename = prog.getOssName();
                InputStream inputStream = ossTemplate.statFileStream(filename);
                //String filename = prog.getOssName();
                //InputStream inputStream = ossTemplate.statFileStream(filename);
                //addInputStreamToZip(zipOut, inputStream, prog.getName());
                addInputStreamToZip(zipOut, inputStream, prog.getName());
                */
                addProgramPackageToZip(zipOut,approved);
            }
            addDataJson(zipOut, programIdList);
            addDataJson(zipOut, programPackageNodeIdList);
        }
        os.close();
    }
    /**
     * 将程序包和下属文件加入压缩包
     * @param zipOut
     * @param approved
     */
    private void addProgramPackageToZip(ZipOutputStream zipOut, NcProgramApproved approved) throws IOException{
        String packageFolder = approved.getProgramName()+"/";
        ZipEntry zipEntry = new ZipEntry(packageFolder);// "/"结尾表示文件夹
        zipOut.putNextEntry(zipEntry);
        zipOut.closeEntry();
        List<NcNode> programNodes = ncNodeService.lambdaQuery().eq(NcNode::getParentId, approved.getNodeId()).list();
        FlowProgramFile programFile;
        for (NcNode node : programNodes) {
            String filePathInZip = packageFolder + node.getName();
            ZipEntry fileEntry = new ZipEntry(filePathInZip);
            zipOut.putNextEntry(fileEntry);
            programFile = this.flowProgramFileService.getById(node.getFlowProgramFileId());
            InputStream inputStream = ossTemplate.statFileStream(programFile.getOssName());
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) >= 0) {
                zipOut.write(buffer, 0, length);
            }
            zipOut.closeEntry();
        }
    }
    /**
     * 导入数据文件
     * @param zipOut
     */
    void addDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
        addProgramDataJson(zipOut, programIdList);
        addApproveRecordDataJson(zipOut, programIdList);
        addNcNodeDataJson(zipOut, programIdList);
    void addDataJson(ZipOutputStream zipOut, List<Long> programPackageNodeIdList) throws IOException {
        //addProgramDataJson(zipOut, programPackageNodeIdList);
        addNodeDataJson(zipOut, programPackageNodeIdList);
        addApproveRecordDataJson(zipOut, programPackageNodeIdList);
    }
    /**
     * 导入程序记录
     * zip保重加入节点的数据
     * @param zipOut
     * @param programIdList
     * @param pkgNodeIdList
     * @throws IOException
     */
    void addProgramDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
        LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(NcProgram::getId, programIdList);
        List<NcProgram> programList = progService.list(queryWrapper);
    void  addNodeDataJson(ZipOutputStream zipOut,List<Long>  pkgNodeIdList) throws IOException {
        List<NcNode> pkgNodes =  this.ncNodeService.lambdaQuery().in(NcNode::getId, pkgNodeIdList).list();
        List<Long> allNodeIds = new ArrayList<>();
        for(NcNode node : pkgNodes){
            allNodeIds.addAll(Func.toLongList(node.getParentIds()));
            allNodeIds.add(node.getId());
        }
        //加入程序包下级的程序节点
        List<NcNode> programNodes = ncNodeService.lambdaQuery().in(NcNode::getParentId, pkgNodes.stream().map(NcNode::getId)).list();
        allNodeIds.addAll(programNodes.stream().map(NcNode::getId).toList());
        List<Long>  distinctIds = allNodeIds.stream().distinct().toList();
        List<NcNode> allNodes = this.ncNodeService.lambdaQuery().in(NcNode::getId, distinctIds).list();
        JSONArray jsonArray = new JSONArray();
        for(NcProgram program : programList){
            JSONObject recObj = new JSONObject();
            recObj.put("id", program.getId());
            recObj.put("code", program.getCode());
            recObj.put("ossName",program.getOssName());
            recObj.put("isTextFile",program.getIsTextFile());
            recObj.put("isLastEdition",program.getIsLastEdition());
            recObj.put("category",program.getCategory());
            recObj.put("description",program.getDescription());
            recObj.put("name",program.getName());
            recObj.put("drawingNo",program.getDrawingNo());
            recObj.put("ncNodeId",program.getNcNodeId());
            recObj.put("bindNcNodeId",program.getBindNcNodeId());
            recObj.put("url",program.getUrl());
            recObj.put("isCured",program.getIsCured());
            recObj.put("isLocked",program.getIsLocked());
            recObj.put("isTest",program.getIsTest());
            recObj.put("machineCode",program.getMachineCode());
            recObj.put("processEdition",program.getProcessEdition());
            recObj.put("taskAssignTime",program.getTaskAssignTime());
            addSuperProperties(recObj,program);
        for(NcNode node : allNodes){
            JSONObject recObj = getNodeJsonObject(node);
            addSuperProperties(recObj,node);
            jsonArray.add(recObj);
        }
        addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),PROGRAM_JSON_FILE);
    }
    @NotNull
    private static JSONObject getNodeJsonObject(NcNode node) {
        JSONObject recObj = new JSONObject();
        recObj.put("id", node.getId());
        recObj.put("name", node.getName());
        recObj.put("drawingNo", node.getDrawingNo());
        recObj.put("drawingNoEdition", node.getDrawingNoEdition());
        recObj.put("productModel", node.getProductModel());
        recObj.put("processName", node.getProcessName());
        recObj.put("processEdition", node.getProcessEdition());
        recObj.put("craftEdition", node.getCraftEdition());
        recObj.put("parentIds", node.getParentIds());
        recObj.put("processNo", node.getProcessNo());
        recObj.put("isCured", node.getIsCured());
        recObj.put("isLocked", node.getIsLocked());
        recObj.put("nodeType", node.getNodeType());
        recObj.put("machineCode", node.getMachineCode());
        recObj.put("flowProgramFileId", node.getFlowProgramFileId());
        return recObj;
    }
    /**
     * 导入审批记录
     * @param zipOut
     * @param programIdList
     * @param programPackageNodeIdList 程序包名的id列表
     */
    void addApproveRecordDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
        LambdaQueryWrapper<ApproveRecord> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(ApproveRecord::getNcProgramId, programIdList);
        List<ApproveRecord> records = approveRecordService.list(queryWrapper);
    void addApproveRecordDataJson(ZipOutputStream zipOut, List<Long> programPackageNodeIdList) throws IOException {
        List<String> instanceIds = this.ncNodeService.lambdaQuery().in(NcNode::getProcessInstanceId, programPackageNodeIdList)
            .list().stream().map(NcNode::getProcessInstanceId).toList();
        List<ApproveRecord> records = approveRecordService.lambdaQuery().in(ApproveRecord::getProcessInstanceId, instanceIds).list();
        JSONArray jsonArray = new JSONArray();
        for(ApproveRecord record : records){
            JSONObject recObj = new JSONObject();
@@ -181,62 +232,6 @@
        }
        addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json");
    }
    /**
     * 导入节点
     * @param zipOut
     * @param programIdList
     */
    void addNcNodeDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException {
        LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(NcProgram::getId, programIdList);
        List<NcProgram> programs = progService.list(queryWrapper);
        JSONArray jsonArray = new JSONArray();
        ArrayList<Long> exportNodeIdList     = new ArrayList<>();
        for(NcProgram program : programs){
            //JSONObject recObj = new JSONObject();
            if(!exportNodeIdList.contains(program.getBindNcNodeId())){
                exportNodeIdList.add(program.getBindNcNodeId());
            }
            NcNode ncNode = ncNodeService.getById(program.getBindNcNodeId());//从绑定的节点本身开始导出
            if(StringUtils.isNotEmpty(ncNode.getParentIds())){
                List<Long> pids = Func.toLongList(ncNode.getParentIds());
                for(Long nodeId : pids){
                    if(!exportNodeIdList.contains(nodeId)){
                        exportNodeIdList.add(nodeId);
                    }
                }
            }
        }
        LambdaQueryWrapper<NcNode> nodeQueryWrapper = new LambdaQueryWrapper<>();
        nodeQueryWrapper.in(NcNode::getId, exportNodeIdList);
        List<NcNode> nodeList =ncNodeService.list(nodeQueryWrapper);
        for(NcNode node : nodeList){
            JSONObject recObj = new JSONObject();
            recObj.put("id", node.getId());
            recObj.put("nodeType", node.getNodeType());
            recObj.put("machineCode",node.getMachineCode());
            recObj.put("parentId",node.getParentId());
            recObj.put("description",node.getDescription());
            recObj.put("name",node.getName());
            recObj.put("remark",node.getRemark());
            recObj.put("drawingNo",node.getDrawingNo());
            recObj.put("parentIds",node.getParentIds());
            recObj.put("processName",node.getProcessName());
            addSuperProperties(recObj,node);
            jsonArray.add(recObj);
        }
        addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_nc_node.json");
    }
    void addSuperProperties(JSONObject recObj, BizEntity entity){