yangys
2025-09-23 3baca21e0e6563f8379359ef2ba78c224eb4bc80
修复审批表,确认表内容
已添加7个文件
已修改20个文件
505 ■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/replace/ReplaceFinishListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/entity/MachineBackTask.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/mapper/MachineBackTaskMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/mapper/MachineBackTaskMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/service/MachineBackTaskService.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/vo/MachineBackTaskQueryVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/vo/MachineBackTaskVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileSendRecordController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileSendRecord.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/ReceiveFileCheckService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeHisService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/ApproveTableService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/ConfirmTablePrintService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MesSyncTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
@@ -7,8 +7,8 @@
    /**
     * ç¨‹åºæ–‡ä»¶å æ­£åˆ™
     */
    public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9a-zA-Z]+)-([\\u4e00-\\u9fa5a-zA-Z0-9]+)-(\\d+)-(\\d+)-?([Pp]\\d+)?(\\.[a-zA-Z]+)?$");
    public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\u4e00-\\u9fa5\\w\\-]+)-([0-9a-zA-Z]+)-([\\u4e00-\\u9fa5a-zA-Z0-9]+)-(\\d+)-(\\d+)-?([Pp]\\d+)?(\\.[a-zA-Z]+)?$");
    //public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("[\\w\\-]+\\-\\w+\\-\\w+");
    public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("([\\w\\-]+)-[0-9a-zA-Z]+-[0-9a-zA-Z]+");
    public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("([\\u4e00-\\u9fa5\\w\\-]+)-[0-9a-zA-Z]+-[\\u4e00-\\u9fa5a-zA-Z0-9]+");
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java
@@ -19,7 +19,7 @@
import java.util.List;
/**
 * åç¦»å•固化完成数据处理器,功能:梳理树节点
 * ä¸´æ—¶æ›´æ”¹å•固化完成数据处理器,功能:梳理树节点
 */
@Slf4j
@Component("deviationCureFinishDataHandler")
@@ -31,13 +31,13 @@
    private NcNodeService nodeService;
    /**
     * cureFinishOperateTask调用,偏离单回传审批完成处理业务
     * cureFinishOperateTask调用,临时更改单回传审批完成处理业务
     * @param props å±žæ€§
     */
    public void handleData(FlowProgramProperties props) {
        // æ‰§è¡Œä¸šåŠ¡é€»è¾‘
        NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId,  props.getProcessInstanceId()).one();
        pkgNode.lock("偏离单回传锁定");
        pkgNode.lock("临时更改单回传锁定");
        pkgNode.setIsLastEdition(0);
        nodeService.updateById(pkgNode);
