yangys
2025-06-27 26f07223e1b33a8eb5ee184041575e9b204cfebe
上传程序文件
已修改18个文件
已添加6个文件
698 ■■■■ 文件已修改
blade-service/blade-mdm/pom.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/DispatchFlowService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramQueryVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sql/mdm/mdm.mysql.all.create.sql 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/pom.xml
@@ -70,7 +70,11 @@
            <groupId>org.springblade</groupId>
            <artifactId>blade-flow-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--<dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-transaction</artifactId>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -48,8 +48,6 @@
        if (StringUtil.isNoneBlank(processInstanceId, comment)) {
            taskService.addComment(taskId, processInstanceId, comment);
        }
        // éžç©ºåˆ¤æ–­
        if (Func.isEmpty(variables)) {
            variables = Kv.create();
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -8,7 +8,9 @@
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.flow.excution.AutoAssignUsersService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -32,6 +34,8 @@
    @Autowired
    private NcProgramService ncProgramService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private MachineService machineService;
    /**
     * å›ºåŒ–流程的key
@@ -44,44 +48,16 @@
     */
    public void start(long programId){
        Map<String, Object> vars = new HashMap<>();
        NcProgram prog = ncProgramService.getById(programId);
        Machine machine = machineService.getByCode(prog.getMachineCode());
        //NcProgram prog = ncProgramService.getById(programId);
        NcNode progNode = ncNodeService.getById(programId);
        Machine machine = machineService.getByCode(progNode.getMachineCode());
        vars.put("machineCode",machine.getCode());
        vars.put("machineMode",machine.getName());
        vars.put("processEdition",prog.getProcessEdition());
        vars.put("programId",prog.getProcessEdition());
        vars.put("program",prog);
        vars.put("processEdition",progNode.getProcessEdition());
        vars.put("programId",programId);
        vars.put("program",progNode);
        //vars.put("processNo",startVO.getProcessNo());prog.getProcessEdition()
        //vars.put("processName",startVO.getProcessName());
        /*
        Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO.getProducePlanId());
        Map<String, Object> vars = new HashMap<>(preAssignee);
        vars.put("machineCode",startVO.getMachineCode());
        vars.put("machineMode",startVO.getMachineMode());
        vars.put("processNo",startVO.getProcessNo());
        vars.put("processName",startVO.getProcessName());
        vars.put("processEdition",startVO.getProcessEdition());
        vars.put("craftEdition",startVO.getCraftEdition());
        vars.put("planStartTime",startVO.getPlanStartTime());
        vars.put("drawingNo",startVO.getDrawingNo());
        vars.put("drawingNoEdition",startVO.getDrawingNoEdition());
        vars.put("planLockDays",startVO.getPlanLockDays());
        //零组件代码
        String partNo = generatePartNo(startVO);
        vars.put("partNo",partNo);
        NcProgram curedNcProgram = ncProgramService.getCuredNcProgram(partNo,startVO.getMachineCode());
        vars.put("curedNcProgram",curedNcProgram);
        //设置是否有固化程序标记
        vars.put("hasCuredProgram",curedNcProgram != null ? "Y":"N");
        */
        String businessKey = "0";//业务表key
        identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//设置流程发起人
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/DispatchFlowService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package org.springblade.mdm.flow.service;
import org.flowable.engine.IdentityService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.runtime.ProcessInstance;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.flow.excution.AutoAssignUsersService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.service.NcProgramService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
 * å›ºåŒ–流程服务
 */
@Service
public class DispatchFlowService {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private AutoAssignUsersService autoAssignUsersService;
    @Autowired
    private IdentityService identityService;
    @Autowired
    private NcProgramService ncProgramService;
    @Autowired
    private MachineService machineService;
    /**
     * å›ºåŒ–流程的key
     */
    private static final String PROCESS_KEY = "program-cure";
    /**
     * ç¼–制节点通过前,检查程序是否存在
     * @param processInstanceId æµç¨‹å®žä¾‹id
     */
    public boolean programExists(String processInstanceId) {
        return false;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/ProgramEmptyUpgradeProcessEdtionTask.java
@@ -15,7 +15,7 @@
    private NcProgramService ncProgramService;
    public void execute(DelegateExecution execution) {
        //空升版,新加入一条程序数据,并且将工序版次processEdition设置为用户输入的新版本
        /*
        NcProgram ncProgram =  (NcProgram)execution.getVariable("curedNcProgram");
        //将现有程序设置为非最新的
        ncProgram.setIsLastEdition(0);
@@ -28,5 +28,7 @@
        ncProgramService.save(newNcProgram);
        log.info("空升版完成,新的程序id为{}",newNcProgram.getId());
         */
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcNodeController.java
@@ -1,6 +1,7 @@
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;
@@ -11,7 +12,11 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.basesetting.machine.vo.MachineQueryVO;
import org.springblade.mdm.basesetting.machine.vo.MachineVO;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
import org.springblade.mdm.program.vo.NcNodeProgramVO;
import org.springblade.mdm.program.vo.NcNodeVO;
import org.springframework.web.bind.annotation.*;
@@ -63,4 +68,14 @@
        List<NcNodeVO> list = ncNodeService.lazyList(parentId);
        return R.data(list);
    }
    /**
     * åˆ†é¡µ
     */
    @Operation(summary = "程序分页查询", description = "用于在编制节点选择流程对应的程序")
    @GetMapping("/programpickpage")
    public R<IPage<NcNodeProgramVO>> page(NcNodeProgramQueryVO query) {
        IPage<NcNodeProgramVO> pages = ncNodeService.programPageQuery(query);
        return R.data(pages);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
@@ -7,6 +7,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.service.NcProgramService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -30,9 +31,30 @@
    @Operation(summary = "上传", description = "上传程序/附件文件")
    public R<Boolean> upload(@RequestParam MultipartFile file,Long nodeId,
                             @RequestParam String category) {
        ncProgramService.uploadNcFile(file,nodeId,category);
        ncProgramService.uploadProgramFile(file,nodeId,category);
        return R.<Boolean>status(true);
    }
    @PostMapping("/remove")
    @Operation(summary = "删除程序文件", description = "")
    public R<Boolean> removeFile(Long id) {
        try {
            ncProgramService.removeProgram(id);
            return R.success();
        }catch(Exception e) {
            log.error("删除文件失败",e);
            return R.fail(e.getMessage());
        }
    }
    @GetMapping("/content")
    @Operation(summary = "获取文件内容", description = "仅限文本格式的内容,二进制文件将返回空串")
    public R<String> fileContent(Long id) {
        try {
            return R.data(ncProgramService.getFileContent(id));
        }catch(Exception e) {
            log.error("删除文件失败",e);
            return R.fail(e.getMessage());
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java
@@ -30,18 +30,4 @@
    private final NcProgramService ncProgramService;
    @PostMapping("/export-dnc")
    @Operation(summary = "数控程序导出dnc", description = "数控程序导出到工控网")
    public void exportDnc(Long nodeId, HttpServletResponse response) {
        //return R.<Boolean>status(true);
    }
    /*
    @PostMapping("/import-dnc-file")
    @Operation(summary = "上传工控网回传文件", description = "上传程序/附件文件")
    public R<Boolean> importDncFile(@RequestParam MultipartFile file) {
        ncProgramService.uploadNcPkgFile(file);
        return R.<Boolean>status(true);
    }*/
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package org.springblade.mdm.program.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.mdm.program.service.NcProgramService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * ç¨‹åºæ¶‰å¯†ç½‘-工控网交换接口
 *
 * @author yangys
 */
@NonDS
@RestController
@RequestMapping("/program/exchange")
@AllArgsConstructor
@Tag(name = "导出DNC", description = "涉密网沉痼导出DNC")
@Slf4j
public class NcProgramExportDNCController {
    private final NcProgramService ncProgramService;
    @PostMapping("/export-dnc")
    @Operation(summary = "数控程序导出dnc", description = "数控程序导出到工控网")
    public void exportDnc(Long nodeId, HttpServletResponse response) {
        //return R.<Boolean>status(true);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
@@ -14,6 +14,55 @@
public class NcNode extends BizEntity {
    private String name;
    private Long parentId;
    /**
     * ä¸Šçº§çˆ¶id集合
     */
    private String parentIds;
    /**
     * è®¾å¤‡ç¼–号
     */
    private String machineCode;
    /**
     * å›¾å·
     */
    private String drawingNo;
    /**
     * å›¾å·ç‰ˆæ¬¡
     */
    private String drawingNoEdition;
    /**
     * å·¥åºï¼Œå¦‚“精铣”
     */
    private String processName;
    /**
     * å·¥åºç‰ˆæ¬¡
     */
    private String processEdition;
    /**
     * å·¥è‰ºç‰ˆæ¬¡
     */
    private String craftEdition;
    /**
     * é›¶ç»„件号
     */
    private String partNo;
    /**
     * æ˜¯å¦å›ºåŒ–
     */
    private Integer isCured;
    /**
     * è¿‡æœŸæ—¥æœŸ
     */
    private LocalDate expireDate;
    /**
     * æ˜¯å¦é”å®š
     */
    private Integer isLocked;
    /**
     * èŠ‚ç‚¹ç±»åž‹ï¼šå­—å…¸
      */
@@ -22,4 +71,5 @@
    private String description;
    private String remark;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java
@@ -12,37 +12,69 @@
@Getter
@TableName("mdm_nc_program")
public class NcProgram extends BizEntity {
    /**
     * æ–‡ä»¶å
     */
    private String name;
    /**
     * å¯¹è±¡å­˜å‚¨ä¸­çš„名称
     */
    private String ossName;
    private String code;
    /**
     * æ‰€å±žèŠ‚ç‚¹id,必须未“程序包名"的节点
     */
    private long ncNodeId;
    /**
     * ç¨‹åºåŒ…名
      */
    private String packageName;
    //private String packageName;
    /**
     * æ–‡ä»¶åœ°å€
     */
    private String url;
    /**
     * æ–‡ä»¶ç±»åž‹
     */
    private String category;
    /**
     * æ˜¯å¦ä¸ºæ–‡æœ¬ç±»åž‹
     */
    private Boolean isTextFile;
    /**
     * å·¥åºï¼Œå¦‚“精铣”
     */
    //private String processName;
    /**
     * å¤‡æ³¨
     */
    //private String remark;
    /**
     * è®¾å¤‡ï¼ˆæœºåºŠï¼‰ç¼–码
     */
    private String machineCode;
    //private String machineCode;
    /**
     * é›¶ç»„件号
     */
    private String partNo;
    //private String partNo;
    /**
     * æ˜¯å¦å›ºåŒ–
     */
    private Integer isCured;
    //private Integer isCured;
    /**
     * è¿‡æœŸæ—¥æœŸ
     */
    private LocalDate expireDate;
    //private LocalDate expireDate;
    /**
     * å·¥åºç‰ˆæ¬¡
     */
    private String processEdition;
    //private String processEdition;
    /**
     * æ˜¯å¦æœ€æ–°ç‰ˆæ¬¡ï¼Œ1:最新版次;0:历史版次
     */
    private Integer isLastEdition;
    //private Integer isLastEdition;
    /**
     * æ˜¯å¦é”å®š
     */
@@ -65,4 +97,6 @@
        //
        return taskAssignTime.plusMonths(effectiveMonths).isBefore(LocalDateTime.now());
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.java
@@ -1,9 +1,12 @@
package org.springblade.mdm.program.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.mp.mapper.BladeMapper;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
import org.springblade.mdm.program.vo.NcNodeProgramVO;
import org.springblade.mdm.program.vo.NcNodeVO;
import java.util.List;
@@ -11,11 +14,12 @@
public interface NcNodeMapper extends BladeMapper<NcNode> {
    List<NcNodeVO> lazyList(Long parentId);
    /**
     * èŽ·å–æœ€æ–°å›ºåŒ–ç¨‹åº
     * @param partNo é›¶ç»„件号
     * @param machineGroupCode æœºåºŠç»„代码
     * @return
    IPage<NcNodeProgramVO> programPageQuery(@Param("page")IPage<NcNodeProgramVO> page, @Param("query") NcNodeProgramQueryVO query);
    /**
     * æ ¹æ®åç§°èŽ·å–æœ€æ–°çš„ç¨‹åºåŒ…èŠ‚ç‚¹
     * @param name ç¨‹åºåç§°ï¼ˆç¨‹åºåŒ…名称)
     * @return ç¨‹åºèŠ‚ç‚¹
     */
    //NcProgram getCuredNcProgram(@Param("partNo")String partNo,@Param("machineGroupCode")String machineGroupCode);
    NcNode getLastProgramNode(String name);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml
@@ -45,4 +45,18 @@
        parent_id = n.id and is_deleted = 0
        ) AS "has_children" from mdm_nc_node n where is_deleted=0 and parent_id=#{parentId}
    </select>
    <select id="programPageQuery" resultType="org.springblade.mdm.program.vo.NcNodeProgramVO">
        select id,parent_id,machine_code,drawing_no,drawing_no_edition,part_no,process_name,craft_edition from mdm_nc_node n
        <where>
            <if test="query.name!=null and query.name!=''">
                and n.name like CONCAT('%', #{query.name,jdbcType=VARCHAR},'%')
            </if>
        </where>
    </select>
    <!--获取 æœ€æ–°ç‰ˆæœ¬çš„程序(即程序包名 èŠ‚ç‚¹ node_type=60)-->
    <select id="getLastProgramNode" resultType="org.springblade.mdm.program.entity.NcNode">
        select <include refid="all_columns"/> from mdm_nc_node
        where is_deleted=0 and node_type='60' and is_last_edition=1 order by create_time desc limit 1
    </select>
</mapper>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java
@@ -24,5 +24,5 @@
     * @param name ç¨‹åºåç§°
     * @return nc程序
     */
    NcProgram getLastNcProgram(String name);
    //NcProgram getLastNcProgram(String name);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml
@@ -43,8 +43,10 @@
        order by create_time desc
        limit 1
    </select>
    <!--
    <select id="getLastNcProgram" resultType="org.springblade.mdm.program.entity.NcProgram">
        select <include refid="all_columns"/> from mdm_nc_program
        where is_deleted=0 and is_last_edition=1 order by create_time desc limit 1
    </select>
    -->
</mapper>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java
@@ -1,56 +1,15 @@
/**
 * BladeX Commercial License Agreement
 * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
 * <p>
 * Use of this software is governed by the Commercial License Agreement
 * obtained after purchasing a license from BladeX.
 * <p>
 * 1. This software is for development use only under a valid license
 * from BladeX.
 * <p>
 * 2. Redistribution of this software's source code to any third party
 * without a commercial license is strictly prohibited.
 * <p>
 * 3. Licensees may copyright their own code but cannot use segments
 * from this software for such purposes. Copyright of this software
 * remains with BladeX.
 * <p>
 * Using this software signifies agreement to this License, and the software
 * must not be used for illegal purposes.
 * <p>
 * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
 * not liable for any claims arising from secondary or illegal development.
 * <p>
 * Author: Chill Zhuang (bladejava@qq.com)
 */
package org.springblade.mdm.program.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.flowable.engine.*;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.service.CureFlowService;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
@@ -62,11 +21,7 @@
@Service
@AllArgsConstructor
public class DncSendBackService  {
    //private final RepositoryService repositoryService;
    //private final RuntimeService runtimeService;
    //private final HistoryService historyService;
    //private final ProcessEngine processEngine;
    private final NcNodeService ncNodeService;
    private final NcProgramService ncProgramService;
    private final CureFlowService cureFlowService;
    private final NcProgramExchangeMapper ncProgramExchangeMapper;
@@ -81,16 +36,18 @@
    public void dncFileAccept(String ids) {
        List<Long> idList = Func.toLongList(ids);
        NcProgramExchange exchange;
        NcProgram program;
        //NcProgram program;
        NcNode programNode;
        for (Long id : idList) {
            exchange = ncProgramExchangeMapper.selectById(id);
            exchange.setStatus(2);//已入库状态
            program = ncProgramService.getLastNcProgram(exchange.getName());
            programNode = ncNodeService.getLastProgramNode(exchange.getName());
            //如果是已经固化的则不需要启动流程
            //启动固化流程
            if(program.getIsCured() !=1) {//未固化的程序,启动固化流程
                cureFlowService.start(program.getId());
            if(programNode.getIsCured() !=1) {//未固化的程序,启动固化流程
                cureFlowService.start(programNode.getId());
            }
        }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
@@ -1,12 +1,17 @@
package org.springblade.mdm.program.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.basesetting.machine.vo.MachineVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.mapper.NcNodeMapper;
import org.springblade.mdm.program.vo.NcNodeProgramQueryVO;
import org.springblade.mdm.program.vo.NcNodeProgramVO;
import org.springblade.mdm.program.vo.NcNodeVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@@ -29,10 +34,24 @@
        BeanUtils.copyProperties(vo, ncNode);
        ncNode.setId(null);
        ncNode.setParentIds(buildParentIds(vo.getParentId()));
        this.save(ncNode);
    }
    /**
     * æž„建父id节点
     * @param nodeId èŠ‚ç‚¹id
     * @return
     */
    String buildParentIds(long nodeId){
        if(nodeId == 0L){
            return "0";
        }
        NcNode pNode = this.baseMapper.selectById(nodeId);
        return pNode.getParentIds()+","+pNode.getId();
    }
    /**
     * æ›´æ–°èŠ‚ç‚¹
     * @param vo
@@ -43,6 +62,7 @@
        ncNode.setNodeType(vo.getNodeType());
        ncNode.setDescription(vo.getDescription());
        ncNode.setRemark(vo.getRemark());
        ncNode.setMachineCode(vo.getMachineCode());
        this.updateById(ncNode);
    }
@@ -59,4 +79,23 @@
        return baseMapper.lazyList(parentId);
    }
    /**
     * ç¨‹åºèŠ‚ç‚¹
     * @param query
     * @return
     */
    public IPage<NcNodeProgramVO> programPageQuery(NcNodeProgramQueryVO query) {
        return this.getBaseMapper().programPageQuery(Condition.getPage(query),query);
    }
    /**
     * æŸ¥è¯¢çŽ°æœ‰å›ºåŒ–çš„ç¨‹åºï¼Œæš‚å®šæ¡ä»¶ï¼šé›¶ç»„ä»¶å·ç›¸åŒï¼Œä¸”æ˜¯åŒä¸€æœºåºŠç»„
     *      * @param name ç¨‹åºåç§°
     * @param name
     * @return
     */
    public NcNode getLastProgramNode(String name) {
        return this.getBaseMapper().getLastProgramNode(name);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package org.springblade.mdm.program.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
 * ä¸‹å‘/回传程序统计
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class NcProgramExportDNCService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     * @param query æŸ¥è¯¢å‚æ•°
     * @return
     */
    public IPage<DncSendBackData> dncSendBackPageQuery(Query query) {
        IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query);
        return page;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
@@ -28,18 +28,23 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.flowable.engine.*;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.program.mapper.NcProgramMapper;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.utils.FileContentUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@@ -53,13 +58,9 @@
@AllArgsConstructor
public class NcProgramService  extends BizServiceImpl<NcProgramMapper, NcProgram> {
    private final ObjectMapper objectMapper;
    private final RepositoryService repositoryService;
    private final RuntimeService runtimeService;
    private final HistoryService historyService;
    private final TaskService taskService;
    private final ProcessEngine processEngine;
    private final MachineService machineService;
    private final OssTemplate ossTemplate;
    /**
     * æŸ¥è¯¢çŽ°æœ‰å›ºåŒ–çš„ç¨‹åºï¼Œæš‚å®šæ¡ä»¶ï¼šé›¶ç»„ä»¶å·ç›¸åŒï¼Œä¸”æ˜¯åŒä¸€æœºåºŠç»„
     * @param partNo
@@ -71,21 +72,57 @@
        return this.getBaseMapper().getCuredNcProgram(partNo,machine.getMachineGroupCode());
    }
    /**
     * æŸ¥è¯¢çŽ°æœ‰å›ºåŒ–çš„ç¨‹åºï¼Œæš‚å®šæ¡ä»¶ï¼šé›¶ç»„ä»¶å·ç›¸åŒï¼Œä¸”æ˜¯åŒä¸€æœºåºŠç»„
     * @param name ç¨‹åºåç§°
     * @return
     */
    public NcProgram getLastNcProgram(String name) {
        return this.getBaseMapper().getLastNcProgram(name);
    }
    /**
     * ä¸Šä¼ ç¨‹åºæ–‡ä»¶åˆ°æŒ‡å®šèŠ‚ç‚¹
     * @param file
     * @param nodeId
     * @param category
     * @param category æ–‡ä»¶åˆ†ç±»ï¼ˆç¨‹åºæ–‡ä»¶/其他文件)
     */
    public void uploadNcFile(MultipartFile file, Long nodeId, String category) {
    public void uploadProgramFile(MultipartFile file, Long nodeId, String category) {
        BladeFile bfile = ossTemplate.putFile(file);
        String link = bfile.getLink();
        //保存profame
        NcProgram prog = new NcProgram();
        prog.setName(file.getOriginalFilename());
        prog.setNcNodeId(nodeId);
        prog.setOssName(bfile.getName());
        boolean isTextFile = false;
        try {
            isTextFile = FileContentUtil.isTextFile(file.getInputStream());
        } catch (IOException e) {
            log.warn("判断是否文本文件异常",e);
        }
        prog.setIsTextFile(isTextFile);
        prog.setUrl(link);
        prog.setCategory(category);
        this.save(prog);
    }
    /**
     * åˆ é™¤ä¸€ä¸ªç¨‹åº
     * @param id
     */
    public String getFileContent(Long id) {
        String result  ="";
        NcProgram prog = this.getById(id);
        String fileName = prog.getOssName();
        try (InputStream inputStream = ossTemplate.statFileStream(fileName)) {
            result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return result;
    }
    /**
     * åˆ é™¤ä¸€ä¸ªç¨‹åº
     * @param id
     */
    public void removeProgram(Long id) {
        NcProgram prog = this.getById(id);
        ossTemplate.removeFile(prog.getOssName());
        this.getBaseMapper().deleteById(id);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramQueryVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.springblade.mdm.program.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.core.mp.support.Query;
/**
 * åˆ†é¡µæ‹†çº¿å‘¢
 */
@Schema(description = "机床回传文件查询对象")
@Setter
@Getter
public class NcNodeProgramQueryVO extends Query {
    @Schema(description = "程序名称")
    private String name;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package org.springblade.mdm.program.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.mdm.commons.vo.BaseVO;
@Setter
@Getter
public class NcNodeProgramVO extends BaseVO {
    @Schema(description = "节点名称")
    private String name;
    @Schema(description = "父ID,根节点父id=0")
    private Long parentId;
    @Schema(description = "设备编号")
    private String machineCode;
    @Schema(description = "节点类型,字典(程序节点类型nc_node_type)")
    private String nodeType;
    @Schema(description = "描述")
    private String description;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "图号")
    private String drawingNo;
    @Schema(description = "图号版次")
    private String drawingNoEdition;
    @Schema(description = "工序,如“精铣”")
    private String processName;
    @Schema(description = "工艺版次")
    private String craftEdition;
    @Schema(description = "零组件号")
    private String partNo;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
@@ -12,6 +12,8 @@
    private String name;
    @Schema(description = "父ID,根节点父id=0")
    private Long parentId;
    @Schema(description = "设备编号")
    private String machineCode;
    @Schema(description = "节点类型,字典(程序节点类型nc_node_type)")
    private String nodeType;
    @Schema(description = "是否有子节点")
blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package org.springblade.mdm.utils;
import org.apache.tika.Tika;
import java.io.IOException;
import java.io.InputStream;
public class FileContentUtil {
    /**
     * åˆ¤æ–­æ˜¯å¦æ–‡æœ¬ç±»åž‹
     * @param inputStream
     * @return
     */
    public static boolean isTextFile(InputStream inputStream) {
        Tika tika = new Tika();
        try {
            String mimeType = tika.detect(inputStream);
            //String mimeType = tika.detect(file);
            return mimeType.startsWith("text/")
                || mimeType.equals("application/xml")
                || mimeType.equals("application/json");
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
}
doc/sql/mdm/mdm.mysql.all.create.sql
@@ -65,9 +65,17 @@
   `id` bigint NOT NULL,
   `tenant_id` varchar(6) DEFAULT NULL COMMENT '所属租户',
   `name` varchar(100) NOT NULL COMMENT '节点名称',
   `drawing_no` varchar(40) NULL COMMENT '图号',
   `process_name` varchar(20) NULL COMMENT '工序名称',
   `machine_code` varchar(100) DEFAULT NULL COMMENT '设备编号/机床编号',
   `part_no` varchar(100) NULL COMMENT '零组件编号',
   `is_cured` int DEFAULT NULL COMMENT '是否固化,1是;0否',
   `expire_date` date DEFAULT NULL COMMENT '到期时间,根据有效期时长计算而来',
   `process_edition` varchar(40) DEFAULT NULL COMMENT '工序版次,升版就是变更改该字段,需要保留历史记录',
   `description` varchar(100) NOT NULL COMMENT '描述',
   `remark` varchar(200) NOT NULL COMMENT '备注',
   `parent_id` bigint DEFAULT NULL COMMENT '所属机床组ID',
   `parent_id` bigint DEFAULT NULL COMMENT '上级节点ID',
   `parent_ids` varchar(100) DEFAULT NULL COMMENT '上级节点ID集合,id逗号分隔',
   `node_type` varchar(20) DEFAULT NULL COMMENT '节点类型:业务字典定义',
   `status` int DEFAULT NULL COMMENT '业务状态',
   `create_dept` bigint DEFAULT NULL COMMENT '创建单位',
@@ -79,17 +87,42 @@
   PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='程序节点目录';
/**流程实例与节点关联表,记录创建时机:用户在程序编制节点手动关联*/
DROP TABLE IF EXISTS `mdm_process_node_ref`;
CREATE TABLE `mdm_process_node_ref` (
  `id` bigint NOT NULL,
  `tenant_id` varchar(6) DEFAULT NULL COMMENT '所属租户',
  `nc_node_id` bigint DEFAULT NULL COMMENT '节点id,对应 ç¨‹åºåŒ…名 èŠ‚ç‚¹id',
  `process_instance_id` varchar(100) NOT NULL COMMENT '流程实例id',
  `status` int DEFAULT NULL COMMENT '业务状态',
  `create_dept` bigint DEFAULT NULL COMMENT '创建单位',
  `is_deleted` int DEFAULT NULL,
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `create_user` bigint DEFAULT NULL COMMENT '创建人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `update_user` bigint DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='流程实例与节点关联表';
DROP TABLE IF EXISTS `mdm_nc_program`;
CREATE TABLE `mdm_nc_program` (
  `id` bigint NOT NULL,
  `tenant_id` varchar(6) DEFAULT NULL COMMENT '所属租户',
  `nc_node_id` bigint DEFAULT NULL COMMENT '所属节点id',
  `nc_node_id` bigint DEFAULT NULL COMMENT '所属节点id,应该属于某个数控程序节点',
  `code` varchar(100) NOT NULL COMMENT '程序编号',
  `name` varchar(100) NOT NULL COMMENT '程序名称',
  `package_name` varchar(100) NOT NULL COMMENT '程序包名',
  `oss_name` varchar(100) NULL COMMENT 'oss中的文件名',
  `category` varchar(2) NULL COMMENT '文件分类',
  `drawing_no` varchar(40) NULL COMMENT '图号',
  `process_name` varchar(20) NULL COMMENT '工序名称',
  `remark` varchar(100) NULL COMMENT '备注',
  `is_text_file` int DEFAULT NULL COMMENT '是否文本文件',
  `url` varchar(400) NOT NULL COMMENT '文件地址',
  `machine_code` bigint DEFAULT NULL COMMENT '设备编号/机床编号',
  `part_no` varchar(100) NOT NULL COMMENT '零组件编号',
  `machine_code` varchar(100) DEFAULT NULL COMMENT '设备编号/机床编号',
  `part_no` varchar(100) NULL COMMENT '零组件编号',
  `is_cured` int DEFAULT NULL COMMENT '是否固化,1是;0否',
  `expire_date` date DEFAULT NULL COMMENT '到期时间,根据有效期时长计算而来',
  `process_edition` varchar(40) DEFAULT NULL COMMENT '工序版次,升版就是变更改该字段,需要保留历史记录',
@@ -107,6 +140,25 @@
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='数控程序';
DROP TABLE IF EXISTS `mdm_nc_program_approved`;
CREATE TABLE `mdm_nc_program_approved` (
   `id` bigint NOT NULL,
   `tenant_id` varchar(6) DEFAULT NULL COMMENT '所属租户',
   `program_name` varchar(100) NOT NULL COMMENT '程序名称',
   `program_id` bigint NOT NULL COMMENT '程序id,指向最新的程序记录',
   `status` int DEFAULT NULL COMMENT '业务状态',
   `exchange_type` int DEFAULT NULL COMMENT '交换类型,1:下发;2:固化(dnc回传)',
   `create_dept` bigint DEFAULT NULL COMMENT '创建单位',
   `is_deleted` int DEFAULT NULL,
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
   `create_user` bigint DEFAULT NULL COMMENT '创建人',
   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
   `update_user` bigint DEFAULT NULL COMMENT '更新人',
   PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='数控程序审批表';
DROP TABLE IF EXISTS `mdm_nc_program_exchange`;
CREATE TABLE `mdm_nc_program_exchange` (
  `id` bigint NOT NULL,