yangys
2025-09-15 7bc1d0f521c1d59246f29bcadcc4343f88ceef1c
性能优化+bug调整
已修改12个文件
185 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/append/AppendFinishListener.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNodeHis.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/ConfirmTablePrintService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sql/mdm/mdm.mysql.all.create.sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -57,6 +57,7 @@
            boolean isDuplicate = taskDispatchService.checkIsDuplicate(startVO);
            TaskDispatch dispatch = taskDispatchService.saveTask(startVO,isDuplicate);
            startVO.setCreateUser(dispatch.getCreateUser());
            if(isDuplicate){
                throw new ServiceException("重复派工");
            }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/append/AppendFinishListener.java
@@ -3,12 +3,14 @@
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.service.FlowProgramFileService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgramApproved;
import org.springblade.mdm.program.service.NcNodeHisService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramApprovedService;
import org.springblade.mdm.utils.EntityUtil;
@@ -16,6 +18,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
@@ -32,12 +35,15 @@
    private FlowCommonService flowCommonService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private NcNodeHisService nodeHisService;
    /**
     * 在流程结束时自动调用,(配置在审批结束事件的executelistener中了)
     * @param execution 执行对象
     */
    public void handle(DelegateExecution execution) {
        Date time = DateUtil.now();
        // 执行业务逻辑
        String instId = execution.getProcessInstanceId();
        log.info("事件名称{},instid={}" , execution.getEventName(),instId);
@@ -80,6 +86,8 @@
        }
        addApproveTable(tempPkgNode,props);
        nodeHisService.mergeNodeToHisGeTime(time);
        log.info("程序补充流程已完成in AppendFinishListener");
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/CureFinishOperateTask.java
@@ -31,8 +31,6 @@
    private final NormalCureFinishDataHandler normalCureFinishDataHandler;
    private final DeviationCureFinishDataHandler deviationCureFinishDataHandler;
    private final NcNodeService ncNodeService;
    /**
     * 固化审批通过处理任务,
     *
@@ -44,6 +42,7 @@
        Date time = DateUtil.now();
        //固化程序检查有效期,
        dealWithNode(execution.getProcessInstanceId());
        nodeHisService.mergeNodeToHisGeTime(time);
    }
@@ -74,8 +73,4 @@
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/DeviationCureFinishDataHandler.java
@@ -29,10 +29,6 @@
    private FlowProgramFileService flowProgramFileService;
    @Autowired
    private NcNodeService nodeService;
    @Autowired
    private NcNodeAutoCreateService ncNodeAutoCreateService;
    @Autowired
    private MachineService machineService;
    /**
     * cureFinishOperateTask调用,偏离单回传审批完成处理业务
@@ -40,7 +36,6 @@
     */
    public void handleData(FlowProgramProperties props) {
        // 执行业务逻辑
        String instId = props.getProcessInstanceId();
        NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId,  props.getProcessInstanceId()).one();
        pkgNode.lock();