@@ -53,7 +53,7 @@
        addNewProgramNode(newPkgNode,props.getProcessInstanceId());
        log.info("偏离回传Listener完成");
        log.info("临时更改单回传Listener完成");
    }
    /**
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -240,8 +240,6 @@
            cureNode.upgradeVersionNumber();
        }
        //nodeService.save(cureNode);
        return cureNode;
    }
    /**
@@ -256,13 +254,12 @@
            byte[] bytes = IOUtils.toByteArray(ins);
            ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(bytes);
            //InputStream finishedStream = programAnnotationService.setGHAnnotation(byteInputStream,controlSystem,annoDicts);
            List<DictBiz> annoDictList = programAnnotationService.getAnnotionDictList();
            AnnotationProperties annoProps = config.getConfigMap().get(controlSystem);
            if(annoProps == null){
                annoProps = AnnotationProperties.getDefault();
            }
            InputStream finishedStream =AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, "GH", annoProps.getStatusLineIndex(), controlSystem, annoDictList);
            InputStream finishedStream =AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, AnnotationUtil.GH, annoProps.getStatusLineIndex(), controlSystem, annoDictList);
            try(finishedStream) {
                finishedStream.reset();
                BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -16,6 +16,7 @@
import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.service.NcNodeAutoCreateService;
import org.springblade.mdm.program.service.NcNodeHisService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.programannotation.*;
import org.springblade.mdm.utils.ProgramFileNameParser;
@@ -48,6 +49,8 @@
    private ListenerHelper listenerHelper;
    @Autowired
    private OssTemplate ossTemplate;
    @Autowired
    private NcNodeHisService ncNodeHisService;
    /**
     * DispatchFinishListener中调用
@@ -66,20 +69,23 @@
                ncNodeService.updateById(packageNode);
                //版本号根据零组件号+工序号,工序版次,机床组 ç›´æŽ¥æŸ¥è¯¢æ•°é‡ï¼Œ+1获取
                Integer newVersion = ncNodeService.calculateVersionNumber(packageNode);
                packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,newVersion);
                Integer newVersion = ncNodeHisService.calculateVersionNumber(packageNode);
                packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props);
                packageNode.setVersionNumber(newVersion);
                ncNodeService.updateById(packageNode);
            }else{
                //可用,空升版(修改其工序版次),原来的节点清除
                moveToNewProcessEdition(packageNode,props);
                //更新已固化的,同名、不同机床组的程序为锁定状态
                ncNodeService.lockSameNameOtherMachineGroupProgramPackage(packageNode);
            }
        }else{
            //普通试切
            packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,1);
            //普通试切/临时更改单
            packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props);
            Integer newVersion = ncNodeHisService.calculateVersionNumber(packageNode);
            long hisSerial = ncNodeService.calculateHistorySerial(packageNode);
            packageNode.setHisSerial(hisSerial);
            packageNode.setVersionNumber(newVersion);
            ncNodeService.updateById(packageNode);
        }
@@ -111,7 +117,6 @@
        this.ncNodeService.updateById(packageNode);
        Machine machine = machineService.getByCode(packageNode.getMachineCode());
        //移动程序节点
        //List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
        List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
        for(NcNode programNode : programNodes){
            FlowProgramFile progFile = this.flowProgramFileService.getById(programNode.getFlowProgramFileId());
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/replace/ReplaceFinishListener.java
@@ -95,7 +95,7 @@
        newPackageNode.setIsLocked(0);
        newPackageNode.setIsLastEdition(1);
        Integer newVersion = ncNodeService.calculateVersionNumber(oldPackageNode);
        Integer newVersion = nodeHisService.calculateVersionNumber(oldPackageNode);
        newPackageNode.setVersionNumber(newVersion);
        newPackageNode.setProcessInstanceId(processInstanceId);
        ncNodeService.save(newPackageNode);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -92,8 +92,8 @@
        if(programPackage.getDeviation() != null) {
            vars.put(FlowVariableConstant.MY_PROCESS_NAME, "偏离回传");
            vars.put(FlowVariableConstant.TITLE,programPackage.getName()+"-偏离回传");//自动增加标题
            vars.put(FlowVariableConstant.MY_PROCESS_NAME, "临时更改单回传");
            vars.put(FlowVariableConstant.TITLE,programPackage.getName()+"-临时更改单回传");//自动增加标题
        }else {
            vars.put(FlowVariableConstant.MY_PROCESS_NAME, "固化流程");
            vars.put(FlowVariableConstant.TITLE,programPackage.getName()+"-"+programPackage.getProcessEdition()+"-固化");//自动增加标题
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
@@ -219,6 +219,9 @@
        vars.put(FlowConstant.NODE_ID, programPackageNode.getId());
        vars.put(FlowVariableConstant.WORKSHOP,nodeDeptQueryService.getWorkshopNameByMachineCode(programPackageNode.getMachineCode()));
        if(programPackageNode.isDeviationProgram()) {
            vars.put(FlowVariableConstant.DEVIATION, programPackageNode.getDeviation());
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/controller/MachineBackTaskController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package org.springblade.mdm.gkw.task.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.commons.service.OssFileCommonService;
import org.springblade.mdm.gkw.task.service.MachineBackTaskService;
import org.springblade.mdm.gkw.task.vo.MachineBackTaskQueryVO;
import org.springblade.mdm.gkw.task.vo.MachineBackTaskVO;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
import org.springblade.mdm.machinefile.service.FileSendRecordService;
import org.springblade.mdm.machinefile.vo.FileSendRecordExcelVO;
import org.springblade.mdm.machinefile.vo.FileSendRecordQueryVO;
import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
 * æœºåºŠå›žä¼ ä»»åŠ¡
 *
 * @author yangys
 */
