yangys
2025-08-21 842d6752d6e646fcc516e82da0f98f17a63ffcb8
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
139
package org.springblade.mdm.flow.excution.dispatch;
 
import lombok.extern.slf4j.Slf4j;
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.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;
 
/**
 * 普通派工完成数据处理器,功能:插入审批表数据,DispatchFinishListener调用
 */
@Slf4j
@Component("normalDispatchFinishDataHandler")
public class NormalFinishDataHandler implements FinishDataHandler{
    @Autowired
    private NcProgramApprovedService approvedService;
    @Autowired
    private ApproveRecordService approveRecordService;
    @Autowired
    private FlowProgramFileService flowProgramFileService;
    @Autowired
    private NcNodeService ncNodeService;
    @Autowired
    private NcNodeAutoCreateService ncNodeAutoCreateService;
    /**
     * DispatchFinishListener中调用
     * @param props 执行对象
     */
    public void handleData(FlowProgramProperties props) {
        // 执行业务逻辑
        String instId = props.getProcessInstanceId();
 
        String programPkgName = NcNodeService.genProgramName(props.getDrawingNo(),props.getProcessNo());
        createProgramNodes(props);
 
        //TODO 偏离单,和已经固化的程序,没有处理,:已经处理没有验证
        NcNode packageNode;
        if(FlowContants.Y.equals(props.getHasCuredProgram()) && FlowContants.Y.equals(props.getCureProgramUseable())){
            //有固化,且程序可用,从固化树查询节点.使用流程中保存的节点
            //packageNode = ncNodeService.getLastEditionCuredProgramPackage(programPkgName,props.getProcessEdition());
            packageNode = ncNodeService.getById(props.getCuredNodeId());
        }else if(Func.isNotBlank(props.getDeviation())){
            //有偏离单
            packageNode = ncNodeService.getLastEditionDeviationProgramPackage(programPkgName,props.getProcessEdition());
        }else{
            //普通试切,或者有固化不可用
            packageNode = ncNodeService.getLastEditionTryingProgramPackage(programPkgName,props.getProcessEdition());
        }
 
        addApproveTable(packageNode,props);
        updateApproveRecordNodeId(instId, packageNode.getId());
        log.info("普通流程已完成in DispatchFinishListener");
    }
 
    /**
     * 自动创建程序节点
     * @param progProperties 流程属性
     */
    void createProgramNodes(FlowProgramProperties progProperties){
        if(FlowContants.N.equals(progProperties.getHasCuredProgram())) {
            //无固化:(试切或者偏离)
            ncNodeAutoCreateService.createNodeTreeWithProgram(progProperties);
        }else{
            //有固化,程序不可用
            if(FlowContants.N.equals(progProperties.getCureProgramUseable())) {
                //固化程序不可用,需要重新建立程序包名和文件节点;可用情况在流程审批中已经升级过节点了
                NcNode curedProgramPackage = ncNodeService.getById(Func.toLong(progProperties.getCuredNodeId()));
 
                NcNode newCuredPkgNode = new NcNode();
                BeanUtils.copyProperties(curedProgramPackage, newCuredPkgNode);
                EntityUtil.clearBaseProperties(newCuredPkgNode);
                newCuredPkgNode.setIsLastEdition(1);
                newCuredPkgNode.setIsLocked(0);
                newCuredPkgNode.upgradeVersionNumber();
                ncNodeService.save(newCuredPkgNode);
 
                //新的流程对应的文件更新到新节点下
                List<FlowProgramFile> newFlowFileList = flowProgramFileService.listByProcessInstanceId(progProperties.getProcessInstanceId());
                for (FlowProgramFile newFlowFile : newFlowFileList) {
                    NcNode newProgramNode = new NcNode();
                    BeanUtils.copyProperties(newCuredPkgNode, newProgramNode);
                    EntityUtil.clearBaseProperties(newProgramNode);
 
                    newProgramNode.setName(newFlowFile.getName());
                    newProgramNode.setNodeType(NcNode.TYPE_PROGRAM_FILE);
                    newProgramNode.setParentId(newCuredPkgNode.getId());
                    newProgramNode.setIsLastEdition(1);
                    newProgramNode.setIsLocked(0);
                    newProgramNode.setParentIds(newCuredPkgNode.getParentIds() + "," + newCuredPkgNode.getId());
                    newProgramNode.setFlowProgramFileId(newFlowFile.getId());
                    ncNodeService.save(newProgramNode);
                }
 
                //原节点更新为老版本,锁定
                curedProgramPackage.setIsLastEdition(0);
                curedProgramPackage.setIsLocked(1);
                ncNodeService.updateById(curedProgramPackage);
            }
        }
    }
 
    /**
     * 保存审批完成的记录
     * @param packageNode
     * @param props
     */
    void addApproveTable(NcNode packageNode,FlowProgramProperties props){
        NcProgramApproved approved = new NcProgramApproved();
 
        approved.setProgramName(packageNode.getName());
        approved.setNcNodeId(packageNode.getId());//程序包节点id
        approved.setTitle(props.getTitle());
        approved.setProgrammerId(props.getProgrammerId());
        approvedService.save(approved);
 
    }
 
 
    void updateApproveRecordNodeId(String processInstanceId,Long nodeId){
        //更新审批记录的ncNodeId
        approveRecordService.lambdaUpdate()
            .eq(ApproveRecord::getProcessInstanceId, processInstanceId)
            .set(ApproveRecord::getNcNodeId,nodeId).update();
    }
}