@@ -55,8 +50,21 @@
        nodeService.save(newPkgNode);
        //处理程序包下层的程序节点111
        List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,pkgNode.getId()).list();
        copyNonProgramNodes(pkgNode,newPkgNode);
        addNewProgramNode(newPkgNode,props.getProcessInstanceId());
        log.info("偏离回传Listener完成");
    }
    /**
     * 从待固化节点复制非程序文件节点到固化节点下
     * @param oriPkgNode 待固化节点
     * @param cureNode 固化节点
     */
    void copyNonProgramNodes(NcNode oriPkgNode,NcNode cureNode){
        //处理程序包下层的程序节点1
        List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,oriPkgNode.getId()).list();
        FlowProgramFile pfile;
        for(NcNode oldProgramNode : oriProgramNodes){
            pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
@@ -66,17 +74,23 @@
                NcNode newOtherFileNode = new NcNode();
                BeanUtils.copyProperties(oldProgramNode,newOtherFileNode);
                EntityUtil.clearBaseProperties(newOtherFileNode);
                newOtherFileNode.setParentId(newPkgNode.getId());
                newOtherFileNode.setParentIds(newPkgNode.getParentIds()+","+newPkgNode.getId());
                newOtherFileNode.setParentId(cureNode.getId());
                newOtherFileNode.setParentIds(cureNode.subNodeParentIds());
                newOtherFileNode.setIsLastEdition(1);
                nodeService.save(newOtherFileNode);
            }
        }
        //nodeService.updateBatchById(oriProgramNodes);
    }
    /**
     * 加入新的程序文件节点
     * @param newPkgNode 新的节点(固化的)
     * @param processInstanceId 流程实例id
     */
    void addNewProgramNode(NcNode newPkgNode,String processInstanceId){
        //新的文件作为最新版本
        List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,pkgNode.getProcessInstanceId()).list();
        List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,processInstanceId).list();
        for(FlowProgramFile flowProgramFile : files){
            NcNode newProgNode = new NcNode();
            BeanUtils.copyProperties(newPkgNode, newProgNode);
@@ -85,7 +99,7 @@
            newProgNode.setName(flowProgramFile.getName());
            newProgNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
            newProgNode.setParentId(newPkgNode.getId());
            newProgNode.setParentIds(newPkgNode.getParentIds()+","+newPkgNode.getId());
            newProgNode.setParentIds(newPkgNode.subNodeParentIds());
            newProgNode.setIsLastEdition(1);
            newProgNode.setVersionNumber(newPkgNode.getVersionNumber());
            newProgNode.setFlowProgramFileId(flowProgramFile.getId());
@@ -93,8 +107,5 @@
            nodeService.save(newProgNode);
        }
        log.info("偏离回传Listener完成");
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -76,7 +76,12 @@
        //需要固化的节点
        NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId,  flowProps.getProcessInstanceId()).one();
        //原节点保留不动,置为老版本
        pkgNode.setIsLastEdition(0);
        pkgNode.setIsLocked(1);
        nodeService.updateById(pkgNode);
        nodeService.getBaseMapper().deleteById(pkgNode.getParentId());//删除机床组节点
        //List<NcNode> historyProgramPackageNodes = nodeService.getTryNodeHistory(pkgNode);
        try {
            moveNodeToCuredTree(pkgNode, flowProps);//, historyProgramPackageNodes
@@ -91,20 +96,18 @@
    /**
     * 将节点和历史节点挪动到固化的同级节点下
     * @param pkgNode1 要固化的节点
     * @param historyProgramPackageNodes 程序包名 历史节点List<NcNode> historyProgramPackageNodes,
     * @param programProperties 流程属性
     */
    void moveNodeToCuredTree(NcNode pkgNode1, FlowProgramProperties programProperties) throws IOException {
        //创建节点到机床级别.(固化树)
        NcNode machineGroupNode = ncNodeAutoCreateService.createNodeTreeToMachineGroup(programProperties);
        //新建一个节点,作为固化节点,老节点保留不动,置为老版本
        //新建一个节点,作为固化节点,
        this.nodeService.lambdaUpdate().likeRight(NcNode::getParentIds, machineGroupNode.subNodeParentIds())
            .in(NcNode::getNodeType, Arrays.asList(NcNode.TYPE_PROGRAM_PACKAGE,NcNode.TYPE_PROGRAM_FILE))
            .set(NcNode::getIsLastEdition,0).set(NcNode::getIsLocked,1).update();
        //pkgNode1.setParentId(machineGroupNode.getId());
        //pkgNode1.setParentIds(machineGroupNode.subNodeParentIds());//更新上级节点,下面还要用应为在historyProgramPackageNodes中的和这个不是一个实例
        List<NcNode> programNodes = nodeService.getProgramFilesByPackageId(pkgNode1.getId());
        boolean tryPkgNodeHasChild = !programNodes.isEmpty();
@@ -114,64 +117,67 @@
        cureNode.setParentIds(machineGroupNode.subNodeParentIds());
        nodeService.save(cureNode);
        this.copyNonProgramNodes(pkgNode1,cureNode);
        /*
        List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,pkgNode1.getId()).list();
        //FlowProgramFile pfile;
        FlowProgramFile pfile;
        for(NcNode oldProgramNode : oriProgramNodes){
            oldProgramNode.setParentIds(pkgNode1.subNodeParentIds());
            oldProgramNode.setIsLastEdition(0);
            //pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
            //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
            //其他文件,需要复制到新建的固化节点下
            NcNode newFileNode = new NcNode();
            BeanUtils.copyProperties(oldProgramNode,newFileNode);
            EntityUtil.clearBaseProperties(newFileNode);
            newFileNode.setParentId(cureNode.getId());
            newFileNode.setParentIds(cureNode.subNodeParentIds());
            newFileNode.setIsLastEdition(1);
            nodeService.save(newFileNode);
            //其他文件,需要复制到新建的固化节点下(程序文件不复制)
            pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
            if(!pfile.isProgram()) {
                NcNode newFileNode = new NcNode();
                BeanUtils.copyProperties(oldProgramNode, newFileNode);
                EntityUtil.clearBaseProperties(newFileNode);
                newFileNode.setParentId(cureNode.getId());
                newFileNode.setParentIds(cureNode.subNodeParentIds());
                newFileNode.setIsLastEdition(1);
                nodeService.save(newFileNode);
            }
        }
        nodeService.updateBatchById(oriProgramNodes);
        /*
        for(NcNode hisPackageNode : historyProgramPackageNodes){
            hisPackageNode.setIsLastEdition(0);
            hisPackageNode.setParentId(machineGroupNode.getParentId());
            hisPackageNode.setParentIds(machineGroupNode.subNodeParentIds());//程序包与机床节点同级
            hisPackageNode.lock();
        */
            //处理程序包下层的程序节点,这里:老的程序节点不用更新为历史版本,因为会建立新节点。只修改parentId 和 parentIds //改了,看看效果
            List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,hisPackageNode.getId()).list();
            FlowProgramFile pfile;
            for(NcNode oldProgramNode : oriProgramNodes){
                oldProgramNode.setParentIds(hisPackageNode.subNodeParentIds());
                oldProgramNode.setIsLastEdition(0);
        this.addNewProgramNode(cureNode,pkgNode1.getProcessInstanceId());
                pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
                //if(oldProgramNode.getParentId().equals(pkgNode1.getId()) && !pfile.isProgram()){
                    //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
                    //其他文件,需要复制到新建的固化节点下
                    NcNode newFileNode = new NcNode();
                    BeanUtils.copyProperties(oldProgramNode,newFileNode);
                    EntityUtil.clearBaseProperties(newFileNode);
                    newFileNode.setParentId(cureNode.getId());
                    newFileNode.setParentIds(cureNode.subNodeParentIds());
                    newFileNode.setIsLastEdition(1);
                    nodeService.save(newFileNode);
                //}
    }
    /**
     * 从待固化节点复制非程序文件节点到固化节点下
     * @param oriPkgNode 待固化节点
     * @param cureNode 固化节点
     */
    void copyNonProgramNodes(NcNode oriPkgNode,NcNode cureNode){
        List<NcNode> oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,oriPkgNode.getId()).list();
        FlowProgramFile pfile;
        for(NcNode oldProgramNode : oriProgramNodes){
            oldProgramNode.setParentIds(oriPkgNode.subNodeParentIds());
            oldProgramNode.setIsLastEdition(0);
            //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,直接挪到固化树下,两个网络之间只交换程序文件,其他文件只能保留
            //其他文件,需要复制到新建的固化节点下(程序文件不复制)
            pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId());
            if(!pfile.isProgram()) {
                NcNode newFileNode = new NcNode();
                BeanUtils.copyProperties(oldProgramNode, newFileNode);
                EntityUtil.clearBaseProperties(newFileNode);
                newFileNode.setParentId(cureNode.getId());
                newFileNode.setParentIds(cureNode.subNodeParentIds());
                newFileNode.setIsLastEdition(1);
                nodeService.save(newFileNode);
            }
            nodeService.updateBatchById(oriProgramNodes);
        }
        nodeService.updateBatchById(oriProgramNodes);
    }
         */
        //nodeService.updateBatchById(historyProgramPackageNodes);
    void addNewProgramNode(NcNode cureNode,String processInstanceId) throws IOException {
        Machine machine = machineService.getByCode(cureNode.getMachineCode());
        List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
        //新的流程文件,需要在包节点下新建,不能用老的
        List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,pkgNode1.getProcessInstanceId()).list();
        //新的流程文件,需要在包节点下新建,不能用老的包节点
        List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,processInstanceId).list();
        for(FlowProgramFile flowProgramFile : files){
            NcNode newProgNode = new NcNode();
@@ -190,8 +196,6 @@
            nodeService.save(newProgNode);
        }
    }
    /**
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveInfoQueryService.java
@@ -101,10 +101,10 @@
        //查询数控程序编号
        Optional<NcProgramApproved> appOpt = programApprovedService.lambdaQuery().eq(NcProgramApproved::getProcessInstanceId, props.getProcessInstanceId()).oneOpt();
        if(appOpt.isEmpty()){
            appInfo.setProgramNo("(未生成)");
            appInfo.setProgramName("(未生成)");
        }else{
            NcNodeHis programPkgNameNode = this.ncNodeHisService.getById(appOpt.get().getNcNodeId());
            appInfo.setProgramNo(programPkgNameNode.programNo());
            appInfo.setProgramName(programPkgNameNode.programName());
        }
        return appInfo;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
@@ -143,7 +143,7 @@
        data.put("checkerName",approveInfo.getCheckerName());
        data.put("seniorName",approveInfo.getSeniorName());
        data.put("programNo",approveInfo.getProgramNo());
        data.put("programNo",approveInfo.getProgramName());
        return data;
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java
@@ -28,5 +28,5 @@
    /**
     * 数控程序编号
     */
    private String programNo;
    private String programName;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNodeHis.java
