yangys
2025-08-17 685d26c3a34dbb532a2612ce4cd5f9d904c8d6d1
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
package org.springblade.mdm.flow.excution;
 
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.ApproveRecordService;
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.NcNodeAutoCreateService;
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.List;
 
/**
 * 派工审批通过执行的事件,功能:插入审批表数据
 */
@Slf4j
@Component("dispatchFinishListener")
public class DispatchFinishListener {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private NcProgramApprovedService approvedService;
    @Autowired
    private ApproveRecordService approveRecordService;
    @Autowired
    private FlowProgramFileService flowProgramFileService;
    @Autowired
    private FlowCommonService flowCommonService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private NcNodeAutoCreateService ncNodeAutoCreateService;
    /**
     * 在流程结束时自动调用,(配置在审批结束事件的executelistener中了)
     * @param execution 执行对象
     */
    public void handle(DelegateExecution execution) {
        // 执行业务逻辑
        String instId = execution.getProcessInstanceId();
        log.info("事件名称{},instid={}" , execution.getEventName(),instId);
 
        FlowProgramProperties props = flowCommonService.getProgramProperties(instId);
 
        createProgramNodes(props);
 
        String programName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
        NcNode packageNode = ncNodeService.getProgramPackageByName(programName);
 
        addApproveTable(packageNode,props.getTitle());
 
        updateApproveRecordNodeId(instId,packageNode.getId());
 
        log.info("流程已完成in DispatchFinishListener");
    }
 
    /**
     * 自动创建程序节点
     * @param progProperties 流程属性
     */
    void createProgramNodes(FlowProgramProperties progProperties){
        //FlowProgramProperties progProperties = flowCommonService.getProgramProperties(processInstanceId);
        if(!FlowContants.Y.equals(progProperties.getHasCuredProgram())) {
            //试切或者偏离
            ncNodeAutoCreateService.createNodeTreeWithProgram(progProperties);
        }else{
            //有固化
            //TODO 还要区分是否可用判定是否可用。可用界
            if(!FlowContants.Y.equals(progProperties.getCureProgramUseable())) {
                //固化程序不可用,需要重新建立程序包名和文件节点;可用情况在流程审批中已经升级过节点了
                NcNode curedProgramPackage = ncNodeService.getById(Func.toLong(progProperties.getCuredNodeId()));
 
                NcNode newCuredNode = new NcNode();
                BeanUtils.copyProperties(curedProgramPackage, newCuredNode);
                EntityUtil.clearBaseProperties(newCuredNode);
                newCuredNode.setIsLastEdition(1);
                newCuredNode.setIsLocked(0);
                ncNodeService.save(newCuredNode);
 
                //新的流程对应的文件更新到新节点下
                List<FlowProgramFile> newFlowFileList = flowProgramFileService.listByProcessInstanceId(progProperties.getProcessInstanceId());
                for (FlowProgramFile newFlowFile : newFlowFileList) {
                    NcNode newProgramNode = new NcNode();
                    newProgramNode.setName(newFlowFile.getName());
                    newProgramNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
                    newProgramNode.setParentId(newCuredNode.getParentId());
                    newProgramNode.setIsLastEdition(1);
                    newProgramNode.setIsLocked(0);
                    newProgramNode.setParentIds(newCuredNode.getParentIds() + "," + newCuredNode.getId());
 
                    ncNodeService.save(newProgramNode);
                }
 
                //原节点更新为老版本,锁定
                curedProgramPackage.setIsLastEdition(0);
                curedProgramPackage.setIsLocked(1);
                ncNodeService.updateById(curedProgramPackage);
            }
        }
    }
 
    void addApproveTable(NcNode packageNode,String title){
        NcProgramApproved approved = new NcProgramApproved();
        //approved.setProgramName(pf.getProgramName());
        approved.setProgramName(packageNode.getName());
        approved.setNcNodeId(packageNode.getId());//程序包节点id
        approved.setTitle(title);
        approvedService.save(approved);
 
    }
 
 
    void updateApproveRecordNodeId(String processInstanceId,Long nodeId){
        //更新审批记录的ncNodeId
        approveRecordService.lambdaUpdate()
            .eq(ApproveRecord::getProcessInstanceId, processInstanceId)
            .set(ApproveRecord::getNcNodeId,nodeId).update();
    }
}