yangys
2025-09-18 0d61b9bfca526e9c3da2209de8f9f367e76fd013
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package org.springblade.mdm.flow.excution.replace;
 
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.constants.FlowConstant;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.*;
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;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.Date;
import java.util.List;
 
/**
 * 替换完成执行的事件,功能:插入审批表数据
 */
@Slf4j
@Component("replaceFinishListener")
public class ReplaceFinishListener {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private FlowProgramFileService flowProgramFileService;
    @Autowired
    private NcProgramApprovedService ncProgramApprovedService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private NcNodeHisService nodeHisService;
    @Autowired
    private FlowCommonService flowCommonService;
    /**
     * 在流程结束时自动调用,(配置在审批结束事件的executelistener中了)
     * @param execution 执行对象
     */
    public void handle(DelegateExecution execution) {
        // 执行业务逻辑
        Date time = DateUtil.now();
 
        String instId = execution.getProcessInstanceId();
        FlowProgramProperties props = flowCommonService.getProgramProperties(instId);
        Long nodeId = runtimeService.getVariable(execution.getId(), FlowConstant.NODE_ID,Long.class);
        log.info("事件名称{},instid={}" , execution.getEventName(),instId);
 
        //List<FlowProgramFile> programFiles =  flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId, instId).list();
        List<FlowProgramFile> programFiles = flowProgramFileService.listByProcessInstanceId(instId);
        NcNode newProgramPackage = replaceProgram(nodeId,instId,programFiles);
 
        addToApproved(newProgramPackage,props);
 
        nodeHisService.mergeNodeToHisGeTime(time);
        log.info("流程已完成 in replaceFinishListener");
    }
 
    /**
     * 增加审批通过记录,供用户导出到工控网
     * @param newProgramPackage 新的程序包节点
     * @param props 流程属性集合
     */
    void addToApproved(NcNode newProgramPackage,FlowProgramProperties props){
        NcProgramApproved approve = new NcProgramApproved();
        approve.setProgramName(newProgramPackage.getName());
        approve.setNcNodeId(newProgramPackage.getId());
        approve.setTitle(props.getTitle());
        approve.setProgrammerId(props.getProgrammerId());
 
        ncProgramApprovedService.save(approve);
    }
    /**
     * 替换原来程序的文件
     * @param programFiles 新的文件
     * @return 新的程序包名节点
     */
    NcNode replaceProgram(Long nodeId,String processInstanceId, List<FlowProgramFile> programFiles){
        //原节点改为老版本
        NcNode oldPackageNode = ncNodeService.getById(nodeId);
        oldPackageNode.setIsLastEdition(0);
        oldPackageNode.setIsLocked(1);
        ncNodeService.updateById(oldPackageNode);
 
        //程序包名节点升级版本
        //已确认,要新创建一个package
        NcNode newPackageNode = new NcNode();
        BeanUtils.copyProperties(oldPackageNode,newPackageNode);
        EntityUtil.clearBaseProperties(newPackageNode);
        newPackageNode.setIsLocked(0);
        newPackageNode.setIsLastEdition(1);
 
        Integer newVersion = ncNodeService.calculateVersionNumber(oldPackageNode);
        newPackageNode.setVersionNumber(newVersion);
        newPackageNode.setProcessInstanceId(processInstanceId);
        ncNodeService.save(newPackageNode);
 
 
        //老文件,更新成老版本
        List<NcNode> programFileNodes = ncNodeService.getProgramFilesByPackageId(nodeId);
 
        for(NcNode fileNode: programFileNodes){
            fileNode.setIsLastEdition(0);
            ncNodeService.updateById(fileNode);
        }
 
        for(FlowProgramFile programFile: programFiles){
            NcNode node = new NcNode();
 
            BeanUtils.copyProperties(newPackageNode, node);
            EntityUtil.clearBaseProperties(node);
            node.setRemark(null);
 
            node.setIsLastEdition(1);
            node.setProcessEdition(newPackageNode.getProcessEdition());
            node.setName(programFile.getName());
            node.setParentIds(newPackageNode.subNodeParentIds());
            node.setParentId(newPackageNode.getId());
            node.setFlowProgramFileId(programFile.getId());
            node.setMachineCode(newPackageNode.getMachineCode());
            node.setProcessName(newPackageNode.getProcessName());
            node.setNodeType(NcNode.TYPE_PROGRAM_FILE);
            node.setVersionNumber(newPackageNode.getVersionNumber());//新版本,应为需要比对
            node.setCraftEdition(newPackageNode.getCraftEdition());
            node.setIsLocked(0);
 
            ncNodeService.save(node);
        }
 
        return newPackageNode;
    }
 
}