yangys
2025-06-23 edd4eb1d5eed4085bbe80cb65116fe585a13c42f
dnc导入完善
已修改7个文件
已添加4个文件
407 ■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramExchange.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramExchangeMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramExchangeMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncSendBackService.java 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sql/mdm/mdm.mysql.all.create.sql 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -4,6 +4,8 @@
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;
@@ -29,13 +31,26 @@
    @Autowired
    private NcProgramService ncProgramService;
    @Autowired
    private MachineService machineService;
    /**
     * å›ºåŒ–流程的key
     */
    private static final String PROCESS_KEY = "program-cure";
    /**
     * å¯åŠ¨å›ºåŒ–æµç¨‹
     * @param programId ç¨‹åºid
     */
    public void start(long programId){
        Map<String, Object> vars = new HashMap<>();
        NcProgram prog = ncProgramService.getById(programId);
        Machine machine = machineService.getByCode(prog.getMachineCode());
        vars.put("machineCode",machine.getCode());
        vars.put("machineMode",machine.getName());
        vars.put("processEdition",prog.getProcessEdition());
        //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);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java
@@ -1,15 +1,20 @@
package org.springblade.mdm.program.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.basesetting.machine.vo.MachineVO;
import org.springblade.mdm.program.service.DncSendBackService;
import org.springblade.mdm.program.service.NcProgramExchangeService;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.program.vo.ProgramExchangeStatQueryVO;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -22,26 +27,40 @@
 */
@NonDS
@RestController
@RequestMapping("/program")
@RequestMapping("/program/dncsendback/")
@AllArgsConstructor
@Tag(name = "DNC回传程序接口", description = "DNC回传程序接口")
@Slf4j
public class DncSendBackController {
    private final DncSendBackService dncSendBackService;
    private final NcProgramExchangeService ncProgramExchangeService;
    /**
     * ä¸Šä¼ DNC回传文件
     *
     * @param file    dnc程序打包文件
     */
    @PostMapping("dnc-sendback-upload")
    @PostMapping("upload")
    @ApiOperationSupport(order = 1)
    @Operation(summary = "上传DNC回传文件", description = "传入文件")
    public R<List<DncSendBackData>> dncSendBackUpload(@RequestParam MultipartFile file) {
        return R.data(dncSendBackService.dncSendBackUpload(file));
    @Operation(summary = "上传DNC回传文件", description = "回传导入")
    public R<Void> dncSendBackUpload(@RequestParam MultipartFile file) {
        try {
            ncProgramExchangeService.dncSendBackUpload(file);
        }catch (Exception e){
            log.error("导入错误",e);
            return R.fail(e.getMessage());
        }
        return R.success();
    }
    @PostMapping("dnc-sendback-accept")
    @Operation(summary = "dnc回传数据分页", description = "dnc回传数据分页")
    @GetMapping("/page")
    public R<IPage<DncSendBackData>> page(Query query) {
        IPage<DncSendBackData> pages = ncProgramExchangeService.dncSendBackPageQuery(query);
        return R.data(pages);
    }
    @PostMapping("accept")
    @ApiOperationSupport(order = 2)
    @Operation(summary = "DNC回传数据入库", description = "入库,同时启动固化流程")
    public R<Void> dncSendBackAccept(@RequestParam String ids) {
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgramExchange.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package org.springblade.mdm.program.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import org.springblade.core.mp.base.BizEntity;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Setter
@Getter
@TableName("mdm_nc_program_exchange")
public class NcProgramExchange extends BizEntity {
    private String name;
    private int exchangeType;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramExchangeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.springblade.mdm.program.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.mapper.BladeMapper;
import org.springblade.core.mp.support.Query;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.vo.DncSendBackData;
import java.util.List;
public interface NcProgramExchangeMapper extends BladeMapper<NcProgramExchange> {
    IPage<DncSendBackData> dncSendBackpageQuery(IPage<Object> page, Query query);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramExchangeMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.mdm.program.mapper.NcProgramExchangeMapper">
    <resultMap id="BaseResultMap" type="org.springblade.mdm.program.entity.NcProgramExchange">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="exchange_type" property="exchangeType"/>
        <result column="status" property="status"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="is_deleted" property="isDeleted"/>
    </resultMap>
    <select id="dncSendBackpageQuery" resultType="org.springblade.mdm.program.vo.DncSendBackData">
        select e.id,e.name
        from mdm_nc_program_exchange e
        where e.is_deleted=0 and e.exchange_type=2
    </select>
</mapper>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java
@@ -18,4 +18,11 @@
     * @return
     */
    NcProgram getCuredNcProgram(@Param("partNo")String partNo,@Param("machineGroupCode")String machineGroupCode);
    /**
     * æ ¹æ®ç¨‹åºåç§°ï¼ŒèŽ·å–æœ€æ–°çš„ç¨‹åºå®žä½“
     * @param name ç¨‹åºåç§°
     * @return nc程序
     */
    NcProgram getLastNcProgram(String name);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml
@@ -43,4 +43,8 @@
        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
@@ -34,8 +34,13 @@
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.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;
@@ -58,81 +63,16 @@
@AllArgsConstructor
public class DncSendBackService  {
    private final RepositoryService repositoryService;
    private final RuntimeService runtimeService;
    private final HistoryService historyService;
    private final ProcessEngine processEngine;
    /**
     * dnc回传文件上传
     * @param file
     * @return
     */
    public List<DncSendBackData> dncSendBackUpload(MultipartFile file) {
        List<DncSendBackData> list=new ArrayList<>();
            try {
                String fileName = file.getOriginalFilename();
                InputStream fileInputStream = file.getInputStream();
                byte[] bytes = FileUtil.copyToByteArray(fileInputStream);
                list = parseDncZipFromByteArray(bytes);
                //TODO è§£æžä¸ºåˆ—表文件
                DncSendBackData dt = new DncSendBackData();
                dt.setId(1L);
                dt.setProgramName("test.nc");
                dt.setProgramNo("001");
                list.add(dt);
            } catch (IOException e) {
                log.error("上传dnc文件失败",e);
            }
        return list;
    }
    public static List<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException {
        //List<DncSendBackData> datas = new ArrayList<>();
        List<DncSendBackData> datas  = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
    //private final RepositoryService repositoryService;
    //private final RuntimeService runtimeService;
    //private final HistoryService historyService;
    //private final ProcessEngine processEngine;
    private final NcProgramService ncProgramService;
    private final CureFlowService cureFlowService;
    private final NcProgramExchangeMapper ncProgramExchangeMapper;
        /*
        try (ByteArrayInputStream bis = new ByteArrayInputStream(zipData);
             ZipArchiveInputStream zis = new ZipArchiveInputStream(bis)) {
            ZipArchiveEntry entry;
            while ((entry = zis.getNextZipEntry()) != null) {
                DncSendBackData prog = new DncSendBackData();
                prog.setProgramName(entry.getName());
                if (!entry.isDirectory()) {
                    System.out.println("文件名: " + entry.getName());
                    System.out.println("大小: " + entry.getSize());
                    // è¯»å–文件内容到字节数组
                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                    IOUtils.copy(zis, outputStream);
                    byte[] fileContent = outputStream.toByteArray();
                    // å¤„理文件内容...
                    System.out.println("内容长度: " + fileContent.length);
                }else{
                    //文件夹,读内部文件,获取文件列表
                    System.out.println("文件夹程序:"+entry.getName());
                    List<String> children = new ArrayList<>();
                    prog.setChildren(children);
                }
                datas.add(prog);
            }
        }*/
        return datas;
    }
    /**
     * å…¥åº“回传文件,并启动固化流程
     * @param ids
@@ -140,43 +80,22 @@
     */
    public void dncFileAccept(String ids) {
        List<Long> idList = Func.toLongList(ids);
        NcProgramExchange exchange;
        NcProgram program;
        for (Long id : idList) {
            exchange = ncProgramExchangeMapper.selectById(id);
            exchange.setStatus(2);//已入库状态
            program = ncProgramService.getLastNcProgram(exchange.getName());
            //如果是已经固化的则不需要启动流程
            //启动固化流程
        }
    }
}
class ZipFileDirectoryScanner {
    public static List<DncSendBackData> getFilesInDirectoryRecursive(byte[] zipData, String dirPath) throws IOException {
        List<DncSendBackData> list = new ArrayList<>();
        if (!dirPath.endsWith("/")) {
            dirPath += "/";
        }
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
             ZipFile zipFile = new ZipFile(channel)) {
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                ZipArchiveEntry entry = entries.nextElement();
                String entryName = entry.getName();
                DncSendBackData d = new DncSendBackData();
                d.setProgramName(entryName);
                if(entry.isDirectory()){
                    d.setHasChildren(true);
                }
                list.add(d);
                //if (entryName.startsWith(dirPath) && !entry.isDirectory()) {
                //    fileList.add(entryName);
                //}
            if(program.getIsCured() !=1) {//未固化的程序,启动固化流程
                cureFlowService.start(program.getId());
            }
        }
        return list;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
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.basesetting.machine.vo.MachineVO;
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 NcProgramExchangeService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
    /**
     * dnc回传文件上传
     * @param file
     * @return
     */
    public void dncSendBackUpload(MultipartFile file) {
        List<DncSendBackData> list=new ArrayList<>();
        try {
            String fileName = file.getOriginalFilename();
            InputStream fileInputStream = file.getInputStream();
            byte[] bytes = FileUtil.copyToByteArray(fileInputStream);
            list = parseDncZipFromByteArray(bytes);
            for(DncSendBackData dncSendBackData:list){
                NcProgramExchange exchange=new NcProgramExchange();
                exchange.setName(dncSendBackData.getProgramName());
                exchange.setStatus(1);//已导入
                this.save(exchange);
            }
        } catch (IOException e) {
            log.error("上传dnc文件失败",e);
        }
    }
    public static List<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException {
        //List<DncSendBackData> datas = new ArrayList<>();
        List<DncSendBackData> datas  = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, "");
        /*
        try (ByteArrayInputStream bis = new ByteArrayInputStream(zipData);
             ZipArchiveInputStream zis = new ZipArchiveInputStream(bis)) {
            ZipArchiveEntry entry;
            while ((entry = zis.getNextZipEntry()) != null) {
                DncSendBackData prog = new DncSendBackData();
                prog.setProgramName(entry.getName());
                if (!entry.isDirectory()) {
                    System.out.println("文件名: " + entry.getName());
                    System.out.println("大小: " + entry.getSize());
                    // è¯»å–文件内容到字节数组
                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                    IOUtils.copy(zis, outputStream);
                    byte[] fileContent = outputStream.toByteArray();
                    // å¤„理文件内容...
                    System.out.println("内容长度: " + fileContent.length);
                }else{
                    //文件夹,读内部文件,获取文件列表
                    System.out.println("文件夹程序:"+entry.getName());
                    List<String> children = new ArrayList<>();
                    prog.setChildren(children);
                }
                datas.add(prog);
            }
        }*/
        return datas;
    }
    /**
     * ç¨‹åºä¸‹å‘统计分页查询
     * @param query æŸ¥è¯¢å‚æ•°
     * @return
     */
    public IPage<DncSendBackData> dncSendBackPageQuery(Query query) {
        IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query);
        return page;
    }
}
class ZipFileDirectoryScanner {
    public static List<DncSendBackData> getFilesInDirectoryRecursive(byte[] zipData, String dirPath) throws IOException {
        List<DncSendBackData> list = new ArrayList<>();
        if (!dirPath.endsWith("/")) {
            dirPath += "/";
        }
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
             ZipFile zipFile = new ZipFile(channel)) {
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                ZipArchiveEntry entry = entries.nextElement();
                String entryName = entry.getName();
                DncSendBackData d = new DncSendBackData();
                d.setProgramName(entryName);
                if(entry.isDirectory()){
                    d.setHasChildren(true);
                }
                list.add(d);
                //if (entryName.startsWith(dirPath) && !entry.isDirectory()) {
                //    fileList.add(entryName);
                //}
            }
        }
        return list;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
@@ -72,6 +72,15 @@
    }
    /**
     * æŸ¥è¯¢çŽ°æœ‰å›ºåŒ–çš„ç¨‹åºï¼Œæš‚å®šæ¡ä»¶ï¼šé›¶ç»„ä»¶å·ç›¸åŒï¼Œä¸”æ˜¯åŒä¸€æœºåºŠç»„
     * @param name ç¨‹åºåç§°
     * @return
     */
    public NcProgram getLastNcProgram(String name) {
        return this.getBaseMapper().getLastNcProgram(name);
    }
    /**
     * ä¸Šä¼ ç¨‹åºæ–‡ä»¶åˆ°æŒ‡å®šèŠ‚ç‚¹
     * @param file
     * @param nodeId
doc/sql/mdm/mdm.mysql.all.create.sql
@@ -76,8 +76,7 @@
   `create_user` bigint DEFAULT NULL COMMENT '创建人',
   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
   `update_user` bigint DEFAULT NULL COMMENT '更新人',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE KEY `uniqueNameIndex` (`parent_id`,`name`,`is_deleted`) USING BTREE
   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`;
@@ -114,7 +113,7 @@
  `tenant_id` varchar(6) DEFAULT NULL COMMENT '所属租户',
  `name` varchar(100) NOT NULL COMMENT '程序名称',
  `status` int DEFAULT NULL COMMENT '业务状态',
  `exchange_type` int DEFAULT NULL COMMENT '交换类型,1:下发;2:固化',
  `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 '创建时间',
@@ -122,7 +121,7 @@
  `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='数控程序下发记录';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='数控程序交换记录';