@NonDS
@RestController
@RequestMapping("/gkw/machinebacktask")
@Tag(name = "机床回传任务", description = "机床回传任务")
@Slf4j
public class MachineBackTaskController {
    @Autowired
    private MachineBackTaskService machineBackTaskService;
    @GetMapping("/page")
    @Operation(summary = "机床回传任务列表", description = "机床回传任务列表")
    public R<IPage<MachineBackTaskVO>> page(MachineBackTaskQueryVO query) {
        if(query.getCreateTimeEnd()!=null){
            query.setCreateTimeEnd(query.getCreateTimeEnd().plusDays(1));
        }
        return R.data(machineBackTaskService.pageQuery(query));
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/entity/MachineBackTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package org.springblade.mdm.gkw.task.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.io.FileUtils;
import org.springblade.core.mp.base.BizEntity;
import java.util.Date;
/**
 * æœºåºŠå›žä¼ ä»»åŠ¡
 */
@Setter
@Getter
@TableName("mdm_machine_back_task")
public class MachineBackTask extends BizEntity {
    /**
     * ä»»åŠ¡ç±»åž‹ï¼šå·¥è‰ºç¼–åˆ¶ä»»åŠ¡
     */
    private static final long TASK_TYPE_PROGRAM = 1;
    /**
     * ä»»åŠ¡ç±»åž‹ï¼šçŽ°åœºç¼–åˆ¶ä»»åŠ¡
     */
    private static final long TASK_TYPE_ON_MACHINE = 2;
    /**
     * æ–‡ä»¶å
     */
    private String programName;
    /**
     * æ‰€å±žæœºåºŠ
     */
    private String machineCode;
    /**
     * ä¸´æ—¶æ›´æ”¹å•
     */
    private String deviation;
    /**
     * ä»»åŠ¡ç±»åž‹
     */
    private String taskType;
    private Date finishTime;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/mapper/MachineBackTaskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package org.springblade.mdm.gkw.task.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.gkw.task.entity.MachineBackTask;
import org.springblade.mdm.gkw.task.vo.MachineBackTaskQueryVO;
import org.springblade.mdm.gkw.task.vo.MachineBackTaskVO;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
import org.springblade.mdm.machinefile.vo.FileSendRecordQueryVO;
import org.springblade.mdm.machinefile.vo.FileSendRecordVO;
public interface MachineBackTaskMapper extends BladeMapper<MachineBackTask> {
    /**
     * æ–‡ä»¶ä¸‹å‘记录分页查询
     * @param page åˆ†é¡µä¿¡æ¯
     * @param query æŸ¥è¯¢å‚æ•°
     * @return åˆ†é¡µæ•°æ®
     */
    IPage<MachineBackTaskVO> pageQuery(IPage<MachineBackTaskVO> page, @Param("query") MachineBackTaskQueryVO query);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/mapper/MachineBackTaskMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
<?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.gkw.task.mapper.MachineBackTaskMapper">
    <!--文件记录查询-->
    <select id="pageQuery" resultType="org.springblade.mdm.gkw.task.vo.MachineBackTaskVO">
        select t.id,t.program_name,t.machine_code,t.task_type,t.finish_time,t.create_time,t.status,t.update_time,u.name create_user_name
        from mdm_machine_back_task t left join blade_user u on t.create_user=u.id
        <where>
            t.is_deleted=0
            <if test="query.status!=null and query.status!=''">
                and t.status = #{query.status}
            </if>
            <if test="query.programName!=null and query.programName!=''">
                <bind name="pname" value="'%'+query.programName+'%'"/>
                and t.program_name like #{pname}
            </if>
            <if test="query.machineCode!=null and query.machineCode!=''">
                <bind name="machineCode" value="'%'+query.machineCode+'%'"/>
                and t.machine_code like #{machineCode}
            </if>
            <if test="query.createTimeBegin!=null">
                and t.create_time &gt;=#{query.createTimeBegin}
            </if>
            <if test="query.createTimeEnd!=null">
                and t.create_time &lt;=#{query.createTimeEnd}
            </if>
        </where>
        order by t.create_time desc
    </select>
</mapper>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/service/MachineBackTaskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package org.springblade.mdm.gkw.task.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.mdm.gkw.task.entity.MachineBackTask;
import org.springblade.mdm.gkw.task.mapper.MachineBackTaskMapper;
import org.springblade.mdm.gkw.task.vo.MachineBackTaskQueryVO;
import org.springblade.mdm.gkw.task.vo.MachineBackTaskVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * æœºåºŠæ–‡ä»¶
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class MachineBackTaskService extends BizServiceImpl<MachineBackTaskMapper, MachineBackTask> {
    @Transactional(readOnly = true)
    public IPage<MachineBackTaskVO> pageQuery(MachineBackTaskQueryVO query) {
        return baseMapper.pageQuery(Condition.getPage(query),query);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/vo/MachineBackTaskQueryVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package org.springblade.mdm.gkw.task.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.core.mp.support.Query;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
@Schema(description = "击穿回传任务查询对象")
@Setter
@Getter
public class MachineBackTaskQueryVO extends Query {
    @Schema(description = "文件名称")
    private String programName;
    @Schema(description = "机床编码")
    private String machineCode;
    @Schema(description = "创建时间开始")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate createTimeBegin;
    @Schema(description = "创建时间截止")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate createTimeEnd;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/task/vo/MachineBackTaskVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.springblade.mdm.gkw.task.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.mdm.commons.vo.BaseVO;
@Schema(description = "文件下发记录VO")
@Setter
@Getter
public class MachineBackTaskVO extends BaseVO {
    @Schema(description = "程序名称")
    private String programName;
    @Schema(description = "机床编号")
    private String machineCode;
    @Schema(description = "任务类型")
    private int taskType;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/controller/FileSendRecordController.java
@@ -72,7 +72,6 @@
        query.setCurrent(1);
        query.setSize(Integer.MAX_VALUE);
        //IPage<MachineBackFileVO> pages = service.pageQuery(query);
        IPage<FileSendRecordVO> pages = fileSendRecordService.pageQuery(query);
        List<FileSendRecordExcelVO> list = new ArrayList<>();
        pages.getRecords().forEach(m ->{
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/entity/FileSendRecord.java
@@ -35,6 +35,11 @@
     * å¯¹è±¡å­˜å‚¨æ–‡ä»¶åï¼Œå¤‡æŸ¥
     */
    private String ossName;
    /**
     * ç¨‹åºçŠ¶æ€
     */
    private String programStatus;
    /**
     * ç”Ÿæˆæ–‡ä»¶å¤§å°çš„æ˜¾ç¤ºæ–‡æœ¬
     * @return æ˜¾ç¤ºæ–‡æœ¬
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/ReceiveFileCheckService.java
@@ -66,7 +66,6 @@
            return;
        }
        AnnotationProperties annoProps = AnnotationProperties.getDefault();
        try(InputStream fileIns = Files.newInputStream(checkFilePath);) {
            int excepType = MachineFile.EXCEPTION_OK;
            ByteArrayInputStream byteStream = new ByteArrayInputStream(IOUtils.toByteArray(fileIns));
@@ -88,11 +87,18 @@
                    }else{
                        //检查是否匹配下发记录的段数
                        //正负3秒作为查询时间
                        Date beginTime = new Date(machineFile.getFileCreateTime().getTime()-3000);
                        Date endTime = new Date(machineFile.getFileCreateTime().getTime()+3000);
                        //Date beginTime = new Date(machineFile.getFileCreateTime().getTime()-3000);
                        //Date endTime = new Date(machineFile.getFileCreateTime().getTime()+3000);
                        String likeStr;
                        if(StringUtils.isNotBlank(progNameVO.getLgPart())){
                            likeStr = prefix +"%P%";
                        }else{
                            likeStr = prefix;
                        }
                        Optional<FileSendRecord> optFile = fileSendRecordService.lambdaQuery()
                            .eq(FileSendRecord::getMachineCode,machineFile.getMachineCode())
                            .likeRight(FileSendRecord::getName,prefix).between(FileSendRecord::getCreateTime,beginTime,endTime).oneOpt();
                            .likeRight(FileSendRecord::getName,likeStr).last("limit 1")
                            .orderByDesc(FileSendRecord::getCreateTime).oneOpt();
                        boolean matchSendRecord;//文件是否有下发记录
                        if(optFile.isPresent()){
@@ -112,7 +118,8 @@
                        if(!matchSendRecord){//如果文件未下发过,查看是否有现场编程记录
                            byteStream.reset();
                            //TODO ä¸‹é¢è¿™äº›åº”该都没有,因为时现场编程
                            /*
                            String planStatusLine = AnnotationUtil.removeAnnotation(machine.getControlSystem(),FileContentUtil.readLineAt(byteStream,annoProps.getStatusLineIndex()),programAnnotationService.getAnnotionDictList());
                            String lgNo;//更改单号
@@ -121,14 +128,17 @@
                                lgNo = AnnotationUtil.removeAnnotation(machine.getControlSystem(), lgLine, programAnnotationService.getAnnotionDictList());
                            }else{
                                lgNo = null;
                            }
                            }*/
                            String devSerial = null;
                            if(StringUtils.isNotBlank(progNameVO.getLgPart())){
                                devSerial = progNameVO.getLgPart().substring(1);
                            }
                            long progOnMachineCount = programOnMachineService.lambdaQuery()
                                .eq(ProgramOnMachine::getDrawingNo,progNameVO.getDrawingNo())
                                .eq(ProgramOnMachine::getProcessNo,progNameVO.getProcessNo())
                                .eq(ProgramOnMachine::getProcessEdition,progNameVO.getProcessEdition())
                                .eq(lgNo != null,ProgramOnMachine::getDeviation,lgNo)//TODO ä¸´æ—¶æ›´æ”¹å•序号匹配
                                .eq(devSerial != null,ProgramOnMachine::getDeviationSerial,devSerial)
                                .eq(ProgramOnMachine::getMachineCode,machineFile.getMachineCode()).count();
                            if(progOnMachineCount == 0){//无现场编程记录
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -359,6 +359,7 @@
     */
    public void mdmFileAccept(String ids) throws IOException {
        List<FileSendRecord>  importedRecords = new ArrayList<>();
        List<String> idList = Func.toStrList(ids);
        String dictStr = bladeRedis.get(getFileKey());
@@ -394,6 +395,8 @@
                record.setOssName(bFile.getName());
            }
            fileSendRecordService.save(record);
            importedRecords.add(record);
        }
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeAutoCreateService.java
@@ -80,63 +80,21 @@
        //加工机床节点
        return createNodeIfNotExists(programProperties.getMachineGroupCode(),NcNode.TYPE_MACHINE_GROUP, processEditionNode,programProperties,null);
    }
    /*
    @Transactional
    public NcNode createNodeTreeToProcessEdition(FlowProgramProperties programProperties) {
        NcNode root;
        if(programProperties.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY)){
            if(Func.isEmpty(programProperties.getDeviation()) ||
                (FlowContants.Y.equals(programProperties.getHasCuredProgram()) &&  FlowContants.N.equals(programProperties.getCureProgramUseable()))){
                //普通试切,或者有固化不可用,建立试切节点
                //试切根节点
                root = rootNodeByName(TRY_NAME);
                if (root == null) {
                    root = createTryNode();
                }
            }else{
                //有偏离
                root = rootNodeByName(DEVIATION_NAME);
                if(root == null){
                    root = createDeviationNode();
                }
            }
        }else if(programProperties.getProcessDefinitionKey().equals(FlowContants.CURE_PROCESS_KEY)){
            root = rootNodeByName(CURE_NAME);
            if(root == null){
                root = createCureNode();
            }
        }else{
            throw new ServiceException("流程定义不在范围内");
        }
        //创建产品型号节点
        NcNode productModelNode = createNodeIfNotExists(programProperties.getProductModel(),NcNode.TYPE_PRODUCT_MODEL, root,programProperties,null);
        //零组件号节点
        NcNode drawingNoNode = createNodeIfNotExists(programProperties.getDrawingNo(),NcNode.TYPE_DRAWING_NO, productModelNode,programProperties,null);
        //工艺版次节点
        //NcNode craftEditionNode = createNodeIfNotExists(programProperties.getCraftEdition(),NcNode.TYPE_CRAFT_EDITION, drawingNoNode,programProperties);
        //工序号节
        NcNode processNoNode = createNodeIfNotExists(programProperties.getProcessNo(),NcNode.TYPE_PROCESS_NO, drawingNoNode,programProperties,null);
        //工序版次节点
        NcNode processEditionNode = createNodeIfNotExists(programProperties.getProcessEdition(),NcNode.TYPE_PROCESS_EDITION, processNoNode,programProperties,null);
        //加工机床节点
        return createNodeIfNotExists(programProperties.getMachineCode(),NcNode.TYPE_MACHINE_CODE, processEditionNode,programProperties,null);
    }
    */
    /**
     * æ ¹æ®æµç¨‹ä¿¡æ¯ï¼Œè‡ªåŠ¨åˆ›å»ºå„ä¸ªèŠ‚ç‚¹,包括程序节点
     * @param programProperties ç¨‹åºå±žæ€§
     * @return ç¨‹åºåŒ…节点实例
     */
    @Transactional
    public NcNode createNodeTreeWithProgram(FlowProgramProperties programProperties,Integer versionNumber) {
        //,int rootNodeCatgory = 1:试切,2固化,3偏离
        NcNode programPkdNode = createTreeToPackage(programProperties,versionNumber);
    public NcNode createNodeTreeWithProgram(FlowProgramProperties programProperties) {
        NcNode programPkdNode = createTreeToPackage(programProperties);
        //删除之前创建过的程序文件节点(因为重复在编制节点审批),避免重复数据
        ncNodeService.deleteSubNodes(programPkdNode.getId());
        //ncNodeService.deleteSubNodes(programPkdNode.getId());//del 0923 18:07
        List<FlowProgramFile> programFiles = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, programProperties.getProcessInstanceId()).list();
        List<FlowProgramFile> programFiles = flowProgramFileService.listByProcessInstanceId(programProperties.getProcessInstanceId());
        for (FlowProgramFile programFile : programFiles) {
            createProgramFileNode(programFile, programPkdNode,versionNumber);//所有文件包括程序和其他,都需要建立节点
            createProgramFileNode(programFile, programPkdNode);//所有文件包括程序和其他,都需要建立节点
        }
        return programPkdNode;
@@ -148,7 +106,7 @@
     * @param programPkdNode ç¨‹åºåŒ…名 èŠ‚ç‚¹ï¼Œç¨‹åºèŠ‚ç‚¹çš„ ä¸Šçº§
     * @param versionNumber ç‰ˆæœ¬å·
     */
    private void createProgramFileNode(FlowProgramFile programFile, NcNode programPkdNode, Integer versionNumber) {
    private void createProgramFileNode(FlowProgramFile programFile, NcNode programPkdNode) {
        //此处应避免重复创建
        NcNode node = new NcNode();
@@ -161,11 +119,7 @@
        node.setIsLastEdition(1);
        node.setFlowProgramFileId(programFile.getId());
        if(versionNumber == null){
            node.setVersionNumber(1);
        }else {
            node.setVersionNumber(versionNumber);
        }
        node.setParentId(programPkdNode.getId());
        node.setParentIds(programPkdNode.getParentIds()+","+programPkdNode.getId());
@@ -179,26 +133,50 @@
     * @return ç¨‹åºåŒ…名节点(最末级)
     */
    @Transactional
    public NcNode createTreeToPackage(FlowProgramProperties programProperties,Integer versionNumber) {
    public NcNode createTreeToPackage(FlowProgramProperties programProperties) {
        NcNode machineGroupNode = createNodeTreeToMachineGroup(programProperties);
        //NcNode processEditionNode = this.ncNodeService.getById(machineCodeNode.getParentId());
        //获取工序版次下其他机床名,存在则删除
        /*
        ncNodeService.lambdaUpdate().eq(NcNode::getNodeType,NcNode.TYPE_MACHINE_GROUP)
            .eq(NcNode::getParentId,processEditionNode.getId()).eq(NcNode::getIsLastEdition,1)
            .ne(NcNode::getName,machineCodeNode.getName()).remove();
         */
        //保持加工机床是最新下发任务的机床,不是新建一个机床节点,插叙工序版次下是否有其他的机床(零件号一致,工序号,工序版次一致)
        //获取
        //程序包名在机床组下级 20250913
        String programPkgName = NcNodeService.genProgramName(programProperties.getDrawingNo(),programProperties.getProcessNo(),programProperties.getProcessEdition());
        return createNodeIfNotExists(programPkgName ,NcNode.TYPE_PROGRAM_PACKAGE, machineGroupNode,programProperties,versionNumber);
        return createProgramPackageNode(programProperties,machineGroupNode);
        //return createNodeIfNotExists(programPkgName ,NcNode.TYPE_PROGRAM_PACKAGE, machineGroupNode,programProperties,versionNumber);
    }
    /**
     * åˆ›å»ºç¨‹åºåŒ…名节点
     * @param programProperties
     * @param parentNode
     * @return
     */
    NcNode createProgramPackageNode(FlowProgramProperties programProperties,NcNode parentNode){
        NcNode node = new NcNode();
        node.setNodeType(NcNode.TYPE_PROGRAM_PACKAGE);
        node.setName(NcNodeService.genProgramName(programProperties.getDrawingNo(),programProperties.getProcessNo(),programProperties.getProcessEdition()));
        node.setProcessInstanceId(programProperties.getProcessInstanceId());
        node.setDrawingNo(programProperties.getDrawingNo());
        node.setDrawingNoEdition(programProperties.getDrawingNoEdition());
        node.setCraftEdition(programProperties.getCraftEdition());
        node.setProcessNo(programProperties.getProcessNo());
        node.setProcessEdition(programProperties.getProcessEdition());
        node.setProcessName(programProperties.getProcessName());
        node.setMachineCode(programProperties.getMachineCode());
        node.setMachineGroupCode(programProperties.getMachineGroupCode());
        node.setProductModel(programProperties.getProductModel());
        node.setDeviation(programProperties.getDeviation());
        node.setProgramNo(programProperties.getProgramNo());
        //node.setVersionNumber(versionNumber);
        node.setParentId(parentNode.getId());
        node.setParentIds(parentNode.subNodeParentIds());
        ncNodeService.save(node);
        return node;
    }
    /**
     * ä¸å­˜åœ¨åˆ™åˆ›å»ºèŠ‚ç‚¹
     * @param name èŠ‚ç‚¹åç§°
     * @param nodeType èŠ‚ç‚¹ç±»åž‹
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeHisService.java
@@ -54,7 +54,23 @@
        ncNodeService.deleteOldEditionNodeData();
    }
    /**
     * è®¡ç®—版本号
     * @param pkgNode èŠ‚ç‚¹
     * @return ç‰ˆæœ¬å·
     */
    public int calculateVersionNumber(NcNode pkgNode) {
        NcNodeHis nodeHis = this.lambdaQuery().eq(NcNodeHis::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE).eq(NcNodeHis::getDrawingNo,pkgNode.getDrawingNo())
            .eq(NcNodeHis::getProcessNo,pkgNode.getProcessNo()).eq(NcNodeHis::getProcessEdition,pkgNode.getProcessEdition())
            .eq(NcNodeHis::getMachineGroupCode,pkgNode.getMachineGroupCode()).last("limit 1").one();
        if(nodeHis != null && nodeHis.getVersionNumber()!=null){
            return nodeHis.getVersionNumber()+1;
        }else{
            //以往没有,生成一个新的
            return 1;
        }
    }
    /**
     * æŸ¥è¯¢èŠ‚ç‚¹çš„åŽ†å²åˆ—è¡¨ï¼ˆèŠ‚ç‚¹çš„ä¸Šçº§èŠ‚ç‚¹â€ç¨‹åºåŒ…åâ€œå› ä¸ºå­˜åœ¨å¤šä¸ªç‰ˆæœ¬ï¼Œæ‰€ä»¥åŽ†å²è®°å½•ä¹Ÿéœ€è¦æ ¹æ®ä¸åŒç‰ˆæœ¬ç¨‹åºåŒ…åè¿›è¡ŒæŸ¥è¯¢ï¼‰
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
@@ -253,18 +253,7 @@
        }
    }
    public int calculateVersionNumber(NcNode pkgNode) {
        NcNode node = this.lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE).eq(NcNode::getDrawingNo,pkgNode.getDrawingNo())
            .eq(NcNode::getProcessNo,pkgNode.getProcessNo()).eq(NcNode::getProcessEdition,pkgNode.getProcessEdition())
            .eq(NcNode::getMachineGroupCode,pkgNode.getMachineGroupCode()).last("limit 1").one();
        if(node != null && node.getVersionNumber()!=null){
            return node.getVersionNumber()+1;
        }else{
            //以往没有,生成一个新的
            return 1;
        }
    }
    /**
     * ç”Ÿæˆç¨‹åºåŒ…名/程序名称
     * @param drawingNo é›¶ç»„件号
@@ -326,12 +315,13 @@
     */
    public NcNode getLastCuredProgramWithoutProcessEdition(String drawingNo, String processNo, String machineCode) {
        Machine machine = machineService.getByCode(machineCode);
        List<Machine> sameGroupMachines = machineService.lambdaQuery().eq(Machine::getMachineGroupCode,machine.getMachineGroupCode()).list();
        List<String> machineCodesInGroup = sameGroupMachines.stream().map(Machine::getCode).toList();
        //List<Machine> sameGroupMachines = machineService.lambdaQuery().eq(Machine::getMachineGroupCode,machine.getMachineGroupCode()).list();
        //List<String> machineCodesInGroup = sameGroupMachines.stream().map(Machine::getCode).toList();
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getDrawingNo, drawingNo).eq(NcNode::getProcessNo, processNo)
            .likeRight(NcNode::getParentIds,"0,2,").eq(NcNode::getIsCured,1)
            .in(!machineCodesInGroup.isEmpty(),NcNode::getMachineCode,machineCodesInGroup)
            .eq(NcNode::getMachineGroupCode,machine.getMachineGroupCode())
            //.in(!machineCodesInGroup.isEmpty(),NcNode::getMachineCode,machineCodesInGroup)
            .eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list();
        if(nodes.isEmpty()){
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -103,6 +103,7 @@
        Machine machine = machineService.getByCode(packageNodeHis.getMachineCode());//程序包节点,获取注释用
        //需要增加版本号的过滤
        List<NcNodeHis> programNodes = ncNodeHisService.lambdaQuery().eq(NcNodeHis::getParentId, approved.getNcNodeId()).list();
        FlowProgramFile programFile;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/ApproveTableService.java
@@ -100,7 +100,7 @@
            dataMap.put("bz", WordReplaceUtil.CHECKED);
        }
        dataMap.put("programNo",props.getProgramNo());
        dataMap.put("programNo",props.getDrawingNo()+"-"+props.getProcessNo()+"-"+props.getProcessEdition());
        dataMap.put("fzy",WordReplaceUtil.CHECKED); //仿真 æ˜¯
        dataMap.put("fzn",WordReplaceUtil.UNCHECKED);//仿真 å¦
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/ConfirmTablePrintService.java
@@ -29,7 +29,6 @@
import org.springblade.mdm.flow.vo.FlowVO;
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.statreport.utils.WordReplaceUtil;
import org.springblade.system.feign.IDictBizClient;
import org.springframework.stereotype.Service;
@@ -54,7 +53,6 @@
    private final FlowProgramFileService flowProgramFileService;
    private ApproveInfoQueryService approveInfoQueryService;
    private final MachineService machineService;
    private final NcNodeService nodeService;
    private final NcNodeHisService nodeHisService;
    private final ParamService paramService;
    private final TaskDispatchService taskDispatchService;
@@ -63,7 +61,6 @@
    private static final String DATE_PATTERN = "yyyy-M-d";
    /**
     * å¯¼å‡ºword岸本
     * @param dispatch ä»»åŠ¡åˆ†æ´¾
     * @param props æµç¨‹å±žæ€§
     */
    public ByteArrayOutputStream exportConfirmTableDoc(FlowProgramProperties props) throws IOException {
@@ -94,7 +91,8 @@
            //防止老数据报错
            dispatch = new TaskDispatch();
        }
        dataMap.put("bh",props.getProgramNo());//编号,就是数控程序编号
        String bianhao = props.getDrawingNo()+"-"+props.getProcessNo()+"-"+props.getProcessEdition();
        dataMap.put("bh",bianhao);//编号,就是数控程序编号
        dataMap.put("drawingNo", props.getDrawingNo());
        dataMap.put("processNo", props.getProcessNo());
@@ -128,7 +126,7 @@
        }else{
            dataMap.put("czz", "");
        }
        dataMap.put("programNo",props.getProgramNo());
        dataMap.put("programNo",bianhao);
        if(StringUtils.isNotBlank(dispatch.getInspector())) {
            dataMap.put("jyy",dispatch.getInspector()+"/"+formatTimeForTable(dispatch.getCheckTime()));//实际检验员和检验时间
@@ -150,8 +148,8 @@
        dataMap.put("bianzhi",approveInfo.getProgrammerName()+"/"+formatTimeForTable(approveInfo.getProgrammingDate()));//编程人员
        //approveInfo.getDispatchDate()
        dataMap.put("jiaodui",approveInfo.getTeamLeaderName()+"/"+formatTimeForTable(approveInfo.getCheckDate()));//校对:专业组长
        dataMap.put("shenhe",approveInfo.getSeniorName()+"/"+formatTimeForTable(approveInfo.getApproveDate()));
        dataMap.put("jiaodui",(approveInfo.getTeamLeaderName()!=null?approveInfo.getTeamLeaderName():"")+"/"+formatTimeForTable(approveInfo.getCheckDate()));//校对:专业组长
        dataMap.put("shenhe",(approveInfo.getSeniorName()!=null?approveInfo.getSeniorName():"")+"/"+formatTimeForTable(approveInfo.getApproveDate()));
        dataMap.put("sendPath",machine.getProgSendDir()!=null?machine.getProgSendDir():"");
blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MesSyncTask.java
@@ -27,10 +27,6 @@
    private MesSyncService mesSyncService;
    @Autowired
    private ParamService paramService;
    /**
     * æ–‡ä»¶é»˜è®¤ä¿å­˜å°æ—¶æ•°ï¼Œ0不限制
     */
    private static final int DEFAULT_HOUR = 0;
    // æ¯5秒执行一次
    //@Scheduled(cron = "0 15 19 * * ?") //test
    @Scheduled(cron = "${task.cron.mes_sync:0 */10 * * * ?}")
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
@@ -17,14 +17,19 @@
import org.springblade.mdm.flow.excution.events.CureFinishedEvent;
import org.springblade.mdm.flow.service.MesSyncService;
import org.springblade.mdm.flow.service.WIthdrawService;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
import org.springblade.mdm.machinefile.entity.MachineFile;
import org.springblade.mdm.machinefile.service.FileSendRecordService;
import org.springblade.mdm.machinefile.service.MachineFileScanService;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.ProgramOnMachine;
import org.springblade.mdm.program.service.NcNodeHisService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.program.service.ProgramOnMachineService;
import org.springblade.mdm.task.InternalEmailNotifyTask;
import org.springblade.mdm.task.MachineFileScanTask;
import org.springblade.mdm.task.ReceiveDirCheckTask;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.system.feign.IDictBizClient;
import org.springblade.system.pojo.entity.DictBiz;
@@ -39,6 +44,7 @@
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@Slf4j
@RestController
@@ -51,7 +57,7 @@
    @Autowired
    private MesSyncService mesSyncService;
    @Autowired
    private ProgramAnnotationService programAnnotationService;
    private ReceiveDirCheckTask fileCheckTask;
    @Autowired
    private IDictBizClient bizDictClient;
    @Autowired
@@ -65,6 +71,8 @@
    @Autowired
    private NcNodeHisService nodeHisService;
    @Autowired
    private FileSendRecordService fileSendRecordService;
    /**
     * æ–°å¢ž
     */
@@ -172,4 +180,19 @@
        int code = mesSyncService.postData(jsonObject);
        log.info("mestest response:{}",code);
    }
    @GetMapping("/check-files")
    public void checkFiles(){
        fileCheckTask.checkFiles();
    }
    @GetMapping("/likeright")
    public Object likeRight(){
        Optional<FileSendRecord> optFile = fileSendRecordService.lambdaQuery()
            .eq(FileSendRecord::getMachineCode,"P01")
            .likeRight(FileSendRecord::getName,"a-P%").last("limit 1")
            .orderByDesc(FileSendRecord::getCreateTime).oneOpt();
        return optFile.get();
    }
}
blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/FileContentUtilTest.java
@@ -52,7 +52,7 @@
        //System.out.println(charset);
    }
    @Test
    //@Test
    public void testReadLineAt() throws IOException {
        Path source = Paths.get("src/test/resources/filecontenttest.txt");
@@ -65,7 +65,7 @@
    }
    @Test
    //@Test
    public void testReplaceReadLineAt(@TempDir Path tempDir) throws IOException {
        // åŠ è½½èµ„æºæ–‡ä»¶
        Path source = Paths.get("src/test/resources/filecontenttest.txt");