@@ -82,7 +82,10 @@
     * 产品型号
     */
    private String productModel;
    /**
     * 程序编号(程序包名节点需要)
     */
    private String programNo;
    /**
     * 历史序列号
     */
@@ -143,7 +146,7 @@
        return this.isLocked != null && this.isLocked == NcNode.LOCKED;
    }
    public String programNo() {
    public String programName() {
        return this.getDrawingNo()+"-"+this.getProcessNo()+"-"+this.getProcessEdition();
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml
@@ -48,7 +48,7 @@
        ) AS "has_children" from mdm_nc_node n left join blade_user u on n.create_user=u.id
        left join blade_dict_biz dt on n.node_type=dt.dict_key and dt.code='nc_node_type' and dt.is_deleted=0
        where n.is_deleted=0 and n.is_last_edition=1 and n.parent_id=#{parentId}
        order by name
        order by id
    </select>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/ConfirmTablePrintService.java
@@ -29,6 +29,8 @@
import org.springblade.mdm.flow.vo.ApproveTableInfo;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.mdm.program.entity.NcNode;
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;
@@ -48,13 +50,14 @@
@Service
@AllArgsConstructor
public class ConfirmTablePrintService {
    private final RuntimeService runtimeService;
    private final IDictBizClient dictBizClient;
    private final HistoryService historyService;
    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;
    private final OssTemplate ossTemplate;
@@ -85,7 +88,8 @@
        machine = machineService.getByCode(machineCode);
        Map<String, String> dataMap = new HashMap<>();
        NcNode node = this.nodeService.getById(props.getNodeId());
        //NcNode node = this.nodeService.getById(props.getNodeId());
        NcNodeHis node = nodeHisService.getById(props.getNodeId());
        TaskDispatch dispatch = taskDispatchService.getByProgramNo(node.getProgramNo());
        if(dispatch == null){
doc/sql/mdm/mdm.mysql.all.create.sql
@@ -179,6 +179,7 @@
   `parent_ids` varchar(200) DEFAULT NULL COMMENT '上级节点ID集合,id逗号分隔',
   `node_type` varchar(20) DEFAULT NULL COMMENT '节点类型:业务字典定义',
   `product_model` varchar(100) NULL COMMENT '产品型号',
   `program_no` varchar(20) NULL COMMENT '程序编号,只有程序包名节点才有值',
   `his_serial` bigint NULL COMMENT '历史序列号,序列号相同属于同一历史列表',
   `flow_program_file_id` bigint NULL COMMENT '关联的流程程序文件id,程序文件类型的节点才有值',
   `process_instance_id` varchar(64) NULL COMMENT '关联的流程实例id,程序包 类型的节点才有值',